Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > 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, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Dik Morris
SERGO“А как сделать, чтобы вот эта анимация питья делалась очень редко! А то она уж слишком частая!”
На onHeartBeat обьекта поставь:

void main()
{
ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK,1.0f,15.0f);
}
П.С: обрати внимание, что ты можешь сам регулировать скорость проигрывания той или иной анимации, (в данном случае питья), 1.0f, - это скорость с которой НПС проигрывает анимацию, а 15.0f, - время проигрывания.

Как прописать скрипт, чтобы НПС все время ходил по двум, трем... вайпоинтам без остановки.
Насчет этого сильно голову не надо забивать, просто создай вайпоинты (сколько хочешь, можно хоть 20 - 30) выбери их и нажми: СОЗДАТЬ НАБОР, там пиши: WP_ + ТЭГ СОЗДАНИЯ. Все.
П.С: у создания (ходящего по вайпоинтам должен быть уникальный ТЭГ)
SERGO
как в таком коде зделать так, чтобы НеПиСь после диалога сного начал ходит по точкам?
Neverwinter Script Source
#include "NW_I0_GENERIC"
void main()
{
   ActionSpeakString("Hmm, where's my horse?");
   WalkWayPoints(FALSE, 5.0);
}


Не на Херт Бит а на Спаун
Aiwan
QUOTE (Dik Morris @ Jun 25 2005, 16:01)
На onHeartBeat обьекта поставь:

не надо ставить на ХертБит ничего. nea.gif
Dik Morris
Решил тут я квест сделать...Без МАСТЕРА СЮЖЕТА...И сразу вопрос назрел выложте кому не трудно скриптик чтобы после убийства определенного НПС обновлялся журнал.
Tiger Greyhawk
QUOTE (SERGO @ Jun 25 2005, 08:25)
Я делал по твоей инструкции, и получилось так, что НеПиСь при попытке разговора поворачивается, есть диалог, а дальше он по точкам не ходит. Как сделать чтобы он и далльше ходил? (после диалога)

ммм... мне непонятно, почему у тебя возникает этот вопрос dntknw.gif если ты сделал все правильно. Непись, вроде, должна после разговора продолжать ходить по вейпам. В крайнем случае, попробуй на все ветки окончания разговора повесить еще раз WalkWayPoints, но это, по идее, глупый совет. Должно и так все работать.

QUOTE (SERGO @ Jun 25 2005, 08:25)
А как сделать, чтобы вот эта анимация питья делалась очень редко! А то она уж слишком частая!
Делай проверки. К примеру:
if мояпеременная = 0
{
поставить переменную в значение 1;
выполнить анимацию ;
задержка (60 сек, поставить переменную в значение 0);
}

QUOTE (Dik Morris @ Jun 25 2005, 20:50)
Решил тут я квест сделать...Без МАСТЕРА СЮЖЕТА...И сразу вопрос назрел выложте кому не трудно скриптик чтобы после убийства определенного НПС обновлялся журнал.

А зачем оно тебе? Если тебе надо разобраться в скриптах, то начни с задачи попроще. А если надо готовый квест сделать, то используй визард. Если ты расчитываешь, что все время тебе будут выдавать готовые скрипты, то я тебя разочрую, придется разбираться самому(на основе того, что тебе делает визард, можно разобраться. + конечно же, лексикон). Если тебе непонятна какая-то конкретная проблема, то да, поможем. Сорри. dntknw.gif
функция для строки журнала (естественно, журнал должен содержать эти строки):
Neverwinter Script Source
AddJournalQuestEntry(string szPlotID, int nState, object oCreature, int bAllPartyMembers=TRUE, int bAllPlayers=FALSE, int bAllowOverrideHigher=FALSE)

