Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Ты вешаень на НПС команду с зедержкой на 20 сек. А если через 20 сек нет этого НПС, то все. Твоя команда потерялась, так как нет объекта, к которому была привязка..все логично
DBColl
Лекс, абсолютно прав в своем ответе. И все действительно ЛОГИЧНО.
QUOTE (Twin @ Oct 1 2004, 04:47)
Проблема в том, что у меня "debug2" не пишет, если понизить время в DelayCommand до 5.0f то напишет, но мне то нужно таймер больше чем минуты делать. Почему так происходит я не знаю, еще очень мало работаю с тулсетом. Может кто подскажет как мне реализовать таймер после убийства НПС, причем я должен иметь доступ к свойствам убиваемого НПС (только для чтения, не для записи).

А вот в этом случае я бы тебе советовал делать перед смертью
SetDestroyable(OBJECT_SELF, ...); - чтобы не пропадал труп!
Весь инвентарь выкидывал в какой-то лут-контейнер рядом... И уже на этот контейнер можно повесить конструкцию:

AssignCommand(oLoot, DelayCommand(30.0, действие));

Затем сразу можно Destroy'ить тело wink.gif.
<small>Добавлено в 10:38</small>
QUOTE
DelayCommand( 20.0f, DoSpawn2());

QUOTE (Twin @ Oct 1 2004, 07:24)
Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё...

Это как это НЕ ИМЕЕТ??? swoon.gif ИМЕЕТ! yes.gif
Замени свою конструкцию на
Neverwinter Script Source
AssignCommand(oKiller, DelayCommand(20.0, ExecuteScript("скрипт с DoSpawn2()")));

...и увидишь разницу. wink.gif
Aiwan
QUOTE (Twin @ Oct 1 2004, 10:24)
Я это допускал. Но объясни мне, как может DelayCommand зависить от существования OBJECT_SELF'а? Это же бред.

Ты не прав. Посмотри, твоя команда
Neverwinter Script Source
DelayCommand( 20.0f, DoSpawn2());

Вызывает функцию, которая прописана в скрипте объекта OBJECT_SELF.
ТЫ ВЫЗЫВАЕШЬ эту функцию через 10 секунд, например, а функции УЖЕ НЕТ! Так как она была прописана на НПС а он дестроился. Все это будет работать так скрипт с именем DoSpawn2:
Neverwinter Script Source
void DoSpawn2()
{
    SendMessageToPC(GetFirstPC(), "debug2");
}


Будет запускаться таким образом:

Neverwinter Script Source
#include "x2_inc_compon"
#include "x0_i0_spawncond"

void DoSpawn2();

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();

    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if ( nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL) )
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    DelayCommand( 20.0f,  ExecuteScript("DoSpawn2", GetFirstPC()));
    SendMessageToPC(GetFirstPC(), "debug 1");

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if ( GetSpawnInCondition(NW_FLAG_DEATH_EVENT) )
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }

    craft_drop_items(oKiller);
}
Lex
на такую халаву все горазды отвечать (и я в том числе).
А вот на 5 вопросов Shadа никто ответить даже не пытался..признаюсь, что некоторые (вопросы) ставят меня в тупик.
Twin
Ох, сорри. wink.gif Просто мне очень хотелось верить в то что DelayCommand работает на низком уровне и уж априори не является свойством объекта. Ну нет так нет. smile.gif Я в тулсете ноль, хотя после ваших ответов уже с палочкой. yes.gif Спасибо.

2 DBColl:
Я писал авто-респаун НПСей для PW не через энкаунтеры, а по событию смерти. Лут их мне не был нужен, лиш resref и тэг. В итоге так и реализовал, как ты советывал, вешая DelayCommand на "системный" плэйс (чтоб ДМ мог его разломать и все респауны прекратились lol.gif).
Aiwan
Shad Пропустил твой пост... тока нашел...
QUOTE (Shad @ Sep 24 2004, 04:32)
3. Как сделать, чтобы Item свободно левитировал в воздухе, и чтобы его из воздуха можно было взять?//Редакторе висит, в игре падает вниз.

