Ты вешаень на НПС команду с зедержкой на 20 сек. А если через 20 сек нет этого НПС, то все. Твоя команда потерялась, так как нет объекта, к которому была привязка..все логично
Лекс, абсолютно прав в своем ответе. И все действительно ЛОГИЧНО.
QUOTE (Twin @ Oct 1 2004, 04:47) |
Проблема в том, что у меня "debug2" не пишет, если понизить время в DelayCommand до 5.0f то напишет, но мне то нужно таймер больше чем минуты делать. Почему так происходит я не знаю, еще очень мало работаю с тулсетом. Может кто подскажет как мне реализовать таймер после убийства НПС, причем я должен иметь доступ к свойствам убиваемого НПС (только для чтения, не для записи). |
А вот в этом случае я бы тебе советовал делать перед смертью
SetDestroyable(OBJECT_SELF, ...); - чтобы не пропадал труп!
Весь инвентарь выкидывал в какой-то лут-контейнер рядом... И уже на этот контейнер можно повесить конструкцию:
AssignCommand(oLoot, DelayCommand(30.0, действие));
Затем сразу можно Destroy'ить тело

.
<small>
Добавлено в 10:38</small>
QUOTE |
DelayCommand( 20.0f, DoSpawn2()); |
QUOTE (Twin @ Oct 1 2004, 07:24) |
Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё... |
Это как это НЕ ИМЕЕТ???

ИМЕЕТ!
Замени свою конструкцию на
Neverwinter Script Source |
AssignCommand(oKiller, DelayCommand(20.0, ExecuteScript("скрипт с DoSpawn2()"))); |
...и увидишь разницу.
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); } |
на такую халаву все горазды отвечать (и я в том числе).
А вот на 5 вопросов Shadа никто ответить даже не пытался..признаюсь, что некоторые (вопросы) ставят меня в тупик.
Ох, сорри.

Просто мне очень хотелось верить в то что DelayCommand работает на низком уровне и уж априори не является свойством объекта. Ну нет так нет.

Я в тулсете ноль, хотя после ваших ответов уже с палочкой.

Спасибо.
2 DBColl:
Я писал авто-респаун НПСей для PW не через энкаунтеры, а по событию смерти. Лут их мне не был нужен, лиш resref и тэг. В итоге так и реализовал, как ты советывал, вешая DelayCommand на "системный" плэйс (чтоб ДМ мог его разломать и все респауны прекратились

).
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 как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать.
И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов.
Подумай десять раз, стоит ли твой гемморой стольких свечь или нет?п.с. Не обижайся, если я резковато ответил

А вообще, чем занят?

Может поделишься инфой?
Elven king
Oct 4 2004, 17:53
Такая прозьбы, для опытных мастеров:
Кто исправит мой скрипт для отдыха, а то я уже голову сломал и так, и эдак пробовал, но нифига не выходит

Помогите!
Вот собстна сам скрипт:
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()); } } }
|
Алучше сделай тестовый модуль и выложи его. С итемами и скриптами.
Elven king
Oct 4 2004, 22:55
Вобщем скрип на отдых...
Смысл скрипта вот в чем: игрок кладет из инвентаря дрова, на землю потом поджигает их факелом - появляется модель костра, потом возле костра игрок нажимает rest и тогда скрипт проверяет есть ли у PC еда и вода, если PC эльф, то скрипт проверяет есть ли эльфийская вода или эльфийский паек...
ЗЫ. Выложить модуль пока времени нету... Но постараюсь найти его.
нужен не весль модуль, а только кусочек, где это все вставлено.
Похоже на стандартный отдых. На Эксисе такой точно был (кроме эльфийской части)
Аваддон
Oct 9 2004, 00:14
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелы
Аваддон это можно в ХоТУ скриптовыми командами. Какими точно и как я не знаю, не сталкивался.
QUOTE (Аваддон @ Oct 9 2004, 00:14) |
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелы |
В фильтре функций (правое окно редактора скриптов) вводишь light, это основные функции инклуды не нужны. Надо будет пробежать по всем тийлам, на нужных SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color). По-моему, просто по координатам, преобразовываем вектор в location... Вообще то я тоже с этим не сталкивался, но, наверно, можно ставить SourceLightColor даже не на нужных, а на всех (не уверен что легко выделить нужные) - там где нет SourceLight (светильников, факелов) это просто даст нулевой эффект, наверное.
Привет, Aiwan. А я уже почти и перестал надеятся.(вру)
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
Shad Пропустил твой пост... тока нашел...
Никак. Вся инфа об итемах и простых предметах на арене находится в вайлах локации. А изменение координаты Z можно лишь через тулсет. Но можно сделать невидимый объект на уровне тайлов, с возможностью ходить по нему. Тогда это будет невидимый объект - пъедестал, который будет тормозом для игрока. Есть еще способ, он проще но есть но. Делаешь в Махе два предмета с разными координатами и размерами. Например как картины в НВН. Основание далеко внизу а макушка видимая вверху, в виде pls объекта. Затем дестрой-крет в инвентаре твой итем. Но Объект будет активным скорее всего весь, так что тут свои изъяны.
|
Спс. Я сам не догадался перейти на уровень редактирования моделей. Мне больше второй способ понравился, но, ты прав, новые модели в хак я ещё пять раз подумаю прежде чем добавлять.
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
А вообще, сделать что то в НВН красиво и без изврата не возможно. |
Иногда, да. Это ключевой момент, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливой

реализации.
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) |
И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет? |
Чем дальше, тем больше убеждаюсь что ты прав. Началось всё месяца два (уже три) назад с уверенности, что для участия в чём-то надо хоть мало-мальски разобраться в тулсете. Надумал, взялся изучать. Повторюсь, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливой

реализации. А от идеи отказываться как-то не хосется. Вот и думаю, и спрашиваю. В итоге наверно это никому не будет нужно.
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
п.с. Не обижайся, если я резковато ответил |
Нп. Молчание горазду хуже.
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
А вообще, чем занят? |
Рисовал спелл один... был такой в 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) не вполне работает. Но, ты прав,

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

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

, не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса.
Аваддон
Oct 14 2004, 17:49
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?
DBColl
Oct 14 2004, 18:37
QUOTE (Аваддон @ Oct 14 2004, 17:49) |
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации? |
В Проклятье Левора эта система живет в хертбите модуля. Однако это:
1. Сингл. По сему не приходится перебирать чаров.
2. Для создания несильной загруженности, проверки снижены до односложных-вложенных условий (без && и ||). Типа
Neverwinter Script Source |
if (GetFormatTimeLastRest(oPC)+15часов > GetFormatTime()) { if (!GetHasWakeEffect(oPC)) { ............. и т.д. } } |
QUOTE (Shad @ Oct 9 2004, 08:58) |
Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, я уже устал исправлять, пока не узнаю что работка кому-то интересна. |
Shad щас, гляну
Ой блин!

У меня ж нету Тулсета...

Но солью все равно
Черный Ярл
Oct 19 2004, 01:40
Мир вам!
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры.
Вообще это реализуемо? Если да, то как?
Спасибо.
baskan
Oct 23 2004, 14:37
Ай нид хелп..
Вот скрипт и тут есть фича с регистрацией аккаунта на шарде..так вот как ее отсечь без вреда скрипту?(ка я понял там еще есть некоторые действия)
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
Oct 23 2004, 15:01
Черный Ярл
QUOTE (Черный Ярл @ Oct 19 2004, 01:40) |
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры. Вообще это реализуемо? Если да, то как? |
Мне кажется, что это нельзя отследить... Хотя... есть идейка хитренькая...
У моба надо скрипт на OnDamage вешать. При каждом полученном неписем повреждении скрипт на нем анализирует максимальный "некритический" удар damager'а. Сравнивает с полученным повреждением и если оно больше, чем максимальный "некритический" удар, значит это КРИТ. Запускаем кастом функцию.
Shad я посмотрел твой модуль. МОЛОДЕЦ!
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю

Но то что видел у тебя мне понравилось!
QUOTE (Aiwan @ Oct 23 2004, 18:10) |
Shad я посмотрел твой модуль. МОЛОДЕЦ! Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю Но то что видел у тебя мне понравилось! |
Спасибо,
Aiwan.

Значит я не зря старался.

Осталость применение найти.
П.С. Можно удалять посты о модуле, дабы тему не зафлуживать.
Все нормально. Если уж наши слова спам, то я Испанский Летчик
Может ты бы оформил свой модуль как ссылку и в тему полезных ссылок поставил?
baskan
Oct 25 2004, 17:52
Вопросик..
В каком модульном свойстве стоит система лута?
DBColl
Oct 25 2004, 18:35
Лут не в модульных свойствах. Он в OnDeath крича.
baskan
Oct 25 2004, 21:19
QUOTE (DBColl @ Oct 25 2004, 18:35) |
Лут не в модульных свойствах. Он в OnDeath крича. |
Ясно..Спасибо
Не подскажут ли мастера тулсета: Как сделать цикл перебора всех карт в модуле? Что-то я рылся в функция, рылся - ничего не нашел. Вся беда в том, что невозможно присваивать свою величину перепенной типа object
А нельзя циклом прогнать объекты, и определить их тип как area?
Тобур Если можно достучатся до файлов на диске, ResRef-ы карт в файле module.ifo хранятся подряд, возможно это можно использовать.
Можно использовать объекты со специфическим тегом ("sequence_xx") и пробегать по ним.
DBColl
Oct 26 2004, 03:34
Shad
До ерф-файлов и module.ifo из игры не достучаться.
QUOTE (Тобур @ Oct 25 2004, 23:38) |
Вся беда в том, что невозможно присваивать свою величину перепенной типа object |
??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?..
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(...) нельзя делать??? Или я не понял?.. |
Эхх , если бы все было так просто