szPlotID - таг записи журнала
nState - "выполненность": номер строки в журнале. Ставится в самом журнале. (там есть флаг завершенности квеста)
oCreature - объект для записи журнала (т.е. игрок)
bAllPartyMembers - TRUE - для всей партии в которой состоит oCreature, FALSE - только для oCreature
bAllPlayers - вообще для всех игроков в модуле
bAllowOverrideHigher - разрешено ли "понижать строки". Если TRUE и была достигнута более "высокая" строка, то она "понизиться" на это значение. Если  FALSE (по-умолчанию), то строки будут только повышаться.
SERGO
Народ, мона кому нить в Аську пописать вопросы, а то тут уж больно долго ждать ответы на поставленные вопросы?
defolt
QUOTE (SERGO @ Jun 26 2005, 12:12)
Народ, мона кому нить в Аську пописать вопросы, а то тут уж больно долго ждать ответы на поставленные вопросы?


иди на канал WRG, там должны помочь, ведь для чего то он все таки нужен...
SERGO
QUOTE (Archangel @ Jun 24 2005, 21:23)


Нужен вот такой скрипт:
Neverwinter Script Source
void main()
{
object oNPC1 = GetObjectByTag("ТЭГ_ПЕРВОГО_ОХРАННИКА");
object oNPC2 = GetObjectByTag("ТЭГ_ВТОРОГО_ОХРАННИКА");
object oWP1= GetWaypointByTag("ТЭГ_ВЭЙПОИНТА_НА_УЛИЦЕ");
object oWP2= GetWaypointByTag("ТЭГ_ВЭЙПОИНТА_В_ЗДАНИИ(которому принадлежит дверь)");
object oDoor = GetObjectByTag("ТЭГ_ДВЕРИ");
if (GetIsDay() && GetLocalInt(oNPC1, "Day") != 1)
{
DelayCommand(1.0, AssignCommand(oNPC1, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0)));
DelayCommand(5.0, AssignCommand(oNPC1, ActionJumpToObject(oWP2)));
DelayCommand(9.0, AssignCommand(oNPC1, ActionForceMoveToObject(oNPC2,FALSE, 1.0, 7.0)));
DelayCommand(1.0, AssignCommand(oNPC2, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0)));
DelayCommand(5.0, AssignCommand(oNPC2, ActionJumpToObject(oWP1)));
SetLocalInt(oNPC1, "Day", 1);
SetLocalInt(oNPC1, "Night", 0);
return;
}
if (GetIsNight()&& GetLocalInt(oNPC1, "Night") != 1)
{
DelayCommand(1.0, AssignCommand(oNPC2, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0)));
DelayCommand(5.0, AssignCommand(oNPC2, ActionJumpToObject(oWP2)));
DelayCommand(9.0, AssignCommand(oNPC2, ActionForceMoveToObject(oNPC1,FALSE, 1.0, 7.0)));
DelayCommand(11.0, AssignCommand(oNPC2, SpeakString("Иди отдыхай. Теперь моя смена.")));
DelayCommand(13.0, AssignCommand(oNPC1, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0)));
DelayCommand(17.0, AssignCommand(oNPC1, ActionJumpToObject(oWP1)));
SetLocalInt(oNPC1, "Day", 0);
SetLocalInt(oNPC1, "Night", 1);
return;
}
}

Это очень упрощенная версия скрипта. Может найдутся люди, которые напишут его подробнее, а у меня сейчас времени нет. wink.gif
З.Ы.:
Также не исключаю наличие ошибок в скриптах. Тулсета под рукой нет.

Ну я сделал, теперь первый охранник уходит появляет ся второй, второй-же за ним уходит, и они вместе стоят в таверне!
Archangel
Ща посмотрим... так, так... Для начала надо переделать это:
Neverwinter Script Source
DelayCommand(13.0, AssignCommand(oNPC2, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0)));
DelayCommand(18.0, AssignCommand(oNPC2, ActionJumpToObject(oWP1)));

А куда ты вообще ставил этот скрипт? Все остальное, в принципе, должно работать.

SERGO
QUOTE
А куда ты вообще ставил этот скрипт? Все остальное, в принципе, должно работать.

Я вставлял в Свойства Области -> События -> OnHeartBeat
-fenix-
Люди у вас вот что происходит:
Идет проверка сейчас день? - день!, лок.пер. "день"не равн.1 - не равн. ее просто нет - значит охраник уходит, на его место преходит новый, лок.перем "день" ставим на 1, лок.перем "ночь" ставим на 0.

