Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
gennady
Цитата(DanaVolgograd @ Nov 5 2008, 23:45) *
Как можно заставить объект двигаться к определенной точке.
Правда иногда пропадают кадры, т.е. плейсы...
Neverwinter Script
//ПЕРЕДВИЖЕНИЕ ПЛЕЙСА
// object oSelf - Объект управлЯющий передвижением
// string sGtTag - тэг передвигаемого объекта
// float fDist=0.1 - дистанциЯ одного шага
// float fSpeed=0.3 - скорость кадра
// int iShag=20 количество создаваемых объектов (кадров)
// float fOrient=180.0 - направление движениЯ
void multik(object oSelf, string sGtTag, float fDist=0.1, float fSpeed=0.3, int iShag=20, float fOrient=180.0);

//____________________ ПЕРЕДВИЖЕНИЕ ПЛЕЙСА _____________________________________
void multik(object oSelf, string sGtTag, float fDist=0.1, float fSpeed=0.3, int iShag=20, float fOrient=180.0)
{
if (GetLocalInt(oSelf,"STENA") == 1) return;
object oPlace = GetNearestObjectByTag(sGtTag, oSelf);
effect eVis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); // невидимость
effect eIskra = EffectVisualEffect(VFX_COM_SPARKS_PARRY);
int i;
AssignCommand(oSelf, ClearAllActions());
AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE
));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eIskra, oSelf);
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oPlace));
for (i=1; i<iShag; i++)
  {
    vector vSpawn = GetPosition(oPlace);
    float fFacing = GetFacing(oPlace);
    vSpawn.x += cos(fFacing) * fDist*i;
    vSpawn.y += sin(fFacing) * fDist*i;
    // Если отрицательное значение, то locSpawn позади oPC
    location locSpawn = Location(GetArea(oPlace), vSpawn, fOrient+fFacing);
  object oNew = CreateObject(OBJECT_TYPE_PLACEABLE, GetResRef(oPlace), locSpawn, FALSE, sGtTag);
  SetPlotFlag(oNew, TRUE); // Сюжетный
  ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oNew);
  AssignCommand(oSelf, ActionDoCommand(RemoveEffect(oNew, GetFirstEffect(oNew))));
  if (i<(iShag-1))
  {
    if (i<3) AssignCommand(oSelf, ActionWait(1.0));
    else AssignCommand(oSelf, ActionWait(fSpeed));
    AssignCommand(oSelf, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_
PERMANENT, eVis, oNew)));
    AssignCommand(oSelf, ActionDoCommand(DestroyObject(oNew, 0.5)));
  }
  }
  AssignCommand(oPlace,PlaySound("al_cv_millwheel1"));
  DelayCommand(4.0, AssignCommand(oPlace,PlaySound("as_cv_minercar1")));
  SetLocalInt(oSelf,"STENA",1);
  AssignCommand(oSelf, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_
INSTANT, eIskra, oSelf)));
  AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE))
;
  AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf,"STENA",0)));
  AssignCommand(oSelf, ActionDoCommand(DestroyObject(oPlace)));
}
DanaVolgograd
нипаняяяяяятна:
Событие OnDeath того же плейса (тарана):
Код
void main()
{
ActionCastSpellAtLocation(SPELL_EARTHQUAKE, GetLocation(GetWaypointByTag("taran_wp")), METAMAGIC_MAXIMIZE, 1, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
}

НИ-ЧЕ-ГО не происходит...
А если поставить этот КастСпелл, скажем в другой обработчик (ну за пару секунд до дестроя итема), то все нормально - земля трясется, град сыпется...
Ilerien
Всё верно, плейс не успевает выполнить экшен.
DanaVolgograd
и каг быть? )

