QUOTE (Убо-Сатло @ May 21 2005, 18:25) |
А диалог вставить в ->свойства плэйса -> улучшеный-> разговор |
вот это ты сделал?
Добавлено в [mergetime]1116687381[/mergetime]
QUOTE (Убо-Сатло @ May 21 2005, 18:25) |
void main() { ActionStartConversation(GetLastUsedBy()); } |
это пашет - 100%.
Конечно

. Все поставил.
Сейчас еще проверю...
Убо-Сатло
May 21 2005, 17:59
Я могу предположить 2 варианта:
1) Твой плэйс расположен так, что PC не может его использовать(подойти к нему с нужной стороны на нужное расстояние). Когда кликаешь на него, в левом верхнем углу вылазит иконка движения. Если когда PC подошел к плэйсу, иконка не ушла, значит это так.
2) Ну, это на всякий случай, проверь, скрипт стоит на OnUsed? Диалог вставлен? Да, и есть ли еще на этом плэйсе какие-то скрипты? Если есть, то где?
Все я понял в чем дело...Дело в том что там 10 шаров и я не по тому целкал
Новый вопрос у меня, дроп золота я сделал. Теперь у меня задача сделать дроп одной случаной вещи из инвенторя. Дальше возможны варианты выпадение вещи по ее стоимости или скажем выпадение одной одетой вещи(кстати дополнительный вопрос: как правильно говорить? Одетой и надетой?

). (это когда игроки забивают всю сумку хламом...)
Мефистофель
May 22 2005, 01:16
Lex Большое спасибо, что помогаеш мне, но вотя в этих скриптах дуб дубком, немог бы ты описать более понятным для меня образом.
Neverwinter Script Source |
CreateObject(int OBJECT_TYPE_*,string ref, location lloc,FALSE); |
?????
Neverwinter Script Source |
CreateObject(int OBJECT_TYPE_*,string ref, location lloc,FALSE); |
?????
JesterX
May 22 2005, 09:50
Кто нибудь помогите. Делаю модуль по мотивам книг Ника Перумова - Хранитель мечей, точнее по миру описанному там.
Скриптер из меня никакой. Нужен скрипт:
Герой умирает и переносится в межреальность, там общается и его отправляют назад в место где он погиб.
За основу я взял скрипты (помоему от Аваддон"а),и чуть переделал.
OnPlayerDying Герой без сознания.
void bleed(int iBleedAmt)
{
effect eShake=EffectVisualEffect(VFX_FNF_SCREEN_SHAKE);
effect eBleedEff;
if (GetCurrentHitPoints() <= 3) {
SpeakStringByStrRef (110519);
if (iBleedAmt > 0) {
eBleedEff = EffectDamage(iBleedAmt);
} else {
eBleedEff = EffectDamage(iBleedAmt);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);
if (GetCurrentHitPoints() <= -10) {
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF);
return;
}
if (iBleedAmt > 0) {
if (d10(1) == 1) {
iBleedAmt = -iBleedAmt;
}
}
}
DelayCommand(6.0,bleed(iBleedAmt));
}
void main()
{
effect eBlood=EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM);
object oDying = GetLastPlayerDying();
object oEnemy = GetLastAttacker();
float fWho = (GetFacing(oEnemy));
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eBlood, GetLocation(oDying), 10.0);
AssignCommand(oDying, ClearAllActions());
AssignCommand(oDying, bleed(1));
CreateObject(OBJECT_TYPE_PLACEABLE,"bloody",GetLocation(oDying),TRUE);
}
Далее OnPlayerDeath Герой умирает и переносится в межреальность.
void main()
{
object oPlayer = GetLastPlayerDied();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oPlayer));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MAJOR), oPlayer,6.0);
DelayCommand(2.0,FadeToBlack(oPlayer));
DelayCommand(5.0,BlackScreen(oPlayer));
DelayCommand(5.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer));
DelayCommand(5.8,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer));
DelayCommand(6.0,AssignCommand(oPlayer,ClearAllActions()));
DelayCommand(6.2,AssignCommand(oPlayer,JumpToLocation(GetLocation(GetObjectByTag("WP_RAISE")))));
}
И еще в локации межреальности - куда перемещается мертвый игрок OnEnter
void main()
{
object oPC = GetEnteringObject();
DelayCommand(2.0,FadeFromBlack(oPC,FADE_SPEED_SLOWEST));
}
Огромная просьба, ПОМОГИТЕ!!! Допишите скрипт пожалуйста.
P.S. Нужен еще один скрипт, который я поставлю на ветвь разговора. И чуть дописать скрипт на OnPlayerDeath. [COLOR=red][COLOR=red]
QUOTE (Мефистофель @ May 22 2005, 01:16) |
Lex Большое спасибо, что помогаеш мне, но вотя в этих скриптах дуб дубком, немог бы ты описать более понятным для меня образом.
Neverwinter Script Source | CreateObject(int OBJECT_TYPE_*,string ref, location lloc,FALSE); |
Neverwinter Script Source | CreateObject(int OBJECT_TYPE_*,string ref, location lloc,FALSE); |
|
Это просто пример функции.
на место int OBJECT_TYPE_* - ставишь константу, типа объекта(плэйсибл, существо и т.д.)
string ref - РесРеф создаваемого объекта.
location lloc - куда объект создается.
FALSE - эффект "появления". Например паук спускается по нити паутины...
2JesterX, гм...ты же сам все сделал.
Archangel
May 22 2005, 11:03
Люди, памажите! Вот скрипт:
Neverwinter Script Source |
void main() { object oTK=GetObjectByTag("TK"); object oSTK1=GetObjectByTag("STK1"); object oED=GetObjectByTag("IN_HOME_AREA_D1"); object oMD1=GetObjectByTag("HOME_AREA_BIG_DOOR"); object oMD2=GetObjectByTag("CENTER_AREA_BIG_DOOR"); object oTKWP0=GetWaypointByTag("TKWP0"); object oTKWP1=GetWaypointByTag("TKWP1"); object oTKWPEND=GetWaypointByTag("TKWPEND"); object oMTK1=GetObjectByTag("MTK1"); if (GetIsDay() && GetLocalInt(oTK, "Day") != 1) { ActionSpeakString("Äîáðîå óòðî!"); ActionForceMoveToObject(oED); ActionJumpToObject(oTKWP0); ActionForceMoveToObject(oMD1); ActionJumpToObject(oTKWP1); SetLocalInt(oTK, "Day", 1); SetLocalInt(oTK, "Night", 0); return; } if (GetIsNight()&& GetLocalInt(oTK, "Night") != 1) { ActionSpeakString("Óõ. Ïîçäíî óæå. Ïîéäó äîìîé..."); ActionForceMoveToObject(oMD2); ActionJumpToObject(oTKWPEND); ActionSit(oSTK1); ActionWait(120.0); ActionForceMoveToObject(oMTK1); ActionPlayAnimation(ANIMATION_LOOPING_GET_MID); ActionForceMoveToObject(oTKWPEND); ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT); ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT); ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT); ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT); ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT); ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE); ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE); ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE); ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE); ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE); ActionPlayAnimation(ANIMATION_LOOPING_LISTEN); ActionPlayAnimation(ANIMATION_LOOPING_LISTEN); ActionPlayAnimation(ANIMATION_LOOPING_LISTEN); ActionPlayAnimation(ANIMATION_LOOPING_LISTEN); ActionPlayAnimation(ANIMATION_LOOPING_LISTEN); ActionSit(oSTK1); SetLocalInt(oTK, "Day", 0); SetLocalInt(oTK, "Night", 1); return; } } |
Но почему-то, когда НеПиСь выполняет команду ActionSit, то он больше не встает со стула! Почему же так происходит? Все компилится без проблем.
Я пытался после этой ф-ии ставить ClearAllActions(), но непомогает. Так же пытался все преплести к DelayCommand, но толку никакого...
Кто-нибудь знает в чем загвостка?
ЗЫ
Скрипт ставится в OnHeartBeat НеПиСя.
Вобщем система выпадения одной шмотки из слота при смерти PС и золота, была написана...
Если кому интересно то вот:
Neverwinter Script Source |
object oDrop=OBJECT_INVALID; int nSlot; int nGP = GetGold(oPC); int k; int i; int nChance=0; if(GetHitDice(oPC)<6)nChance=70; if((Random(100)+nChance)<(60+GetHitDice(oPC))) { k=Random(11); for(i=k;oDrop==OBJECT_INVALID; ) { switch(i) { case 0:nSlot=INVENTORY_SLOT_ARMS;break; case 1:nSlot=INVENTORY_SLOT_BELT;break; case 2:nSlot=INVENTORY_SLOT_BOOTS;break; case 3:nSlot=INVENTORY_SLOT_CHEST;break; case 4:nSlot=INVENTORY_SLOT_CLOAK;break; case 5:nSlot=INVENTORY_SLOT_HEAD;break; case 6:nSlot=INVENTORY_SLOT_LEFTHAND;break; case 7:nSlot=INVENTORY_SLOT_LEFTRING;break; case 8:nSlot=INVENTORY_SLOT_NECK;break; case 9:nSlot=INVENTORY_SLOT_RIGHTHAND;break; case 10:nSlot=INVENTORY_SLOT_RIGHTRING;break; } oDrop=GetItemInSlot(nSlot,oPC); i++; if(i==11) i=0; if(i==k)break; } } object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE,"pc_corpse",GetLocation(oPC),TRUE); //плэйс трупа игрока AssignCommand(oCorpse,TakeGoldFromCreature(nGP,oPC,FALSE));//забираем GP AssignCommand(oCorpse,ActionTakeItem(oDrop,oPC));//забираем вещь |
Из игроков левелом 5 или меньше, вещи не падают, только золото. Есть шанс выпадения. У 10 -70%,у 20 уровня он равен 80%,у 30 - 90%, у 40%...
Если вещей в слотах не было найдено, то тогда ничего не выпадает.
Собственно есть задача с которой я не могу справится. Я хочу переписать систему смерти на шарде. При смерти игрока кидает в фугу, где он либо входит в портал, за что с него снимают n-кол-во XP, либо ждет пока его реснут(скастовав райз или резурект на труп, который создается на месте смерти.)
Вот с момента воскрешения начинаются проблемы...
Пробовал реализовать через стринги которые накладываются при смерти на труп и на игрока.
Neverwinter Script Source |
void main() { object oPC =GetNextPC(); string sPCName = GetPCPlayerName(oPC);
if(GetSpellId()==SPELL_RAISE_DEAD) { if(GetLocalString(OBJECT_SELF,"NAME")==sPCName) { AssignCommand(oPC,JumpToLocation(GetLocation(OBJECT_SELF))); int nPenalty =100*GetHitDice(oPC); int nXP = GetXP(oPC); int nNewXP = nXP - nPenalty; SetXP(oPC,nNewXP); } } } |
И если они равны, применять к игроку в фуге необходимые эффекты, но! я на 100% уверен, что -
Neverwinter Script Source |
object oPC =GetNextPC(); |
уже не верно.
Даже не знаю как реализовать