Никак. Вся инфа об итемах и простых предметах на арене находится в вайлах локации. А изменение координаты Z можно лишь через тулсет. Но можно сделать невидимый объект на уровне тайлов, с возможностью ходить по нему. Тогда это будет невидимый объект - пъедестал, который будет тормозом для игрока. Есть еще способ, он проще но есть но. Делаешь в Махе два предмета с разными координатами и размерами. Например как картины в НВН. Основание далеко внизу а макушка видимая вверху, в виде pls объекта. Затем дестрой-крет в инвентаре твой итем. Но Объект будет активным скорее всего весь, так что тут свои изъяны.
А вообще, сделать что то в НВН красиво и без изврата не возможно.
QUOTE (Shad @ Sep 24 2004, 04:32)
4. Как сделать, чтобы работали фиты на Creature Weapon - Improved Critical, Overwhelming Critical, например. У меня не работают.
5. Как сделать, чтобы Creature Weapon наносил одновременно разные типы физического урона (Режущий и колющий и дробящий сразу).// Когда ставлю такие свойства на оружме, или эффект на существо - урон растет но остаетья того же типа, что на базовом предмете оружии.

Это все редактирование 2Да. Что именно и возможно ли все что ты просишь я не знаю. Но из логики работы с редактором могу сказать только одно. Любое действие, то бишь тот же урон, есть такой же Action как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать.

И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет?

п.с. Не обижайся, если я резковато ответил yes.gif А вообще, чем занят? wink.gif Может поделишься инфой?
Elven king
Такая прозьбы, для опытных мастеров:
Кто исправит мой скрипт для отдыха, а то я уже голову сломал и так, и эдак пробовал, но нифига не выходит sad.gif Помогите!
Вот собстна сам скрипт:
rest
CODE
void DestroyFirecamp(object oCampFire=OBJECT_SELF)
{
// Создаем обгорелое пятно на месте костра и гасим костер
 object oLandMark=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_weathmark",GetLocation(oCampFire));
// Пятно исчезает через 120 секунд (2 реальных минуты, 1 игровой час). Менять по вкусу
 AssignCommand(oLandMark,DelayCommand(120.0,DestroyObject(oLandMark)));
 DestroyObject(oCampFire);
}

void ApplyRestEffect(object oTarget=OBJECT_SELF)
{
// Создаем эффекты сна. Функцию править по вкусу.
 effect eSleep=EffectBlindness();

 if (GetRacialType(oTarget)==RACIAL_TYPE_ELF)
 {
// Эльфы едят и пьют другое
object FindFood(object oTarget=OBJECT_SELF)
{
 object oEnum=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oELEnum)!="FOODELVEN"))
     oEnum=GetNextItemInInventory(oTarget);
 return oEnum;
}
object FindWater(object oTarget=OBJECT_SELF)
{
 object oELWATER=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oELWATER) && (GetTag(oELWATER)!="WATERELVEN"))
     oEnum=GetNextItemInInventory(oTarget);
 return oELWATER;
}


     // Эффект сна на 30 секунд. Менять по желанию.
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oTarget,30.0);
}

object FindFood(object oTarget=OBJECT_SELF)
{
 object oEnum=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="FOOD"))
     oEnum=GetNextItemInInventory(oTarget);
 return oEnum;
}
object FindWater(object oTarget=OBJECT_SELF)
{
 object oWATER=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="WATER"))
     oWATER=GetNextItemInInventory(oTarget);
 return oEnum;
}


makecamp (вешать на OnUsed дров)
CODE
#include "rest"

void main()
{
 object oPC=GetLastUsedBy();
 if (!GetIsPC(oPC)) return;
 object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
 if (GetIsObjectValid(oTorch) &&
        (GetTag(oTorch) == "NW_IT_TORCH001") &&
// Флаг, висящий на области (например в таверне) и позволяющий отдыхать бесплатно
        (GetLocalInt(GetArea(oPC),"NoCampArea") != TRUE)) {
     object oFire=CreateObject(OBJECT_TYPE_PLACEABLE,"campfire",GetLocation(OBJECT_SELF));
     DestroyObject(OBJECT_SELF);
// Огонь гаснет через 900 секунд (15 реальных минут или 7,5 игровых часов)
// Менять по желаю
     AssignCommand(oFire,DelayCommand(900.0,DestroyFirecamp(oFire)));
 } else {
     CreateItemOnObject("wood",oPC);
     DestroyObject(OBJECT_SELF);
 }
}


dropwood (вешать OnUnAquiredItem модуля)
CODE
void main()
{
 object oPC=GetModuleItemLostBy();
 if (!GetIsPC(oPC)) return;
 object oItem=GetModuleItemLost();
 if (!GetIsObjectValid(oItem)) return;
 string sResRef=GetTag(oItem);
 if (sResRef=="WOOD")
 {
     if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem)))) {
         CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile",GetLocation(oItem));
         DestroyObject(oItem);
     }
 }
}