скриптик
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
Oct 26 2004, 09:30
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы. |
Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту...
Добавлено в [mergetime]1098772792[/mergetime] К тому же, обрати внимание на функцию ObjectToString(object oObj);
QUOTE (Тобур @ Oct 26 2004, 04:41) |
object oMod = GetModule(); int i = 1; SetLocalObject(oMod,"CurMap",i); |
Это мне вобще непонятно

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

. Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой.
QUOTE |
QUOTE (Тобур @ Oct 26 2004, 04:41)
object oMod = GetModule(); int i = 1; SetLocalObject(oMod,"CurMap",i);
Это мне вобще непонятно Как это объекту можно присвоить числовое значение? |
Я же специально привел ссылку из лексикона - object содержит в себе натуральное число (иначе говоря просто номер объекта). Весь вопрос в том и состоит - как переменной типа object присвоить этот самый номер.
Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту.
Короче, я понял, что тут никто толкового сказать не может
DBColl
Oct 27 2004, 00:19
QUOTE (Тобур @ Oct 26 2004, 18:49) |
Короче, я понял, что тут никто толкового сказать не может |
Спасибо за твою благодарность в сторону наших попыток помочь. Либо ты слишком умный, либо слишком много у нас времени и главное ДАННЫХ, которые ты представил в своей задаче...

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

Я понял, тебе надо будет пробегать таким циклом по поиску лок лишь ОДИН раз, на старте модуля? Или я опять не догнал?
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Через ресрефы тоже плохо - они все разные |
Можно сохранять ResRef для подтверждения правильности локации.
Но если пройти по модулю нужно один раз за версию - вопрос перешел в разряд теретических. Ведь какой-никакой метод, ты говришь, уже нашел.
DBColl
Oct 27 2004, 00:46
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение. |
Шо цэ есть, ЗАДВОЕНИЕ?
Добавлено в [mergetime]1098827906[/mergetime] QUOTE (Shad @ Oct 27 2004, 00:34) |
Можно сохранять ResRef для подтверждения правильности локации. |
Вот-вот. Отлично Shad!
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.
Решение я нашел такое: Я сохраняю в БД какую-то локацию, потом каким-то внешним редактором (в моем случае 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 можно сортировать , фильтровать и анализировать записи. Таким же образом можно получить сводную информацию обо всех объектах, находящихся на картах в модуле (не в палитре), например о НПС и плэйсэйблах
Тобур даже я вчера до двух ночи голову ломал.

Зря ты так
QUOTE (Тобур @ Oct 27 2004, 10:52) |
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН. |
Все ок!

ТО что ты сейчас сказал настолько важно, к примеру для меня

Ты даже не представляешь

Заходи к нам почаще!

Все плохое забыли

И молодец, что победил проблему. Кинь ее в базу скриптов, очень людям поможешь.
DBColl
Oct 27 2004, 17:53
ТобурВсе ок

. Ты - взрослый человек.
По делу... А дальше что? Ну есть у тебя экселевский файл. И что с ним делать дальше? Я думал тебе данные нужны для обратного использования потом в скрипте...
Изначально моя цель была найти карты, у которых совпадают тэги. Для этого мне надо было получить список тэгов всех карт в модуле - я его получил, хоть и извращенным способом. После этого достаточно отсортировать в экселе таблицу по полю тэга и пробежаться взглядом по ней, чтобы найти задвоенность (дубляж) тэга. Я нашел в 470 картах 4 дубляжа - это тот результат, который я и хотел получить
aleVandal
Oct 27 2004, 19:40
Менее извратный способ - создать 2дашку и забивать в нее таги(или ресрефы) локаций. Всего то делов остается - пробежать все строчки одного столбца( с тагами карт )
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.
DBColl
Oct 28 2004, 12:28
QUOTE (Shad @ Oct 28 2004, 01:07) |
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт. |
А следуя из этого, программульку-анализатор на Сях или Дельфях написать - как 2 пальца...
altrush
Oct 30 2004, 12:42
Вопрос. Как убрать ВСЕ из инвентаря (нет ли функции соответствующей, аль чето такого)?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.