|
|
13.09.2011, 14:17
|
#2483
|
|
Re: М: Скриптинг в Готике
2ElderGamer:Старая монета добавляется в инвентарь убитого NPC в функции B_KillNpc():
Cпойлер(щелкните, чтобы прочесть):
func void B_KillNpc(var int npcInstance) { * * *var C_Npc npc; * * *var int itemInstance; * * *PrintDebugNpc(PD_ZS_DETAIL,"B_KillNpc"); * * *npc = Hlp_GetNpc(npcInstance); * * *npc.flags = 0; * * *CreateInvItem(npc,ItMi_Stuff_OldCoin_02); * * *Npc_ChangeAttribute(npc,ATR_HITPOINTS,-npc.attribute[ATR_HITPOINTS_MAX]); * * *if(Npc_GetInvItemBySlot(npc,INV_WEAPON,1)) * * *{ * * * * * *PrintDebugNpc(PD_ZS_DETAIL,"...Waffe in Slot 1 gefunden!"); * * * * * *itemInstance = Hlp_GetInstanceID(item); * * * * * *Npc_RemoveInvItem(npc,itemInstance); * * *}; * * *if(Npc_GetInvItemBySlot(npc,INV_WEAPON,2)) * * *{ * * * * * *PrintDebugNpc(PD_ZS_DETAIL,"...Waffe in Slot 2 gefunden!"); * * * * * *itemInstance = Hlp_GetInstanceID(item); * * * * * *Npc_RemoveInvItem(npc,itemInstance); * * *}; };
Это сделано для того, чтобы труп не исчезал, т.к. монета является квестовым предметом (флаг ITEM_MISSION). Если же нужно, чтобы труп исчез, напишите функцию, которая сначала чистит инвентарь непися, а затем обнуляет у него атрибут "HITPOINTS".
|
|
|
14.09.2011, 14:28
|
#2484
|
|
|
|
|
A.G.F.C.
Регистрация: 18.02.2008
Сообщений: 0
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2Dimus: К сожалению, и этот способ не помогает. Обнулил хиты так, как это сделано в Хроманине:
Npc_ChangeAttribute(Templer_OM,ATR_HITPOINTS,-Templer_OM.attribute[ATR_HITPOINTS_MAX]);
Тело не исчезает. Причём, результат не зависит от того, есть что-либо в инвентаре непися, или нет. Для того, чтобы тело исчезло, нужно подойти к нему и отойти на некоторое расстояние. Пока только так. *:square:
Добавление от 09/14/11, в 13:48:04 Две проблемы, связанные с бойцами арены в СЛ.
Проблема первая. Если вызвать кого-либо из них на бой, но не входить на арену, то боец будет стоять там и ждать... не знаю сколько времени, возможно, до конца игры, или пока его не убьёт скрипт. Можно ли каким-нибудь способом сбрасывать это состояние. Может быть, поможет контроль времени или контроль расстояния?
Проблема вторая. Если вызов приходится на время, когда на арене кто-то практикуется с мечом, то получается глупая ситуация, т.к. анимация практики не прерывается, и можно затеять "бой втроём". Я пробовал изменять распорядок бойцам в момент вызова на бой одного из них. Формально, распорядок изменяется, на деле, анимация практики продолжает выполняться. Через некоторое время практикующий боец не убирая оружия уходит с арены и продолжает практиковаться вне её. Можно ли как-то решить эту проблему?
|
|
|
15.09.2011, 10:37
|
#2486
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от redleha link=board=gothic&t=1105030050&goto=6469258 date=09/14/11, в 22:13:34
для временной смены расписания есть функции TA_BeginOverlay и TA_RemoveOverlay, я сам такими пользовался, правда, для Г2
|
С оверлеем надо быть осторожным. мне не удалось заставить его нормально работать для персонажа, кому принадлежит диалог, работало только для сторонних персонажей. А в случае "диалогоносителя" часто происходили его "зависания".
|
|
|
15.09.2011, 10:38
|
#2487
|
|
|
|
|
A.G.F.C.
Регистрация: 18.02.2008
Сообщений: 0
|
|
|
|
|
|
Re: М: Скриптинг в Готике
ElderGamer:
Вопрос к знатокам. Можно ли в Г1 с помощью какой-либо функции контролировать окончание анимации обследования сундука?
|
Мухомор:
Можно поставить в условие диалога Горна
if(!C_BodyStateContains(hero,BS_MOBINTERACT_INTERR UPT))
|
ElderGamer:
Понял в чём проблема. Во время обыскивания сундука состояние тела определяется, не как BS_MOBINTERACT_INTERRUPT, а как BS_INVENTORY. BS_MOBINTERACT_INTERRUPT определяется в фазе открытия сундука. Поменял в условии на BS_INVENTORY и всё заработало. :)
|
|
|
20.09.2011, 23:27
|
#2491
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от ElderGamer link=board=gothic&t=1105030050&goto=6476654 date=09/20/11, в 10:47:35
Первый способ не работает. *:( Функция PrintScreen() всё равно обрабатывается раньше, чем будут завершено воспроизведение всех звуковых файлов, предшествующих ей.
|
не PrintScreen, а AI_PrintScreen (уж не знаю точно, есть ли она в двиге первой готы, в туторе Vam'а она описана как функция чисто Г2-двига) по поводу второго способа (поглядел я скрипты первой готы, есть там ZS_Talk), так вот вырезка из моей функции ZS_Talk_End(): if(Npc_IsPlayer(other)) { if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(fff)) && Npc_KnowsInfo(other,DIA_fff_Hello)) { Wld_PlayEffect("FX_EarthQuake",other,other,0,0,0,F ALSE); }; };
|
|
|
07.11.2011, 13:23
|
#2498
|
|
Re: М: Скриптинг в Готике
2Ultroman:Вы что-нибудь знаете о языке Daedalus? Потому что все скрипты G1 и G2 написаны на нём. Названия GMDK, G2MDK, Spacer, Gothic Sourcer вам что-нибудь говорят? Если ответ будет положительным, тогда можно перейти к деталям. Чтобы в процессе игры NPC выполнял набор действий, нужно прописать ему ежедневное расписание деятельности (daily routine), которое находится в скриптах Story\NPC\*.d. В качестве примера возьмём простейший скрипт идола Кадара из Болотного лагеря (Story\NPC\GUR_1208_BaalCadar.d):
Cпойлер(щелкните, чтобы прочесть):
instance GUR_1208_BaalCadar(Npc_Default) { * * *name[0] = "Идол Кадар"; * * *npcType = npctype_main; * * *guild = GIL_GUR; * * *level = 28; * * *voice = 2; * * *id = 1208; * * *attribute[ATR_STRENGTH] = 70; * * *attribute[ATR_DEXTERITY] = 55; * * *attribute[ATR_MANA_MAX] = 50; * * *attribute[ATR_MANA] = 50; * * *attribute[ATR_HITPOINTS_MAX] = 376; * * *attribute[ATR_HITPOINTS] = 376; * * *Mdl_SetVisual(self,"HUMANS.MDS"); * * *Mdl_ApplyOverlayMds(self,"Humans_Mage.mds"); * * *Mdl_SetVisualBody(self,"hum_body_Naked0",1,1,"Hum _Head_Psionic",20,1,gur_armor_m); * * *B_Scale(self); * * *Mdl_SetModelFatness(self,-1); * * *Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6); * * *CreateInvItem(self,ItArRuneWindfist); * * *B_Give_BaalCadarChapter1Runes(); * * *fight_tactic = FAI_HUMAN_MAGE; * * *daily_routine = Rtn_start_1208; };
func void Rtn_start_1208() { * * *TA_Sleep(2,0,8,0,"PSI_23_HUT_IN"); * * *TA_Teaching(8,0,2,0,"PSI_TEACH_CADAR"); };
У него прописано ежедневное расписание
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_start_1208(): с 2:00 до 8:00 он спит в своей хижине (waypoint PSI_23_HUT_IN), а с 8:00 до 2:00 обучает послушников магии Спящего под тренировочной площадкой для храмовников (waypoint PSI_TEACH_CADAR)
. Например, пусть ночью он не спит, а тренируется в использовании магии на том же месте, что и днём - тогда заменяем ему функцию сна на другую:
Cпойлер(щелкните, чтобы прочесть):
TA_PracticeMagic(2,0,8,0,"PSI_TEACH_CADAR");
, компилируем скрипты, делаем резервную копию файлов _work\Data\Scripts\_compiled\GOTHIC.DAT и _work\Data\Scripts\Content\Cutscene\OU.BIN, затем заменяем эти файлы полученными после компиляции. Запускаем игру, через консоль устанавливаем время на 2 часа ночи ( set time 2) и переходим к нему командой goto waypoint PSI_TEACH_CADAR. Список задействованных в игре действий NPC задан в скрипте Story\ZS\Ta.d (G1) или AI\Human\TA.d (G2). Учтите, что у некоторых NPC расписание жизнедеятельности в процессе игры может изменяться с помощью функции B_StartOtherRoutine(инстанция NPC, "новое расписание"). В качестве примера рассмотрим расписание Секоба (Story\NPC\BAU_930_Sekob.d):
Cпойлер(щелкните, чтобы прочесть):
instance BAU_930_Sekob(Npc_Default) { * * *name[0] = "Секоб"; * * *guild = GIL_OUT; * * *id = 930; * * *voice = 1; * * *flags = NPC_FLAG_IMMORTAL; * * *npcType = npctype_main; * * *aivar[AIV_ToughGuy] = TRUE; * * *B_SetAttributesToChapter(self,1); * * *fight_tactic = FAI_HUMAN_COWARD; * * *EquipItem(self,ItMw_1h_Bau_Mace); * * *B_CreateAmbientInv(self); * * *B_SetNpcVisual(self,MALE,"Hum_Head_Fatbald",Face_ P_OldMan_Gravo,BodyTex_P,ITAR_Vlk_H); * * *Mdl_SetModelFatness(self,0); * * *Mdl_ApplyOverlayMds(self,"Humans_Arrogance.mds"); * * *B_GiveNpcTalents(self); * * *B_SetFightSkills(self,20); * * *daily_routine = Rtn_Start_930; };
func void Rtn_Start_930() { * * *TA_Sit_Throne(8,0,22,0,"NW_FARM4_SEKOB"); * * *TA_Sleep(22,0,8,0,"NW_FARM4_IN_BED"); };
func void Rtn_FleeDMT_930() { * * *TA_Stand_WP(8,0,22,0,"NW_BIGFARM_FARM4_PATH_01"); * * *TA_Stand_WP(22,0,8,0,"NW_BIGFARM_FARM4_PATH_01"); };
func void Rtn_Obsessed_930() { * * *TA_Stand_Guarding(8,0,22,0,"NW_FARM4_02"); * * *TA_Stand_Guarding(22,0,8,0,"NW_FARM4_02"); };
Его начальное расписание описано
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_Start_930(): с 8:00 до 22:00 сидит в кресле (NW_FARM4_SEKOB), а с 22:00 до 8:00 спит на кровати (NW_FARM4_IN_BED). Затем в 3-й главе, когда ищущие выгоняют его семью из дома, Секоб круглые сутки стоит на улице (функция Rtn_FleeDMT_930()) до тех пор, пока ГГ не уничтожит ищущих. А когда Секоб становится одержимым, тогда от него сбегают жена и сын, а сам он круглые сутки стоит на waypoint NW_FARM4_02 (функция Rtn_Obsessed_930()).
Внимание: Новое расписание должно ссылаться на функцию вида Rtn_Routine_xxx, но без префиксов "Rtn" и "xxx"! Т.е. Секоб в 3-й главе покидает свой дом по команде B_StartOtherRoutine(Sekob,"FleeDMT");, прописанной в скрипте Story\B_Story\B_Enter_NewWorld.d.
|
|
|
11.11.2011, 03:23
|
#2500
|
|
Re: М: Скриптинг в Готике
Есть ли в Г2 ограничение на число неписей? И еще у меня персы не вставляются. Все скрипты вставлены как надо, разве что диалогов нет, в gothic.src правку провел, впихнул перса под Ксара. Однако после запуска новой игры непись не появляется, его можно разве что читом вызвать.
Процесс таков: Создаю перса в Gothic II\_work\Data\Scripts\Content\Story\NPC Вставляю его в Gothic II\_work\Data\Scripts\Content\Story\StartUp.d *соответственно остальным неписям. Все манипуляции производятся в новом проекте, точнее модернизируется старый, имененный ранее с добавкой пары квестов, скрипты созданы в этом проекте, так что косяков быть не должно, ошибок в скриптах нет. Прописал перса в gothic.src, сохранил, скомпилил скрипты в сорсере, заменил Gothic.dat и OU.bin. Запуск новой игры и пустота.
Возможно ошибка в выборе вейпоинта, хотя я пробовал и другие варианты, к примеру изначально перс должен был стоять недалеко от Ксардаса, но не пошло. Тогда я перенес его на вейпоинт на первом этаже, но рядом были фрипоинты демонов из четвертой главы, и возможно поэтому перс не воткнулся. Затем я вынес перса на улицу и прописал на фрипоинт овцы (один из трех по которым она перемещается, при этом данный поинт свободен, тк овца прописана на соседнем). Однако и тут облом. *
|
|
|
13.11.2011, 00:03
|
#2505
|
|
Re: М: Скриптинг в Готике
2Dyom sn1p:1. Для этого вам понадобятся или Spacer 2 (входит в состав G2MDK) или Gothic Sourcer v3.14, который лучше выявляет ошибки скриптов. Также вам потребуются декомпилированные скрипты оригинальной Gothic II или аддона (лучше всего взять очищенные от ошибок скрипты, например, декомпилировать G2a_NR_ScriptPatch). Ссылки на программы найдёте сами, а различные статьи по модостроению можно найти здесь. 2. [rul] запрещают дублировать сообщения - смотрите статью 3, пункт 6. Поэтому тема с дубликатом вашего сообщения удалена.
|
|
|
09.12.2011, 16:42
|
#2512
|
|
Re: М: Скриптинг в Готике
2 ZEN :Вообще-то этот флаг нигде не используется, а для того, чтобы сделать ГГ или NPC пьяным, нужно применить для него анимацию "Humans_drunken.mds", например, с помощью консоли:
Cпойлер(щелкните, чтобы прочесть):
apply overlaymds humans_drunken
или через скрипты:
Cпойлер(щелкните, чтобы прочесть):
Mdl_ApplyOverlayMds(self,"Humans_drunken.mds");
Эта анимация есть только в G1.
|
|
|
15.12.2011, 17:37
|
#2515
|
|
Re: М: Скриптинг в Готике
Привет люди, решил поскриптить на досуге и вот такое дело накарябал, однако сорсер ошибки там на ровном месте находит, одни строки принимает как должное, а другие похожие в штыки. В общем и целом, это скрипт игры в кости (вроде кто-то такой уже делал), осталось доделать часть, чтобы можно было играть по-новой.
Cпойлер(щелкните, чтобы прочесть):
var int Player; instance NPC_Game(C_Info) { * * *npc = VLK_454_Buerger; * * *nr = 3; * * *condition = PC_Game_Condition; * * *information = PC_Game_Info; * * *permanent = TRUE; * * *description = "Сыграем в кости?"; }; func int PC_Game_Condition() { * * *if(Npc_KnowsInfo(other,DIA_VLK_454_Hello)) * * *{ * * * * * *return TRUE; * * *}; };
func void PC_Game_Info()
{ *AI_Output(other,self,"DIA_PlayGame_15_01"); //Сыграем в кости? *AI_Output(self,other,"DIA_PlayGame_15_02"); //Не терпится расстаться с золотом? (смеется) Хорошо.Какая ставка? *Info_ClearChoices(PC_Game); *Info_AddChoice(PC_Game,"20 золотых",PC_Game_1); *Info_AddChoice(PC_Game,"30 золотых",PC_Game_2); *Info_AddChoice(PC_Game,"50 золотых",PC_Game_3); *Info_AddChoice(PC_Game,"100 золотых",PC_Game_4); };
var int Round; func void PC_Game_1() { * * *AI_Output(other,self,"DIA_PlayGame_15_03"); *// 20золотых * * *Round = 20; };
func void PC_Game_2() { * ** * *AI_Output(other,self,"DIA_PlayGame_15_04"); *//30 золотых * * *Round = 30; };
func void PC_Game_3() { * * *AI_Output(other,self,"DIA_PlayGame_15_05"); *//50 золотых * * *Round = 50; };
func void PC_Game_4() { * * *AI_Output(other,self,"DIA_PlayGame_15_06"); *//100 золотых * * *Round = 100; };
instance NPC_Game_Start(C_Info) { * * *npc = VLK_454_Buerger; * * *nr = 3; * * *condition = PC_Game_Start_Condition; * * *information = PC_Game_Start_Info; * * *permanent = TRUE; * * * }; func int PC_Game_Start_Condition() { * * *if(Npc_KnowsInfo(other,NPC_Game)) * * *{ * * * * * *return TRUE; * * *}; }; var int Game; var int MyGame; func void PC_Game_Start_Info()
{ * * *Game = Hlp_Random(12); * if(Game <= 2) *{ * * *AI_Output(other,self,"DIA_BigGame_15_01"); * * *//Проклятье! Двойка. *} else if(Game = 3) *{ * * *AI_Output(other,self,"DIA_BigGame_15_02"); * * *//Три очка. * * * *}
else if(Game = 4) *{ * * *AI_Output(other,self,"DIA_BigGame_15_03"); * * *//Четыре, паршиво. * * * *} else if(Game = 5) *{ * * *AI_Output(other,self,"DIA_BigGame_15_04"); * * *//Пять. * * * *} else if(Game = 6) *{ * * *AI_Output(other,self,"DIA_BigGame_15_05"); * * *//Шесть, хоть что-то. * * * *} else if(Game = 7) { * * *AI_Output(other,self,"DIA_BigGame_15_06"); * * *//Семь. * * * } else if(Game = 8) { * * *AI_Output(other,self,"DIA_BigGame_15_07"); * * *//Восемь, неплохо, совсем неплохо. * * * } else if(Game = 9) { * * *AI_Output(other,self,"DIA_BigGame_15_08"); * * *//Девять. Посмотрим, что ты на это скажешь. * * * } else if(Game = 10) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Нельзя выполнить присвоение if. Прикол в том, что стоило перенести if строкой ниже, а потом вернуть на место, эта ошибка пропала, но два нижних условия по прежнему считаются ошибочными. Если же убрать if, начинает выдавать ошибки в строках с условиями ранее признанные программой как правильные. *{ * * *AI_Output(other,self,"DIA_BigGame_15_09"); * * *//Десятка, разрази меня гром! Я сегодня в ударе. *} else if(Game = 11) *{ * * *AI_Output(other,self,"DIA_BigGame_15_10"); // Одинадцать.(хвастливо) Попробуй кинуть лучше! * * * * * * *} else if(Game = 12) *{ * * *AI_Output(other,self,"DIA_BigGame_15_11"); // Двенадцать.Ха-ха, теперь твои деньги уплывут в мой карман! *}; };
instance NPC_HGame(C_Info) { * * *npc = VLK_454_Buerger; * * *nr = 3; * * *condition = PC_HGame_Condition; * * *information = PC_HGame_Info; * * *permanent = TRUE; * * *description = "Моя очередь"; };
func int PC_HGame_Condition() { * * *if(Npc_KnowsInfo(other,NPC_Game_Start)) * * *{ * * * * * *return TRUE; * * *}; };
func void PC_HGame_Info() { MyGame = Hlp_Random(12); if(MyGame <= 2) && (Game > 2) { * * *AI_Output(other,self,"DIA_BigGame_16_01"); * * *//Двойка. (усмехается) Тебе невезет приятель. * * *B_GiveInvItems(other,self,ItMi_Gold,Round); } else if(MyGame <= 2) && (Game <= 2) { * * *AI_Output(other,self,"DIA_BigGame_17_01"); * * *//Двойка. Ничья. } else if(MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) *|| (MyGame > 4) && (Game <= 4) * || (MyGame = 5) && (Game <= 4) || Ошибка синтаксиса.|| (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) || ||(MyGame = 9) && (Game <= 8) *||(MyGame > 9) && (Game <= 9) ||(MyGame = 10) && (Game <= 9) ||(MyGame > 10) && (Game <= 10) ||(MyGame = 11) && (Game <= 10) ||(MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11) Здесь не очень хорошо видно, ситуация такова: условие было слишком длинным, и я решил разделить его в три строки. Такое встречается в скриптах готики, однако в данном случае это не сработало. Попытка удаления "лишних палочек" также как попытка написать условие в одну строку, без переносов приводят к вылету программы на рабочий стол.
{ * * *AI_Output(other,self,"DIA_BigGame_16_02"); * * *//Зараза, ты победил! * * *B_GiveInvItems(self,other,ItMi_Gold,Round); }
else if(MyGame = 3) && (Game > 3) { * * *AI_Output(other,self,"DIA_BigGame_17_02"); * * *//Три очка. * * *Твои деньги стали моими. * * *B_GiveInvItems(other,self,ItMi_Gold,Round); } else if(MyGame = 3) && (Game = 3) { * * *AI_Output(other,self,"DIA_BigGame_17_03"); * * *//Ничья. }
else if(MyGame = 4) && (Game > 4) { * * *AI_Output(other,self,"DIA_BigGame_16_03"); * * *//Четыре, гони золотишко. * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * }
else if(MyGame = 4) && (Game = 4) { * * *AI_Output(other,self,"DIA_BigGame_17_03"); * * *//Ни тебе, ни мне. Ничья. } else if(MyGame = 5) && (Game > 5) { * * *AI_Output(other,self,"DIA_BigGame_16_04"); * * *//Пять, золото гони опять. (ржет) * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * } else if(MyGame = 5) && (Game = 5) || *(MyGame = 6) && (Game = 6) { * * *AI_Output(other,self,"DIA_BigGame_16_05"); * * *//Одинаковый результат тоже результат. Вот только карман от него не тяжелеет. } else if(MyGame = 6) && (Game > 6) { * * *AI_Output(other,self,"DIA_BigGame_16_06"); * * *//Шесть,отличная попытка, но до меня далеко. * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * } else if(MyGame = 7) && (Game > 7) { * * *AI_Output(other,self,"DIA_BigGame_16_07"); * * *//Семь. * * *Хороший бросок,но мой лучше. * * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * } else if(MyGame = 7) && (MyGame = 7) || (MyGame = 7) && (Game = 7) *|| (MyGame = 8) && (Game = 8) || (MyGame = 9) && (Game = 9) *|| (MyGame = 10) && (Game = 10) || (MyGame = 11) && (Game = 11) { * * *AI_Output(other,self,"DIA_BigGame_16_08"); * * *//Однако, счет равный. } else if(MyGame = 8) && (Game > 8) { * * *AI_Output(other,self,"DIA_BigGame_16_09"); * * *//Восемь. Совсем неплохо. А теперь гони мои деньги. * * * * * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * } else if(MyGame = 9) && (Game > 9) { * * *AI_Output(other,self,"DIA_BigGame_16_10"); * * *//Девять. Для новичка ты хорош, однако удача на моей стороне. * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * * * * } else if(MyGame = 10) && (Game > 10) { * * *AI_Output(other,self,"DIA_BigGame_16_11"); * * *//Десятка. * * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * } else if(MyGame = 11) && (Game > 11) { * * *AI_Output(other,self,"DIA_BigGame_16_12"); // Одинадцать.Ты почти достал меня. B_GiveInvItems(other,self,ItMi_Gold,Round); * * * * * * } else if(MyGame = 12) && (Game = 12) { * * *AI_Output(other,self,"DIA_BigGame_16_13"); // Двенадцать! Чтоб тебя! Вот это везение, я уж думал тебе не отвертеться. }
*
Help anybody!!!
|
|
|
15.12.2011, 18:16
|
#2516
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2Лавовый:
}else if(Game = 10) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Нельзя выполнить присвоение if. Прикол в том, что стоило перенести if строкой ниже, а потом вернуть на место, эта ошибка пропала, но два нижних условия по прежнему считаются ошибочными. Если же убрать if, начинает выдавать ошибки в строках с условиями ранее признанные программой как правильные. }
|
Ппц, справку когда читать будете прежде чем в скрипты лезть?! Конечно нельзя, оператор присвоения = допустим только в теле блока функции, а не в условии куда ты ее присобачил. Там должен стоять оператор сравнения ==. Должно быть:
else if(MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) *|| (MyGame > 4) && (Game <= 4) * || (MyGame = 5) && (Game <= 4) || Ошибка синтаксиса.|| (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) || ||(MyGame = 9) && (Game <= 8) *||(MyGame > 9) && (Game <= 9) ||(MyGame = 10) && (Game <= 9) ||(MyGame > 10) && (Game <= 10) ||(MyGame = 11) && (Game <= 10) ||(MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11) Здесь не очень хорошо видно, ситуация такова: условие было слишком длинным, и я решил разделить его в три строки. Такое встречается в скриптах готики, однако в данном случае это не сработало. Попытка удаления "лишних палочек" также как попытка написать условие в одну строку, без переносов приводят к вылету программы на рабочий стол.
|
Попробуй прописать так:
Код:
else if ((MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) || (MyGame > 4) && (Game <= 4) || (MyGame = 5) && (Game <= 4) || (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) || (MyGame = 9) && (Game <= 8) || (MyGame > 9) && (Game <= 9) || (MyGame = 10) && (Game <= 9) || (MyGame > 10) && (Game <= 10) || (MyGame = 11) && (Game <= 10) || (MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11))
|
|
|
28.12.2011, 15:51
|
#2518
|
|
Re: М: Скриптинг в Готике
Объясните пож-ста, если нужно выполнить проверку условия: if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(LordHagen)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Parcival))) 1. можно ли заменить этот блок на условие: if(self.id == (LordHagen.id | Parcival.id)) 2. почему GS выдает ошибку "нельзя пребразовать тип instance в int" , если условие в виде if((Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(LordHagen)) | Hlp_GetInstanceID(Parcival)) или if((Hlp_GetInstanceID(self) == (LordHagen.id | Parcival.id)) Добавление от 12/28/11, в 15:11:16
Как присвоить глобальной переменной var C_Item значение, переданное в функцию через внутр. переменную?
Cпойлер(щелкните, чтобы прочесть):
var C_Item itmpick;
func int C_Beklauen(var C_Item itm,var int TheftGold) { if((Npc_GetTalentSkill(other,NPC_TALENT_PICKPOCKE T) == TRUE) && (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE) && (NpcObsessedByDMT == FALSE)) { TheftGoldGlob = 0; if((Npc_IsInState(self,ZS_Talk)) && (Hlp_IsValidItem(itm))) { if((Hlp_IsItem(itm,ItMi_Gold)) || (Hlp_IsItem(itm,ItRw_Arrow))) { TheftGoldGlob = 25 + Hlp_Random(TheftGold); }; if(Hlp_IsItem(itm,ItMi_Nugget)) { TheftGoldGlob = 1 + Hlp_Random(TheftGold); }; if((Npc_HasItems(self,itm) == 0) && (TheftGold < 0)) { TheftGoldGlob = 1; }; if((TheftGoldGlob > 0) || (Npc_HasItems(self,itm) > 0)) { itmpick = Npc_GetInvItem(self,itm); return TRUE; }; return FALSE; }; }; return FALSE; };
|
|
|
29.12.2011, 17:54
|
#2519
|
|
|
|
|
A.G.F.C.
Регистрация: 18.02.2008
Сообщений: 0
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2Skaarj:
2. почему GS выдает ошибку "нельзя пребразовать тип instance в int" , если условие в виде
if((Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(LordHagen)) | Hlp_GetInstanceID(Parcival))
|
Попробуйте использовать для сравнения не сами функции Hlp_GetInstanceID(npc), а локальные переменные, которым присвоено значение с помощью этих функций. А ещё, возможно, следует в условии использовать два сравнения, а не одно (не уверено, но, вдруг, поможет). if((A == B) || (A == C))
|
|
|
Здесь присутствуют: 23 (пользователей: 0 , гостей: 23)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 05:49. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|