разобралась...
Ilerien
Перевесить этот экшен на что-нибудь рядом и живое smile.gif
DanaVolgograd
так он и так, сам экшн повешен на Вейпоинт, который находится рядом с плейсом (который и уничтожается).
greye
Нет, ты кастуешь на этот вэйпоинт, а плейс не успевает собственно сотворить заклинание перед смертью.
Можно попробовать ExecuteScript, думаю.
Ilerien
Neverwinter Script
object oWP = GetWaypointByTag("taran_wp");
    AssignCommand(oWP, ActionCastSpellAtLocation(SPELL_EARTHQUAKE, GetLocation(oWP), METAMAGIC_MAXIMIZE, 1, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
Можно попробовать так. Чёрт его знает, выполнит ли вейпоинт экшен, если нет - надо плейс невидимый рядом создать и на него перевесить smile.gif
Lex
щас (на 1.69) хз, но раньше через вэйпы такую штуку было нельзя протащить.
Sugo77
И снова всем привет.

Так и не вышло у меня со скриптом для враждебности к трем фракциям игроков,но не их монстрам, хотя знаю что возможно, так как видел подобное на Американских серверах(К примеру Серевер:"Alestorm LOTR Team PvP", вообщем вот мой модуль, если кто то может с моим проектом я буду счастлив, но сейчас я застрял на враждебности, игроков друг к другу.

Пожалуйста посмотрите мой модуль, со скриптами, завершённый на 50%, и помогите с завершающим скриптом, дальше я его доделаю сам, но если кто то присоединится к моему проекту, и будет помощником, я буду очень счастлив:
http://narutoandothers.ucoz.ru/Files/STARC...aFinishOn60.zip

Так же я могу создать для этого сервера, свой сайт, форум и всё что угодно, с этим у меня нет проблем.
greye
Как и где определяется в игре, будет ли существо умерщвлено жестоко или нет(месиво или нет)? В EffectDeath есть параметр nSpectacularDeath, отвечающий за это, но для начала мне надо отконтролить его срабатывание в модуле.
Melisse
Цитата
Как и где определяется в игре, будет ли существо умерщвлено жестоко или нет(месиво или нет)? В EffectDeath есть параметр nSpectacularDeath, отвечающий за это, но для начала мне надо отконтролить его срабатывание в модуле.


Да там есть такой параметр, но особой разницы я не увидела...если хочешь жестко, то тебе нужны спецэффекты разбрасывания костей и кровищи...они есть в стандартном наборе
все эффекты,которые можно задавать скриптово, можно глянуть в visualeffect.2da....как то так называется.
Кстати есть интересная анимация - судороги...с взрывом кровищи и последующем создавании плэйсов было бы эффектно ^ ^

P.S. на ваулте можно найти плэйсовые куски рук и ног, голов...там этого полно ))
virusman
Цитата(greye @ Nov 24 2008, 21:06) *
Как и где определяется в игре, будет ли существо умерщвлено жестоко или нет(месиво или нет)? В EffectDeath есть параметр nSpectacularDeath, отвечающий за это, но для начала мне надо отконтролить его срабатывание в модуле.
Не уверен, но на это может влиять настройка в SetIsDestroyable.
Хотя подозреваю, что это где-нибудь в 2da определяется.
greye
2Melisse )) Спасибо за идею с эффектами, не думал об этом.
2virusman В 2da я этого не нашел, но SetIsDestroyable хватает для работы, спасибо.
greye
Вопрос наполовину глупый: как можно выйти из очереди OnDeath события? Мне надо поставить с него команду, но так, чтобы она выполнялась без флага "умирающий".
P.S. Прошу прощения за даблпост.

Обошелся без этого, но вопрос остается: можно ли вызвать команду так, чтобы она была в очереди другого события?
SignalEvent это не то, т.к. все равно последующие команды идут в очередь основного события(по-крайней мере, по действию).
Aiwan
greye, опиши задачу. Так будет проще думать.
virusman
Цитата(greye @ Nov 29 2008, 10:43) *
Вопрос наполовину глупый: как можно выйти из очереди OnDeath события? Мне надо поставить с него команду, но так, чтобы она выполнялась без флага "умирающий".
P.S. Прошу прощения за даблпост.

Обошелся без этого, но вопрос остается: можно ли вызвать команду так, чтобы она была в очереди другого события?
SignalEvent это не то, т.к. все равно последующие команды идут в очередь основного события(по-крайней мере, по действию).
AssignCommand? Действия назначаются не на события, а на объекты.
greye
Я уж и забыл про это. В общем, мне надо было SetIsDestroyable(FALSE) ставить в скрипт OnDeath при некоторых условиях, после чего было воскрешение, соответственно, сразу за ним необходимо было вернуть SetIsDestroyable(TRUE), но в таком случае крич исчезал согласно corpse fade time. Любые перенаправления в OnUserDefined или через ExecuteScript приводили к тому же.
virusman
Видимо, флаг, заданный SetIsDestroyable, отрабатывает до события OnDeath. Так что лучше поставить SetIsDestroyable(FALSE) на спауне, а при смерти либо "добивать", либо нет.
greye
Это да, просто я забыл еще сказать, что это может происходить с одним существом много раз, то есть OnSpawn тут не поможет, так как надо было, чтобы это значение менялось туда-обратно при каждом выполнении.

