Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Lex
QUOTE (Убо-Сатло @ May 21 2005, 18:25)
А диалог вставить в ->свойства плэйса -> улучшеный-> разговор

вот это ты сделал?
Добавлено в [mergetime]1116687381[/mergetime]
QUOTE (Убо-Сатло @ May 21 2005, 18:25)
void main()
{
  ActionStartConversation(GetLastUsedBy());
}

это пашет - 100%.
Лито
Конечно yes.gif . Все поставил.

Сейчас еще проверю...

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

Новый вопрос у меня, дроп золота я сделал. Теперь у меня задача сделать дроп одной случаной вещи из инвенторя. Дальше возможны варианты выпадение вещи по ее стоимости или скажем выпадение одной одетой вещи(кстати дополнительный вопрос: как правильно говорить? Одетой и надетой? smile.gif). (это когда игроки забивают всю сумку хламом...)
Мефистофель
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
Кто нибудь помогите. Делаю модуль по мотивам книг Ника Перумова - Хранитель мечей, точнее по миру описанному там.
Скриптер из меня никакой. Нужен скрипт:
Герой умирает и переносится в межреальность, там общается и его отправляют назад в место где он погиб.
За основу я взял скрипты (помоему от Аваддон"а),и чуть переделал.

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
Люди, памажите! Вот скрипт:
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, но толку никакого... black eye.gif
Кто-нибудь знает в чем загвостка?
ЗЫ
Скрипт ставится в 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();
уже не верно.
Даже не знаю как реализовать dntknw.gif , помогайте мастера shout.gif
dumbo
а причем тут GetNextPC()?! - это функция получения следущего объекта игрока при перечислении игроков. тебе надо при создании трупа игрока на объект трупа вешать ссылку на объект игрока. и потом при юзании резурректа на труп, читать с него переменную объекта игрока и уже с ней работать.
Лито
dumbo, что надо использовать не GetNextPC() мне понятненько, а вот это:
1п.
QUOTE
вешать ссылку на объект игрока
- нет, как это сделать?

Я надеюсь что пойму вот это:
2п.
QUOTE
читать с него переменную объекта игрока и уже с ней работать.

Но для начала надо разобратся с 1п dntknw.gif
dumbo
где-то в подыхании игрока стоит что-то вроде:
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-канал. там самое место для такого чата. yes.gif
Лито
Собственно поставил на 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. Где проблема опять же ума не приложу dntknw.gif
Добавлено в [mergetime]1116779131[/mergetime]
QUOTE
ps. и юзайте irc-канал. там самое место для такого чата.

Да...пора бы уже настроить.
dumbo
Лито, ты своим введением все и поломал. wink.gif
QUOTE (Лито @ May 22 2005, 20:24)
GetName(oPC), потому что делается для шарда, и локалка по идее должна отличатся от локалок других трупов. и написал вот такой скрипт на OnCastSpell трупа
не должна она отличаться. у каждого трупа своя переменная "oOwner". ты же не путаешь свою ногу с чужой только от того, что они обе называются "нога"? потом еще момент - я писал определение GetSpellTargetObject(), потому как предполагал, что ты изменяешь скрипт спелла(общего). в пределах скрипта OnSpellCastAt это определение бессмысленно. вот эта твоя конструкция вообще не выдерживает никакой критики:
Neverwinter Script Source
object oPC = GetLocalObject(oTarget, GetName(oPC));
по идее, такое не должно компилиться. но тут огреха компилятора - собирает и не пикает. почему ты выставляешь экспу трупу - вообще загадка.. wink.gif причем, до этого уничтожаешь его(само уничтожение происходит, кстати, только после выхода из скрипта). ладно. от теории к практике:
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");
  // то, что ты никогда не делаешь, а очень зря! pardon.gif
  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. модифицировать это все нужно очень вкурчиво, следить за логикой и очередностью происходящих с объектами операций... drag.gif
Мефистофель
Лито немогли бы вы показать целый скрипт, а то, я ничерта несмыслю.
Заранее спасибо.
JesterX
Кто нибудь помогите. Делаю модуль по мотивам книг Ника Перумова - Хранитель мечей, точнее по миру описанному там.
Скриптер из меня никакой. Герой умирает и переносится в межреальность, там общается и его отправляют назад в место где он погиб. Нужен скрипт телепорта на место смерти героя.
За основу я взял скрипты (помоему от Аваддон"а),и чуть переделал.

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));
}

Огромная просьба, ПОМОГИТЕ!!! Допишите скрипт пожалуйста.
mamuc
QUOTE
Но почему-то, когда НеПиСь выполняет команду ActionSit, то он больше не встает со стула! Почему же так происходит? Все компилится без проблем.
Я пытался после этой ф-ии ставить ClearAllActions(), но непомогает. Так же пытался все преплести к DelayCommand, но толку никакого... 
Кто-нибудь знает в чем загвостка?
ЗЫ
Скрипт ставится в OnHeartBeat НеПиСя.