resteffect (вешать на OnRested модуля)

CODE
#include "rest"

void main()
{
 object oPC=GetLastPCRested();
 if (GetCurrentAction(oPC)!=ACTION_REST) return;
 int iFreeRest=GetLocalInt(GetArea(oPC),"FreeRestArea");
 if (iFreeRest) ApplyRestEffect(oPC);
 else {
     object oCampFire=GetNearestObjectByTag("campfire",oPC);
// нельзя отдыхать дальше 3 метров от костра (расстояние менять по вкусу)
     if (GetIsObjectValid(oCampFire) && (GetDistanceBetween(oPC,oCampFire)<=3.0))
{
         object oFood=FindFood(oPC);
         if (GetIsObjectValid(oFood)) {
             DestroyObject(oFood);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
object oWATER=FindWater(oPC);
         if (GetIsObjectValid(oWATER)) {
             DestroyObject(oWATER);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
}
object oELFood=FindFood(oPC);
         if (GetIsObjectValid(oFood)) {
             DestroyObject(oELFood);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
object oELWATER=FindELWater(oPC);
         if (GetIsObjectValid(oELWATER)) {
             DestroyObject(oELWATER);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
}
DBColl
Хех, ты бы хоть написал, что ты от него хочешь... Хехехе... Во дал! А то, "кто исправит"! Я балдю! lol.gif lol.gif crazy.gif
Aiwan
Алучше сделай тестовый модуль и выложи его. С итемами и скриптами. yes.gif
Elven king
Вобщем скрип на отдых...
Смысл скрипта вот в чем: игрок кладет из инвентаря дрова, на землю потом поджигает их факелом - появляется модель костра, потом возле костра игрок нажимает rest и тогда скрипт проверяет есть ли у PC еда и вода, если PC эльф, то скрипт проверяет есть ли эльфийская вода или эльфийский паек...
ЗЫ. Выложить модуль пока времени нету... Но постараюсь найти его. smile.gif
Lex
нужен не весль модуль, а только кусочек, где это все вставлено.

Похоже на стандартный отдых. На Эксисе такой точно был (кроме эльфийской части)
Аваддон
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелыsmile.gif
Aiwan
Аваддон это можно в ХоТУ скриптовыми командами. Какими точно и как я не знаю, не сталкивался.
Shad
QUOTE (Аваддон @ Oct 9 2004, 00:14)
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелыsmile.gif

В фильтре функций (правое окно редактора скриптов) вводишь light, это основные функции инклуды не нужны. Надо будет пробежать по всем тийлам, на нужных SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color). По-моему, просто по координатам, преобразовываем вектор в location... Вообще то я тоже с этим не сталкивался, но, наверно, можно ставить SourceLightColor даже не на нужных, а на всех (не уверен что легко выделить нужные) - там где нет SourceLight (светильников, факелов) это просто даст нулевой эффект, наверное.
Shad
Привет, Aiwan. А я уже почти и перестал надеятся.(вру)

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Shad Пропустил твой пост... тока нашел...

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

Спс. Я сам не догадался перейти на уровень редактирования моделей. Мне больше второй способ понравился, но, ты прав, новые модели в хак я ещё пять раз подумаю прежде чем добавлять. yes.gif
QUOTE (Aiwan @ Oct 2 2004, 08:30)
А вообще, сделать что то в НВН красиво и без изврата не возможно.

Иногда, да. Это ключевой момент, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливойswoon.gif реализации.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Это все редактирование 2Да. Что именно и возможно ли все что ты просишь я не знаю. Но из логики работы с редактором могу сказать только одно. Любое действие, то бишь тот же урон, есть такой же Action как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать.


Мм. Фиты связанные с критическими ударами работяют нормально с оружием которое берётся в руку/руки, какая то странная дискриминация для оружия существ... Что подозрительно, что стандартные (!) Elder * Elemental-ы, например, имеют этот самый фит Creature Weapon - Improved Critical (что кстати соответствует и AD&D 3rd Ed MM), но он, определённо, не действует.
Про Action... Действительно ли для разных типов физ. урона невозможны отдельные "действия"? Ведь для стихийных судя по всему существуют. Мм. Если я правильно ли понимаю...: тут для всех типов физического урона есть одна на всех "ячейка", и при расчёте только идентификатор одного из них проходит как параметр этого "действия"?

QUOTE (Aiwan @ Oct 2 2004, 08:30)
И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет?


Чем дальше, тем больше убеждаюсь что ты прав. Началось всё месяца два (уже три) назад с уверенности, что для участия в чём-то надо хоть мало-мальски разобраться в тулсете. Надумал, взялся изучать. Повторюсь, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливойswoon.gif реализации. А от идеи отказываться как-то не хосется. Вот и думаю, и спрашиваю. В итоге наверно это никому не будет нужно.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
п.с. Не обижайся, если я резковато ответил  yes.gif

Нп. Молчание горазду хуже. yes.gif

QUOTE (Aiwan @ Oct 2 2004, 08:30)
А вообще, чем занят? wink.gif

Рисовал спелл один... был такой в BG2:ToB - Вызов элементалей, с ним в комплекте Великий вызов их же. Ждал его а IWD2, ждал в NWN... Эхх... Вот, думаю, заодно и разберусь как и что.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Может поделишься инфой?

У меня всё что есть, это в основном:
туториалы по ссылкам на www.wrg.ru и Realms.ru, в том числе и статьи
"В ПОМОЩЬ СОЗДАТЕЛЮ ПРИКЛЮЧЕНИЙ" ... хорошая последовательная и структурированная штука.
+ NWN Lexicon April2004
+ Eligio Sacateca Custom Content v3.0
+ CEPBuilders Guide&Standards
...хотя учился я в основном на комментариях от Bioware.
Вот и всё. То что намутил с заклинанием (вместо 2х получилось 3, но это не важно) - наверно скоро выложу где-то здесь. Хотя вот нашел одну совсем простую вроде ошибку... это наверно единственное без чего работа просо не будет применима - это не обойти и не обойтись без него:

6. Как заставить отображаться SubRad-спеллы, если они относятся к спеллу взятому через фит?//Когда мастер-спелл повешен на посохе (том самом, что упорно не хочет летать), всё работает норм. Когда взят Epic Spell - нет. Привязка SubRad-спеллов к фиту судя по всему осуществляется в spells.2da столбец FeatID, используя формулу FeatID_для_мастер-спелла + k*65536. Вот это k мне и не даётся так сразу - SubRad-спеллы в радиальном меню не появляются.

Да, спс ещё раз, Aiwan. Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, yes.gif я уже устал исправлять, пока не узнаю что работка кому-то интересна. wink.gif
Aiwan
2 Shad я уж думал ты пропал biggrin.gif

QUOTE (Shad @ Oct 9 2004, 11:58)
Если я правильно ли понимаю...: тут для всех типов физического урона есть одна на всех "ячейка", и при расчёте только идентификатор одного из них проходит как параметр этого "действия"?

dntknw.gif biggrin.gif

Я думал ты делаешь проект. Или делаешь? Жаль, что много людей интересуются разными вещами и очень мало, а точнее почти никто sad.gif , не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса.
Shad
QUOTE (Aiwan @ Oct 9 2004, 10:02)
2 Shad  я уж думал ты пропал  biggrin.gif


dntknw.gif   biggrin.gif

Я думал ты делаешь проект. Или делаешь? Жаль, что много людей интересуются разными вещами и очень мало, а точнее почти никто sad.gif , не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса.

Нет, Aiwan, я толко начал редактор изучать. Хочу поработать с командой шарда Siala - мне нравится их жёстко маниакальный подход.
Аваддон
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?
DBColl
QUOTE (Аваддон @ Oct 14 2004, 17:49)
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?

В Проклятье Левора эта система живет в хертбите модуля. Однако это:
1. Сингл. По сему не приходится перебирать чаров.
2. Для создания несильной загруженности, проверки снижены до односложных-вложенных условий (без && и ||). Типа
Neverwinter Script Source
if (GetFormatTimeLastRest(oPC)+15часов > GetFormatTime())
{
   if (!GetHasWakeEffect(oPC))
   {
       ............. и т.д.
   }
}
Shad
QUOTE (Shad @ Oct 9 2004, 08:58)
Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, я уже устал исправлять, пока не узнаю что работка кому-то интересна.
Aiwan
Shad щас, гляну yes.gif
Ой блин! sclerosis.gif У меня ж нету Тулсета... swoon.gif Но солью все равно biggrin.gif
Shad
QUOTE (Aiwan @ Oct 17 2004, 08:22)
Shad  щас, гляну  yes.gif 
Ой блин! sclerosis.gif У меня ж нету Тулсета...  swoon.gif  Но солью все равно  biggrin.gif

Напиши, как оно. Интересно... rolleyes.gif
Черный Ярл
Мир вам!

Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры.
Вообще это реализуемо? Если да, то как?
Спасибо.
baskan
Ай нид хелп..
Вот скрипт и тут есть фича с регистрацией аккаунта на шарде..так вот как ее отсечь без вреда скрипту?(ка я понял там еще есть некоторые действия)

CODE
void main()
{
PGSModuleClientEnterEvent (GetEnteringObject());
object oPC = GetEnteringObject();
object oEmote = GetItemPossessedBy(oPC, ITEM_TYPE_EMOTEWAND);
object oDMring = GetItemPossessedBy(oPC, "dmfi_onering");
object oObject = GetItemPossessedBy(oPC, sSTR_013);
object pl;
string sName = GetPCPlayerName(oPC);
string sFName = GetName(oPC);
string sDMName = GetPCPlayerName(oPC);
string sKey = GetCampaignString(SECURITY, sName);
string sPL1 = GetCampaignString(SECURITY, sName+"player1");
string sPL2 = GetCampaignString(SECURITY, sName+"player2");
string sPL3 = GetCampaignString(SECURITY, sName+"player3");
int iAlignment = GetAlignmentGoodEvil(oPC);
int a;
int b;
int d;
int iDHP;
int iMHP = GetMaxHitPoints(oPC);
int nomer=StringToInt(GetDeity(oPC));
int prenomer=0;
if (GetIsPC(oPC) && !GetIsDM(oPC))
{
 SetPlotFlag(oPC, FALSE);
 SendMessageToPC(oPC, sSTR_005);
 //
 if (sPL1==sFName) {prenomer=1;}
 else if (sPL2==sFName) {prenomer=2;}
 else if (sPL3==sFName) {prenomer=3;};
 //
 if ((nomer==0)&&(prenomer!=0)&&(GetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT")==""))
 {
 SetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT","TRUE");
 SetDeity(oPC,IntToString(prenomer));
 nomer=prenomer;
 a=0;
 for (d = 1; d <=GetCampaignInt("player_list","count"); d++)
 {
 if (a==1) continue;
 if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){}
 else {a=1;};
 };

 if (a!=1)
 {
 SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1));
 SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName);
 };
 };
 //
 if ( (GetPCPublicCDKey(oPC) == sKey)&&(nomer==prenomer)&&(nomer!=0))
 {
  if (oEmote == OBJECT_INVALID) CreateItemOnObject(ITEM_TYPE_EMOTEWAND, oPC, 1);

   switch (iAlignment)
   {
   case ALIGNMENT_GOOD:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 1) SetCampaignInt(GOOD_EVIL,sFName+sName,1);
   break;
   case ALIGNMENT_EVIL:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 2) SetCampaignInt(GOOD_EVIL,sFName+sName,2);
   break;
   default:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 3) SetCampaignInt(GOOD_EVIL,sFName+sName,3);
   break;
   }


   pl = GetFirstPC();
   b = GetCampaignInt(GOOD_EVIL,sFName+sName);
   while ( pl != OBJECT_INVALID)
   {
   if ((!GetIsDM(pl))&&(pl!=oPC))
   {
   a = GetCampaignInt(GOOD_EVIL,GetName(pl)+GetPCPlayerName(pl));
   if ((a!=b)&&(a!=2)&&(b!=2)) ActionDoCommand(SetPCDislike(oPC,pl));
   };
   pl=GetNextPC();
   }
  //ExecuteScript ("ats_client_enter",oPC);

 SetLocalString(oPC,"acc",GetPCPlayerName(oPC));

 int iHP = StringToInt(GetCampaignString(CHAR_DATA,GetPCPlayerName(oPC)+"player"+IntToString(nomer)+"HP"));
 if (iHP != 0)
 {
 if (iHP<iMHP){iDHP=iMHP-iHP;ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDHP), oPC);}
 else if (iHP>iMHP) {iDHP=iHP-iMHP; ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectTemporaryHitpoints(iDHP), oPC,30.0);}
 };

 if (GetIsDead(oPC))
 {
 SetLocalInt(oPC,"autokill",1);
 location lLoc = GetCampaignLocation("bd_locations",sFName+sName);
 AssignCommand(oPC,ActionJumpToLocation(lLoc));
 };

 /*Vnesenie akkauntov v spisok player_list
 a=0;
 for (d = 1; d <=GetCampaignInt("player_list","count"); d++)
 {
 if (a==1) continue;
 if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){}
 else {a=1;};
 };

 if (a!=1)
 {
 SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1));
 SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName);
 };
 */

 }
 else{BootPC(oPC); SetLocalInt(oPC,"bootexit",1);}
}
else if (GetIsDM(oPC))
 {
  if (GetCampaignString(DM_VAULT, sDMName) == GetPCPublicCDKey(oPC))
  {
   SendMessageToPC(oPC, sSTR_038);
   if (oDMring == OBJECT_INVALID) { CreateItemOnObject("dmfi_onering", oPC, 1); }
  }

  else
  {
  BootPC(oPC);
  PrintString("Someone with IP: " + GetPCIPAddress(oPC) + " tryed to enter as a DM '" + GetPCPlayerName(oPC) + "'!");
  }
 }
}
DBColl
Черный Ярл
QUOTE (Черный Ярл @ Oct 19 2004, 01:40)
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры. Вообще это реализуемо? Если да, то как?