Добавлено: не каждый раз, а при определенных условиях, другое дело, что эти условия могут много раз повторяться.
P.S. Да и еще, проблема была также с тем, что если этот флаг оставить FALSE, то при убийстве крича будет невидимая подвеска < name> dead, что тоже неприятно, поэтому и надо было переставлять флаг.
virusman
А зачем тебе тогда SetIsDestroyable трогать, если каждый раз существо будет воскрешаться?
Андрей ЮП
Товарищи, подскажите пожалуйста, как составить скрипт, чтобы, например персонажа арестовали и сажают в тюрьму, при этом у него забирают все его вещи из инвентаря и все что на нем, но потом, когда его выпускают из тюрьмы, все вещи ему возвращают обратно. Мне интересно, как должны выглядеть скрипты на такую манипуляцию с вещами персонажа? Перерыл форум, смотрел в других модулях - ничего такого похожего ненашел. Может кто-нибудь знает?

С уважением, Андрей ЮП.
Kamita
Это целый цикл скриптов.
Очень широкий вопрос, слишком много тонкостей. Например:
Как ты хочешь чтобы это выглядело - кат сценой или игровой процесс...сжали в тюрму - вели или просто персонаж прыгл в тюрму после ареста...
Эти нюансы прямо пропорциональны количеству скритов и времени затраченного на их синхронизацию.


А вообще все функции действий описаны ТУТ
Lex
нене, там не те функции.
Андрей ЮП, глянь ПЛ, первую главу. Тот эпизод, где игрока огревают по башке и он оказывается у Ви.
Но вообще все просто, скрипт отбора всех вещей есть (выкладывался не раз, обычно юзают в начале модуля. Просто надо до дестроя добавить копирвание в сундук). Ну а вернуть обратно - все тоже самое, но объекты (игрок-сундук) местами меняются. А как это все обставлено (стража, катсцена, тюрьма) - это уже совсем другая история.
Aiwan
Андрей ЮП, еще можешь глянуть в ПВ скрипты которые срабатывают при попытке украсть что-то. Но боюсь разобраться будет в них сложно...
Андрей ЮП
Цитата(Kamita @ Dec 9 2008, 08:42) *
Как ты хочешь чтобы это выглядело - кат сценой или игровой процесс...сжали в тюрму - вели или просто персонаж прыгл в тюрму после ареста...

Товарищ Kamita, это я уже все сделал. Продолбался целый день, но сделал. С помощью не сложных скриптов, переменных и тэгов. Я сделал не тюрьму, а карцер (типа как КПЗ biggrin.gif ) Устроил мордобой в населенном пункте, нагрубил солдату или другому представителю власти и персонажа арестовывают (надо будет еще на воровство сделать арест...). Отсидев в камере, персонаж должен либо заплатить штраф, либо его отправят на принудительные работы, после чего отпустят. Тут у меня все получилось, кроме вот этой проблемы с вещами персонажа. Получается как-то глупо: нарушитель правопорядка оказывается в камере с оружием, в броне, и всеми вещами. Это неправильно.

Цитата(Lex @ Dec 9 2008, 09:29) *
Андрей ЮП, глянь ПЛ, первую главу. Тот эпизод, где игрока огревают по башке и он оказывается у Ви.

Уже смотрел, товарищ Лекс, не смог понять где там и что. Но попробую еще раз, может разберусь.

Цитата(Lex @ Dec 9 2008, 09:29) *
Просто надо до дестроя добавить копирвание в сундук).

Вот на этом моменте бы поподробнее... declare.gif Я попробую. Спасибо!

Цитата(Lex @ Dec 9 2008, 09:29) *
А как это все обставлено (стража, катсцена, тюрьма) - это уже совсем другая история.

Ну это намного проще, чем скрипты составлять declare.gif

Цитата(Aiwan @ Dec 9 2008, 11:09) *
Андрей ЮП, еще можешь глянуть в ПВ скрипты которые срабатывают при попытке украсть что-то. Но боюсь разобраться будет в них сложно...

Спасибо, товарищ Aiwan! Это тоже посмотрю.

Всем спасибо за полезные советы!

