|
|
20.12.2010, 21:15
|
#2401
|
|
Re: М: Скриптинг в Готике
2Olympus: Попробуй после AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") убрать return Loop_Continue. Вот скрипт из моей Готы, он нормально компилируется:
Cпойлер(щелкните, чтобы прочесть):
func void B_StopShortZapped() { PrintDebugNpc(PD_MAGIC,"B_StopShortZapped"); Npc_PercDisable(self,PERC_ASSESSSTOPMAGIC); Npc_ClearAIQueue(self); AI_Standup(self); if(C_NpcIsHuman(self) || C_NpcIsOrc(self)) { AI_StartState(self,ZS_ReactToDamage,0,""); } else if(C_NpcIsMonster(self)) { AI_StartState(self,ZS_MM_Attack,0,""); }; };
func void ZS_ShortZapped() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped"); if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABL E)) { PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); AI_Standup(self); }; if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) { PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") ; }; };
func void ZS_ShortZapped_Loop() { PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) { B_StopShortZapped(); }; AI_Wait(self,1); };
func void ZS_ShortZapped_End() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped_End "); };
|
|
|
20.12.2010, 22:05
|
#2402
|
|
Re: М: Скриптинг в Готике
2JohaNBlack:
Попробуй после AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") убрать return Loop_Continue.
|
Не только его, а еще и функцию сделать void, а не int. Иначе опять выдаст ворнинг.
Cпойлер(щелкните, чтобы прочесть):
func void ZS_Zapped() { PrintDebugNpc(PD_MAGIC,"ZS_Zapped"); Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopZa pped); Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABL E)) { PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); AI_Standup(self); }; if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) { PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") ; }; };
|
|
|
21.12.2010, 16:39
|
#2407
|
|
Re: М: Скриптинг в Готике
2Olympus:
Работает! Вот ещё вопрос: Можно сделать, чтобы меч убивал, а не просто вырубал людей, не убирая повреждения от оружия (EDGE)?
|
Ну для этого надо немного логику игры разбирать. По умолчанию за обработку всего урона отвечает движок и именно он переключает персонажа между состояниями ZS_Attack (атакующее состояние) и ZS_Unconscious (бессознательное состояние) Можно всунуть в начало ф-ции состояния ZS_Unconscious проверку на экипированное\активное оружие ГГ и убивать НПЦ в случае, если выбран тот или иной меч. И да, EDGE - не повреждение от оружие, а режущий урон, есть еще BLUNT - дробящий, POINT - колющий, FIRE - от огня, MAGIC- магический, FALL - от падения и FLY от кулака тролля. Соответственно и резист у НПЦ может быть от разных видов урона, например, тот же голем, неуязвимый для режущего и колющего оружия. А вообще почитайте Уроки скриптологии, это основа основ.
|
|
|
26.12.2010, 23:38
|
#2409
|
|
Re: М: Скриптинг в Готике
2ForestDark: Как поменять оригинальный загрузочный экранЭто же элементарно Форест...
Cпойлер(щелкните, чтобы прочесть):
для начала мы должны подготовить твою новую загрузочную текстуру, она должна быть размером 1024x 1024 (квадрат) и в разширении *.Tex *конвертировать её в этот формат можно с помощью программы Goman там сделать всё просто... далее можно пойти по 1му пути -это запихнуть готовую текстуру StartScreen.tex в папку _work\data\textures\_compiled
или залить её в свой файл-мод , всё просто :)
|
|
|
17.01.2011, 21:28
|
#2412
|
|
Re: М: Скриптинг в Готике
2zovsna:
А где может быть механизм проверки при загрузке сейва? Я бы тоже его позаимствовал.
|
Механизма как такового нет, как нет и функций отслеживающих сейвы. Но каждый раз при загрузке с сейва движок выполняет скрипт init_world();, а если начата новая игра то еще и startup_world(); Следовательно, никто не мешает нам ввести глобальную переменную, например:
Код:
var int PlayerIsBald;
Которая в диалоге стрижки будет приобретать значение 1/true:
Код:
PlayerIsBald = true;
И при инициализации мира проверить ее проще простого:
Код:
func void init_world(){ if (PlayerIsBald) { // тут заново "облысяем" ГГ. };...};
|
|
|
04.02.2011, 18:48
|
#2413
|
|
Re: М: Скриптинг в Готике
Подскажите,в скрипте B_MM_WispDetect правильна ли вставка return LOOP_CONTINUE или нужно Return 0 ?
Cпойлер(щелкните, чтобы прочесть):
func int B_MM_WispDetect() { * * *if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (Wisp_Detector)) * * *{ * * * * * *Npc_PerceiveAll (self); * * * * * *if (Wld_DetectNpc (self, Wisp_Detector, NOFUNC, -1)) * * * * * *{ * * * * * * * * *B_RemoveNpc (self); * * * * * *}; * * * * * *if ((Npc_GetDistToNpc (self, hero) < 2000) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * * * * * *{ * * * * * * * * *self.aivar[AIV_SummonTime] = 0; * * * * * * * * *B_WispDetectedItem (); * * * * * * * * *return LOOP_END; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * * *if (Npc_GetDistToNpc (self, hero) < 500) * * * * * * * * *{ * * * * * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * * * * * *} * * * * * * * * *else * * * * * * * * *{ * * * * * * * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * * * * * * * * * *Npc_ClearAIQueue (self); * * * * * * * * * * * *AI_GotoNpc (self, hero); * * * * * * * * *}; * * * * * * * * *return LOOP_END; * * * * * *}; * * *}; * * *return LOOP_CONTINUE; // or Rerurn 0 ? };
Спасибо.
|
|
|
24.03.2011, 00:41
|
#2419
|
|
Re: М: Скриптинг в Готике
2Wandar:
это понятие вообще применимо к ГГ?
|
Нет. Потому как, причина атаки - это ответная реакция других НПЦ на определенные действия ГГ, или события в игровом мире. К примеру если ГГ на глазах у охраны просто отметелит мирных прохожих, охранник атакуют ГГ с причиной атаки наказания ГГ. Если же ГГ убьет прохожего на глазах у других, у окружающих уже будет совсем другая причина атаки со смертельным исходом для ГГ.
|
|
|
24.03.2011, 04:22
|
#2420
|
|
Re: М: Скриптинг в Готике
2Мухомор: А вот, как оказалось, не совсем правы Вы, уважаемый. :) Ибо с точки зрения игры ГГ является таким же неписем, и, следовательно, обладает таким же набором параметров, что и другие. А это значит, что у него тоже есть массив переменных aivar, в котором в одном из элементов и записывается причина атаки. Только у ГГ этот элемент не меняется всю игру, а так и остаётся равным 0 (т.е. AR_NONE - я всё таки был прав :)). Значит, любая атака ГГ игрой считается атакой без причины.
|
|
|
26.03.2011, 22:25
|
#2421
|
|
Re: М: Скриптинг в Готике
2Wandar:
Значит, любая атака ГГ игрой считается атакой без причины.
|
Вы его можете изменить как и любой параметр аивара вот только, он не отрабатывается базовой логикой игры относительно ГГ, реакцию определяют взаимоотношения между гг и атакуемой целью, наблюдателями и гг, наблюдателями и атакуемой целью. Проще говоря, зачем оно вам нужно? :)
|
|
|
08.04.2011, 19:06
|
#2424
|
|
Re: М: Скриптинг в Готике
Не могу заставить НПС после диалога проводить Игрока на определённый Вейп.
Cпойлер(щелкните, чтобы прочесть):
* * *AI_Output(self,other,"DIA_GROX_GOHOME_6_01"); * * *//Бла-бла-бла * * *AI_StopProcessInfos(Self); * * *Npc_ExchangeRoutine(self,"Rtn_Start_0001"); * * *GROX_Guide = Wld_GetDay(); * \\ Здесь я просто написал var int Grox_Guide;
*Функция расписания дня имеется, и Вейпоинт тоже стоит, его название правильное, из заглавных букв. Может я что то не прописал?
|
|
|
10.04.2011, 22:24
|
#2426
|
|
Re: М: Скриптинг в Готике
(снимаю свой вопрос!)2JohaNBlack: Вероятно, на карте у тебя мало или нет Waypoint`ов, NPC просто не может найти рядом с ним путь, чтобы вернуться назад. ЗЫ: вроде этого
|
|
|
22.04.2011, 22:27
|
#2433
|
|
Re: М: Скриптинг в Готике
2SkaIneT: Скрипты находятся в специальном *.Mod или *.VDF файле. Декомпилируем файлы программой "GothicVDFS", а скрипты декомпилят с программой "GothicSourcerV3_14"
Cпойлер(щелкните, чтобы прочесть):
Не знаю, законно ли отсылать чужие скрипты... будь что будет (ВОТ) :P
|
|
|
30.04.2011, 21:58
|
#2434
|
|
Re: М: Скриптинг в Готике
Прошу помощи. Имеется расписание НПС StandAround.
Cпойлер(щелкните, чтобы прочесть):
func void ZS_StandAround() { Perception_Set_Normal(); B_ResetAll(self); AI_SetWalkMode(self,NPC_WALK); if(!Npc_IsOnFP(self,"CAMPFIRE")) { AI_GotoWP(self,self.wp); }; self.aivar[AIV_TAPOSITION] = NOTINPOS; };
func int ZS_StandAround_Loop() { var int randomAni; var int RandomAc; var int random; if(Npc_IsOnFP(self,"CAMPFIRE")) { AI_AlignToFP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; } else if(Wld_IsFPAvailable(self,"CAMPFIRE")) { AI_GotoFP(self,"CAMPFIRE"); AI_Standup(self); AI_AlignToFP(self); self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK; } else { AI_AlignToWP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; }; random = Hlp_Random(11); if(random == 0) { if(Npc_HasItems(self,ItFoApple) == 0) { CreateInvItem(self,ItFoApple); }; self.aivar[AIV_Food] = FOOD_Apple; } else if(random == 1) { if(Npc_HasItems(self,ItFoCheese) == 0) { CreateInvItem(self,ItFoCheese); }; self.aivar[AIV_Food] = FOOD_Cheese; } else if(random == 2) { if(Npc_HasItems(self,ItFoFish) == 0) { CreateInvItem(self,ItFoFish); }; self.aivar[AIV_Food] = FOOD_Bacon; } else if(random == 3) { if(Npc_HasItems(self,ItFoMutton) == 0) { CreateInvItem(self,ItFoMutton); }; self.aivar[AIV_Food] = FOOD_Bread; } else if(random == 4) { if(Npc_HasItems(self,ItFoBooze) == 0) { CreateInvItem(self,ItFoBooze); }; self.aivar[AIV_Food] = FOOD_Booze; } else if(random == 5) { if(Npc_HasItems(self,ItFo_Potion_Water_01) == 0) { CreateInvItem(self,ItFo_Potion_Water_01); }; self.aivar[AIV_Food] = FOOD_Wine; } else if(random == 6) { if(Npc_HasItems(self,ItFoRice) == 0) { CreateInvItem(self,ItFoRice); }; self.aivar[AIV_Food] = FOOD_Rice; } else if(random == 7) { if(Npc_HasItems(self,ItMiJoint_1) == 0) { CreateInvItem(self,ItMiJoint_1); }; self.aivar[AIV_Food] = FOOD_Joint; } else if(random == 8) { if(Npc_HasItems(self,ItFo_Fishsoup) == 0) { CreateInvItem(self,ItFo_Fishsoup); }; self.aivar[AIV_Food] = FOOD_Fishsoup; } else if(random == 9) { self.aivar[AIV_Food] = FOOD_ANI_1; } else if(random == 10) { self.aivar[AIV_Food] = FOOD_ANI_2; }; if(self.aivar[AIV_TAPOSITION] == NOTINPOS) { if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Bacon) { AI_UseItemToState(self,ItFoFish,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Bread) { AI_UseItemToState(self,ItFoLoaf,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_Wine) { AI_UseItemToState(self,ItFo_Potion_Water_01,0 ); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_Rice) { AI_UseItemToState(self,ItFoRice,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_Fishsoup) { AI_UseItemToState(self,ItFo_Fishsoup,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_ANI_1) { self.aivar[AIV_TAPOSITION] = ISINPOS; }; if(self.aivar[AIV_Food] == FOOD_ANI_2) { self.aivar[AIV_TAPOSITION] = ISINPOS; }; }; if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) { if(self.aivar[AIV_Food] == FOOD_Apple) { AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ITEMINTERA CT); AI_ContinueRoutine(self); } else if((self.aivar[AIV_Food] == FOOD_Bacon) || (self.aivar[AIV_Food] == FOOD_Bread)) { AI_PlayAniBS(self,"T_MEAT_RANDOM_1",BS_ITEMINTERA CT); AI_ContinueRoutine(self); } else if((self.aivar[AIV_Food] == FOOD_Booze) || (self.aivar[AIV_Food] == FOOD_Wine)) { randomAni = Hlp_Random(5); if(randomAni == 0) { AI_PlayAniBS(self,"T_POTION_RANDOM_3",BS_ITEMINTE RACT); AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT); AI_ContinueRoutine(self); } else if(randomAni == 1) { AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT); AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT); AI_ContinueRoutine(self); } else { AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT); AI_ContinueRoutine(self); }; } else if((self.aivar[AIV_Food] == FOOD_Rice) || (self.aivar[AIV_Food] == FOOD_Fishsoup)) { AI_PlayAni(self,"T_RICE_RANDOM_1"); AI_ContinueRoutine(self); } else if((self.aivar[AIV_Food] == FOOD_Joint) ) { AI_PlayAniBS(self,"T_JOINT_RANDOM_1",BS_ITEMINTER ACT); AI_ContinueRoutine(self); } else { AI_PlayAniBS(self,"T_FOODHUGE_RANDOM_1",BS_ITEMIN TERACT); AI_ContinueRoutine(self); }; if(self.aivar[AIV_Food] == FOOD_ANI_1) { B_Pee(self); }; if(self.aivar[AIV_Food] == FOOD_ANI_2) { B_Bored(self); }; Npc_SetStateTime(self,0); }; return LOOP_CONTINUE;
};
func void ZS_StandAround_End() { AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT); if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,-1); }; if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,-1); }; if(self.aivar[AIV_Food] == FOOD_Bacon) { AI_UseItemToState(self,ItFoFish,-1); }; if(self.aivar[AIV_Food] == FOOD_Bread) { AI_UseItemToState(self,ItFoMutton,-1); }; if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,-1); }; if(self.aivar[AIV_Food] == FOOD_Wine) { AI_UseItemToState(self,ItFo_Potion_Water_01,-1); }; if(self.aivar[AIV_Food] == FOOD_Rice) { AI_UseItemToState(self,ItFoRice,-1); }; if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,-1); }; };
Проблема в том, что НПС держит в руке к примеру яблоко, а проигрывается анимация куреия косяка. Или пьет из рыбы, кусает тарелку с ухой. Анимация каждый раз разная. Также, почему-то предметы не убираются из рук НПС, т.е. он всегда держит в руке вышеупоянутое яблоко, но то курит его, то ест двумя руками, то чешет им пах ;D. И третий баг, иногда НПС вообще держит в руках "пустое место", т.е. пригрывает анимацию без предмета в руках.
|
|
|
30.04.2011, 23:51
|
#2436
|
|
Re: М: Скриптинг в Готике
2JohaNBlack:Магматик прав - на фиг такие сложности? В оригинальном скрипте Story\ZS\ZS_StandAround.d все анимации происходят в функции ZS_StandAround_Loop():
Cпойлер(щелкните, чтобы прочесть):
func void ZS_StandAround() { PrintDebugNpc(PD_TA_FRAME,"ZS_StandAround"); B_SetPerception(self); if(Npc_WasInState(self,ZS_Smalltalk)) { Npc_PercEnable(self,PERC_NPCCOMMAND,B_SmallTa lk); }; AI_SetWalkMode(self,NPC_WALK); B_ClearItem(self); if(!Npc_IsOnFP(self,"CAMPFIRE")) { PrintDebugNpc(PD_TA_CHECK,"...nicht auf FP!"); AI_GotoWP(self,self.wp); }; };
func int ZS_StandAround_Loop() { var int choice; PrintDebugNpc(PD_TA_LOOP,"ZS_StandAround_Loop "); if(Npc_WasInState(self,ZS_Smalltalk)) { B_GotoFP(self,"SMALLTALK"); AI_AlignToFP(self); } else if(Wld_IsFPAvailable(self,"CAMPFIRE")) { B_GotoFP(self,"CAMPFIRE"); AI_AlignToFP(self); } else { Npc_PerceiveAll(self); if(Wld_DetectNpcEx(self,-1,NOFUNC,-1,0)) { AI_TurnToNPC(self,other); }; }; if(Npc_WasInState(self,ZS_Smalltalk)) { Npc_SendPassivePerc(self,PERC_NPCCOMMAND,self,sel f); }; choice = Hlp_Random(100); PrintDebugInt(PD_TA_DETAIL,"...Zufallsani-Wurf: ",choice); if(self.aivar[AIV_ITEMSTATUS] == TA_IT_NONE) { if(C_NpcBelongsToOldCamp(self)) { if(choice < 10) { B_ChooseApple(self); } else if(choice < 20) { B_ChooseLoaf(self); } else if(choice < 30) { B_ChooseCheese(self); } else if(choice < 40) { B_ChooseBeer(self); } else if(choice < 60) { B_ChooseMeat(self); } else if(choice < 80) { B_Pee(self); } else if(choice < 100) { B_Bored(self); }; } else if(C_NpcBelongsToNewCamp(self)) { if(choice < 10) { B_ChooseRice(self); } else if(choice < 30) { B_ChooseWine(self); } else if(choice < 50) { B_ChooseBooze(self); } else if(choice < 60) { B_ChooseJoint(self); } else if(choice < 80) { B_Pee(self); } else if(choice < 100) { B_Bored(self); }; } else if(C_NpcBelongsToPsiCamp(self)) { if(choice < 20) { B_ChooseSoup(self); } else if(choice < 80) { B_ChooseJoint(self); } else if(choice < 90) { B_Pee(self); } else if(choice < 100) { B_Bored(self); }; }; } else if(choice < 20) { B_ClearItem(self); }; B_PlayItemRandoms(self); AI_Wait(self,1); return LOOP_CONTINUE; };
func void ZS_StandAround_End() { PrintDebugNpc(PD_TA_FRAME,"ZS_StandAround_End "); C_StopLookAt(self); B_ClearItem(self); };
func void B_SmallTalk() { PrintDebugNpc(PD_TA_FRAME,"B_SmallTalk"); if(Npc_IsInState(other,ZS_StandAround) && Npc_IsOnFP(other,"SMALLTALK") && (Npc_GetDistToNpc(self,other) < HAI_DIST_SMALLTALK)) { PrintDebugNpc(PD_TA_CHECK,"...'other' geeigneter SmallTalk-Partner!"); Npc_PercDisable(other,PERC_ASSESSPLAYER); Npc_PercDisable(other,PERC_OBSERVEINTRUDER); B_FullStop(other); Npc_SetTarget(other,self); Npc_GetTarget(self); AI_StartState(other,ZS_Smalltalk,1,""); Npc_PercDisable(self,PERC_ASSESSPLAYER); Npc_PercDisable(self,PERC_OBSERVEINTRUDER); B_FullStop(self); Npc_SetTarget(self,other); Npc_GetTarget(self); AI_StartState(self,ZS_Smalltalk,1,""); }; };
|
|
|
30.04.2011, 23:53
|
#2437
|
|
Re: М: Скриптинг в Готике
2Лавовый: Так ведь там рэндом анимации только для определенных прдеметов, в частности для питья - разные анимации - "попьет, постотрит на бутылку", просто "попьет", "попьет, поболтает бутылку". Т.е. анимация в сущности одна. А насчет яблока:
До этого AIV_Food присваивается рандомом допустим food_apple, а затем просто проигрывается анимация if(self.aivar[AIV_Food] == FOOD_Apple) { AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ITEMINTERAC T); AI_ContinueRoutine(self); } T_FОOD_RANDOM_1 - чел держит яблоко в одной руке, потом откусывает от него.
Добавление от 04/30/11, в 22:57:28 2Dimus: Я забыл указать, что скрипт для второй части, а ты написал пример из первой. Во второй скрипт из первой не работает без изменения. Меня не устраивает стандартное расписание TA_Stand_Eating из второй Готы, так как там люди могут целый день есть одно яблоко, поэтому я решил дополнить расписание второй части тем, что люди меняют предметы как в первой.
|
|
|
01.05.2011, 00:12
|
#2438
|
|
Re: М: Скриптинг в Готике
2JohaNBlack:Проверьте правильность написания кодов предметов, т.к. они могут быть разными в G1 и G2, например:
Cпойлер(щелкните, чтобы прочесть):
ItFoApple - ItFo_Apple ItFoBooze - ItFo_Booze ItFoCheese - ItFo_Cheese ItFoFish - ItFo_Fish ItFoLoaf - ItFo_Bread ItFoRice - нет в G2 ItFo_Potion_Water_01 - ItFo_Water ItMiJoint_1 - ItMi_Joint
|
|
|
01.05.2011, 16:29
|
#2439
|
|
Re: М: Скриптинг в Готике
2Dimus: Это я уже проверил, и некоторые имена изменил, тем более что я компилю через Соурсер, а он бы не допустил неверных имен. Добавление от 05/01/11, в 14:28:40
Немного уменьшил скрипт:
Cпойлер(щелкните, чтобы прочесть):
func void ZS_StandAround() { Perception_Set_Normal(); B_ResetAll(self); AI_SetWalkMode(self,NPC_WALK); if(!Npc_IsOnFP(self,"CAMPFIRE")) { AI_GotoWP(self,self.wp); }; self.aivar[AIV_TAPOSITION] = NOTINPOS; };
func int ZS_StandAround_Loop() { var int randomAni; var int RandomAc; var int random; if(Npc_IsOnFP(self,"CAMPFIRE")) { AI_AlignToFP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; } else if(Wld_IsFPAvailable(self,"CAMPFIRE")) { AI_GotoFP(self,"CAMPFIRE"); AI_Standup(self); AI_AlignToFP(self); self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK; } else { AI_AlignToWP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; }; random = Hlp_Random(4); if(random == 0) { if(Npc_HasItems(self,ItFoApple) == 0) { CreateInvItem(self,ItFoApple); }; self.aivar[AIV_Food] = FOOD_Apple; } else if(random == 1) { if(Npc_HasItems(self,ItFoCheese) == 0) { CreateInvItem(self,ItFoCheese); }; self.aivar[AIV_Food] = FOOD_Cheese; } else if(random == 2) { if(Npc_HasItems(self,ItFoBooze) == 0) { CreateInvItem(self,ItFoBooze); }; self.aivar[AIV_Food] = FOOD_Booze; } else if(random ==3) { if(Npc_HasItems(self,ItMiJoint_1) == 0) { CreateInvItem(self,ItMiJoint_1); }; self.aivar[AIV_Food] = FOOD_Joint; } if(self.aivar[AIV_TAPOSITION] == NOTINPOS) { if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,0); self.aivar[AIV_TAPOSITION] = ISINPOS; } else if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,0); self.aivar[AIV_TAPOSITION] = ISINPOS; }; }; if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) { if(self.aivar[AIV_Food] == FOOD_Apple) { AI_PlayAni(self,"T_FOOD_RANDOM_1"); //AI_ContinueRoutine(self); } else if(self.aivar[AIV_Food] == FOOD_CHEESE) { AI_PlayAni(self,"T_FOODHUGE_RANDOM_1"); //AI_ContinueRoutine(self); } else if(self.aivar[AIV_Food] == FOOD_Booze) { AI_PlayAni(self,"T_POTION_RANDOM_3"); AI_PlayAni(self,"T_POTION_RANDOM_1"); } else if(self.aivar[AIV_Food] == FOOD_Joint) { AI_PlayAni(self,"T_JOINT_RANDOM_1"); //AI_ContinueRoutine(self); }; Npc_SetStateTime(self,0); }; return LOOP_CONTINUE;
};
func void ZS_StandAround_End() { AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT); if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,-1); }; if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,-1); }; if(self.aivar[AIV_Food] == FOOD_Bacon) { AI_UseItemToState(self,ItFoFish,-1); }; if(self.aivar[AIV_Food] == FOOD_Bread) { AI_UseItemToState(self,ItFoMutton,-1); }; if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,-1); }; if(self.aivar[AIV_Food] == FOOD_Wine) { AI_UseItemToState(self,ItFo_Potion_Water_01,-1); }; if(self.aivar[AIV_Food] == FOOD_Rice) { AI_UseItemToState(self,ItFoRice,-1); }; if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,-1); }; };
Теперь НПС почему-то всегда держат в руке косяк FOOD_Joint, и то кусают его, то курят, то пьют из косяка. Добавление от 05/01/11, в 15:44:33
У меня получилось! Вот скрипт:
Cпойлер(щелкните, чтобы прочесть):
func void ZS_StandAround() { Perception_Set_Normal(); B_ResetAll(self); AI_SetWalkMode(self,NPC_WALK); if(!Npc_IsOnFP(self,"CAMPFIRE")) { AI_GotoWP(self,self.wp); }; self.aivar[AIV_TAPOSITION] = NOTINPOS; };
func int ZS_StandAround_Loop() { var int randomAni; var int RandomAc; var int random; if(Npc_IsOnFP(self,"CAMPFIRE")) { AI_AlignToFP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; } else if(Wld_IsFPAvailable(self,"CAMPFIRE")) { AI_GotoFP(self,"CAMPFIRE"); AI_Standup(self); AI_AlignToFP(self); self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK; } else { AI_AlignToWP(self); if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) { self.aivar[AIV_TAPOSITION] = NOTINPOS; }; }; random = Hlp_Random(4); randomAni = Hlp_Random(2); if(random == 0) { if(Npc_HasItems(self,ItFoApple) == 0) { CreateInvItem(self,ItFoApple); }; self.aivar[AIV_Food] = FOOD_Apple; } else if(random == 1) { if(Npc_HasItems(self,ItFoCheese) == 0) { CreateInvItem(self,ItFoCheese); }; self.aivar[AIV_Food] = FOOD_Cheese; } else if(random == 2) { if(Npc_HasItems(self,ItFoBooze) == 0) { CreateInvItem(self,ItFoBooze); }; self.aivar[AIV_Food] = FOOD_Booze; } else if(random == 3) { if(Npc_HasItems(self,ItMiJoint_1) == 0) { CreateInvItem(self,ItMiJoint_1); }; self.aivar[AIV_Food] = FOOD_Joint; }; if(self.aivar[AIV_TAPOSITION] == NOTINPOS) { if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,0); self.aivar[AIV_TAPOSITION] = ISINPOS; AI_PlayAni(self,"T_FOOD_RANDOM_1"); AI_wait(self,0.5); return LOOP_END; //AI_ContinueRoutine(self); } else if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,0); self.aivar[AIV_TAPOSITION] = ISINPOS; AI_PlayAni(self,"T_FOODHUGE_RANDOM_1"); AI_wait(self,0.5); return LOOP_END; //AI_ContinueRoutine(self); } else if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,0); self.aivar[AIV_TAPOSITION] = ISINPOS; if(randomAni == 0) { AI_PlayAni(self,"T_POTION_RANDOM_3"); AI_PlayAni(self,"T_POTION_RANDOM_1"); } else if(randomAni == 1) { AI_PlayAni(self,"T_POTION_RANDOM_3"); AI_PlayAni(self,"T_POTION_RANDOM_2"); } else if(randomAni == 2) { AI_PlayAni(self,"T_POTION_RANDOM_3"); }; AI_wait(self,0.5); return LOOP_END; //AI_ContinueRoutine(self); } else if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,0); self.aivar[AIV_TAPOSITION] = ISINPOS; AI_PlayAni(self,"T_JOINT_RANDOM_1"); AI_wait(self,0.5); return LOOP_END; }; }; //if((Npc_GetStateTime(self) > 1) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) //{ // if(self.aivar[AIV_Food] == FOOD_Apple) //{ //} //else if(self.aivar[AIV_Food] == FOOD_CHEESE) //{ //} //else if(self.aivar[AIV_Food] == FOOD_Booze) //{ //} //else if(self.aivar[AIV_Food] == FOOD_Joint) //{ //}; //Npc_SetStateTime(self,0); //}; AI_wait(self,1.5); return LOOP_CONTINUE;
};
func void ZS_StandAround_End() { //AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTER ACT); if(self.aivar[AIV_Food] == FOOD_Apple) { AI_UseItemToState(self,ItFoApple,-1); }; if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFoCheese,-1); }; if(self.aivar[AIV_Food] == FOOD_Bacon) { AI_UseItemToState(self,ItFoFish,-1); }; if(self.aivar[AIV_Food] == FOOD_Bread) { AI_UseItemToState(self,ItFoMutton,-1); }; if(self.aivar[AIV_Food] == FOOD_Booze) { AI_UseItemToState(self,ItFoBooze,-1); }; if(self.aivar[AIV_Food] == FOOD_Wine) { AI_UseItemToState(self,ItFo_Potion_Water_01,-1); }; if(self.aivar[AIV_Food] == FOOD_Rice) { AI_UseItemToState(self,ItFoRice,-1); }; if(self.aivar[AIV_Food] == FOOD_Joint) { AI_UseItemToState(self,ItMiJoint_1,-1); }; };
Добавление от 05/01/11, в 15:49:07
И опять новый вопрос :( Я использую скриптовую болванку от WSA с комментариями. И почему-то НПС не реагируют на убийство :'(. Хотя реагируют на оружие, магию и мобов. Отношения гильдий настроены правильно, если ударить НПС, все ближайшие люди из его гильдии кинутся его защищать, а вот убийство даже согильдийца оставляют без внимания.
|
|
|
26.05.2011, 16:07
|
#2440
|
|
Re: М: Скриптинг в Готике
У меня такой вопрос к модостроителям? (извиняюсь если не туда его пишу) Хотел сделать для себя минимод изменяющий баланс Г2 НВ, а именно по части корректировки соотношения параметр/очки умений. (файл b_getlearncostattribute) Компиляция после внесения изменений прошла успешно, однако зайдя в игру заного и попытавшись в Хоринисе поднять силу я обнаружил, что соотношение стало 1 к 1 в независимости от уровня параметра. Подскажите плз, что я сделал неправильно, или что мне еще нужно изменить чтобы все работало нормально? Код с изменениями под спойлером
Cпойлер(щелкните, чтобы прочесть):
func int B_GetLearnCostAttribute(var C_Npc oth,var int attribut) { * * *var int kosten; * * *kosten = 0; * * *if(attribut == ATR_STRENGTH) * * *{ * * * * * *if(oth.aivar[REAL_STRENGTH] >= 200) * * * * * *{ * * * * * * * * *kosten = 5; * * * * * *} * * * * * *else if(oth.aivar[REAL_STRENGTH] >= 150) * * * * * *{ * * * * * * * * *kosten = 4; * * * * * *} * * * * * *else if(oth.aivar[REAL_STRENGTH] >= 100) * * * * * *{ * * * * * * * * *kosten = 3; * * * * * *} * * * * * *else if(oth.aivar[REAL_STRENGTH] >= 50) * * * * * *{ * * * * * * * * *kosten = 2; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * * *kosten = 1; * * * * * *}; * * *}; * * *if(attribut == ATR_DEXTERITY) * * *{ * * * * * *if(oth.aivar[REAL_DEXTERITY] >= 200) * * * * * *{ * * * * * * * * *kosten = 5; * * * * * *} * * * * * *else if(oth.aivar[REAL_DEXTERITY] >= 150) * * * * * *{ * * * * * * * * *kosten = 4; * * * * * *} * * * * * *else if(oth.aivar[REAL_DEXTERITY] >= 100) * * * * * *{ * * * * * * * * *kosten = 3; * * * * * *} * * * * * *else if(oth.aivar[REAL_DEXTERITY] >= 50) * * * * * *{ * * * * * * * * *kosten = 2; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * * *kosten = 1; * * * * * *}; * * *}; * * *if(attribut == ATR_MANA_MAX) * * *{ * * * * * *if(oth.aivar[REAL_MANA_MAX] >= 200) * * * * * *{ * * * * * * * * *kosten = 5; * * * * * *} * * * * * *else if(oth.aivar[REAL_MANA_MAX] >= 150) * * * * * *{ * * * * * * * * *kosten = 4; * * * * * *} * * * * * *else if(oth.aivar[REAL_MANA_MAX] >= 100) * * * * * *{ * * * * * * * * *kosten = 3; * * * * * *} * * * * * *else if(oth.aivar[REAL_MANA_MAX] >= 50) * * * * * *{ * * * * * * * * *kosten = 2; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * * *kosten = 1; * * * * * *}; * * *}; * * *return kosten; }; Жирным цветом обозначены *изменения
P.S. Использовались декомпилированные скрипты Акеллы
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 03:55. Часовой пояс GMT +4.
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|