Здравствуйте, гость ( Вход | Регистрация )
Отправлено: Jun 25 2006, 10:28 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Расскажу как сделано на Сиале. За основу взята лутовая система NESS. Суть ее в том, что лутовые таблицы находятся в магазине (merchant) на специальной системной локации. Для специфичных мобов (боссов), делается спец таблица, которая располагается на той локе, где находится моб. При первом обращении к таблице на модуль сохраняется переменная, в которую помещается ссылка на таблицу (чтобы каждый раз не искать по модулю), перибираются все предметы в магазине и на объект магазина вешаются переменные с порядковым номером вещи и ее ресрефом. Таким образом, в дальнейшем, работа идет только с переменными, что значительно ускоряет работу лутовой системы при большом разнообразии вещей и легкостью изменения содеожания лутовых таблиц |
Форум: Шарды рунета · Просмотр сообщения: #85829 · Ответов: 16 · Просмотров: 21,483 |
Отправлено: Feb 26 2005, 18:05 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Круто! Правда у меня сомнения по поводу возможных багов и использования модов в следующих версиях тулсета, но сделана действительно нужная вещь |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #28328 · Ответов: 88 · Просмотров: 170,733 |
Отправлено: Feb 26 2005, 18:00 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Я тоже присоединяюсь к этому воззванию :) Особенно по предложениям 1. SetName(oObj). 2. Set/GetDescription(oObj) 35. Сохранение локальных переменных при старте нового модуля. Или сделайте специальные локальные переменные, ограниченное число, для переноса из модуля в модуль. 71. Поддержку БД через ODBC или на прямую в самом сервере... mysql, postgres, access (хоть дополнительным модулем за деньги пусть продают) От себя еще добавлю, что очень нужен эффект Time Stop действующий только на одну локацию, функции, которые возвращают полную атаку (как в чар листе) и вообще, побольше функций, возвращающих и устанавливающих значения переменных в игре |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #28326 · Ответов: 46 · Просмотров: 60,357 |
Отправлено: Feb 21 2005, 08:52 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Если вопрос про моба-шадоудансера, то самый простой путь, который мы с Ярлом нашли не требует написания никаких скриптов. Все что надо, это не давать мобу НИКАКИХ активных боевых фитов (т.е. кнок, дизарм и т.д.). В этом случае, стандартные скрипты очень здорово позволяют ШД прятаться во время боя. |
||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #27507 · Ответов: 5109 · Просмотров: 910,096 |
Отправлено: Jan 27 2005, 19:27 | |||||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Не уверен, но, по-моему объект не уничтожается потому, что назначаешь команду уничтожения исполнить объекту, который сам будет уничтожен (умерший моб должен уничтожить мешок). К тому же у тебя просто ошибка в скрипте: DestroyObject(OBJECT_SELF, 250.0); должна уничтожить моба (если скрипт запускает моб). Попробуй в скрипте вместо DestroyObject(OBJECT_SELF, 250.0); такую конструкцию: object oBag = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag); AssignCommand(GetModule(), DestroyObject(oBag , 250.0)); т.е. чтобы какой то другой объект уничтожал (в данном случае модуль) |
||||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #24048 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Jan 26 2005, 20:03 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
#include "x2_inc_cutscene" void CutSound(int nCutscene, object oSound); void MyPentogramma(int nCutscene, object oPC, int iBeam, float fDur); void MultiJump(object oPC, string sWay); void PlayMusic(int nCutscene, object oPC); void SetShift(int nCutscene, object oPC, float fShift); int nCutsceneNumber = 20; void main() { object oPC = GetEnteringObject(); object oGlav = GetObjectByTag("PIVIGA"); object oWP1 = GetObjectByTag("WP_1"); object oWP3 = GetObjectByTag("WP_3"); object oWP4 = GetObjectByTag("WP_4"); object oWP5 = GetObjectByTag("WP_5"); object oWP6 = GetObjectByTag("WP_6"); object oWP7 = GetObjectByTag("WP_7"); object oSound = GetObjectByTag("cut20_summ_sfx"); //Effect Vizual Effect========================================================== effect eZa1 = EffectVisualEffect(VFX_BEAM_BLACK); effect eZa2 = EffectVisualEffect(VFX_BEAM_EVIL); effect eZa3 = EffectVisualEffect(VFX_IMP_DEATH_WARD); effect eZa4 = EffectVisualEffect(VFX_IMP_FEAR_S); //Localnoe====================================================================== location lMes1=GetLocation(oWP1); location lLoc2=GetLocation(oWP7); location lMes3=GetLocation(oWP3); location lMes4=GetLocation(oWP4); location lMes5=GetLocation(oWP5); //============================================================================== if (!GetIsPC(oPC)||GetLocalInt(oPC,"Proverochoi tur!")==TRUE) return; { // Первая ошибка SetLocalInt(oPC,"Proverochoi tur",TRUE); AssignCommand(oPC,ClearAllActions()); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectDarkness(),oPC,20.0); DelayCommand(0.5,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eZa1,lMes1,3.0)); DelayCommand(0.5,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eZa2,lLoc2,3.0)); DelayCommand(0.5,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eZa3,lMes3,3.0)); DelayCommand(0.5,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eZa4,lMes4,3.0)); DelayCommand(2.0,AssignCommand(oGlav,JumpToLocation(lMes1))); DelayCommand(2.0,AssignCommand(oGlav,ActionSpeakString("KO MHE MOI SLUGI"))); DelayCommand(1.0,AssignCommand(oGlav,ActionMoveToObject(oPC,FALSE,0.5))); //Camera mode=================================================================== DelayCommand(1.5, DelayCommand(GetShift(oPC, TRUE), MyPentogramma(nCutsceneNumber, oPC, 482, 3.0))); DelayCommand(1.5, FadeFromBlack(oPC)); CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 100.0, 10.0, 50.0, CAMERA_TRANSITION_TYPE_SNAP); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 180.0, 9.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW, FALSE); CutSetCamera(1.5, oPC, CAMERA_MODE_TOP_DOWN, 100.0, 12.0, 60.0, CAMERA_TRANSITION_TYPE_SLOW, FALSE); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Vso dla camera object oCam1 = GetWaypointByTag("Camera1"); object oCam2 = GetWaypointByTag("Camera2"); object oCam3 = GetWaypointByTag("Camera3"); object oCam4 = GetWaypointByTag("Camera4"); object oCam5 = GetWaypointByTag("Camera5"); object oCam6 = GetWaypointByTag("Camera6"); //+++++++++++++++++++++++++++++CAMERA+++++++++++++++++++++++++++++++++++++++++++ CutPlayAnimation(1.5, oCam1, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); CutPlayAnimation(1.5, oCam2, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); CutPlayAnimation(0.5, oCam3, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); CutPlayAnimation(1.5, oCam4, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); CutPlayAnimation(0.5, oCam5, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); CutPlayAnimation(18.0, oCam6, ANIMATION_LOOPING_WORSHIP, 20.0, FALSE); //Camera stroenie=============================================================== CutSetCamera(1.5, oPC, CAMERA_MODE_TOP_DOWN, 182.0, 111.0, 56.0, CAMERA_TRANSITION_TYPE_SLOW); CutSetCamera(1.5, oPC, CAMERA_MODE_TOP_DOWN, 180.0, 5.0, 65.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 210.0, 0.1, 80.0, CAMERA_TRANSITION_TYPE_VERY_FAST); CutSetCamera(18.0, oPC, CAMERA_MODE_TOP_DOWN, 155.0, 45.0, 82.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(15.6, oPC, CAMERA_MODE_TOP_DOWN, 210.0, 0.1, 80.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(1.5, oPC, CAMERA_MODE_TOP_DOWN, 10.0, 4.0, 82.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(1.5, oPC, CAMERA_MODE_TOP_DOWN, 210.0, 0.1, 80.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(18.0, oPC, CAMERA_MODE_TOP_DOWN, 90.0, 40.0, 82.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 210.0, 0.1, 80.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 105.0, 4.0, 82.0, CAMERA_TRANSITION_TYPE_SNAP); } //PENTAGRAMMA VOCRUG++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void MyPentogramma(int nCutscene, object oPC, int iBeam, float fDur) { if(CutGetActiveCutsceneForObject(oPC) == nCutscene) { object oPen1 = GetObjectByTag("Pen1"); object oPen2 = GetObjectByTag("Pen2"); object oPen3 = GetObjectByTag("Pen3"); object oPen4 = GetObjectByTag("Pen4"); object oPen5 = GetObjectByTag("Pen5"); int iBeam2 = 483; //Rasstavlaem+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(iBeam, oPen1, BODY_NODE_CHEST, FALSE), oPen2, fDur); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(iBeam2, oPen2, BODY_NODE_CHEST, FALSE), oPen3, fDur); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(iBeam2, oPen3, BODY_NODE_CHEST, FALSE), oPen4, fDur); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(iBeam2, oPen4, BODY_NODE_CHEST, FALSE), oPen5, fDur); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(iBeam2, oPen5, BODY_NODE_CHEST, FALSE), oPen1, fDur); } } // Taime ======================================================================= void SetShift(int nCutscene, object oPC, float fShift) { if(CutGetActiveCutsceneForObject(oPC) == nCutscene) SetLocalFloat(GetArea(oPC), ".."fShift); // Вторая ошибка } void CutSound(int nCutscene, object oSound) { if(CutGetActiveCutsceneForObject(oSound) == nCutscene) { SoundObjectPlay(oSound); } //=============================================================================== } |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #23890 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Jan 25 2005, 21:53 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
0Х0 - это размер предмета - пришлось создать в файле baseitems.2da новый предмет-контейнер В сингле использовать эту фишку я особого смысла не вижу, так в нем спокойно можно пользоваться стандартной базой данных
Это, конечно, баг движка, но именно он позволяет сделать предмет, который нельзя выделить и использовать (только надо предупредить игрока, чтобы он очистил от предметов 4 ячейки в левом нижнем углу 1 страницы инвентаря, т.к. хотя размер нулевой, но 4 ячейки все таки используются и исли на этом месте лежат какие-то предметы, то доступ к ним может пропасть). Смысл в том, что технически игрок носит свой сейф с собой (чем достигается высокая надежность хранения вещей), но доступ к сейфу имеет только через специальное устройство (в виде плэйсэйбла в здании банка), к которому привязаны скрипты взаимодействия с контейнером. Если на шарде есть выпадение вещей после смерти (но обычно делается так, что плотовые вещи не выпадают), то наличие сейфа, в котором ироки могут хранить ценные неиспользуемые предметы, является очень ценной функцией для них. Для сингла я бы рекомендовал использовать шкурку-контейнер, так как , по-моему , при восстановлении игры она не пропадает. |
||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #23736 · Ответов: 88 · Просмотров: 170,733 |
Отправлено: Jan 25 2005, 21:37 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Система тэговых скриптов включена в стандартные скрипты НВН (смотрите стандартные скрипты x2_mod_def_load, x2_mod_def_unaqu, x2_mod_def_unequ, x2_mod_def_act, x2_mod_def_aqu, x2_mod_def_equ, а так же скрипт-пример x2_it_example.nss) Касательно моего вклада в копилку идей: поделюсь с вами тем, как на Сиале реализован банк вещей. Сразу скажу, что описанная ситуация работает только с сервер-ваултными персонажами. Идея основана на баге одно функции: void DoPlaceableObjectAction(object oPlaceable, int nPlaceableAction) Дело в том, что эта функция, не смотря на ее название, работает не только с плэйсэйблами, но и с контейнерами (улавливаете мою мысль? :) ) сделав вызов с действием PLACEABLE_ACTION_USE вы можете для игрока открыть любой контейнер. А теперь наступают трудности. Надо сделать так, чтобы контейнер не был доступен пользователю и чтобы он и предметы из него не воровались. Заманчиво сделать контейнер-шкурку (это решает проблему доступа и воровства), но, к сожалению, все шкурки на игроке пропадают при заходе на шард. Поэтому пришлось сделать контэйнер размером 0Х0 (т.е. по нему нельзя щелкнуть мышкой, чтобы открыть) и делать в скрипте использования контейнера вещи, помещенные в контейнер плотовыми (как и сам контейнер),чтобы их нельзя было своровать. Способ конечно извратный, но у него есть огромное преимущество: он не использует БД и поэтому не нагружает сервер. |
||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #23728 · Ответов: 88 · Просмотров: 170,733 |
Отправлено: Jan 25 2005, 21:11 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Я бы предложил такую схему: 1 НПС делается или через тулсет сразу Immortal или в скрипте спауна через функцию (Immortal - статус означает, что урон ему наносится, но никогда не понижается ниже 1) 2 в событии On Damage этого НПСя идет проверка, равны ли его текущие хит поинты 1 (или тому значению, при котором ты хочешь остановить бой) или нет Если да, то останавливаешь бой и начинаешь диалог. |
||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #23721 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Jan 25 2005, 21:01 | |||||||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Честно говоря не понял вопроса, но если ты спрашиваешь почему в одном случае после функции надо ставить ; а в другом не надо, то ответ будет такой: void MyPentogramma(int nCutscene, object oPC, int iBeam, float fDur); - это объявление функции (такое же объявление применимо к константам, переменным). Это объявление говорит компилятору, что такая функция существует. Дело в том, что компилирование скрипта идет сверху вниз. Если бы ты не объявил эту функцию, то при попытке ее вызова из главного тела программы была бы выдана ошибка, т.к. компилятор еще этой функции не знает. Можно обойтись без объявления функции, если ее описание (т.е. ее текст) поставить перед телом основной программы. Объявление функций и переменных служит также для документирования программы, т.к. если выбрать название функции в теле программы , в окошке подсказки высвечивается ее заголовок и примечание (если оно есть) , предшествующее заголовку. Например, все стандартные константы и функции НВНа объявлены в стандартном скрипте nwscript. |
||||||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #23720 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Dec 22 2004, 08:26 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Есть идея по поводу стимула для игроков других шардов посешать общую арену: награждать игрока хонор-поинтами, на которые они в своем мире могли бы в спец-магазинах или через диалоги покупать элитные вещи. Политику этих магазинов, естественно, определяла бы администрация каждого шарда самостоятельно. |
Форум: Шарды рунета · Просмотр сообщения: #19079 · Ответов: 243 · Просмотров: 86,754 |
Отправлено: Dec 9 2004, 20:45 | |||||||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Именно так и сделано на Сиале - так что способ проверенный :) |
||||||
Форум: Шарды рунета · Просмотр сообщения: #17862 · Ответов: 40 · Просмотров: 130,215 |
Отправлено: Oct 27 2004, 19:28 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Изначально моя цель была найти карты, у которых совпадают тэги. Для этого мне надо было получить список тэгов всех карт в модуле - я его получил, хоть и извращенным способом. После этого достаточно отсортировать в экселе таблицу по полю тэга и пробежаться взглядом по ней, чтобы найти задвоенность (дубляж) тэга. Я нашел в 470 картах 4 дубляжа - это тот результат, который я и хотел получить :) |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #14627 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Oct 27 2004, 07:52 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН. Решение я нашел такое: Я сохраняю в БД какую-то локацию, потом каким-то внешним редактором (в моем случае 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 можно сортировать , фильтровать и анализировать записи. Таким же образом можно получить сводную информацию обо всех объектах, находящихся на картах в модуле (не в палитре), например о НПС и плэйсэйблах |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #14578 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Oct 26 2004, 18:49 | |||||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Потому что при добавлении новой карты все индексы перестраиваются и со сменой версии модуля игрок может оказаться или не там, где выходил или вообще в стартовой локации. ObjectToString ничего мне не дает - вот если бы была функция StringToObject - это бы все меняло :). Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой.
Я же специально привел ссылку из лексикона - object содержит в себе натуральное число (иначе говоря просто номер объекта). Весь вопрос в том и состоит - как переменной типа object присвоить этот самый номер. Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту. Короче, я понял, что тут никто толкового сказать не может :( |
||||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #14552 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Oct 26 2004, 07:41 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Эхх , если бы все было так просто :( скриптик 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, просматривать в тулсете тэг очень долго и муторно. Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение. |
||
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #14518 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Oct 25 2004, 23:38 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Не подскажут ли мастера тулсета: Как сделать цикл перебора всех карт в модуле? Что-то я рылся в функция, рылся - ничего не нашел. Вся беда в том, что невозможно присваивать свою величину перепенной типа object :( |
Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #14500 · Ответов: 3670 · Просмотров: 728,205 |
Отправлено: Oct 23 2004, 09:18 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Не все так просто - я когда реализовывал на Сиале такую систему, столкнулся с большим количеством трудностей. Где-то на форуме Кормира местные "отцы" говорили, что все можно сделать гораздо проще: как на Темпларе - каким-то образом (внешней программой) удерживать игрока на сервере еще 30 сек, но я не владею такой технологией. По поводу создания куклы я могу вкратце обрисовать трудности: 1 Надо периодически запоминать положение игрока, т.к. во время выхода положение уже неопределенное 2 Необходимо в какой-то переменной запоминать аккаунт игрока при входе в игру, т.к. при выходе он уже недоступен. 3 Необходимо придусмотреть защиту от обворовывания куклы и ее дисарма. 4 АИ у куклы нет - лично я обходил эту проблему создавая невидимый плэйсэйбл, который и управлял куклой. 5 Будут проблемы с фракциями куклы - т.к. она НПС, то если присвоить ей стандартную фракцию, то после нападения на нее, вся фракция становится враждебной к игроку. 6 Проблема с НоПВП - если на игрока в этой зоне напасть нельзя, то на куклу - можно. |
Форум: Шарды рунета · Просмотр сообщения: #14230 · Ответов: 17 · Просмотров: 21,048 |
Отправлено: Sep 24 2004, 08:25 | |
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Вот ссылка на описание крафта на Сиале Крафт Сиалы |
Форум: Шарды рунета · Просмотр сообщения: #12220 · Ответов: 91 · Просмотров: 71,442 |
Отправлено: Sep 17 2004, 07:39 | |||
Level 2 Группа: Master Сообщений: 28 Регистрация: 12.07.2004 Пользователь №: 165 |
Вроде бы Эксис мучаеться без хоста |
||
Форум: Шарды рунета · Просмотр сообщения: #11693 · Ответов: 13 · Просмотров: 17,525 |
Открытая тема (есть новые ответы) Открытая тема (нет новых ответов) Горячая тема (есть новые ответы) Горячая тема (нет новых ответов) |
Опрос (есть новые голоса) Опрос (нет новых голосов) Закрытая тема Тема перемещена |
Текстовая версия | Сейчас: 24th September 2024 - 22:41 |