...в последнем предложении кроется ответ на твою проблем lol.gif "Скрипт ставится в OnHeartBeat НеПиСя. " наводящий вопрос : как часто выполняется скрипт на OnHeartBeat?
dumbo
JesterX
ты извини, конечно, но напрашивается пародия на твой вопрос:
"я тут делаю модуль. вот нашел скрипт и немного его изменил: object oPC = OBJECT_SELF! помогите! допишите мне скрипт!"
ps. телепаты в отпуске. yes.gif
pss. поясняю позицию - что там у тебя за диалоги? - остальное вроде интуитивно понятно, хотя конкретики тоже не помешает. что ты хочешь-то?
JesterX
Просто мне нужно как-то пометить место смерти и написать скрипт телепорта для отправки игрока на это самое место смерти.
dumbo
так кинь там трупак... только что ведь обсуждалась очень схожая ситуация! смотри наши терки с Лито.
ps. народ, вам когда что-то такое надо, сами не знаете что или если чувствуете, что предстоит такое вот общение в режиме чата - идите на irc-канал #wrg(как и что - написано вверху страницы). у меня такое ощущение, что модератор уже откинул крышечку с оптики...
JesterX
В том то и дело, что труп на месте смерти мне не нужен.
Еще раз - Игрок умирает в точке А, и переносится в точку Б,
там он общается и его отправляют обратно в точку А.
Нужен скрипт отправки из Б в А
Я бы не писал все это если бы разбирался в скриптах.
Лито
Мефистофель, Хартбит все время повторяется, не так ли? Вот и подумай, твоему неписю каждые 6 секунд идет команда присесть на стул biggrin.gif
Добавлено в [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
#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
Спасибо!!! Щас буду пробовать. Потом отпишу.
dumbo
в данном случае все проще - надо место смерти тупо повесить на объект игрока. yes.gif
в конец скрипта 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
QUOTE
...в последнем предложении кроется ответ на твою проблем  "Скрипт ставится в OnHeartBeat НеПиСя. " наводящий вопрос : как часто выполняется скрипт на OnHeartBeat?

А куда ж его тогда пихать? Это самый подходящий слот. Темболее другие команды нормально работают. Все проверял раз 10, но НеПиСь застревает только на ActionSit!!!
Лито
Archangel, Значит именно на ActionSit, твой скрипт повторяется...
Archangel
QUOTE
Archangel, Значит именно на ActionSit, твой скрипт повторяется...

Интересно... Даж не знаю... А может еще куда-нить запихнуть моно, чтоб работало? this.gif
Lex
// Уу..развели тут без меня..
- все, что выше я читать в поисках вопросов неотвеченных не буду.
- пишите скрипты в NSS ([*]ТУТ СКРИПТ[/*], где * это NSS), а то хрен прочитаешь.
dumbo
Archangel
не надо его никуда "пихать" - все необходимые проверки для исключения повторного выполнения "действующих" кусков кода выполнены.
что нужно сделать:

1. после блока объявления объектов поставь ClearAllActions(TRUE);
2. все нужно перетащить под DelayCommand, ибо иначе ты не имеешь возможности нормально управлять процессом - в частности, в существующем варианте, если ты после команды усадки на стул поставишь ClearAllActions(TRUE), чтобы поднять непися, то ничего не выйдет, потому как к моменту выполнения этого ClearAllActions непись успеет только первый Actionбла-бла отработать. и он встанет и больше ничего не сделает. yes.gif
после каждой ночной "усадки" нужно вставить DelayCommand(<время за которое непись уже сядет и успеет посидеть>, ClearAllActions(TRUE));

собственно и все. совет(и не только тебе) - еще пару раз перечитать доки и попытаться четко себе представить, как именно работают все функции, связанные с Actions.
Лито
dumbo, поставил твой скрипт, ничего не меняя(ну всмысле сделал все как ты сказал)
Опыт снимается, чар рукой машет, но в локу к трупу не транпортируется sad.gif

Вопрос снимается повестки smile.gif
Мефистофель
QUOTE (Лито @ May 23 2005, 10:16)
Мефистофель, Хартбит все время повторяется, не так ли? Вот и подумай, твоему неписю каждые 6 секунд идет команда присесть на стул  biggrin.gif 

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

я так понял, что ты сам писать не хочешь, а хочешь, чтобы это тебе сделали...эх... это не есть гут.

Напишу позже вечером.
Мефистофель
Lex Я знаю, что это не есть хорошо, нопросто этот скрипт мне очень нужен, а я просто не в состоянии его написать, я пробовал, много раз но ничё не выходило. и поэтому попросил у вас.
Lex
Слот onDamage
в свойствах НПС поставь immortale
(не проверял на работу, если убивать магией смерти smile.gif )
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 команды на персонаже.
- ...
- Доходим до ХХ команд и ловим глюки. smile.gif Или не ловим. Для сингла ситуация не критична, для шарда это более серьезно.
Добавлено в [mergetime]1116893506[/mergetime]
QUOTE (Archangel @ May 22 2005, 12:03)
Но почему-то, когда НеПиСь выполняет команду ActionSit, то он больше не встает со стула!

Выше написал, в чем проблема.
Чтобы снять ее, юзай ClearAllActions()
Там задержку нужную поставь.
Мефистофель
Респект тебе Lex, спасибо огромное, хы жалко мало таких людей которые что то для других делают.
Лито
Вот такая идейка появилась. В теме одиночный вопрос - усложняют жизнь магам. У меня такой вариант. Ограничить кол-во щитов, которые маг может на себя наложить(оболочка местила, лементальный щит, броня смерти).
Если висит щит местилы, наложить death-armor уже не выйдет или элементальный щит, уже не выйдет. То есть либо, либо,либо.
То что это делается через spell-hook, я знаю. Просьба написать основу, а дальше я уже по приведенному примеру будут писать сам. Конечно кроме благодарности ничего взамен предложить не могу, попытаюсь по мере сил, отвечать новичкам на более-менее не сложные вопросы smile.gif
Лито
Ок я конечно, что лень писать что то, самому не нужное. Но тогда прошу проверить последующий далее скрипт 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
Хм... Могу сделать только одно замечание по поводу русских символов в скрипте. Лично я помню очень долго парился по поводу того, что не работал скрипт. Оказалось - мешает русский текст после двойного слеша(!). Так что не знаю, попробуй на всякий случай убрать ВСЕ русские символы из скрипта.
Хотя сам скрипт проверить нет времени (да и сам я пока не асс). Просто это первое что бросилось в глаза.
Лито
Lorendroll, Да нет, с этим все нормально. Тулсет прошит патчем от dumbo.
dumbo
Лито
1. тебя погубят пиво, сигареты, и безответственность в расставлении отступов! yes.gif из-за халатности в правильном форматировании скрипта, ты теряешь визуальное разделение логических блоков. отсюда ошибки. у тебя почти весь скрипт попал под условие "if (GetLevelByClass(CLASS_TYPE_DRUID..." - оттого и не работал. забыл break'и почти во всех case. и уж слишком "раздуплился".. smile.gif
2. сильно запутанный в смысловом плане скрипт получился. с предмета кастовать щиты могут клиры,друиды и рэйнджеры. остальные подвергаются проверке. опять же, если эти выделенные товарищи кастанут резуррект или райз со свитка, то твое снятие экспы не задействуется. ибо return.
][umepa
народ а не могли бы вы подсказать скрипт что бы после каста заклятья у игрока отнимались хиты?
mamuc
][umepa читать сообщения на форуме - это, знаешь ли, не порок biggrin.gif diablo.gif
..прежде чем задавать вопрос - посмотри все темы сопутствующие(хотя бы последние посты по ним)...в частности ответ на твой вопрос в соседней теме -"одиночный вопрос"( только что люди обсуждали скрипт про дикого мага..там и пример скрипта имееться) biggrin.gif

добавлено сорри balrog мага Крови biggrin.gif
balrog
кхе кхе.... не дикого! а Мага крови! *говорит это на повышенном тоне, поднемая палец вверх*...
простите за оффтоп black eye.gif
Aiwan
Кто знает, как можно удалить лутовый контейнер в ХоТУ 1.65. Только не говорите, по ТАГу. Не удаляет...
Задача: при выходе из локации почистить весь лут, что выпал. Ну или вообще как скриптами запретить выпадение лута. Если это возможно.
Добавлено в [mergetime]1117136150[/mergetime]
Контейнер не имеет ресрефа и определяется константа типа как 64.
Мефистофель
Aiwan если я вас конечно правильно понел. то.
Способ 1. открыть модуль, и когда он загрузится, открыть папку temp0, что появится в папке Модулес, а там удалять что нужно. PS я так удалял, теги соУ, чтобы модули сделанные на соУ шли под ХотУ.
Способ 2. открыть туллсет нажать создать скрипт, нажать открыть скрипт, и выделить то, что надо удалить и нажать delete.
PS: Скрипты я к примеру взял, также можно удалять, ХкПаки, звуки, предметы (вроде?).
dumbo
Aiwan
весь твой вопрос зависит только от одного - откуда этот контейнер и, соответственно, лут берется? потому как и при чистке на выходе и при запрете надо знать тэги или резрефы этих контейнеров. в общем странный вопрос у тебя. dntknw.gif
QUOTE (Aiwan @ May 26 2005, 23:26)
Контейнер не имеет ресрефа и определяется константа типа как 64
не понял ничего, кроме отсутствия резрефа. и почему он вдруг отсутствует?
][umepa
сенки сори за невнимательность вчера выпускной был я ещё не отошел dirol.gif crazy.gif
Aiwan
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

Вот так я ловлю все предметы на локе при выходе.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.