С уважением, Андрей ЮП.
gennady
Тут для нашего иодернизированного модуля потребовался такой арест и водворение в тюрьму... В общем это целая система скриптов, но судь идеи в том, что нужно сперва крутануть цикл на нахождение и перенос сумок из инвентаря героя, а затем лишь чистить шмотки... Чего не было сделано в Леворе, поэтому многие и матерились... biggrin.gif Вот тебе скриптик, надеюсь поможет.
Neverwinter Script
//:://////////////////////////////////////////////////
//:: АРЕСТ ГЕРОЯ ЗА НАПАДЕНИE НА ПРОСТОЛЮДИНОВ
//:: Created By: Gennady
//:: File Name: stop_commoner
//:://////////////////////////////////////////////////
#include "ludi"

// ДАТЬ И ОПОЗНАТЬ ПРЕДМЕТЫ
// string sItem - ResRef предмета
// object oTarget - Объект или существо кому дать
// int iKol - Количество предметов
// int iStack=1 - Количество предметов в стеке
void CreateItemSklad(string sItem, object oPC, int iKol=1, int iStack=1);

void CreateItemSklad(string sItem, object oPC, int iKol=1, int iStack=1)
{
while(1 <= iKol)
{
  if(iKol < iStack) iStack = iKol;
  object oItem = CreateItemOnObject(sItem, oPC, iStack);
  SetIdentified(oItem, TRUE); // опознать
  iKol-=iStack;
}
}
////////////////////////////////////////////////////////////////////////////////
void DeletItem(object oPC, object oSklad)
{
object oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
    {
    string sTag = GetTag(oItem);
    int iDestroy = 0;
    if (sTag == "itm_magsteleport" || sTag == "itm_magstelepor1")
    {iDestroy = 1; SetLocalInt(oPC, "MARSHIK_COMMONER", 1);}
    if(iDestroy == 0)
    CopyItem(oItem, oSklad);
    DestroyObject(oItem);
    oItem = GetNextItemInInventory(oPC);
    }
    // ***** Оденем *****
  object oMan = CreateItemOnObject("t_roba_a", oPC, 1); // Роба
  AssignCommand(oPC, ClearAllActions(TRUE));
  AssignCommand(oPC, ActionEquipItem(oMan,INVENTORY_SLOT_CHEST)); // Роба
  AssignCommand(oPC, ActionSpeakString("Я что в тюрьме?"));
  FadeFromBlack(oPC, FADE_SPEED_SLOW); // Уберем занавес
  if(GetLocalInt(oPC, "MARSHIK_COMMONER")==1)
  SetCustomToken(2202, "Да, совсем забыл… Я вам верну маршрутизатор.");
  else
  SetCustomToken(2202, "");
  if(GetLocalInt(oPC, "VOR_COMMONER")>=10)
  {
    DelayCommand(1.0, ReputationTorg(-1));
    SetLocalInt(oPC, "VOR_COMMONER", 0);
    SetLocalInt(oPC, "R2_NPC_OSKAR", 1);// ДЛЯ ДИАЛОГА С ЗАКЛЮЧЕННЫМ
  }
  else
  DelayCommand(1.0, ReputationTorg(-3));
  DelayCommand(1.1, SendMessageToPC(oPC, "<c у >Прошло три часа... Вас доставили в тюрьму...</c>"));
}
////////////////////////////////////////////////////////////////////////////////
void Arest(object oPC, object oWP)
{
int iGold = GetGold(oPC);
int i, iShtraf = iGold/10; //Размер штрафа
int iT = GetTimeHour();
object oSklad = GetObjectByTag("SKLAD_COMMONER");
object oItem = GetFirstItemInInventory(oPC);

if(GetLocalInt(oPC, "VOR_COMMONER")>=10)
iShtraf = iGold/50; //Размер штрафа
SetCustomToken(2201, IntToString(iShtraf));
SetLocalInt(oPC,"GOLD_TURMA", iGold); // золото
SetTime(iT+3,0,0,0);
SetLocalLocation(oPC, "STOP_LOC_COMMONER", GetLocation(oPC)); // ТОЧКА ВОЗВРАТА
CreateItemSklad("nw_it_gold001", oSklad, iGold-iShtraf, 50000);
TakeGoldFromCreature(iGold, oPC, TRUE); // забрать золото
SetStandardFactionReputation(STANDARD_FACTION_COMM
ONER, 50, oPC);
SetLocalInt(GetModule(),"REP_COMMONER",0);
JumpFirstPC(oWP);

    while(GetIsObjectValid(oItem))
      {
      if(GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
      AssignCommand(oPC, ActionGiveItem(oItem, oSklad)); // Дать сумку или предмет
      oItem = GetNextItemInInventory(oPC);
      }
    for (i = 0; i < NUM_INVENTORY_SLOTS; i++)
      {
      oItem = GetItemInSlot(i, oPC);
      if (GetIsObjectValid(oItem))
      {
        CopyItem(oItem, oSklad);
        DestroyObject(oItem);
      }
      }
  DelayCommand(7.0, DeletItem(oPC, oSklad));
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
object oMod = GetModule();
object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 50.0,GetLocation(oPC),TRUE);
object oStop = GetWaypointByTag("STOP_COMMONER");
object oZak = GetObjectByTag("NPC_OSKAR");//Заключенный
effect ePar = EffectCutsceneParalyze();// Эффект парализации
effect eOtz = EffectVisualEffect(VFX_IMP_UNSUMMON);// Отзыв животного
effect eSM3 = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);// ГолубаЯ  звезда
float Time = 17.0;
float fAngle = GetFacing(oPC);
location Loc1 = CreateLocation(oPC, 3.0, fAngle+120.0, 0.0, fAngle);
location Loc2 = CreateLocation(oPC, 3.0, fAngle-120.0, 0.0, fAngle);
string sSt1 = "<c у >Вы нарушили закон Империи! Убили важного гражданина!</c>";
string sSt2 = "<cюa >Вас ждет арест и суд! Пошли!</c>";

