![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#236
|
|
Level 1 Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Еще вопрос, - к azathoth, или еще к кому-нибудь.
Мне надо написать скрипт - расовую проверку, - объединить дварфов, гномов и хоббитов как бы в одну расу, чтобы не вешать на одну фразу три проверки сразу (у меня там еще проверки висят, некрасиво получится, если на одной фразе штук десять скриптов будет висеть, да и не уверена, что это возможно.) Я попыталась приравнять гномов и хоббитов к дварфам, чтобы можно было в окошке sRase(String) выставить единицу, и не париться. Но, что ни напишу, все компилируется, но ни хрена не работает. Сначала я просто написала Neverwinter Script else if(sRace == "gnome" || nRace == 1) Не сработало. Оно и понятно, - выше по списку числятся дварфы, у которых тоже прописана цифра 1. Тогда я переписала: Neverwinter Script else if (sRace == "halfling" || nRace == 3) { return (nRacialType == 1 || nRacialType == 11); } Опять не сработало. Пишу другой вариант: Neverwinter Script else if(sRace == "gnome" || nRace == 3) { nRacialType = GetRacialType(oPC); nCheck = RACIAL_TYPE_GNOME; return (nRacialType == 1 || nRacialType == 11); } Не работает. Если я пишу гномам nRace == 1, это не влияет. Я думаю, может дело в субрасах. Пишу: Neverwinter Script else if(GetStringLeft(sRace, 13) == "lightfoothalf" || nRace == 15) { return (nRacialType == 1 || nRacialType == 11); } И опять, блин, не работает. Вопрос, - что бы тут еще можно было написать, чтобы заработало, а то этот скрипт видит одних дварфов, как и стандартный скрипт gc_check_race_pc, и толку с него нет никакого. Почему не срабатывает return? Неясно. Если бы я разбиралась в скриптах, я бы, конечно, не мучила бы стандартный скрипт, а написала бы что-то вроде "дварфы, гномы, хоббиты == True, все остальные == False", но я вообще без понятия как и в какой форме такое пишут. Со стандартными скриптами иногда хоть что-то путное выходит. Так что, - в очередной раз, помогите, плиз, кто-нибудь. |
![]()
Сообщение
#237
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
должно быть что-то такое:
Neverwinter Script int nRacialType = GetRacialType(oPC); return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING); эта конструкция вернет TRUE, если раса игрока одна из трех. А на какие условия втыкать работу этого блока - тебе виднее. Можно замутить что-то универсальное, чтобы из диалога передавался символьный код, например GDH, который понимался бы скриптом как гномы/дварфы/халфлинги. Но имхо под конкретный модуль проще сделать несколько общих скриптов. Если у тебя всегда такая комбинация карликов, то проще сделать для этого отдельный скрипт и не париться. зы: не уверен в правильности расовых констант, пишу по памяти. |
![]()
Сообщение
#238
|
|
Level 1 Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Lex, прости, но вообще не поняла. Я же говорю, - я не скриптер, не программер, - я сценарист.
Мне что, писать Neverwinter Script // gc_check_race_PC_correct int StartingConditional(string sRace) { object oPC = GetPCSpeaker(); int nRacialType = GetRacialType(oPC); return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING); } ? Но если я пишу (string sRace), это предполагает, что будет окно sRase(String), - и что мне в это окно писать? А если я не пишу (string sRace), то что вместо него написать-то? Или мне по-прежнему основываться на стандартном скрипте, и расписывать все расы, типа if(sRace == "dwarf" || nRace == 1) , но как? Какой смысл возвращать расу гномов к "RACIAL_TYPE_GNOME", уж не говоря о том, что в стандартном скрипте не int nRacialType = GetRacialType(oPC); , а int nRacialType = GetSubRace(oPC); . На этом мысль останавливается. А что касается таких замороченных заклинаний, как "символьный код GDH", так на нашем болоте об этой темной некромантии и не слыхивали, и я таких словов вообще не знаю. Ты уж, пожалуйста, будь проще с народом. |
![]()
Сообщение
#239
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
а ты не пиши (string sRace). И вместо него ничего не пиши. Для данного скрипта тебе вводные параметры из диалога не нужны.
Neverwinter Script int StartingConditional() { int nRacialType = GetRacialType(GetPCSpeaker()); return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING); } А что касается таких замороченных заклинаний, как "символьный код GDH", так на нашем болоте об этой темной некромантии и не слыхивали, и я таких словов вообще не знаю. Ты уж, пожалуйста, будь проще с народом. я лишь имел ввиду передачу из диалога данных в виде строки "GHD", которая бы скриптом расценивалась как: "TRUE, если игрок Gnone, Halfling или Dwarf". Но сейчас я еще раз над этим подумал - плохая идея. Получится большой скрипт (разбор сторки на символы, анализ символов, формирование результата бинарным сложением для упрощения проверки и собственно сама проверка), и нужно будет каждый раз верно ставить буквы. Имхо проще несколько более простых скриптов без внешних параметров. |
![]()
Сообщение
#240
|
|
Level 1 Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Ес-с, работает. Не знала, что после int StartingConditional надо скобки оставлять :-). Может быть, в итоге я чему-то выучусь, и перестану уже тупить, но пока до этого далеко.
Спасибо огромное. |
![]()
Сообщение
#241
|
|
Пушкин ![]() Класс: Обыватель Характер: Chaotic Neutral Раса: Гигант NWN: Тексты ![]() |
Общий вопрос. Известно, что Обсидиан отличается от Авроры интерфейсом и некоторыми функциями - я слышал про cutscenes и ActionSit. Я здесь не говорю про маппинг, который может отличаться сильно. Меня интересуют основные, традиционные функции скриптов Авроры. Годны ли они в целом? Иными словами, если я возьму типичный, средней сложности скрипт для Авроры с проверками пола, времени суток и т.п., или скрипт со spawn и уничтожением объектов, с установкой глобальных переменных, такого рода вещами, сколько из этого придется менять?
|
![]()
Сообщение
#242
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
В целом скрипты не отличаются и их можно использовать в обоих редакторах. Полный список неработающих функций должен быть на офф форумею К слову, ActionSit одна из них. Более подробно расскажет комадна шарда БГ или Ванес, он тож активно переносил все на НВН2.
http://nwvault.ign.com/View.php?view=NWN2A...6#_Toc146633941 |
![]()
Сообщение
#243
|
|
Пушкин ![]() Класс: Обыватель Характер: Chaotic Neutral Раса: Гигант NWN: Тексты ![]() |
Спасибо.
Еще вопрос: задавался ли кто-нибудь системой скриптов для изучения заклинаний (spell research)? |
![]()
Сообщение
#244
|
|
Level 1 Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Приветствую уважаемых мастеров. У меня такой вопрос - как сделать, чтобы после смерти персонаж возрождался не в месте гибели, а в указанном мною. Вопрос второй - как сделать чтобы после смерти персонаж вообще не воскрешался, а вылетала табличка из НВН2 (игра окончена, все свободны: загрузка или выход). Заранее спасибо.
З.Ы Да да, я уже знаю. Я НУБ и ламер=) |
![]()
Сообщение
#245
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
Neverwinter Script V1.1 l Ќ gui_death_respawn_self Щ mod_onplayerdeath Щ mod_onplayerrespawn Щ 0 Ц ? E † // gui_death_respawn_self
/* NWN2 Default Death Screen 'Respawn' callback */ // BMA-OEI 7/20/06 // BMA-OEI 11/08/06 -- Close SCREEN_DEATH_DEFAULT /* You can place your real respawn script in here or you can use it like I did and execute it on the player. */ #include "ginc_death" void main() { //ResurrectCreature( OBJECT_SELF ); ExecuteScript("mod_onplayerrespawn",OBJECT_SELF); CloseGUIScreen( OBJECT_SELF, "SCREEN_DEATH_DEFAULT" ); }/* mod_onplayerdeath */ const string GUI_DEFAULT_DEATH_SCREEN = "SCREEN_DEATH_DEFAULT"; // Display death pop-up to oPlayer void ShowDefaultDeathScreen( object oPlayer ); void main() { object oPlayer = GetLastPlayerDied(); DelayCommand( 2.5f, ShowDefaultDeathScreen( oPlayer ) ); } // Display death pop-up to oPlayer void ShowDefaultDeathScreen( object oPlayer ) { DisplayGuiScreen( oPlayer, GUI_DEFAULT_DEATH_SCREEN, FALSE ); //DisplayMessageBox( oPlayer, 0, GetStringByStrRef(181408), "gui_death_respawn_self", "", FALSE, "", 6603, "", 0, "" ); }/* mod_onplayerrespawn */ #include "nw_i0_plot" #include "ginc_death" #include "x0_i0_transport" //:: Applies an XP and GP penalty //:: to the player respawning //:: object oDead - Player who died. void ApplyPenalty(object oDead); //:: Gets the tag of the destination waypoint //:: object oDead - Player who died. string GetDestinationTag(object oDead); //:: Gets the respawning player object GetRespawningPlayer(); //:: Gets the respawn point, if any //:: sDestTag - tag of the destination waypoint //:: oDead - Player who died object GetRespawnPoint(string sDestTag, object oDead); void main() { //Create initial variables object oRespawner = GetRespawningPlayer(); object oArea = GetArea(oRespawner); string sDestTag = GetDestinationTag(oRespawner); object oRespawnPoint = GetRespawnPoint(sDestTag, oRespawner); location lDeathSpot = GetLocation(GetLastRespawnButtonPresser()); location lRespawnPoint; //Apply effects to PC ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectRe surrection(),oRespawner); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHe al(GetMaxHitPoints(oRespawner)), oRespawner); RemoveEffects(oRespawner); //Apply death penalty ApplyPenalty(oRespawner); //Transport PC if (GetIsObjectValid(oRespawnPoint)) { lRespawnPoint = GetLocation(oRespawnPoint); TransportToLocation(oRespawner,lRespawnPoint); } //Bring PC back to life DelayCommand(1.5,ResurrectCreature(oRespawner)); } void ApplyPenalty(object oDead) { location lDeathSpot = GetLocation(oDead); int nXP = GetXP(oDead); int nPenalty = 50 * GetHitDice(oDead); int nHD = GetHitDice(oDead); // * You can not lose a level with this respawning int nMin = ((nHD * (nHD - 1)) / 2) * 1000; int nNewXP = nXP - nPenalty; if (nNewXP < nMin) nNewXP = nMin; SetXP(oDead, nNewXP); int nGoldToTake = FloatToInt(0.10 * GetGold(oDead)); // * a cap of 10 000gp taken from you if (nGoldToTake > 10000) { nGoldToTake = 10000; } AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE)); DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE)); DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE)); } string GetDestinationTag(object oDead) { //You can go about determining where the respawn waypoint //is located a number of ways. In here I have two examples. // Determined by setting a string variable on the area called sRespawn // Manually set it. string sTag = ""; object oArea = GetArea(oDead); //Get tag based on area level variable sTag = GetLocalString(oArea,"sRespawnTag"); //Check for tag and default to a module level variable if(sTag == "") { sTag = GetLocalString(GetModule(),"sRespawnTag"); } //Manually set tag //sTag = ""; return sTag; } object GetRespawningPlayer() { //This should be OBJECT_SELF, however if not then //we can use the player that last pressed the respawn //button. object oPlayer = OBJECT_INVALID; oPlayer = OBJECT_SELF; //Make sure this is a PC if(!GetIsPC(oPlayer)) { oPlayer = GetLastRespawnButtonPresser(); } return oPlayer; } object GetRespawnPoint(string sDestTag, object oDead) { //Get the waypoint object by using the destination //tag. First we try for one in the current area by //using GetNearestObjectByTag, otherwise we jsut get //an object with that tag. object oRespawnPoint = OBJECT_INVALID; oRespawnPoint = GetNearestObjectByTag(sDestTag,oDead); if(!GetIsObjectValid(oRespawnPoint)) { oRespawnPoint = GetWaypointByTag(sDestTag); } return oRespawnPoint; } |
![]()
Сообщение
#246
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Грифон, ты опасен!
Подумай над своей реакцией, если бы я на твои ранние вопросы по скриптам так бы отвечал (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#247
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Lex, тогда парня надо отправлять сразу в тему по обучению скриптам. Через месяц выкладывать даваемое по кускам (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#248
|
|
Level 1 Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Хех, спасиб . Попробую разобраться в данном скрипте.
|
![]()
Сообщение
#249
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
Lex, я на то и рассчитывал, что гуру скриптинга сразу же прокомментируют, выкинут лишнее и вынесут вердикт. (IMG:style_emoticons/kolobok_light/biggrin.gif)
|
![]()
Сообщение
#250
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Lex, я на то и рассчитывал, что гуру скриптинга сразу же прокомментируют, выкинут лишнее и вынесут вердикт. (IMG:style_emoticons/kolobok_light/biggrin.gif) я вердикт выше вынес: ты опаcен (IMG:style_emoticons/kolobok_light/smile.gif) ) по теме: если нужно ТОЛЬКО респ в какой-то точке (без штрафов и прочей фигни) или вообще его убрать - то 3/4 скрипта можно выкинуть. А вот если планируется еще куча мелких фич, динамическое изменение места респауна и тд - то выкидывать придется не так уж и много. Но в любом случае, чтобы скрипт заработал - нужно еще понаставить доп. объектов и переменные задать. |
![]()
Сообщение
#251
|
|
Level 2 ![]() Класс: Клерик Характер: Lawful Neutral Раса: Человек ![]() |
Реализую не стакающиеся бонусы к атаке разноименных типов (ДнД 3.5, ем буквы).
Вариант 1: Код effect MoraleBonus (effect eEffect) { eEffect = SetEffectSpellId (eEffect, 1600); return eEffect; } Вариант 2 - хранение переменных/массивов на объекте-цели или в БД. Вопрос - как сделать все так, чтобы и диспелл был меньше, чем на 20 страниц кода и длительность нескольких разных спеллов с одноименными эффектами выверялась нормально? P.S. только что задумался о создании динамического списка на модуле... Если что, у нас есть еще вот такой список своих функций: void AppendArrayInt(object obj,string bufName,int value); int GetArrayInt(object obj,string bufName,int index); void SetArrayInt(object obj,string bufName,int index,int value); void AppendArrayLoc(object obj,string bufName,location value); location GetArrayLoc(object obj,string bufName,int index); void SetArrayLoc(object obj,string bufName,int index,location value); void AppendArrayString(object obj,string bufName,string value); string GetArrayString(object obj,string bufName,int index); void SetArrayString(object obj,string bufName,int index,string value); void AppendArrayFloat(object obj,string bufName,float value); float GetArrayFloat(object obj,string bufName,int index); void SetArrayFloat(object obj,string bufName,int index,float value); void AppendArrayObject(object obj,string bufName,object value); object GetArrayObject(object obj,string bufName,int index); void SetArrayObject(object obj,string bufName,int index,object value); void DestroyArray(object obj,string bufName,int type=tINT); int IsArraySet(object obj,string bufName); int GetArrayIdxCount(object obj,string bufName); void DestroyArrayIdx(object obj,string bufName,int index,int type=tINT); int Split(object obj,string str,string bufName,int type=tSTR,string separator=","); int SplitCount(string str,string separator=","); void OutputArray(object obj,string bufName,int type,object oPC=OBJECT_INVALID); void CreateMatrix(object obj,string bufName,int width,int height); void DeleteMatrix(object obj,string bufName,int type=tINT); void ExpandMatrix(object obj,string bufName,int xcount,int ycount); int GetMatrixInt(object obj,string bufName,int x,int y); string GetMatrixString(object obj,string bufName,int x,int y); float GetMatrixFloat(object obj,string bufName,int x,int y); object GetMatrixObject(object obj,string bufName,int x,int y); void SetMatrixInt(object obj,string bufName,int x,int y,int value); void SetMatrixString(object obj,string bufName,int x,int y, string value); void SetMatrixFloat(object obj,string bufName,int x,int y,float value); void SetMatrixObject(object obj,string bufName,int x,int y,object value); Сообщение отредактировал Melshin - Dec 15 2009, 06:09 |
![]()
Сообщение
#252
|
|
Level 2 ![]() Класс: Клерик Характер: Lawful Neutral Раса: Человек ![]() |
Цитата P.S. только что задумался о создании динамического списка на модуле... Начал. Вопрос к опытным мастерам: стоит ли? Будет ли у этого нормальная производительность? Смысл вышенаписанного: при загрузке в модуль первого персонажа инициализируется рекурсивная (6 секунд) ProcessEffects (). На модуле хранится массив, в котором каждый элемент - объект, на котором находится эффект какого-то заклинания или еще чего. На каждом объекте хранится массив, в котором каждый элемент - какой-то SpellId. Для каждого существующего SpellId берутся локальные интеджеры: кастер лвл, длительность в раундах, ДЦ (если нужно, еще можно весь дамаг для ДОТ-ов сразу рассчитать, т.к. всякие эмповерд нехорошие). Если длительность не закончилась - держим на объекте эффект заклинания 6 секунд до следующего выполнения ProcessEffects. Если длительность закончилась - стираем нафиг спелл из массива и всю информацию о нем. Если объект подвергся диспеллу - работаем с соответствующим массивом. На выходе мы получаем систему, которая очень сильно повышает функциональность стандартного НВН скрипта. Можно, например, временно подавлять эффекты заклинаний (анти-магическое поле, защита от зла/добра и т.д.) Можно модифицировать кастер лвл и другие параметры любого спелла как угодно и чем угодно... Так вот собственно объектов в модуле много, на каждом может быть несколько спеллов, а в каждом спелле разные эффекты... Сообщение отредактировал Melshin - Dec 16 2009, 15:17 |
![]()
Сообщение
#253
|
|
Level 3 ![]() Класс: Воин Характер: Chaotic Good Раса: Человек ![]() |
Извините если не по теме, но есть ли русскоязычные статьи по основам скриптинга для nwn2? Я недавно взялся за тулсет. Освоил практически всё кроме скриптов и не знаю как к ним подступиться. С использованием готовых скриптов в диалогах вроде разобрался, но дальше никак.
Вот например, нужны такие скрипты: 1) Если переменная Local Int "XXXXX" принимает значение 1, начинается отсчёт времени, после которого переменная возвращается в значение 0. 2) Если игрок покидает локацию, все открытые двери в этой локации закрываются. 3) Если в сундуке А есть вещи, они переносятся в сундук Б. |
![]()
Сообщение
#254
|
|
Level 9 ![]() ![]() ![]() Класс: Волшебник Характер: Neutral Good Раса: Эльф ![]() |
Merkuta,
1) Для этого переменная твоя должна быть локальной, и где-то храниться. Например на игроке. Для этого задавай ее так: Neverwinter Script object oPC = GetFirstPC(); //будет брать первого игрока в модуле. Если игрок один это сработает. Иначе придумай как нам найти нужного (зависит от того, откуда запускается скрипт) SetLocalInt(oPC, "A", 1); //А = 1 В другом месте, где надо ее проверять и запускать таймер, пиши: Neverwinter Script object oPC = GetFirstPC(); int A = GetLocalInt(oPC, "A"); //берем с первого попавшегося игрока переменную А if (A == 1) { float fTime = 10.0; //через сколько секунд занулять будем? DelayCommand(fTime, SetLocalInt(oPC, "A", 0)); } 2) Это намного сложнее. 3) Здесь нужно организовать цикл перебора всех вещей в сундуке А и копирования их в сундук Б. Напиши мне в аську/пм, подскажу по ходу дела, если нужно. Melshin, думаю если воспользуешься NWNX и подрубишь внешнюю БД, то производительность будет норм. Если юзать стандартные скрипты для работы с массивами - загрузишь его серьезно. Но наверняка не могу говорить. Сообщение отредактировал Lorendroll - Feb 22 2010, 15:42 |
![]()
Сообщение
#255
|
|
Level 9 ![]() ![]() ![]() Класс: Фея Характер: Chaotic Evil Раса: Фея ![]() |
Здрасте.
Нужно на хартбит повесить функцию, которая будет отсчитывать внутриигровое время начиная с первой загрузки модуля. Neverwinter Script #include "inc_array_system" void main() { object oPC = GetFirstPC(1); //if (!GetIsPC(oPC)) return; int nInt; int nDay; int nMin; int nHr; nInt = array_get_int(oPC, "timer", 3); nInt = nInt + 3; //изменяется в зависимости от текущего таймскейла array_set_int(oPC, "timer", 3, nInt); /*if (array_get_int(oPC, "timer", 4) == 60) //seconds into minutes { nMin = array_get_int(oPC, "timer", 3); nMin = nMin + 1; array_set_int(oPC, "timer", 3, nMin); array_set_int(oPC, "timer", 4, 0); }*/ if (array_get_int(oPC, "timer", 3) == 60) //minutes into hours { nHr = array_get_int(oPC, "timer", 2); nHr = nHr + 1; array_set_int(oPC, "timer", 2, nHr); array_set_int(oPC, "timer", 3, 0); } if (array_get_int(oPC, "timer", 2) == 24) //hours into days { nDay = array_get_int(oPC, "timer", 1); nDay = nDay + 1; array_set_int(oPC, "timer", 1, nDay); array_set_int(oPC, "timer", 2, 0); } } в качестве inc_array_system используется этот скрипт. Проблема в том, что нифига это ненадежно и недостоверно. Из-за фаст тревелов/возможных кастомных системах отдыхов и прочего. Может быть есть какой-нибудь более простой способ/функции о которых я даже не подозреваю? Использоваться это будет в сингл модуле. |
![]()
Сообщение
#256
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
самый простой способ работы с игровым временем, имхо, это его пересчет в игровые секунды. Те текущий месяц, день и час пересчитывается в секунды и сравнивается с контрольным для определения, прошло ли нужное количество времени или нет. Этим решается проблема временных скипов в скриптах. Проверять можно не каждые 6 секунд, а лишь когда нужно (в диалоге, в скрипте и тд), что экономит ресурсы. И тд.
|
![]()
Сообщение
#257
|
|
Level 9 ![]() ![]() ![]() Класс: Фея Характер: Chaotic Evil Раса: Фея ![]() |
самый простой способ работы с игровым временем, имхо, это его пересчет в игровые секунды. Те текущий месяц, день и час пересчитывается в секунды и сравнивается с контрольным для определения, прошло ли нужное количество времени или нет. Этим решается проблема временных скипов в скриптах. Проверять можно не каждые 6 секунд, а лишь когда нужно (в диалоге, в скрипте и тд), что экономит ресурсы. И тд. Не, для меня это не подходит, нужно чтобы все юзер-френдли было (IMG:style_emoticons/kolobok_light/crazy.gif) Можно допустим сделать такой костыль: при первой загрузки модуля (самой-самой первой) создается массив, в который записывается день, час, минута, секунда (последнее можно и не использовать), затем на хардбит вешается скрипт который создает другой массив, записывает в него текущую день, час, минуту, секунду затем эти массивы между собой вычитает и получается вполне себе достоверный таймер Только топорно все это, и, ввиду малого опыта работы с большими модами, спрашиваю скажется ли это негативно на перфомансе? |
![]()
Сообщение
#258
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Почему бы не юзать аптайм в секундах в скриптах, а для юзерфрендли вывода не написать конвертер из секунд в остальное посредством деления с остатком?
|
![]()
Сообщение
#259
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Не, для меня это не подходит, нужно чтобы все юзер-френдли было crazy.gif для юзерфрендлиности нужно все расчеты спрятать внутрь инклуда, оставив снаружи несколько управляющих функций. Например: * SetTimer(string sTimerName); - запоминаем текущее время и привязываем число к sTimerName для последующей работы с ним пользователя * CheckTimer(string sTimerName, int nTimeHour, int nTimeMinute = 0); - проверемя разницу между текущим временем и запомненым по идентификатору. Тру - если прошло больше времени, чем указано в nTimeHour/nTimeMinute * DeleteTimer(string sTimerName); - удалить таймер Довольно плотно в свое время работал с внутриигровым временем, по своему опыту скажу: в 90% случаев не нужно в каждый момент знать сколько прошло (те каждые 6 секунд ничего пересчитывать не нужно), проверки прохождения энного количества времени стоят в весьма конкретных местах: вход в локу, фраза диалога и тд. У меня было лишь 2-3 случая, когда пришлось повесить на ХБ, потому что отложенное событие было само по себе. В этой связи завязывать систему на постоянный пересчет считаю не совсем верным, пересчет должен быть вызываемым. И пусть в паре случаев вызов будет в ХБ, ничего страшного. |
![]()
Сообщение
#260
|
|
Level 9 ![]() ![]() ![]() Класс: Фея Характер: Chaotic Evil Раса: Фея ![]() |
Lex, спасибо, момент с вызовом функции по требованию что-то совсем выпал из головы (IMG:style_emoticons/kolobok_light/prankster2.gif)
|
![]() ![]() |
Текстовая версия | Сейчас: 19th July 2025 - 19:47 |