Сменный охраник выходит и смотрит: сейчас ночь? - ночь!, лок.перем. "ночь" не равн. 1 - конечно не равн. мыж ее на ноль в прошлый раз поставили, значит он уходит.

И оба охраника стоят в таверне и ни когда не выйдут т.к обе перем. равны 1.

А вот подумать как исправить у меня времени нет biggrin.gif , уже убегаю.
SERGO
Балин, подскажите код, не могу понять, как реализовать идею Феникса
Dvemer
У меня глупый вопрос. Как сделать, чтобы неписи атаковали игрока, если он начнёт кастовать спелл?
Lex
- слот НПС onSpellCast
- spellhook

пример работы spellhook: http://wrg.ru/TEMP/Lex_LexxL/SpellHook.exe
красные маги появояются при касте закла любого.
Мефистофель
Помогите пожалуйста.
Нужен скрипт, если ПК выбрал себе фракцыю Злой, то он перелетает в определённую локу, если добрый то в другую.
Aiwan
Мефистофель РС, он же Игрок, он же Чар, он же Протогонист, он же ПиСи НЕ МОЖЕТ ВЫБИРАТЬ ФРАКЦИИ. Фракция РС одна и все крутятся вокруг нее.
SERGO
Он имел ввиду характер перса. buba.gif
Lex
Мефистофель, это разбиралось не раз и не 2. И по характеру, по классу, по расе и прочее.
Смотри старые темы или Вопросы и Ответы.

все, что тебе надо это:
Neverwinter Script Source
int GetAlignmentGoodEvil(object);
и иже с ними.
Neverwinter Script Source
if
условный оператор
Neverwinter Script Source
GetObjectByTag
взятие объекта по тэгу
Neverwinter Script Source
ActionJumpToObject(object, int)
перемещение в точку
Dark@ngel
1.Как сделать, чтобы при активировании какого-нибудь предмета в инвентаре НП превращался в кого-нибудь (на время до отдыха)?
2.Можно ли сделать так, чтобы с твоим помощником ходило какое-нибудь животное(например тигр)?
SERGO
Как реализовать такое - у НПС остается меньше 15 ХП, он становится не врагом а нейтралом (простолюдином) прибегает мент - НПС, говорит, идет загрузка - ты в другой области после азговора
Dik Morris
Dark@ngel !
2) - Можно ли сделать так, чтобы с твоим помощником ходило какое-нибудь животное(например тигр)?
Можно хоть дракона или барсука...Просто создай таково персонажа который тебе подойдет, потом засунь ему скрипты стандартного хейчмана + диалог.
Ы.З: не забудь отредактировать диалог, вырезать ненужные места, журнал, звук...
Friedrich
Dark@ngel
1. Видимо, проще всего это сделать через полиморф (правда возможные варианты для превращения ограничены). Для этого создаешь предмет со свойством Cast Spell -> Unique Power Self Only.
Создаешь скрипт, имя которого совпадаетс тегом этого предмета, примерно следующего содержания:
Neverwinter Script Source
#include "x2_inc_switches"
void main()
{
  int nEvent = GetUserDefinedItemEventNumber();
  switch (nEvent)
  {
    case X2_ITEM_EVENT_ACTIVATE:
      object oPC = GetItemActivator();
      // Будем превращаться в жуткого волка
      effect ePoly = EffectPolymorph(POLYMORPH_TYPE_DIRE_WOLF);
      effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
      break;
  }
}

2. Ну можно, например, самого тигра сделать хенчманом (для этого тигру нужно прописать хенчманские скрипты) и подключить его или к товоему помощнику, или к самому игроку.
Например, на ветке диалога:
void main()
{
object oHench = OBJECT_SELF;
object oTiger = GetNearestObjectByTag("TIGER");
object oPC = GetPCSpeaker();

AddHenchman(oPC, oHench);
SetMaxHenchmen(2);
AddHenchman(oPC, oTiger);
}
А когда будем увольнять хенчмана, вместе с ним нужно будет уволить и тигра (только я не знаю, как обрабатывать увольнение хенчмана через радиальное меню pardon.gif ).
-fenix-
Эээ - по поводу друзей игрока.