if(GetLocalInt(oPC, "VOR_COMMONER")>=10)
  {
  sSt1 = "<c у >Стой! Сколько можно воровать? Вас ждет арест и суд!</c>";
  sSt2 = "<cюa >Спокойно воришка, и без глупостей! Пошли!</c>";
  }
  while (GetIsObjectValid(oNPC))  // Все существа в радиусе 30 метров
  {
    AssignCommand(oNPC, ClearAllActions(TRUE));
    if(oNPC != oPC)
    AssignCommand(oMod, DelayCommand(Time+5.0, AssignCommand(oNPC, ClearAllActions(TRUE))));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePar, oNPC, Time);
    if (oPC==GetMaster(oNPC))
      {
        if(oNPC!= GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC))
        {
          ApplyEffectToObject(DURATION_TYPE_INSTANT, eOtz, oNPC);
          DestroyObject(oNPC, 2.0);
        }
        else RemoveHenchman(oPC, oNPC); // Удалить спутника
      }
    oNPC = GetNextObjectInShape(SHAPE_SPHERE, 50.0, GetLocation(oPC), TRUE);
  }

if(GetGender(oPC)==GENDER_FEMALE && GetGender(oZak)==GENDER_MALE)
  {
  location Loc3 = GetLocation(oZak);
  DestroyObject(oZak);
  DelayCommand(3.0, CreateObjectN(OBJECT_TYPE_CREATURE, "zak_oskar_gg", Loc3));
  }
AssignCommand(oPC, SpeakString("Что случилось?"));
  object oStraz1 = CreateObject(OBJECT_TYPE_CREATURE, "straz", Loc1);
  object oStraz2 = CreateObject(OBJECT_TYPE_CREATURE, "straz", Loc2);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSM3, Loc1);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSM3, Loc2);
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePar, oStraz1, Time));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePar, oStraz2, Time));
DelayCommand(6.0, AssignCommand(oStraz1, SpeakString(sSt1)));
DelayCommand(6.0, PlayVoiceChat(VOICE_CHAT_NO, oStraz2));
DelayCommand(12.0, AssignCommand(oStraz2, SpeakString(sSt2)));
DelayCommand(15.0, PlayVoiceChat(VOICE_CHAT_YES, oStraz1));
DelayCommand(Time, FadeToBlack(oPC, FADE_SPEED_FASTEST)); // Занавес
DelayCommand(Time+0.1, Arest(oPC, oStop));
DestroyObject(oStraz1, Time);
DestroyObject(oStraz2, Time);
}
Latiss
Вот еще один вопрос насчет скрипта: (В кампаниях не нашел ничего подобного, к сожалению)
Каждые 20 секунд НПС телепортируется на случайный вейпоинт из шести. При этом показывается визуальный эффект.
Заранее, опять таки, спасибо.
Ilerien
Neverwinter Script
const string NPC_WP_TAG = "NPC_WP_TAG";
const int NPC_VFX = 24;
const float NPC_TELEPORT_TIME = 20.0f;

void Teleport(object oNPC);

void main()
{
    Teleport(OBJECT_SELF);
}