, помогайте мастера
а причем тут GetNextPC()?! - это функция получения следущего объекта игрока при перечислении игроков. тебе надо при создании трупа игрока на объект трупа вешать ссылку на объект игрока. и потом при юзании резурректа на труп, читать с него переменную объекта игрока и уже с ней работать.
dumbo, что надо использовать не GetNextPC() мне понятненько, а вот это:
1п.
QUOTE |
вешать ссылку на объект игрока |
- нет, как это сделать?
Я надеюсь что пойму вот это:
2п.
QUOTE |
читать с него переменную объекта игрока и уже с ней работать. |
Но для начала надо разобратся с 1п
где-то в подыхании игрока стоит что-то вроде:
Neverwinter Script Source |
object oPC = OBJECT_SELF; // где ж мы сдохли? location lLoc = GetLocation(oPC); // трупик object oCorpse = CreateObject( OBJECT_TYPE_PLACEABLE, "resref_трупика", lLoc, FALSE); // повесить ссылку на трупик (установить переменную-объект) SetLocalObject(oCorpse, "oOwner", oPC); |
и, соответственно, в тоем скрипте воскрешения:
Neverwinter Script Source |
object oTarget = GetSpellTargetObject(); if (GetResRef(oTarget) == "resref_трупика") { object oPC = GetLocalObject(oTarget, "oOwner"); бла-бла-бла с oPC } } |
ps. и юзайте irc-канал. там самое место для такого
чата.
Собственно поставил на OnPlayerDeath
Neverwinter Script Source |
SetLocalObject(oCorpse, GetName(oPC), oPC); |
GetName(oPC), потому что делается для шарда, и локалка по идее должна отличатся от локалок других трупов.
и написал вот такой скрипт на OnCastSpell трупа
Neverwinter Script Source |
void main() { object oTarget = GetSpellTargetObject(); int nSpell = GetLastSpell(); if (GetResRef(oTarget) == "pc_corpse") { object oPC = GetLocalObject(oTarget, GetName(oPC)); if(nSpell==SPELL_RAISE_DEAD) { AssignCommand(oPC,ActionJumpToLocation(GetLocation(OBJECT_SELF))); DestroyObject(OBJECT_SELF);
int nPenalty =100*GetHitDice(oTarget); int nXP = GetXP(oTarget); int nNewXP = nXP - nPenalty; SetXP(oTarget,nNewXP); object oItem; int nSlot; AssignCommand(oTarget,ClearAllActions(TRUE)); DeleteLocalObject(oTarget,GetName(oPC)); for(nSlot = 0; nSlot < 14; nSlot++) { oItem = GetItemInSlot(nSlot, oPC); if(oItem != OBJECT_INVALID) { AssignCommand(oTarget, ActionUnequipItem(oItem)); AssignCommand(oTarget, ActionEquipItem(oItem, nSlot)); } } } if(nSpell==SPELL_RESURRECTION) { AssignCommand(oPC,ActionJumpToLocation(GetLocation(OBJECT_SELF))); DestroyObject(OBJECT_SELF); int nPenalty =50*GetHitDice(oTarget); int nXP = GetXP(oTarget); int nNewXP = nXP - nPenalty; SetXP(oTarget,nNewXP); object oItem; int nSlot; AssignCommand(oTarget,ClearAllActions(TRUE)); DeleteLocalObject(oTarget,GetName(oPC)); for(nSlot = 0; nSlot < 14; nSlot++) { oItem = GetItemInSlot(nSlot, oPC); if(oItem != OBJECT_INVALID) { AssignCommand(oTarget, ActionUnequipItem(oItem)); AssignCommand(oTarget, ActionEquipItem(oItem, nSlot)); } } } } } |
Проверял так: Убивал сам себя, после чего пытался наложить райз или резурект на свой же труп. Эффект = 0. Где проблема опять же ума не приложу
Добавлено в [mergetime]1116779131[/mergetime] QUOTE |
ps. и юзайте irc-канал. там самое место для такого чата. |
Да...пора бы уже настроить.
Лито, ты своим введением все и поломал.