Как я понял:

Animal - вот это я не понял, это кто?
Dominated - и это кто?
Familiar - чел каторого нужно куда - нить отвести, при этом он будет везде мешаться.
Henchman - оруженосец.
Summoned - вызваный.

Aiwan
1. Dark@ngel у нас тут любят конкретику. Кто именно и в кого и как это НА ВРЕМЯ ДО ОТДЫХА? crazy.gif
2. Тут точно не подскажу, не занимался ни разу...

SERGO
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnUserDefaine
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 27.06.2005
//:://///////////////////////////////////////////
void main()
{
int nEvent = GetUserDefinedEventNumber();
//======================= DAMAGED EVENT 1006 ===================================
if (nEvent == 1006)
  {
  object oPC = GetFirstPC(); // Опишите своего РС как надо.
  object oHench = GetHenchman(oPC); // Если есть хеньчман
  object oNPC = OBJECT_SELF; // Наш злюка
  int iCurHP = GetCurrentHitPoints(OBJECT_SELF);
  // Проверим сколько НР у него в данный момент времени
  int iD = 15; // Искомое число
//==============================================================================
  if (GetIsPC(oPC) && (iCurHP <= iD) && !GetLocalInt(oNPC, "DO"))
  {
  SetLocalInt(oNPC, "DO", TRUE); // ЧТо бы только раз сработало
  AssignCommand(oPC, ClearAllActions(TRUE)); // Остановим бои и забудем все!
  AssignCommand(oHench, ClearAllActions(TRUE));
  AssignCommand(oNPC, ClearAllActions(TRUE));
  ClearPersonalReputation(oPC, oNPC); // Мирись, мирись и больше не дерись!
  ClearPersonalReputation(oHench, oNPC);
  DelayCommand(0.5, ChangeToStandardFaction(oNPC,STANDARD_FACTION_DEFENDER));
  // Сменим фракцию врага на Защитника
  DelayCommand(10.0, AssignCommand(oNPC, ActionStartConversation(oPC)));
  // Задержка тут стоит потаму как после битвы обычно НПС около раунда
  // Не реагируют на диалоги.
  }
  }
}

Код я не тестил, но должен пахать. Ставится OnUserDefaine НПС.
Раззкоментируй на спавн скрипте НПС евант на демаг. И в диалоге пропиши куда надо прыгать и что сказать.
Friedrich
Animal - это животное-компаньон друида или рейнджера.
Familiar - фамильяр мага.
Как работать с фамильярами (компаньонами) НПС я себе представляю довольно смутно. И среди стандартных компаньонов тигров не замечено.

Dominated - тот кого задоминейтили (Н.п. спелом, или Animal Empaty).

Добавлено в [mergetime]1119891352[/mergetime]
QUOTE (Aiwan @ Jun 27 2005, 19:51)
Кто именно и в кого и как это НА ВРЕМЯ ДО ОТДЫХА?

Обыкновенно, наверное. Эффект полиморфа будет держаться пока отдыхать не сядешь.
Мефистофель
Lex Спасибо, но я не на столько умён как вы, эх.
QUOTE
это разбиралось не раз и не 2. И по характеру, по классу, по расе и прочее.
Смотри старые темы или Вопросы и Ответы.

Чёрт, клянусь мамой, искал гдето час, пользовался поиском, и в итоге 0! swoon.gif
Ткните носом! biggrin.gif
dumbo
Мефистофель
по расам: http://www.wrg.ru/forums/index.php?showtopic=889&st=225 this.gif
далее по аналогии...
Мефистофель
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC))
return;
int nPasi = GetGoodEvilValue(oPC);
string sWP;
if(nPasi == ALIGNMENT_GOOD)
    sWP = "wp_start_good";
if(nPasi == ALIGNMENT_EVIL)
    sWP = "wp_start_Evil";