Мне кажется, что это нельзя отследить... Хотя... есть идейка хитренькая...
У моба надо скрипт на OnDamage вешать. При каждом полученном неписем повреждении скрипт на нем анализирует максимальный "некритический" удар damager'а. Сравнивает с полученным повреждением и если оно больше, чем максимальный "некритический" удар, значит это КРИТ. Запускаем кастом функцию. drag.gif
Aiwan
Shad я посмотрел твой модуль. МОЛОДЕЦ! good.gif
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю crazy.gif Но то что видел у тебя мне понравилось!
Shad
QUOTE (Aiwan @ Oct 23 2004, 18:10)
Shad  я посмотрел твой модуль. МОЛОДЕЦ!  good.gif
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю  crazy.gif  Но то что видел у тебя мне понравилось!

Спасибо, Aiwan. yes.gif Значит я не зря старался. biggrin.gif Осталость применение найти.
П.С. Можно удалять посты о модуле, дабы тему не зафлуживать.
Aiwan
Все нормально. Если уж наши слова спам, то я Испанский Летчик pilot.gif
Может ты бы оформил свой модуль как ссылку и в тему полезных ссылок поставил?
baskan
Вопросик..

В каком модульном свойстве стоит система лута? unsure.gif
DBColl
Лут не в модульных свойствах. Он в OnDeath крича.
baskan
QUOTE (DBColl @ Oct 25 2004, 18:35)
Лут не в модульных свойствах. Он в OnDeath крича.