void Teleport(object oNPC)
{
    object oCurrentWP = GetNearestObjectByTag(NPC_WP_TAG, oNPC), oWP;

    do
        oWP = GetObjectByTag(NPC_WP_TAG, d6());
    while(oWP != oCurrentWP);

    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(NPC_VFX), oNPC);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneImmobilize(), oNPC, 1.0f);

    DelayCommand(1.05f, AssignCommand(oNPC, JumpToObject(oWP)));

    DelayCommand(NPC_TELEPORT_TIME, Teleport(oNPC));
}
Функцию вызывать из onSpawn непися smile.gif Вейпоинты должны иметь тег, указанный в константе NPC_WP_TAG. При этом объектов с таким тегом в модуле больше быть не должно.
Latiss
За скрипт еще раз спасибо.
Цитата(Ilerien @ Dec 14 2008, 15:34) *
При этом объектов с таким тегом в модуле больше быть не должно.

А вот это можно было и не писать, т.к. и ежу понятно.
Андрей ЮП
Цитата(gennady @ Dec 10 2008, 06:14) *
Тут для нашего иодернизированного модуля потребовался такой арест и водворение в тюрьму... В общем это целая система скриптов, но судь идеи в том, что нужно сперва крутануть цикл на нахождение и перенос сумок из инвентаря героя, а затем лишь чистить шмотки... Чего не было сделано в Леворе, поэтому многие и матерились... Вот тебе скриптик, надеюсь поможет.

Товарищ gennady, спасибо конечно, но я в этом скрипте не все понял. Дело в том, что процесс ареста и пр. наглядной рутины у меня уже и так есть. Меня интересует именно - скрипт отбирание вещей с их сохранением и скрипт возврата этих сохраненных вещей. В вашем большом скрипте это есть, но лишнее сбивает меня с толку. Если нетрудно, выложите отдельные скрипты на отбирание и возврат вещей, хорошо бы с комментариями. Заранее благодарен.


С уважением, Андрей ЮП.
gennady
Neverwinter Script
// ДАТЬ И ОПОЗНАТЬ ПРЕДМЕТЫ (ДЛЯ ОБРАБОТКИ ЗОЛОТА)
// string sItem - ResRef предмета
// object oTarget - Объект или существо кому дать
// int iKol - Количество предметов
// int iStack=1 - Количество предметов в стеке
void CreateItemSklad(string sItem, object oPC, int iKol=1, int iStack=1);