ActionJumpToObject(GetWaypointByTag(sWP));
}
????
А скажите как зделать так, если игрок нейтральный то он несможет играть, а например то что связано с добрым, например Хаотично добрый? или здлым. относилось к скрипту.
а если игрок нейтральный то появлялась тобличка как в проклятии левора.
Спасибо.
Aiwan
QUOTE (Мефистофель @ Jun 29 2005, 11:24)
а если игрок нейтральный то появлялась тобличка как в проклятии левора.

Возьми скрипты Левора и глянь.
Мефистофель
QUOTE
Возьми скрипты Левора и глянь.

Дело в том что у меня сейчас нет левора!
Friedrich
Мефистофель, GetGoodEvilValue(object) возвращает значение от 0 до 100, а не константу аляймента!
Добавлено в [mergetime]1120072670[/mergetime]
Знакомые грабли.
Мефистофель
QUOTE
Мефистофель, GetGoodEvilValue(object) возвращает значение от 0 до 100, а не константу аляймента!

А какую функцыю надо?
Агрессинг
Мефистофель
Вот функция
Neverwinter Script Source
if (GetGoodEvilValue(oPC) )
    Kill(oPC);

Zirrex
Брр... о чем это вы, вот что должно быть:

Neverwinter Script Source
void main()
{
    object oPC = GetEnteringObject();

    if (!GetIsPC(oPC)) return;

    int iAligment = GetAlignmentGoodEvil(oPC);
    string sWP;

    if (iAligment == ALIGNMENT_GOOD)
        sWP = "wp_start_good";
    else if (iAligment == ALIGNMENT_EVIL)
        sWP = "wp_start_Evil";
    else
        DelayCommand(6.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(FALSE, TRUE), oPC));

    AssignCommand(oPC, ActionJumpToObject(GetWaypointByTag(sWP)));
}


Судя по этому "if (!GetIsPC(oPC)) return;", относится к многопользовательской игре, поэтому скрипт можно поставить и на "OnClientEnter". Правда, я не советую так делать, не поймут, лучше уж накладывать неподвижность, и выводи фразу в лог боя, что персонажи с нейтральным мировоззрением не допускаются.

Например, так:

Neverwinter Script Source
void main()
{
    object oPC = GetEnteringObject();

    if (!GetIsPC(oPC)) return;

    int iAligment = GetAlignmentGoodEvil(oPC);
    string sWP;

    if (iAligment == ALIGNMENT_GOOD)
        sWP = "wp_start_good";
    else if (iAligment == ALIGNMENT_EVIL)
        sWP = "wp_start_Evil";
    else
        effect eParalyze = EffectCutsceneImmobilize();
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParalyze, oPC);
        DelayCommand(3.0, SendMessageToPC(oPC, "Извините, но нейтральное мировоззрение недопустимо."));
        return;

    AssignCommand(oPC, ActionJumpToObject(GetWaypointByTag(sWP)));
}
Агрессинг
А, а я на сам вопрос невнимательно посмотрел, я думал, что при вхождении в модуль игрок должен быть только нейтральным. А если надо, чтобы он к вейпу определенному прыгал, то это другое дело. buba.gif
Мефистофель
Зирекс Спасибо огромное пойду проверять.
Мягкий Пушистик
не хватает там в нескольких местах { и }
(в блоке для нейтралов в первом и втором скрипте)
GoingPro)
хочу зделать малюсенький сервер...
вопрос такой:
Как мне зделать так что бы на нем нельзя было инспользовать персонажей локалки, а создавать новых и что бы они сохранялись? unsure.gif
Агрессинг
QUOTE
и что бы они сохранялись? 

Любой созданный персонаж сохраняется в loalvault.
QUOTE
Как мне зделать так что бы на нем нельзя было инспользовать персонажей локалки