Ясно..Спасибо yahoo.gif
Тобур
Не подскажут ли мастера тулсета: Как сделать цикл перебора всех карт в модуле? Что-то я рылся в функция, рылся - ничего не нашел. Вся беда в том, что невозможно присваивать свою величину перепенной типа object sad.gif
Aiwan
А нельзя циклом прогнать объекты, и определить их тип как area?
Shad
Тобур Если можно достучатся до файлов на диске, ResRef-ы карт в файле module.ifo хранятся подряд, возможно это можно использовать.
Можно использовать объекты со специфическим тегом ("sequence_xx") и пробегать по ним.
DBColl
Shad
До ерф-файлов и module.ifo из игры не достучаться.
QUOTE (Тобур @ Oct 25 2004, 23:38)
Вся беда в том, что невозможно присваивать свою величину перепенной типа object

??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?.. this.gif unsure.gif
QUOTE (Aiwan @ Oct 26 2004, 00:04)
А нельзя циклом прогнать объекты, и определить их тип как area?

Это будет слишком долго (если модуль довольно объемный)... Вообще имхо ЛУЧШИЙ вариант - поставить в КАЖДОЙ локе вейп с одинаковым тэгом, допустим "WP_ID_AREA". Потом просто циклом перебираем:
Neverwinter Script Source
object oWP, oArea;
while (GetIsObjectValid(oWP = GetObjectByTag("WP_ID_AREA", n)))
{
    oArea = GetArea(oWP);
    ....//здесь делаешь с локой то, что тебе надо от перебора
    n++;
}
Тобур
QUOTE (DBColl @ Oct 26 2004, 03:34)
??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?.. this.gif  unsure.gif