void CreateItemSklad(string sItem, object oPC, int iKol=1, int iStack=1)
{
while(1 <= iKol)
{
  if(iKol < iStack) iStack = iKol;
  object oItem = CreateItemOnObject(sItem, oPC, iStack);
  SetIdentified(oItem, TRUE); // опознать
  iKol-=iStack;
}
}
//////////////  ЗАБРАТЬ ВЕСЬ ИНВЕНТАРЬ И ОДЕТЬ ГЕРОЯ В РОБУ    /////////////////
void DeletItem(object oPC, object oSklad)
{
object oItem = GetFirstItemInInventory(oPC);
int i;
// ИНВЕНТАРЬ
while(GetIsObjectValid(oItem))
    {
    CopyItem(oItem, oSklad);
    DestroyObject(oItem);
    oItem = GetNextItemInInventory(oPC);
    }
// СЛОТЫ
    for (i = 0; i < NUM_INVENTORY_SLOTS; i++)
      {
        oItem = GetItemInSlot(i, oPC);
        if (GetIsObjectValid(oItem))
        {
          CopyItem(oItem, oSklad);
          DestroyObject(oItem);
        }
      }
    // ***** Оденем *****
  object oMan = CreateItemOnObject("t_roba", oPC, 1); // Роба
  AssignCommand(oPC, ClearAllActions(TRUE));
  AssignCommand(oPC, ActionEquipItem(oMan,INVENTORY_SLOT_CHEST)); // Роба
}
/////////////////  ЗАБРАТЬ ВСЕ СУМКИ ГЕРОЯ  ////////////////////////////////////
void CopyBase(object oPC, object oSklad)
{
object oItem = GetFirstItemInInventory(oPC);
    while(GetIsObjectValid(oItem))
      {
      if(GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
      AssignCommand(oPC, ActionGiveItem(oItem, oSklad)); // Дать сумку или предмет
      oItem = GetNextItemInInventory(oPC);
      }
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
object oSklad = GetObjectByTag("SKLAD_ITEM");
int iGold = GetGold(oPC); // золото

// забрать золото и положить его в сундук
CreateItemSklad("nw_it_gold001", oSklad, iGold, 50000);
TakeGoldFromCreature(iGold, oPC, TRUE);
///////////////////////////////////////////
// забрать все сумки
CopyBase(oPC, oSklad);
//////////////////////////////////////////
// забрать все шмотки
DelayCommand(2.0, DeletItem(oPC, oSklad));
//////////////////////////////////////////
}
Андрей ЮП
Огромное спасибо, товарищ gennady! Это как раз то что нужно! Все теперь получается. Правда возврат вещей я решил сделать по другому, не автоматически. Просто герою перед освобождением из карцера открывают тот самый шкаф, куда были перенесены его вещи, и он сам все берет.
Еще раз спасибо!


С уважением, Андрей ЮП.
Sugo77
Подскажите что в этом скрипте(скрипт-телепорт на точку после смерти) не так?, он выдает кучу ошибок.

Neverwinter Script
location lRespawnLocation;

string sPlanet = GetLocalString(oRespawner,"planet");
sPlanet = GetStringUpperCase(sPlanet); //Работа со строкой планеты, у тебя просто разные точки используют разный шрифт, эти - верхний
string sFraction = GetLocalString(oRespawner, "fraction");
object wpStart = GetObjectByTag("PLANET"+sPlanet
+"ToBase"+sFraction); //Вэйпоинт на базе

lRespawnLocation = GetLocation(wpStart);
AssignCommand(oRespawner, JumpToLocation(lRespawnLocation));//Прыгаем на вэйпоинт на базе
greye
Добавь в начале
Цитата
object oRespawner = GetLastPlayerDying();

А по второму случаю надо было писать
Цитата
object oPC = GetEnteringObject(); if (GetIsPC(oPC)) SetLocalString(oPC, "planet", "Earth");

Прошу прощения за те ошибки, хотя вроде всё было правильно...
Latiss
Немного научился я в написании скриптов, но все-равно есть некоторые вопросы -
Этот скрипт висит на "Совершенных Действиях" в диалоге, но не работает. При этом скрипт компяллируется.
Neverwinter Script
void main()
{
        location lSigil = GetLocation(GetNearestObjectByTag("sigil2"));
        object oSigil = CreateObject(OBJECT_TYPE_PLACEABLE,"blueprint",lSigil);
        object oDoor = GetNearestObjectByTag("door");
        object oMark = GetNearestObjectByTag("PlanarBeacon");
        AssignCommand(oDoor,ActionCloseDoor(oDoor));
        AssignCommand(oDoor,ActionLockObject(oDoor));
        DestroyObject(oMark);
}


И еще - Скрипт висит на onDeath одного из НПС. В журнал добавляется, а другой НПС не появляется. Также компяллируется.
Neverwinter Script
void main()
{
        location lTel3 = GetLocation(GetNearestObjectByTag("kaldar_enter"));
        object omage1 = CreateObject(OBJECT_TYPE_CREATURE,"kaldar0",lTel3);
        object oPC = GetFirstPC();
        AddJournalQuestEntry("Drugs", 2, oPC);
}
gennady
Вы определяете объекты оператором GetNearestObjectByTag... Тот ли объект нужен? Если в диалоге, то НПСа с которым идет диалог нужно брать как OBJECT_SELF, как в прочем и в скрипте смерти...
Latiss
Цитата(gennady @ Jan 17 2009, 11:47) *
Вы определяете объекты оператором GetNearestObjectByTag... Тот ли объект нужен? Если в диалоге, то НПСа с которым идет диалог нужно брать как OBJECT_SELF, как в прочем и в скрипте смерти...

Все-таки не понял. Можно чуть поподробнее?
Цитата(gennady @ Jan 17 2009, 11:47) *
OBJECT_SELF

А это зачем? Мы же проверяем объект Door (Дверь), Sigil (Вейпоинт, на котором будет стоять знак), Mark (Вейпоинт, который дестроится) в первом скрипте и Tel3 (Вейпоинт на котором появится НПС).
gennady
Цитата(Latiss @ Jan 17 2009, 12:02) *
Все-таки не понял. Можно чуть поподробнее?
Т.е. нельзя определять НПС или плейс или дверь на котором весит диалог, как объект GetNearestObjectByTag, а нужно обязательно брать OBJECT_SELF, а еще лучше его определить:
Neverwinter Script
object oSelf = OBJECT_SELF; // Объект на котором работает скрипт

Но в вашем случае это не ошибка, т.к. берутся другие объекты. Значит все дело в написание тегов и ресрефов. Задайте все правильно и скрипты будут работать, т.к. в них ошибок...
Latiss
Цитата(gennady @ Jan 17 2009, 13:38) *
Задайте все правильно

Хм... Я провеляр всех их. Написаны вроде бы правильно.
P.S. Аааа... Локацию в которой все эти объекты находилась стала сначала area006, в которой все серое и тулсет вылетал при ее загрузке, а потом мне пришлось ее удалить cray.gif
P.P.S Это так - крик души.
Latiss
Я понял в чем суть проблемы - Диалог и скрипт смерти находились в других локациях, нежели в той, где должны были создаваться объекты.
Сегодня написал еще один скрипт и поместил его на onEnter триггера в одной локации (тоже на создание НПС). Он дестроился, но НПС не создавал (В другой локации). Как только поставил его на вход этой локации - Сразу же заработал.
Поэтому придется делать триггеры, а простым диалогом не обойтись...
gennady
Цитата(Latiss @ Jan 18 2009, 13:33) *
Поэтому придется делать триггеры, а простым диалогом не обойтись...
Чё за чушь... biggrin.gif Бери в диалоге объекты как GetObjectByTag или же запиши так:
Neverwinter Script
void main()
{
object oWP = GetObjectByTag("sigil2"); //точка в нужной области с уникальным тегом (определяет объекты во всем модуле)
object oArea = GetArea(oWP); //сама область
// ближайшие к выбранной точке объекты (объекты должны быть только в одной области с oWP)
object oDoor = GetNearestObjectByTag("door", oWP);
object oMark = GetNearestObjectByTag("PlanarBeacon", oWP);
location lSigil = GetLocation(oWP);

object oSigil = CreateObject(OBJECT_TYPE_PLACEABLE,"blueprint",lSigil);
        AssignCommand(oDoor,ActionCloseDoor(oDoor));
        AssignCommand(oDoor,ActionLockObject(oDoor));
        DestroyObject(oMark);
// ПРОВЕРКА
SpeakString("В области" +GetName(oArea)+" создали плейс " +GetName(oSigil));
}
Latiss
Хм... А вот этого не знал. Зато теперь буду знать. Спасибо, gennady.
P.S. На досуге не заглянешь в тему Threads of Truth в Главном Зале? Хочется все-таки узнать мнение общественности rolleyes.gif
gennady
Кто знает в каком скрипте описана кнопочка отмены полиморфа??? Нужно срочно! biggrin.gif
virusman
Цитата(gennady @ Jan 25 2009, 07:56) *
Кто знает в каком скрипте описана кнопочка отмены полиморфа??? Нужно срочно! biggrin.gif
Она вшита в движок.
sowhat
Доброго всем! Народ, мучает такой вопрос, возможно ли как нить написать на скриптах бота для онлайн шарда?.. Чтобы не писать доп. приложений. Догадываюсь что нет, но хочется в этом убидится. И если вдруг я не прав, киньте линк плз.

--- к вышенаписаному топику ---

В смысле есть ли в НВНке скрипты, для клиентской части, вот)