Ты боишся, что люди будут заходить прокачанными персонажами? Тогда этот скрипт на on enter начальной локации
Neverwinter Script Source
void main()
{

object oPC = GetEnteringObject();
object oEquip = GetFirstItemInInventory(oPC);
int nGold = GetGold(oPC);
object oCustoms = GetObjectByTag("customs");
location lEntry =GetLocation (GetObjectByTag("ENTRY_POINT"));
int nHasEntered=GetLocalInt(oPC, "entered");
effect eEffect;


f (GetIsPC(oPC) == TRUE && GetIsDM(oPC) == FALSE && GetIsObjectValid (oPC) == TRUE) // далее скрипт идет если персонаж не DM
{


  while(GetIsObjectValid(oEquip))
    {
      DestroyObject(oEquip);
      oEquip = GetNextItemInInventory(oPC);
    }

  DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARMS, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_BELT, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_NECK, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC));
  DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC));
//забирает вещи

  SetXP(oPC, 0);


  AssignCommand ( oPC, TakeGoldFromCreature ( nGold, oPC, TRUE)); //забирает золото


}
}
Zirrex
Агрессинг эм... скрипт конечно хорошо, но на сервере достаточно убрать галку "Local Characters Allowed", тогда все входящие игроки будут создавать персонажей заново. Твой скрипт низводит персонажа до 1-го уровня, удаляет все вещи и золото, но он делает это при каждом входе. Можно сделать проще, с учетом вышеописанной опции:

Neverwinter Script Source
void main()
{
    object oPC = GetEnteringObject();

    if (GetIsDM(oPC)) return;

    if (!GetXP(oPC))
    {
        int StartGold = 0;
        int StripPlayer = TRUE;

        if (StartGold == 0)
        {
            if (GetLevelByClass(CLASS_TYPE_BARBARIAN,oPC))    StartGold = d4(5) * 100;
            else if (GetLevelByClass(CLASS_TYPE_BARD,oPC))    StartGold = d4(4) * 100;
            else if (GetLevelByClass(CLASS_TYPE_CLERIC,oPC))  StartGold = d4(4) * 100;
            else if (GetLevelByClass(CLASS_TYPE_DRUID,oPC))    StartGold = d4(4) * 100;
            else if (GetLevelByClass(CLASS_TYPE_FIGHTER,oPC))  StartGold = d4(6) * 100;
            else if (GetLevelByClass(CLASS_TYPE_MONK,oPC))    StartGold = d4(4) * 100;
            else if (GetLevelByClass(CLASS_TYPE_PALADIN,oPC))  StartGold = d4(5) * 100;
            else if (GetLevelByClass(CLASS_TYPE_RANGER,oPC))  StartGold = d4(5) * 100;
            else if (GetLevelByClass(CLASS_TYPE_ROGUE,oPC))    StartGold = d4(6) * 100;
            else if (GetLevelByClass(CLASS_TYPE_SORCERER,oPC)) StartGold = d4(3) * 100;
            else if (GetLevelByClass(CLASS_TYPE_WIZARD,oPC))  StartGold = d4(3) * 100;
            else                                              StartGold = d4(4) * 100;
        }
        GiveGoldToCreature(oPC, StartGold - GetGold(oPC));

        // Удалить надетые на игроке вещи
        if (StripPlayer)
        {
            int i;

            for (i = 0; i < 15 ; i++)
            {
                object oEquip = GetItemInSlot(i,oPC);

                if (GetIsObjectValid(oEquip)) DestroyObject(oEquip);
            }
        }

        // Удаление вещей из рюкзака персонажа
        object oItem = GetFirstItemInInventory(oPC);

        while (GetIsObjectValid(oItem))
        {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
        }
        SetXP(oPC, 1);
    }
}
Batkom
Здравствуйте, я чодержу небольшой шард в локальной сети, вроде полностью созданый модуль работает безглючно но появилась такая проблема, нет стимула пвп ибо с игроков ничего не падает, как я не старался, скрипт onDeath у меня вроде правильно составлен, но золото с игрока не падает, а только копируется в сумку, откуда отреспавнившийся игрок может забрать в 2 раза больше золота и такие же вещи. Почему у мертвого игрока нельзя забрать веши и как с этим бороться?
И вот еще вопрос: как заставить нипися слушать и как узнать что именно сказал игрок(янашел как узнать сказал ли он то, что задуманно, сказал ли он чтото вообще, но как узнать что именно игрок сказал понять не могу)?
Lex
QUOTE (Batkom @ Jul 2 2005, 14:23)
Почему у мертвого игрока нельзя забрать веши и как с этим бороться?