Эхх , если бы все было так просто sad.gif
скриптик
object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);
компилируется с ошибкой ERROR: DECLARATION DOES NOT MATCH PARAMETERS, хотя в Лексиконе ясно сказано "object - An integer that represents a particular object in the world (essentially a pointer to a real object)".

Я не могу никаким образом получить какую-то идентификацию карты иначе, чем через объект, который на этой карте находится. Ясно, что тип object это ссылка, но как перебрать все-таки карты в модуле? В принципе , я уже нашел способ, но этот способ больно извращенный. Неужели в тулсете не предусмотрена все-таки более простая возможность?

Через ресрефы тоже плохо - они все разные, через расставленные вэйпоинты - тоже: их надо расставлять.

Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы. Так как карт у нас около 470, просматривать в тулсете тэг очень долго и муторно. Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение.
DBColl
QUOTE (Тобур @ Oct 26 2004, 07:41)
Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы.

Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту...
Добавлено в [mergetime]1098772792[/mergetime]
К тому же, обрати внимание на функцию ObjectToString(object oObj); wink.gif yes.gif
Baal
QUOTE (Тобур @ Oct 26 2004, 04:41)

object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);

Это мне вобще непонятно wacko.gif Как это объекту можно присвоить числовое значение? swoon.gif
Тобур
QUOTE (DBColl @ Oct 26 2004, 09:30)
Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту...
<small>Добавлено в [mergetime]1098772792[/mergetime]</small>
К тому же, обрати внимание на функцию ObjectToString(object oObj); wink.gif yes.gif