можно ли выполнить runscript без прописи DebugMode 1 на шарде? народ, хелп плиз, очень срочно нада...
Lex
лучше по этому поводу теребить шардовиков, но мне с моей сингловой колокольни видится только 1 вариант запуска скрипта со стороны пользователя - default.nss. Те ХБ чара, причем не только своего, а вообще всех на шарде. Теоретически бота с его помощью написать можно, простенького, типа "убийство всех монстров на карте". Но практически, без данных типа тэгов, точек и зон перехода, будет сложновато сделать что-то путное, если вообще возможно.
sowhat
Цитата(Lex @ Feb 12 2009, 17:55) *
лучше по этому поводу теребить шардовиков, но мне с моей сингловой колокольни видится только 1 вариант запуска скрипта со стороны пользователя - default.nss. Те ХБ чара, причем не только своего, а вообще всех на шарде. Теоретически бота с его помощью написать можно, простенького, типа "убийство всех монстров на карте". Но практически, без данных типа тэгов, точек и зон перехода, будет сложновато сделать что-то путное, если вообще возможно.


А моно поподробней про default.nss... Де должен находится/как запускать?) Пробывал писать пробные скрипты и запускать на шарде, не хочет =( Одно дело запустуть в модуле через runscript, а тут это не катит =(
Ilerien
default.nss - это onHeartbeat скрипт игрока, исполняется каждый раунд. Можно попробовать написать какой-нибудь аи для игрового чара, основанный только на этом скрипте, но, думаю, игра не стоит свеч.
haljavan
короче так. нада чтоб у мобов генерировался дроп. желательно с ооочень маленким процентом выпадания.

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