![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2291
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(gennady @ Jun 1 2006, 14:49) [snapback]83468[/snapback] Тут у меня назрел вопрос по скриптам на OnSpawn, ведь насколько я понял локалки в вышеприведенном вами скрипте, вешаются именно там. Просто у меня было несколько проколов. Все работает 10-20 раз, а на тридцатом, бах висяк! Пришлось переписать и бросить все ХБ, т.к. с сюжетным персам это непозволительно. Ни разу не произошло ни одного сбоя. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) приведи код скрипта сюда. |
![]()
Сообщение
#2292
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(Aiwan @ Jun 1 2006, 22:15) [snapback]83524[/snapback] Ни разу не произошло ни одного сбоя. приведи код скрипта сюда. Коды как мои, так и базовые, в том числе Леворовские. Неверский я видно тупо использовал, ребята спавнили перса в процессе игры, у меня же перс при загрузке уже находился в локе. Т.ч. есть рифы, и о них надо помнить. Да, забыл, были банальные баги при раздачи уровня. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Доморощенный код (последний баг, сработал 50/50, стал только сюжетным) NSS void main() { DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectPetrify()), OBJECT_SELF)); DelayCommand(1.5, SetPlotFlag(OBJECT_SELF, TRUE)); // сюжет } os_died (кусок кода из скрипта Левора, стоял полный код) NSS void main() { SetLocalInt(OBJECT_SELF, "SPAWNED_DEAD", 1); SetIsDestroyable(FALSE, FALSE, FALSE); effect eDeath = EffectDeath(); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF); } nw_c2_j_assvict1 (базовый неверский код) NSS #include "NW_I0_GENERIC"
void main() { SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT); SetListeningPatterns(); // Goes through and sets up which shouts the NPC will listen to. WalkWayPoints(); // Optional Parameter: void WalkWayPoints(int nRun = FALSE, float fPause = 1.0) // 1. Looks to see if any Way Points in the module have the tag "WP_" + NPC TAG + "_0X", if so walk them // 2. If the tag of the Way Point is "POST_" + NPC TAG the creature will return this way point after // combat. } |
![]()
Сообщение
#2293
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Команда Делей не всегда корректно, а скажем почти всегда неккоректно работает с OBJECT_SELF. Делай так:
NSS object oSelf = OBJECT_SELF; NSS void main() { object oNpc = OBJECT_SELF; SetIsDestroyable(FALSE,FALSE,FALSE); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(TRUE,TRUE), oNpc); } Вообще не рекомендую тереть скрипты спавновские полностью, если НПС должен что то делать. Если он мертвый то три. Код выше. |
![]()
Сообщение
#2294
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Делай лучше вообще не использовать в спауне, как раз всякие баги и 50/50 и вылезают.
Особенно, когда мод грузится, при загрузке лок либо нет такого, либо баги реже/меньше, но при загрузке мода 100% бяки вылезают. |
![]()
Сообщение
#2295
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Возникла следующая проблема:
На одну из ветвей диалога вешаю вот такой скрипт: NSS const float SND_DURATION=5.0; void main() { ClearAllActions(); ActionWait(1.5); ActionDoCommand(PlaySound("sound_2")); ActionWait(SND_DURATION); ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE); } По идее, NPC должен чуть подождать (1.5 сек), проиграть звук, а потом начать диалог. А он ждет 5 секунд (SND_DURATION), а затем начинает диалог и параллельно проигрывает звук. Где у меня неправильно?.. |
![]()
Сообщение
#2296
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
NSS const float SND_DURATION=5.0; void main() { ClearAllActions(); DelayCommand(1.5, ActionDoCommand(PlaySound("sound_2"))); DelayCommand(SND_DURATION+1.5, ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE)); } Ждет полторы секунды, играет звук, ждет 5 секунд, начинает диалог. |
![]()
Сообщение
#2297
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
kreon, прикинь - не работает!
А вот что написано в лексиконе: QUOTE This might not be an actual bug, but though PlaySound isn't an action (you don't get the little yellow square on the screen), if you assign a PlaySound to someone, it will wait for their current action queue to finish before playing. Сейчас буду извращаться на тему... |
![]()
Сообщение
#2298
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
Гмм.. ща тоже чего-нить попробую... Я думал что ошибка в ActionWait(), т.к. действия воспроизведения звука не вейтятся вроде...
. А, идея повяилась... Сделать SetCommandable(FALSE) (нечего будет ждать), воспроизвести звук и потом дать команду диалога. Сообщение отредактировал kreon - Jun 2 2006, 20:47 |
![]()
Сообщение
#2299
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Итак, злобно извратившись, я добился того, чего хотел.
Вот так: Родительский скрипт: NSS void main() { object oSelf=OBJECT_SELF; ClearAllActions(); DelayCommand(1.5, PlaySound("sound_1")); DelayCommand(1.5, ExecuteScript("play1", oSelf)); } Скрипт play1: NSS const float SND_DURATION=3.0;
void main() { ActionWait(SND_DURATION); ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE); } Сообщение отредактировал Kavin - Jun 2 2006, 20:56 |
![]()
Сообщение
#2300
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
а нафига так то?
NSS void main() { ClearAllActions(); DelayCommand(1.5, PlaySound("sound_1")); ActionWait(SND_DURATION + 1.5); ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE); } те звук через делей, остальное в стек. ну или взять вариант Креона и выкинуть там ActionDoCommand, ибо в том варианте под задержкой он нафиг не нужен. В стек стремно по 1 причине - можно сбить. Поэтому можно подстраховаться и стек закрыть (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2301
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Lex, попробовал - не сработало. Если верить лексикону, то получается, что PlaySound() не выполняется до тех пор, пока в стеке что-то есть. Глюк биоваревский. Т.е. очередь действий кончилась - начался звук.
Поэтому нужно делать так, чтобы PlaySound срабатывал, когда стек пуст, а затем он начинал заполняться. Разница в доли секунды получится, и глазу юзера будет незаметна. |
![]()
Сообщение
#2302
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
NSS void ANIMATION(object oD) { int A=0; float T,S; switch (Random(8)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1,object oD2) { string s1="",s2=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(30)) { case 0: s1="×òî ìû òåïåðü äåëàòü-òî áóäåì?";s2=" Íåçíàé! Âðåìÿ ïîêàæåò...";break; case 1: s1="À ó íàñ åñòü ÷å ïîåñòü òî, à?";s2="Ñõîäèì â òàâåðíó, òàì äîëæíû áûòü áîè, íàâåðíÿêà ìîíåòêè òî ïîñûïÿòñÿ íà çåìëþ, õåõå...";break; case 2: s1="Ó ìåíÿ â æèâîòå óð÷èò";s2="Òàê ñõîäè, ïîåøü, ñòàðóøêà äðÿõëàÿ ìîÿ!";break; case 3: s1="À íàøà äî÷êà íàâåðíî æèâåò ñ÷àñòëèâîé æèçíü...";s2="Ïðèøåë áû ÿ äîìîé íà ïÿòü ìèíóò ðàíüøå, ÿ áû èç Ñàí÷åçà âñþ äóðü òî âûáèë!! Ýõ ÿ åìó...";break; } AssignCommand(oD1,SpeakString(s1)); AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD1 = GetNearestObjectByTag("oldman1"); object oD2 = GetNearestObjectByTag("oldwoman1"); if (GetIsInCombat(oD1)) return; if (GetIsInCombat(oD2)) return; if ( (IsInConversation(oD1)) || (IsInConversation(oD2)) ) return; if (GetDistanceToObject(oPC)>10.0) return; AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); AssignCommand(oD2,SetFacingPoint(GetPosition(oD1))); DIALOG(oD1,oD2); ANIMATION(oD1); ANIMATION(oD2); } Два вопроса. 1 - почему не составляется(хотя в игре все ОК) 2 - почему НПСы болтают вроде бы, но не слова не появляется!? PS 1 - при английских словах все ОК 2 - при английских словах такаяже лажа(IMG:style_emoticons/kolobok_light/sad.gif) |
![]()
Сообщение
#2303
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
1.
Избавляйся от маленькой буквы я, либо ставь патч от dumbo. NSS ... "Избавл"+ya+"йся" ... 2. Ты точно указал таги NPC ? Сообщение отредактировал Dik Morris - Jun 6 2006, 17:06 |
![]()
Сообщение
#2304
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(..::SERGO::.. @ Jun 6 2006, 17:35) [snapback]83853[/snapback] switch (Random(30)) а кейса 4. У тебя вероятность 4 к 30 что раз в 6 секунд они что-то скажут. + смотри, там же стоит проверка на дистанцию: те если игрок далеко, то фраз видно не будет. ЗЫ: хм.. лучше поменять очередность.. анимация, потом проверка на дистанцию, потом слова. Так реалистичнее |
![]()
Сообщение
#2305
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(..::SERGO::.. @ Jun 6 2006, 17:35) [snapback]83853[/snapback] Два вопроса. 1 - почему не составляется(хотя в игре все ОК) 2 - почему НПСы болтают вроде бы, но не слова не появляется!? PS 1 - при английских словах все ОК 2 - при английских словах такаяже лажа SERGO, у тебя не правильно составлены стринги. Смотри как надо, и правь последнею строку сам. Если скрипт стоял на ХБ перса, то скрипт поэтому и не работал, он написан у тебя для работы с третьего перса. Маленький совет: копируй скрипт при русском шрифте в обоих редакторах, как в редакторе скриптов, так и в текстовом редакторе, должен стоять русский шрифт. NSS void ANIMATION(object oD)
{ int A=0; float T,S; switch (Random(5)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1,object oD2) { string s1="",s2=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(30)) { case 0: s1="Что мы теперь делать-то будем? ";s2="Не знаю! Врем"+ya+" покажет…";break; case 1: s1="А у нас есть че поесть-то, а? ";s2="Сходим в таверну, там должны быть бои, навер"+ya+"ка монетки-то посып"+ya+"тс"+ya+" на землю, хе-хе…";break; case 2: s1="У мен"+ya+" в животе урчит… ";s2="Так сходи, поешь, старуха др"+ya+"хла"+ya+" мо"+ya+"!";break; case 3: s1="А наша дочка наверно живет счастливой жизнью… ";s2="Пришел бы Я домой на пЯть минут раньше, Я бы из Санчеса всю дурь то выбил!! Эх Я ему…";break; } AssignCommand(oD1,SpeakString(s1)); AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD1 = GetNearestObjectByTag("oldman1"); object oD2 = OBJECT_SELF; if (GetIsInCombat(oD1)) return; if (GetIsInCombat(oD2)) return; if (IsInConversation(oD1) || IsInConversation(oD2)) return; if (GetDistanceToObject(oPC)>10.0) return; AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); AssignCommand(oD2,SetFacingPoint(GetPosition(oD1))); DIALOG(oD1,oD2); ANIMATION(oD1); ANIMATION(oD2); } Сообщение отредактировал gennady - Jun 7 2006, 15:17 |
![]()
Сообщение
#2306
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
QUOTE object oD2 = OBJECT_SELF; Так я же ставил на "ХБ невидимого обьекта между ними" Не пашет, все есть, токо слов не видно(IMG:style_emoticons/kolobok_light/sad.gif) |
![]()
Сообщение
#2307
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(gennady @ Jun 7 2006, 07:37) [snapback]83894[/snapback] Если скрипт стоял на ХБ перса, то скрипт поэтому и не работал, он написан у тебя для работы с третьего перса он написан для стороннего контроллера и на его (контроллера) ХБ и стоит. QUOTE(..::SERGO::.. @ Jun 7 2006, 13:04) [snapback]83897[/snapback] Не пашет, все есть, токо слов не видно я тебе сказал, в чем дело скорее всего. У тебя 4 пары фраз? Ну так ставь Рандом(5) а не 30. ____ кстати делай фразы покороче. Большие объемы текста выглядят не очень. QUOTE(gennady @ Jun 7 2006, 07:37) [snapback]83894[/snapback] if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; // Эта проверка здесь лишнЯЯ. Есть проверка дистанции… не лишняя. Проверка дистанции, если игрок не в локации, даст -1.0, а это меньше 10. Так что проверка на своем месте. Тем более читай выше (поставить проверку дистанции после анимации, но до текста) __ ЗЫ: у меня в Тсурле этот скрипт и его модификации различные пашут без проболем. Если проблема не в том, что я написал выше, у тебя верные тэги и условия соблюдены, в ХБ неписей ничего сбивающего не стоит, то я хз, почему у тебя не работает. |
![]()
Сообщение
#2308
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(..::SERGO::.. @ Jun 7 2006, 13:04) [snapback]83897[/snapback] Так я же ставил на "ХБ невидимого обьекта между ними" Не пашет, все есть, токо слов не видно У меня скрипт пахал на ХБ перса, по скрипту я понял, что у тебя он стоял на невидимом объекте, для данного скрипта он в принципе лишний. Можешь вернуть NSS object oD2 = GetNearestObjectByTag("oldwoman1"); Будет усё пахать, только правильно настрой свойства невидимого объекта. Поставь галку - сюжет Убери галку - статик Убери галку – используемый Но может и глючить, желательно все же ставить «используемый», т.ч. лучше выкидай этот объект. Проверка дистанции, если игрок не в локации, даст -1.0, а это меньше 10. Точно, Лекс прав. Ну, и голова! Сообщение отредактировал gennady - Jun 7 2006, 15:14 |
![]()
Сообщение
#2309
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
можно просто без галки статик, у меня все контроллеры такие. Используемый - не обязательно совершенно. Не глючит при этом никогда.
|
![]()
Сообщение
#2310
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
АА! в задницу все! (IMG:style_emoticons/kolobok_light/declare.gif) Можно ли это заточить только под одного персонажа(типа торговца, который выкрикивает весь день)
|
![]()
Сообщение
#2311
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
NSS void ANIMATION(object oD)
{ int A=0; float T,S; switch (Random(5)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1) { string s1=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(4)+1) { case 1: s1="text"; break; case 2: s1="text"; break; case 3: s1="text"; break; case 4: s1="text"; break; } AssignCommand(oD1,SpeakString(s1)); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD2 = OBJECT_SELF; if (GetIsInCombat(oD2)) return; if (IsInConversation(oD2)) return; if (GetDistanceToObject(oPC)>10.0) return; DIALOG(oD2); ANIMATION(oD2); } Сообщение отредактировал Dik Morris - Jun 8 2006, 11:40 |
![]()
Сообщение
#2312
|
|
Level 3 ![]() Класс: Волшебник Характер: Neutral Evil Раса: Человек ![]() |
NSS void main() { object oPC = OBJECT_SELF; if ((GetLevelByClass(CLASS_TYPE_PALEMASTER, oPC)>0)) { int nLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER, OBJECT_SELF); effect eSummon; float fDelay = 3.0; int nDuration = nLevel; if (nLevel >= 7) eSummon = EffectSummonCreature("NW_S_DOOMKGHT",VFX_FNF_SUMMON_UNDEAD); else eSummon = EffectSummonCreature("NW_S_GHAST",VFX_FNF_SUMMON_UNDEAD); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); } Привожу скипт для объяснения ситуации, сам скрипт работает, но у меня проблемы вот с чем. Хочется внести своего самона, ну например чтобы при 10 лвлах ПМа вылезал Командир Дум Найтов. Когда я ставлю его со стандартным его тегом, он вылезает, однако на нем нету скриптов хенчмана(или как их правильно назвать), поэтому управлять им не возможно. Я добавляю ему их, меняю таг, соответствено он перемещается из стандартных монстров, в сделаных мной, и когда я добавляю его в этот скрипт вместо командира вылезает голый дварф с 1 хп и без имени, мобы на него не реагируют (IMG:style_emoticons/kolobok_light/declare.gif) Объясните пожалуйста как с этим быть. P.S. Если запостил не в тот раздел, прошу прощения, пока еще не разобрался с форумом. Сообщение отредактировал Mandrake - Jun 8 2006, 13:25 |
![]()
Сообщение
#2313
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
все, что тебе нужно это указать резреф твоего ДумКнайта в функции EffectSummonCreature. (резреф, не тэг. Это важно.) те что-то такое
NSS void main()
{ object oPC = OBJECT_SELF; if ((GetLevelByClass(CLASS_TYPE_PALEMASTER, oPC)>0)) { int nLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER, OBJECT_SELF); string sSummon; float fDelay = 3.0; int nDuration = nLevel; if (nLevel >= 10) // с 10 левела твой командир sSummon = "твой резреф"; else if (nLevel >= 7) // с 7 по 10 просто думкнайт sSummon = "NW_S_DOOMKGHT"; else // до 7го гаст. sSummon = "NW_S_GHAST"; ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectSummonCreature(sSummon,VFX_FNF_SUMMON_UNDEAD), GetSpellTargetLocation(), HoursToSeconds(nDuration)); } |
![]()
Сообщение
#2314
|
|
Level 3 ![]() Класс: Волшебник Характер: Neutral Evil Раса: Человек ![]() |
Огромное спасибо (IMG:style_emoticons/kolobok_light/thank_you.gif) Теперь все стало работать. Я просто думал раз стандартные мобы указаны через тэги, то и мои должны быть через них (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#2315
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
у стандартных совпадаюи тэги и рефы. Тебе тоже стоит делать, чтобы совпадали. Обычно правило такое: реф маленькими буквами, тэг - большими. (и одинаковые по содержанию)
|
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 18:18 |