Потому что при добавлении новой карты все индексы перестраиваются и со сменой версии модуля игрок может оказаться или не там, где выходил или вообще в стартовой локации. ObjectToString ничего мне не дает - вот если бы была функция StringToObject - это бы все меняло smile.gif. Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой.

QUOTE
QUOTE (Тобур @ Oct 26 2004, 04:41)

object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);


Это мне вобще непонятно  Как это объекту можно присвоить числовое значение? 


Я же специально привел ссылку из лексикона - object содержит в себе натуральное число (иначе говоря просто номер объекта). Весь вопрос в том и состоит - как переменной типа object присвоить этот самый номер.

Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту.

Короче, я понял, что тут никто толкового сказать не может sad.gif
DBColl
QUOTE (Тобур @ Oct 26 2004, 18:49)
Короче, я понял, что тут никто толкового сказать не может

Спасибо за твою благодарность в сторону наших попыток помочь. Либо ты слишком умный, либо слишком много у нас времени и главное ДАННЫХ, которые ты представил в своей задаче... dntknw.gif this.gif Но так, как ты говоришь и высказываешь мнение о пытающихся помочь - не делается. Здесь, на форуме ВРГ, никто никому ничего не должен, а потерпеть и выудить решение все равно можно. Увы, твое терпение коротко...
QUOTE (Тобур @ Oct 26 2004, 18:49)
Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту.

Мне не нравится немного, что ты "еще раз повторяешь: НЕТУ РЕШЕНИЯ! ЧТО ВЫ МУЧАЕТЕСЬ?". Как будто, задавая вопрос и отвечая сам же на него потом нам, ты говоришь: НУ ВЫ И... КАК ВЫ МОГЛИ ПОДУМАТЬ ТОЛЬКО, ЧТО Я ТАКОГО НЕ ПРОБОВАЛ ДЕЛАТЬ?..
QUOTE (Тобур @ Oct 26 2004, 18:49)
Потому что при добавлении новой карты все индексы перестраиваются и со сменой версии модуля игрок может оказаться или не там, где выходил или вообще в стартовой локации.

Вообще-то индексы не перестраиваются. Они дописываются к последнему элементу.
QUOTE (Тобур @ Oct 26 2004, 18:49)
Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой.

Ты бы лучше ПОДРОБНО объяснил задачу, а не задавал вопрос, ОТРИЦАТЕЛЬНЫЙ ответ на который, ты сам заранее уже знаешь и ждешь чтобы тебе его просто подтвердили.

Не спеши с выводами, а потерпи и решение придет. wink.gif

Я понял, тебе надо будет пробегать таким циклом по поиску лок лишь ОДИН раз, на старте модуля? Или я опять не догнал?
Shad
QUOTE (Тобур @ Oct 26 2004, 07:41)
Через ресрефы тоже плохо - они все разные