QUOTE (Лито @ May 22 2005, 20:24) |
GetName(oPC), потому что делается для шарда, и локалка по идее должна отличатся от локалок других трупов. и написал вот такой скрипт на OnCastSpell трупа |
не должна она отличаться. у каждого трупа своя переменная "oOwner". ты же не путаешь свою ногу с чужой только от того, что они обе называются "нога"? потом еще момент - я писал определение GetSpellTargetObject(), потому как предполагал, что ты изменяешь скрипт спелла(общего). в пределах скрипта OnSpellCastAt это определение бессмысленно. вот эта твоя конструкция вообще не выдерживает никакой критики:
Neverwinter Script Source |
object oPC = GetLocalObject(oTarget, GetName(oPC)); |
по идее, такое не должно компилиться. но тут огреха компилятора - собирает и не пикает. почему ты выставляешь экспу трупу - вообще загадка..

причем, до этого уничтожаешь его(само уничтожение происходит, кстати, только после выхода из скрипта). ладно. от теории к практике:
1. в скрипте смерти вернуть то, что тебе предлагали:
Neverwinter Script Source |
SetLocalObject(oCorpse, "oOwner", oPC); |
2. скрипт в слот OnSpellCastAt:
Neverwinter Script Source |
void main() { // страховка от установки скрипта на другой плэйс if (GetResRef(OBJECT_SELF) != "pc_corpse") return; object oPC = GetLocalObject(OBJECT_SELF, "oOwner"); // то, что ты никогда не делаешь, а очень зря!  if (oPC == OBJECT_INVALID) return;
int nPenalty; int nSpell = GetLastSpell(); if (nSpell == SPELL_RAISE_DEAD) nPenalty =100*GetHitDice(oPC); else if (nSpell==SPELL_RESURRECTION) nPenalty =50*GetHitDice(oPC); else return;
SendMessageToPC(oPC, "Перенадеваем вещи..."); //все эти команды выполнятся только после завершения скрипта AssignCommand(oPC, ClearAllActions(TRUE)); AssignCommand(oPC, ActionJumpToLocation(GetLocation(OBJECT_SELF))); AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING));
int nXP = GetXP(oPC); int nNewXP = nXP - nPenalty; SetXP(oPC, nNewXP);
AssignCommand(oPC, DelayCommand(10.0, ExecuteScript("reequip", oPC))); DestroyObject(OBJECT_SELF, 1.0); } |
3. скрипт "переодевания" - reequip.nss
Neverwinter Script Source |
void main() { object oItem; int nSlot; ClearAllActions(TRUE); for(nSlot = 0; nSlot < 14; nSlot++) { oItem = GetItemInSlot(nSlot, OBJECT_SELF); if (GetIsObjectValid(oItem)) { ActionUnequipItem(oItem); ActionEquipItem(oItem, nSlot); } } } |
ps. модифицировать это все нужно очень вкурчиво, следить за логикой и очередностью происходящих с объектами операций...
Мефистофель
May 23 2005, 07:23
Лито немогли бы вы показать целый скрипт, а то, я ничерта несмыслю.
Заранее спасибо.
JesterX
May 23 2005, 08:31
Кто нибудь помогите. Делаю модуль по мотивам книг Ника Перумова - Хранитель мечей, точнее по миру описанному там.
Скриптер из меня никакой. Герой умирает и переносится в межреальность, там общается и его отправляют назад в место где он погиб. Нужен скрипт телепорта на место смерти героя.
За основу я взял скрипты (помоему от Аваддон"а),и чуть переделал.
OnPlayerDying Герой без сознания.
void bleed(int iBleedAmt)
{
effect eShake=EffectVisualEffect(VFX_FNF_SCREEN_SHAKE);
effect eBleedEff;
if (GetCurrentHitPoints() <= 3) {
SpeakStringByStrRef (110519);
if (iBleedAmt > 0) {
eBleedEff = EffectDamage(iBleedAmt);
} else {
eBleedEff = EffectDamage(iBleedAmt);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);
if (GetCurrentHitPoints() <= -10) {
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF);
return;
}
if (iBleedAmt > 0) {
if (d10(1) == 1) {
iBleedAmt = -iBleedAmt;
}
}
}
DelayCommand(6.0,bleed(iBleedAmt));
}
void main()
{
effect eBlood=EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM);
object oDying = GetLastPlayerDying();
object oEnemy = GetLastAttacker();
float fWho = (GetFacing(oEnemy));
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eBlood, GetLocation(oDying), 10.0);
AssignCommand(oDying, ClearAllActions());
AssignCommand(oDying, bleed(1));
CreateObject(OBJECT_TYPE_PLACEABLE,"bloody",GetLocation(oDying),TRUE);
}
Далее OnPlayerDeath Герой умирает и переносится в межреальность.
void main()
{
object oPlayer = GetLastPlayerDied();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oPlayer));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MAJOR), oPlayer,6.0);
DelayCommand(2.0,FadeToBlack(oPlayer));
DelayCommand(5.0,BlackScreen(oPlayer));
DelayCommand(5.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer));
DelayCommand(5.8,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer));
DelayCommand(6.0,AssignCommand(oPlayer,ClearAllActions()));
DelayCommand(6.2,AssignCommand(oPlayer,JumpToLocation(GetLocation(GetObjectByTag("WP_RAISE")))));
}
И еще в локации межреальности - куда перемещается мертвый игрок OnEnter
void main()
{
object oPC = GetEnteringObject();
DelayCommand(2.0,FadeFromBlack(oPC,FADE_SPEED_SLOWEST));
}
Огромная просьба, ПОМОГИТЕ!!! Допишите скрипт пожалуйста.
QUOTE |
Но почему-то, когда НеПиСь выполняет команду ActionSit, то он больше не встает со стула! Почему же так происходит? Все компилится без проблем. Я пытался после этой ф-ии ставить ClearAllActions(), но непомогает. Так же пытался все преплести к DelayCommand, но толку никакого... Кто-нибудь знает в чем загвостка? ЗЫ Скрипт ставится в OnHeartBeat НеПиСя.
|
...в последнем предложении кроется ответ на твою проблем