надо сделать, чтобы падали.
Самый простой вариант: на смерть игрока написать скрипт создания мешка, куда кидать деньги и вещи (какая часть денег и вещей - решать вам. Тут были варианты рандомно одетую вещь, рандомно вещь инвентаря...)
Zirrex
Batkom, скажи мне одну вещь, ты HCR используешь? Если да, то ответ прост, на скрипте умирания "dying" есть обработка создания сумки и копирования туда денег. Бывают моменты, когда скрипт на эвентах "dying и death" срабатывает одновременно, поэтому у тебя и получается дублирование денег. Есть такой вариант:

Neverwinter Script Source
object DropBag(location lDiedHere, object oPC)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    location lLoc = GetLocation(oPC);

    vector vLootBag = GetPositionFromLocation(lLoc);

    float fFacing = GetFacing(oPC) + (Random(2) ? 90.0 : -90.0);

    vLootBag.x += cos(fFacing) * 0.45f;
    vLootBag.y += sin(fFacing) * 0.45f;

    location lDropBag = Location(GetArea(oPC), vLootBag, fFacing + 180.0);

    object oDropBag = CreateObject(OBJECT_TYPE_PLACEABLE, "DyingCorpse", lDropBag, FALSE, "DropBag" + sID);
    return oDropBag;
}

void StripThings(object oPC, object oDrop, object oEquip)
{
    if (GetIsObjectValid(oEquip))
    {
        CopyItem(oEquip, oDrop);
        DestroyObject(oEquip);
    }
}


void CheckBag(object oDropBag)
{
    object oItem = GetFirstItemInInventory(oDropBag);

    if (!GetIsObjectValid(oItem))
    {
        DelayCommand(2.0, DestroyObject(oDropBag));
    }
}

void main()
{
    object oPC = GetLastPlayerDied();
    object oMod = GetModule();

    if (GetTag(GetArea(oPC)) == "fugue_plane") return;

    object oHenchman = GetHenchman(oPC);

    if (GetIsObjectValid(oHenchman))
    {
        RemoveHenchman(oPC, oHenchman);
    }

    string sName = GetName(oPC);
    string sCDK = GetPCPublicCDKey(oPC);
    string sID = sName + sCDK;

    if (GetIsObjectValid(oPC))
    {
        location lDiedHere = GetLocation(oPC);
        object oDropBag = GetLocalObject(oMod, "DropBag" + sID);

        if (!GetIsObjectValid(oDropBag))
        {
            oDropBag = DropBag(lDiedHere, oPC);
        }

        int iGold = GetGold(oPC);

        if (iGold > 0)
        {
            object oBag = CreateItemOnObject("bagofgold", oDropBag);
            SetLocalInt(oBag, "Gold", iGold);
            SetLocalInt(oDropBag, "Gold", iGold);
            AssignCommand(oDropBag, TakeGoldFromCreature(iGold, oPC, TRUE));
        }

        float fProcent = 50.0;

        float fRoll = IntToFloat(d20());
        float fChance = (fRoll * fProcent) / 100.0;
        float fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_ARMS, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_BELT, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_NECK, oPC));
        }

        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC));
        }


        fRoll = IntToFloat(d20());
        fChance = (fRoll * fProcent) / 100.0;
        fCheck = IntToFloat(d20());

        if (fChance >= fCheck)
        {
            StripThings(oPC, oDropBag, GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
        }
        CheckBag(oDropBag);

        object oLimbo = GetObjectByTag("wp_enter_fugue");
        DelayCommand(5.0, AssignCommand(oPC, ActionJumpToObject(oLimbo)));
    }
}