Можно сохранять ResRef для подтверждения правильности локации.
Но если пройти по модулю нужно один раз за версию - вопрос перешел в разряд теретических. Ведь какой-никакой метод, ты говришь, уже нашел.
DBColl
QUOTE (Тобур @ Oct 26 2004, 07:41)
Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение.

Шо цэ есть, ЗАДВОЕНИЕ? unsure.gif
Добавлено в [mergetime]1098827906[/mergetime]
QUOTE (Shad @ Oct 27 2004, 00:34)
Можно сохранять ResRef для подтверждения правильности локации.

Вот-вот. Отлично Shad! yes.gif good.gif
Тобур
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.
Решение я нашел такое: Я сохраняю в БД какую-то локацию, потом каким-то внешним редактором (в моем случае FoxPro) правлю DBF файл и соэдаю в нем 64000 записи с последовательно увеличивающимся индексом и названием переменной (В моем случае MAP1 , 2 и т.д.), в которой присутствует индекс. Затем в скрипте загрузки модуля вставляю следующий текст:

void CheckAreaTag()
{
object oMod = GetModule();
int iCur = GetLocalInt(oMod,"CurCount");
if (iCur < 64000)
{
WriteTimestampedLogEntry(" ~ Continue ~ "+IntToString(iCur));
int iBegin = iCur;
iCur = iCur +2000;
SetLocalInt(oMod,"CurCount",iCur);
object oArea;
object oTemp;
location lLoc;
string sVarName;
int i;
for (i = iBegin; i < iCur; i++)
{
sVarName = "MAP"+IntToString(i);
lLoc = GetCampaignLocation("TEST",sVarName);
oArea = GetAreaFromLocation(lLoc);
if (GetIsAreaNatural(oArea)!=AREA_INVALID)
WriteTimestampedLogEntry(sVarName + " id "+IntToString(i)+" ; "+"object "+ObjectToString(oArea)+" ; "+GetTag(oArea)+" ; "+GetName(oArea)+" ; "+GetResRef(oArea));
}
DelayCommand(2.0f, CheckAreaTag());

}
else
WriteTimestampedLogEntry(" ~ End ~ "+ IntToString(iCur));

}
void main()
{
WriteTimestampedLogEntry(" ~ Begin check area tag ~ ");
CheckAreaTag();
}

Получившийся текстовый лог-файл открываю в Exсel-e и сохраняю как таблицу (поля я специально разделяю знаком ; , так как Exсel понимает этот знак как разделитель. Дальше уже в Exсel-e можно сортировать , фильтровать и анализировать записи. Таким же образом можно получить сводную информацию обо всех объектах, находящихся на картах в модуле (не в палитре), например о НПС и плэйсэйблах
Aiwan
Тобур даже я вчера до двух ночи голову ломал. wink.gif Зря ты так drag.gif
QUOTE (Тобур @ Oct 27 2004, 10:52)
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.

Все ок! wink.gif ТО что ты сейчас сказал настолько важно, к примеру для меня crazy.gif Ты даже не представляешь yes.gif Заходи к нам почаще! drag.gif Все плохое забыли good.gif И молодец, что победил проблему. Кинь ее в базу скриптов, очень людям поможешь.
DBColl
Тобур
Все ок wink.gif. Ты - взрослый человек. good.gif

По делу... А дальше что? Ну есть у тебя экселевский файл. И что с ним делать дальше? Я думал тебе данные нужны для обратного использования потом в скрипте... unsure.gif
Тобур
Изначально моя цель была найти карты, у которых совпадают тэги. Для этого мне надо было получить список тэгов всех карт в модуле - я его получил, хоть и извращенным способом. После этого достаточно отсортировать в экселе таблицу по полю тэга и пробежаться взглядом по ней, чтобы найти задвоенность (дубляж) тэга. Я нашел в 470 картах 4 дубляжа - это тот результат, который я и хотел получить smile.gif
aleVandal
Менее извратный способ - создать 2дашку и забивать в нее таги(или ресрефы) локаций. Всего то делов остается - пробежать все строчки одного столбца( с тагами карт ) crazy.gif
Shad
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.
DBColl
QUOTE (Shad @ Oct 28 2004, 01:07)
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.

А следуя из этого, программульку-анализатор на Сях или Дельфях написать - как 2 пальца... wink.gif
altrush
Вопрос. Как убрать ВСЕ из инвентаря (нет ли функции соответствующей, аль чето такого)? umnik.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.