"Скрипт ставится в OnHeartBeat НеПиСя. " наводящий вопрос : как часто выполняется скрипт на OnHeartBeat?
JesterXты извини, конечно, но напрашивается пародия на твой вопрос:
"я тут делаю модуль. вот нашел скрипт и немного его изменил: object oPC = OBJECT_SELF! помогите! допишите мне скрипт!"
ps. телепаты в отпуске.

pss. поясняю позицию - что там у тебя за диалоги? - остальное вроде интуитивно понятно, хотя конкретики тоже не помешает. что ты хочешь-то?
JesterX
May 23 2005, 08:57
Просто мне нужно как-то пометить место смерти и написать скрипт телепорта для отправки игрока на это самое место смерти.
так кинь там трупак... только что ведь обсуждалась очень схожая ситуация! смотри наши терки с Лито.
ps. народ, вам когда что-то такое надо, сами не знаете что или если чувствуете, что предстоит такое вот общение в режиме чата - идите на irc-канал #wrg(как и что - написано вверху страницы). у меня такое ощущение, что модератор уже откинул крышечку с оптики...
JesterX
May 23 2005, 09:20
В том то и дело, что труп на месте смерти мне не нужен.
Еще раз - Игрок умирает в точке А, и переносится в точку Б,
там он общается и его отправляют обратно в точку А.
Нужен скрипт отправки из Б в А
Я бы не писал все это если бы разбирался в скриптах.
Мефистофель, Хартбит все время повторяется, не так ли? Вот и подумай, твоему неписю каждые 6 секунд идет команда присесть на стул
Добавлено в [mergetime]1116832825[/mergetime] JesterX Neverwinter Script Source |
#include "x0_i0_secret" void main() { object oPC = GetLastPlayerDied(); object oJump = GetWaypointByTag("B");//Вэйпоинт с тэгом B TransportToWaypoint(oPC,oJump); } |
JesterX
May 23 2005, 10:25
#include "x0_i0_secret"
void main()
{
object oPC = GetLastPlayerDied();
object oJump = GetWaypointByTag("B");//Вэйпоинт с тэгом B
TransportToWaypoint(oPC,oJump);
}
Я так понял, что это отправка на место смерти.
А в инклюде что?
Или я не прав?
JesterX, это отправка с места смерти.
В инклюде в функция
Neverwinter Script Source |
TransportToWaypoint(oPC,oJump); |
.
Если хочешь чтобы игрока портили при разговоре на место смерти то -
Neverwinter Script Source |
#include "x0_i0_secret" void main() { object oPC = GetPCSpeaker(); object oJump = GetWaypointByTag("B");//Вэйпоинт с тэгом B TransportToWaypoint(oPC,oJump); } |
На скрипте смерти пишешь:
Neverwinter Script Source |
#include "x0_i0_secret" void main() { CreateObject(OBJECT_TYPE_WAYPOINT,"РесРэф Вэйпоинта",GetLocation(oPC),FALSE,"B"); } |
Подойдет скорее только для сингла.
JesterX
May 23 2005, 10:45
Спасибо!!! Щас буду пробовать. Потом отпишу.
в данном случае все проще - надо место смерти тупо повесить на объект игрока.