Это лишь малая часть, чтобы описать тут весь процесс смерти, страницы не хватит. Если тебе нужна более серьезная обработка смерти, могу скинуть по почте скрипты. В данном случае я убрал создание трупа, с помощью которого можно воскресить, описав лишь создание мешка с деньгами, и выпадение случайным образом вещей.
Batkom
да, я знаю, при смерти игрока создается сумка, в которой создается золото и вешь, который у игрока должны изыматься
hcr не юзаю
Мефистофель
ОГРОМНАЯ Посьба, дорогие форумчане помогите мне пожалуйста, очень нужен скрипт. swoon.gif
если ПК с Хорактером Злой, то при смерти он отправляется в ад, если добрый то в рай. this.gif
надеюсь на вашу помощь.
Batkom
можно включить в скрипт onDeath вот это:
Neverwinter Script Source
object oPC = GetLastPlayerDied();
if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
ActionCastSpellAtObject(SPELL_RESURRECTION, oPC);
AssignCommand(oPC, ActionJumpToLocation(GetLocation(GetObjectByTag("heven"))));
}

if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
ActionCastSpellAtObject(SPELL_RESURRECTION, oPC);
AssignCommand(oPC, ActionJumpToLocation(GetLocation(GetObjectByTag("hell"))));
}



В раю должен стоять флажок или невидимый обьект в тегом heven а в аду с тегом hell

можно также включить это в скрипт респавна , только тогда будет
Neverwinter Script Source
object oPC = GetLastRespawnButtonPresser();
Zirrex
Batkom, подобный скрипт:

Neverwinter Script Source
ActionCastSpellAtObject(SPELL_RESURRECTION, oPC);

не оживит игрока, потому что ты на него читаешь воскрешение, но не возвращаешь жизнь.

Писать нужно так, чтобы точно воскресить и перенести:

Neverwinter Script Source
void Resurrect(object oPlayer, object oTransfer)
{
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPlayer);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);
    AssignCommand(oPlayer, ActionJumpToObject(oTransfer));
}

void main()
{
    object oPC = GetLastPlayerDied();

    int iAligment = GetAlignmentGoodEvil(oPC);

    if (iAligment == ALIGNMENT_GOOD)
    {
        DelayCommand(2.0, Resurrect(oPC, GetObjectByTag("heven")));
    }
    else if (iAligment == ALIGNMENT_NEUTRAL)
    {
        DelayCommand(2.0, Resurrect(oPC, GetObjectByTag("heven")));
    }
    else
    {
        DelayCommand(2.0, Resurrect(oPC, GetObjectByTag("hell")));
    }
}


По поводу твоего скрипта, где создается сумка для вещей, ты смог разобраться?
Batkom
вот схематичный скрипт в ondeath
Neverwinter Script Source
object oDrop = CreateObject(OBJECT_TYPE_PLACEABLE, "тег  пласбл бекпека", GetLocation(oPC));
    int PGold = GetGold(oPC);
    TakeGoldFromCreature(PGold, oPC, TRUE);
    CreateItemOnObject("nw_it_gold001", oDrop, PGold);
GoingPro)
А можно мне полный скрипт на смерть на почту выслать? плиззз
goingpro@ukr.net
что бы и труп оставался для рэса и сумка создавалась и все вещи с рюкзака выпадали кроме одетых, на одетые процент выпадания и все золото что бы выпадало, ну и на фугу естественно попадать плизззз
Очень прошу, очень нужно.... sorry.gif
Агрессинг
Мефистофель
Я тебе рассказывал ведь, что нужно делать проверки на характер, а потом джампать игрока к вейпоинту лагеря. Тут то же самое, в свойствах модуля на onplayerdeath ставь такой же скрипт, как и в начале с выбором лаеря, только замени теги вейпоинтов лагерей, на теги вейпоинтов рая и ада и PC обозначь как GetFirstPC();Zirrex
Я с шардами не знаком, так что...


LEX: тока не GetFirstPC() (это получится чисто сингловый скрипт. Да и не зря эти функции сделали.), а GetLastPlayerDied() или GetLastPlayerDying(). Смотре где стоит скрипт.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.