в конец скрипта OnPlayerDeath:
Neverwinter Script Source |
SetLocalLocation(oPlayer, "died_loc", GetLocation(oPlayer)); |
на "оживляющую" ветку диалога:
Neverwinter Script Source |
void main() { object oPC = GetPCSpeaker(); //извращения с фэйдом дорисовал... DelayCommand(0.2,FadeToBlack(oPC)); DelayCommand(3.0,BlackScreen(oPC)); DelayCommand(3.1, AssignCommand(oPC, JumpToLocation(GetLocalLocation(oPC, "died_loc")))); DelayCommand(7.0,FadeFromBlack(oPC,FADE_SPEED_SLOWEST)); } |
Archangel
May 23 2005, 12:20
QUOTE |
...в последнем предложении кроется ответ на твою проблем "Скрипт ставится в OnHeartBeat НеПиСя. " наводящий вопрос : как часто выполняется скрипт на OnHeartBeat? |
А куда ж его тогда пихать? Это самый подходящий слот. Темболее другие команды нормально работают. Все проверял раз 10, но НеПиСь застревает только на ActionSit!!!
Archangel, Значит именно на ActionSit, твой скрипт повторяется...
Archangel
May 23 2005, 13:01
QUOTE |
Archangel, Значит именно на ActionSit, твой скрипт повторяется... |
Интересно... Даж не знаю... А может еще куда-нить запихнуть моно, чтоб работало?
// Уу..развели тут без меня..
- все, что выше я читать в поисках вопросов неотвеченных не буду.
- пишите скрипты в NSS ([*]ТУТ СКРИПТ[/*], где * это NSS), а то хрен прочитаешь.
Archangelне надо его никуда "пихать" - все необходимые проверки для исключения повторного выполнения "действующих" кусков кода выполнены.
что нужно сделать:
1. после блока объявления объектов поставь ClearAllActions(TRUE);
2. все нужно перетащить под DelayCommand, ибо иначе ты не имеешь возможности нормально управлять процессом - в частности, в существующем варианте, если ты после команды усадки на стул поставишь ClearAllActions(TRUE), чтобы поднять непися, то ничего не выйдет, потому как к моменту выполнения этого ClearAllActions непись успеет только первый Actionбла-бла отработать. и он встанет и больше ничего не сделает.
после каждой ночной "усадки" нужно вставить DelayCommand(<время за которое непись уже сядет и успеет посидеть>, ClearAllActions(TRUE));
собственно и все. совет(и не только тебе) - еще пару раз перечитать доки и попытаться четко себе представить, как именно работают все функции, связанные с Actions.
dumbo, поставил твой скрипт, ничего не меняя(ну всмысле сделал все как ты сказал)
Опыт снимается, чар рукой машет, но в локу к трупу не транпортируется

Вопрос снимается повестки
Мефистофель
May 23 2005, 19:44
QUOTE (Лито @ May 23 2005, 10:16) |
Мефистофель, Хартбит все время повторяется, не так ли? Вот и подумай, твоему неписю каждые 6 секунд идет команда присесть на стул |
Я не понел, я спрашивал про стул.?????
Лито я ввожу эти полоски скрипта что вы мне дали, проавильно. но
Мне всюравно выдаёт ошибку, я прошу, может ты знаеш. Напиши этот скрипт в настоящем размере, а то я сам немогу все эти ковычки и т.д я просто не понимаю. спасибо заранее.
скрипт я ещё раз опишу.
в ХотУ был момент когда жирный куб, сожрал дроу, и он дёргался сночало а потом превратился в скелета, продолжал дёргатся и умер, мне очень нужно чтоб у меня также сробатывал скрипт но талько, чтобы он запускался при смерти Непися. Пожалуйста последняя надежда на вас. Спасибо.
QUOTE (Мефистофель @ May 23 2005, 20:44) |
в ХотУ был момент когда жирный куб, сожрал дроу, и он дёргался сночало а потом превратился в скелета, продолжал дёргатся и умер, мне очень нужно чтоб у меня также сробатывал скрипт но талько, чтобы он запускался при смерти Непися. Пожалуйста последняя надежда на вас. Спасибо. |
я так понял, что ты сам писать не хочешь, а хочешь, чтобы это тебе сделали...эх... это не есть гут.
Напишу позже вечером.
Мефистофель
May 24 2005, 02:19
Lex Я знаю, что это не есть хорошо, нопросто этот скрипт мне очень нужен, а я просто не в состоянии его написать, я пробовал, много раз но ничё не выходило. и поэтому попросил у вас.
Слот onDamage
в свойствах НПС поставь immortale
(не проверял на работу, если убивать магией смерти

)
Neverwinter Script Source |
void CreateSkelet(location lLoc) { string sRef = "C_SKELETON"; // Резреф твоего скелета CreateObject(OBJECT_TYPE_CREATURE,sRef,lLoc); } void main() { //-------------------------------------------------------------------------- // GZ: 2003-10-16 // Make Plot Creatures Ignore Attacks //-------------------------------------------------------------------------- if (GetPlotFlag(OBJECT_SELF)) { return; }
//-------------------------------------------------------------------------- // Execute old NWN default AI code //-------------------------------------------------------------------------- ExecuteScript("nw_c2_default6", OBJECT_SELF); if ((GetCurrentHitPoints()==1) && (!GetLocalInt(OBJECT_SELF,"DEATH"))) { ClearAllActions(TRUE); SetLocalInt(OBJECT_SELF,"DEATH",TRUE); DelayCommand(0.3,SetCommandable(FALSE,OBJECT_SELF)); // АНИМАЦИЯ СТОЯЧЕГО ДРЫГАНЬЯ. НЕ ОЧЕНЬ ХОРОШАЯ.. САМ УВИДИШЬ. // МЕНЯЙ НА КАКУЮ НАДО + Я БЫ ДОБАВИЛ ПАРУ ВИЗУАЛОК ДЛЯ КРАСОТЫ. И ПРЯМО ПЕРЕД ПОЯВЛЕНИЕМ СКЕЛЕТА ТОЖЕ // КАКОЙ-НИТЬ ВИЗУАЛЬЧИК СДЕЛАЛ БЫ. НО ЭТО УЖЕ САМ. ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_SIDE); ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK); ActionPlayAnimation(ANIMATION_FIREFORGET_SPASM); ActionDoCommand(SetImmortal(OBJECT_SELF,FALSE)); ActionDoCommand(DelayCommand(1.5,CreateSkelet(GetLocation(OBJECT_SELF)))); ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),OBJECT_SELF)); }
} |
Добавлено в [mergetime]1116893087[/mergetime]
QUOTE (Мефистофель @ May 23 2005, 20:44) |
Я не понел, я спрашивал про стул.????? |
а что про стул?
Если ты в ХБ пишешь ActionSit() то будет вот что:
- выполнится команда первый раз, но команда такого типа, что выполяется (те НПС/РС сидит) пока не будет удалена (ClearAllActions())
- через 6 сек у тебя в очереди (стеке) окажется 2 команды. 1 которая выполяется, другая следующая, ждущая своей очереди.
- еще через 6 секунд, и уже 3 команды на персонаже.
- ...
- Доходим до ХХ команд и ловим глюки.

Или не ловим. Для сингла ситуация не критична, для шарда это более серьезно.
Добавлено в [mergetime]1116893506[/mergetime] QUOTE (Archangel @ May 22 2005, 12:03) |
Но почему-то, когда НеПиСь выполняет команду ActionSit, то он больше не встает со стула! |
Выше написал, в чем проблема.
Чтобы снять ее, юзай ClearAllActions()
Там задержку нужную поставь.
Мефистофель
May 24 2005, 12:00
Респект тебе Lex, спасибо огромное, хы жалко мало таких людей которые что то для других делают.
Вот такая идейка появилась. В теме одиночный вопрос - усложняют жизнь магам. У меня такой вариант. Ограничить кол-во щитов, которые маг может на себя наложить(оболочка местила, лементальный щит, броня смерти).
Если висит щит местилы, наложить death-armor уже не выйдет или элементальный щит, уже не выйдет. То есть либо, либо,либо.
То что это делается через spell-hook, я знаю. Просьба написать основу, а дальше я уже по приведенному примеру будут писать сам. Конечно кроме благодарности ничего взамен предложить не могу, попытаюсь по мере сил, отвечать новичкам на более-менее не сложные вопросы
Ок я конечно, что лень писать что то, самому не нужное. Но тогда прошу проверить последующий далее скрипт spell-hook и сказать, что в нем не правильно?
Neverwinter Script Source |
#include "nw_i0_tool" #include "x2_inc_switches" void main() { object oPC = OBJECT_SELF; object oTarget = GetSpellTargetObject(); object oSymbol = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); object oItem = GetSpellCastItem(); int nSpell = GetSpellId();
if (GetLevelByClass(CLASS_TYPE_CLERIC, oPC) && (GetIsDM(oPC) == FALSE)) { if (GetIsObjectValid(oItem)) { return; }
if (GetTag(oSymbol) != "cleric_symbol") { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âàì íåîáõîäèì âàø ñèìâîë!"); }
} if (GetLevelByClass(CLASS_TYPE_DRUID, oPC) && (GetIsDM(oPC) == FALSE)) { if (GetIsObjectValid(oItem)) { return; } if(HasItem(oPC, "druid_symbol")==FALSE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âàì íåîáõîäèì âàø ñèìâîë!"); } if (GetLevelByClass(CLASS_TYPE_RANGER, oPC) && (GetIsDM(oPC) == FALSE)) { if (GetIsObjectValid(oItem)) { return; } if(HasItem(oPC, "druid_symbol")==FALSE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âàì íåîáõîäèì âàø ñèìâîë!"); }
}
// Êîíåö äèâàéí ÷àñòè. switch (nSpell) { case SPELL_MESTILS_ACID_SHEATH: if(GetHasSpellEffect(SPELL_MESTILS_ACID_SHEATH)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû óæå îáëàäàåòå ýòèì ýôôåêòîì!"); } else if(GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); } else if(GetHasSpellEffect(SPELL_DEATH_ARMOR)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); } break;
case SPELL_ELEMENTAL_SHIELD:
if(GetHasSpellEffect(SPELL_MESTILS_ACID_SHEATH)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); } else if(GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû óæå îáëàäàåòå ýòèì ýôôåêòîì!"); } else if(GetHasSpellEffect(SPELL_DEATH_ARMOR)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); }
case SPELL_DEATH_ARMOR:
if(GetHasSpellEffect(SPELL_MESTILS_ACID_SHEATH)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); } else if(GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû íå ìîæåòå íàëîæèòü íà ñåáÿ ýòî çàêëèíàíèå â äàííûé ìîìåíò!"); } else if(GetHasSpellEffect(SPELL_DEATH_ARMOR)==TRUE) { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "Âû óæå îáëàäàåòå ýòèì ýôôåêòîì!"); }
case SPELL_RESURRECTION: int nPenalty = 50*GetHitDice(oTarget); int nXP = GetXP(oTarget); int nNewXP = nXP - nPenalty; SetXP(oTarget,nNewXP); object oItem; int nSlot; AssignCommand(oTarget,ClearAllActions(TRUE)); for(nSlot = 0; nSlot < 14; nSlot++) { oItem = GetItemInSlot(nSlot, oTarget); if(oItem != OBJECT_INVALID) { AssignCommand(oTarget, ActionUnequipItem(oItem)); AssignCommand(oTarget, ActionEquipItem(oItem, nSlot)); } } break; } switch (nSpell) { case SPELL_RAISE_DEAD: int nPenalty =100*GetHitDice(oTarget); int nXP = GetXP(oTarget); int nNewXP = nXP - nPenalty; SetXP(oTarget,nNewXP); object oItem; int nSlot; AssignCommand(oTarget,ClearAllActions(TRUE)); for(nSlot = 0; nSlot < 14; nSlot++) { oItem = GetItemInSlot(nSlot, oTarget); if(oItem != OBJECT_INVALID) { AssignCommand(oTarget, ActionUnequipItem(oItem)); AssignCommand(oTarget, ActionEquipItem(oItem, nSlot)); } }
break; } } } |
Lorendroll
May 25 2005, 21:31
Хм... Могу сделать только одно замечание по поводу русских символов в скрипте. Лично я помню очень долго парился по поводу того, что не работал скрипт. Оказалось - мешает русский текст после двойного слеша(!). Так что не знаю, попробуй на всякий случай убрать ВСЕ русские символы из скрипта.
Хотя сам скрипт проверить нет времени (да и сам я пока не асс). Просто это первое что бросилось в глаза.
Lorendroll, Да нет, с этим все нормально. Тулсет прошит патчем от dumbo.
Лито1. тебя погубят пиво, сигареты, и безответственность в расставлении отступов!

из-за халатности в правильном форматировании скрипта, ты теряешь визуальное разделение логических блоков. отсюда ошибки. у тебя почти весь скрипт попал под условие "if (GetLevelByClass(CLASS_TYPE_DRUID..." - оттого и не работал. забыл break'и почти во всех case. и уж слишком "раздуплился"..

2. сильно запутанный в смысловом плане скрипт получился. с предмета кастовать щиты могут клиры,друиды и рэйнджеры. остальные подвергаются проверке. опять же, если эти выделенные товарищи кастанут резуррект или райз со свитка, то твое снятие экспы не задействуется. ибо return.
][umepa
May 26 2005, 09:27
народ а не могли бы вы подсказать скрипт что бы после каста заклятья у игрока отнимались хиты?
][umepa читать сообщения на форуме - это, знаешь ли, не порок
..прежде чем задавать вопрос - посмотри все темы сопутствующие(хотя бы последние посты по ним)...в частности ответ на твой вопрос в соседней теме -"одиночный вопрос"( только что люди обсуждали скрипт про дикого мага..там и пример скрипта имееться)

добавлено сорри balrog мага Крови
balrog
May 26 2005, 10:48
кхе кхе.... не дикого! а Мага крови! *говорит это на повышенном тоне, поднемая палец вверх*...
простите за оффтоп
Кто знает, как можно удалить лутовый контейнер в ХоТУ 1.65. Только не говорите, по ТАГу. Не удаляет...
Задача: при выходе из локации почистить весь лут, что выпал. Ну или вообще как скриптами запретить выпадение лута. Если это возможно.
Добавлено в [mergetime]1117136150[/mergetime]
Контейнер не имеет ресрефа и определяется константа типа как 64.
Мефистофель
May 27 2005, 01:53
Aiwan если я вас конечно правильно понел. то.
Способ 1. открыть модуль, и когда он загрузится, открыть папку temp0, что появится в папке Модулес, а там удалять что нужно. PS я так удалял, теги соУ, чтобы модули сделанные на соУ шли под ХотУ.
Способ 2. открыть туллсет нажать создать скрипт, нажать открыть скрипт, и выделить то, что надо удалить и нажать delete.
PS: Скрипты я к примеру взял, также можно удалять, ХкПаки, звуки, предметы (вроде?).
Aiwanвесь твой вопрос зависит только от одного - откуда этот контейнер и, соответственно, лут берется? потому как и при чистке на выходе и при запрете надо знать тэги или резрефы этих контейнеров. в общем странный вопрос у тебя.

QUOTE (Aiwan @ May 26 2005, 23:26) |
Контейнер не имеет ресрефа и определяется константа типа как 64 |
не понял ничего, кроме отсутствия резрефа. и почему он вдруг отсутствует?
][umepa
May 27 2005, 09:00
сенки сори за невнимательность вчера выпускной был я ещё не отошел
dumbo том то и дело, я знаю Тег но у этого объекта нет ресрефа. Возможно это ноухау биовар... Дело такое, возьми любого стандартного монстра, убей его. Из него выпадает мешок с лутом. Этот мешок будет иметь Таг "BodyBag" и если попросить узнать его Ресреф то будет пустота. И удалить его низя по тегу. Пишет в дебаг что мол нашел такой объект, удаляю но он остается... Тип этого объекта 64. У крича 1 - Это константы.
Добавлено в [mergetime]1117175292[/mergetime]
Neverwinter Script Source |
string sResRef = GetResRef(oDestr); string sTag = GetTag(oDestr); // Debag message string sType = IntToString(GetObjectType(oDestr)); Debug("All Object - TAG = "+sTag+" ResRef = "+sResRef+" TAPY = "+sType); // Debag message |
Вот так я ловлю все предметы на локе при выходе.