Re: Скриптинг в Готике
2Pa:<br>
Цитата:
|
Re: Скриптинг в Готике
2Pa:
Цитата:
|
Re: Скриптинг в Готике
B Wolf:<br>
Цитата:
|
Re: Скриптинг в Готике
Кто-нибудь может что-то подсказать по погодным явлениям? Как отследить наступление дождя, например? Похоже, что эффект вшит в движок, но есть безумная мысль попытаться отловить его через регистрацию проигрывания звука дождя.
|
Re: Скриптинг в Готике
Ура, товарищи! ;D<br>Два дня "битья" над регенерацией не прошли даром!<br>Пробовал создать амулет регенерации разными способами, но в конце концов получилось только при использовании исходников мода Mana Reload.<br><br>Короче, описываю алгоритм действий для создания амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.<br><br><br>В папке AI\Human\TA_Human создаем файл ZS_Recharger.d<br><br>Вот его содержимое(взято из Mana Reload и немного подправлено):<br><br><br>func void ZS_Recharger()<br>{<br> B_ResetAll (self);<br> B_ClearPerceptions (self);<br>};<br><br>func int ZS_Recharger_loop()<br>{<br> if (Npc_GetStateTime(self) > 3)<br> {<br> Npc_SetStateTime (self, 0);<br><br> if (hero.attribute[ATR_MANA] < hero.attribute[ATR_MANA_MAX])<br> {<br> hero.attribute[ATR_MANA]=hero.attribute[ATR_MANA]+1;<br> };<br><br> AI_Teleport (self, Npc_GetNearestWP (hero));<br> <br> };<br><br> return LOOP_CONTINUE;<br>};<br><br>func void ZS_Recharger_end()<br>{<br> AI_PlayAni (self,"T_LGUARD_2_STAND"); <br>};<br><br><br><br>Далее в файле TA.d дописываем следующую строчку:<br><br><br>func void TA_Recharger (var int start_h, var int start_m, var int stop_h, var int stop_m, VAR string waypoint) {TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_Recharger, waypoint);};<br><br><br>Теперь создаем НПС, который будет отвечать за нашу регенерацию.<br><br>В папку Story\NPC вставляем файл None_999_Recharger.d, следующего содержания:<br><br><br>instance None_999_Recharger (Npc_Default) <br>{<br> name = "";<br> guild = GIL_NONE;<br> npctype = NPCTYPE_AMBIENT;<br> flags = NPC_FLAG_IMMORTAL|NPC_FLAG_GHOST;<br> level = 999;<br> voice = 0;<br> id = 999;<br> noFocus = 1;<br> bodyStateInterruptableOverride = 1;<br><br> damagetype = DAM_EDGE;<br> damage [DAM_INDEX_EDGE] = 0;<br><br><br> //-------- visuals --------<br> B_SetNpcVisual (self, MALE, "Hum_Head_Fatbald", 0, 0, ITAR_MIL_M); <br> Mdl_SetModelScale (self, 0.01, 0.01, 0.01);<br><br><br> //-------- talents --------<br> B_SetFightSkills (self, 0); <br><br><br> //------------- ai -------------<br> fight_tactic = FAI_HUMAN_COWARD;<br><br><br> daily_routine = Rtn_start_999;<br>};<br><br><br>func void Rtn_Regeneration_999 ()<br>{<br> TA_Recharger (0,00,13,00, Npc_GetNearestWP (hero));<br> TA_Recharger (13,00,0,00, Npc_GetNearestWP (hero));<br>};<br><br>func void Rtn_start_999 ()<br>{<br> TA_Stand_WP (0,00,13,00, Npc_GetNearestWP (hero));<br> TA_Stand_WP (13,00,0,00, Npc_GetNearestWP (hero));<br>};<br><br><br><br>Обратите внимание, что НПС почти невидим!<br><br>Прописываем нового НПС в стартапе:<br><br><br>Wld_InsertNpc (None_999_Recharger,Npc_GetNearestWP (hero)); <br><br><br><br><br>Ну и в конце-концов вставляем в файле It_Amulette.d следующее:<br><br><br> INSTANCE ItAm_Mana_Regener(C_Item)<br>{<br> name = NAME_Amulett;<br><br> mainflag = ITEM_KAT_MAGIC;<br> flags = ITEM_AMULET;<br><br> value = Value_Mana_Regener;<br><br> visual = "ItAm_Strg_01.3ds";<br><br> visual_skin = 0;<br> material = MAT_METAL;<br> on_equip = Equip_ItAm_Mana_Regener;<br> on_unequip = UnEquip_ItAm_Mana_Regener;<br><br> wear = WEAR_EFFECT;<br> effect = "SPELLFX_ITEMGLIMMER"; <br><br> description = "Амулет регенерации маны";<br> <br> <br> TEXT[5] = NAME_Value;<br> COUNT[5] = value;<br><br> INV_ZBIAS = INVCAM_ENTF_AMULETTE_STANDARD;<br> <br>};<br><br>FUNC VOID Equip_ItAm_Mana_Regener()<br>{<br> Npc_ExchangeRoutine (None_999_Recharger,"Regeneration" );<br>};<br><br>FUNC VOID UnEquip_ItAm_Mana_Regener()<br>{<br> Npc_ExchangeRoutine (None_999_Recharger,"Start");<br>} ;<br><br><br><br><br>Вот, собственно говоря и все. Амулет работает. Единственное, если пользоваться F8 для перелетов на большие расстояния, амулет перестает работать. Чтобы он снова заработал, его надо снять и снова одеть. Этот баг появляется из-за того, что наш речаджер не успевает за нами, т.к. не умеет пользоваться "марвином"! :D<br>Но, в принципе, тем кто пользуется F8 регенерация маны ни к чему! :lol:<br><br>2Dagot_Ur: Если будешь читать этот топик, расскажи, плз, свой способ создания предмета с регенерирующими способностями.
|
Re: Скриптинг в Готике
2Vam:
Цитата:
Цитата:
Цитата:
|
Re: Скриптинг в Готике
2B Wolf: Нема за цо! ;D<br><br>закралась ошибка...<br>
Цитата:
|
Re: Скриптинг в Готике
2finch:
Цитата:
|
Re: Скриптинг в Готике
2B Wolf:
Цитата:
Цитата:
|
Re: Скриптинг в Готике
2finch: <br>
Цитата:
|
Re: Скриптинг в Готике
2TycoooN:
Цитата:
Цитата:
|
Re: Скриптинг в Готике
Пару слов об амулете восстановления...<br><br>Попробовал я таки ввести ентот амулет в модификацию Бумшака.<br>Заметил несколько особенностей:<br><br>Хорошие:<br>1) Амулет работает :)<br><br>Нехорошие:<br>1) Иногда орки, звери и пр. существа начинают нападать на невидимку-реченджера (нужно гильдии смотреть).<br>2) Иногда невидимка-реченджер получает от меня оружием во время боя, т.к. все время путается под ногами.<br><br>А вообщем неплохо :)
|
Re: Скриптинг в Готике
2B Wolf:<br>А разве нельзя сделать регенерацию аналогично драконьей, только сначала проверять на наличие амулета, и никаких невидимок не надо?<br>
|
Re: Скриптинг в Готике
При создании миссий,надо ли что-нибудь писать в файл Story globals?<br>И вообше что содердится в этом файле?
|
Re: Скриптинг в Готике
2francisc:<br>
Цитата:
|
Re: Скриптинг в Готике
Как сделать так, чтобы после разговора с НПС у другого НПС добавлялась новая тема типа "Кто-то говорил..." ??? :-/
|
Re: Скриптинг в Готике
2Vam: <br>
Цитата:
Цитата:
|
Re: Скриптинг в Готике
2TycoooN:<br>
Цитата:
|
Re: Скриптинг в Готике
Вопрос: какая функция создает в инвентаре НПС предмет?
|
Re: Скриптинг в Готике
2Mitrich: <br>
Цитата:
|
Re: Скриптинг в Готике
Цитата:
|
Re: Скриптинг в Готике
2francisc: <br>
Цитата:
|
Re: Скриптинг в Готике
Хмм... Тогда попробуем зайти с другого конца. Это код ТА "пилить"<br>// ****************************<br>// NSC benutzt Sдge Mobsi <br>// ****************************<br><br>FUNC VOID ZS_Saw ()<br>{<br> Perception_Set_Normal();<br> <br> B_ResetAll (self);<br><br> AI_SetWalkmode (self, NPC_WALK); <br> <br> if (Hlp_StrCmp (Npc_GetNearestWP(self), self.wp) == FALSE)<br> {<br> AI_GotoWP (self, self.wp);<br> };<br>};<br><br>FUNC int ZS_Saw_Loop ()<br>{<br> // ------ Saegen ------<br> if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT))<br> && (Wld_IsMobAvailable(self,"BAUMSAEGE"))<b r> {<br> AI_UseMob (self, "BAUMSAEGE", 1);<br> };<br><br> // ------ Random-Ani beim Hдmmern ------<br> if (Npc_GetStateTime(self) > 15)<br> && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT))<br> {<br> Npc_SetStateTime (self, 0);<br> };<br><br> return LOOP_CONTINUE;<br>};<br><br>FUNC VOID ZS_Saw_End ()<br>{<br> AI_UseMob (self, "BAUMSAEGE", -1);<br>};<br><br>Что выполняет данный блок?<br>// ------ Random-Ani beim Hдmmern ------<br> if (Npc_GetStateTime(self) > 15)<br> && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT))<br> {<br> Npc_SetStateTime (self, 0);<br> };<br><br>Особенно интересует /C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT/ в условии. Что это?
|
Re: Скриптинг в Готике
2TycoooN: <br>Это в скрипте нпс надо писать,как я понял.Или в тексте миссии нужно?<br>Вот следуюшй вопрос,как сделать так что бы нпс бежал на какое-то место с оружеем и нападал на кого-нибудь?(бандитов например)
|
Re: Скриптинг в Готике
2francisc:
Цитата:
Цитата:
Цитата:
Цитата:
|
Re: Скриптинг в Готике
По-моему я неудачно зашел с другого конца. Предлагаю рассмотреть ТА ZS_Saw с моими комментариями в качестве примера. Передо мной стоит задача добавлять НПС при пилении каждые 15 секунд некий контрольный предмет. Но некоторые вещи мне непонятны. Кто сможет что-то разьяснить или поправить, буду очень благодарен.<br>Зеленым понятные вещи, красным неясности.<br><br>// ****************************<br>// NSC benutzt Sдge Mobsi <br>// ****************************<br><br>FUNC VOID ZS_Saw () //Объявление функции<br>{<br> * * *Perception_Set_Normal(); //Установка восприятия на нормальный уровень * * *<br> * * *B_ResetAll (self); //Сбрасывание какого-то паретра(ов)???<br> * * *AI_SetWalkmode ** * *(self, NPC_WALK); * * //Перевод НПС в режим ходьбы шагом * * * * * *<br> * * *if (Hlp_StrCmp (Npc_GetNearestWP(self), self.wp) == FALSE)<br> * *{<br> * * * * * *AI_GotoWP * * *(self, self.wp); // npc n0 перемещается в указанную WP s0.<br><br> * * *};<br>};<br><br>FUNC int ZS_Saw_Loop () * *//Начало функции использования МОВ{ * * *<br><br>// ------ Saegen ------<br> * * *if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) //поверка на использование МОВ другим "телом"??? <br>* * *<br>&& (Wld_IsMobAvailable(self,"BAUMSAEGE")) //подозреваю, что это условие непосредственной близости НПС с МОВ с именем "BAUMSAEGE" *<br> * *{<br> * * * * * *AI_UseMob (self, "BAUMSAEGE", 1); ** * *//см сноску*<br> * * *};<br><br> * * *// ------ Random-Ani beim Hдmmern ------<br> * * *if (Npc_GetStateTime(self) > 15) //если НПС находится в таком состоянии более 15 секунд * * *&& (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) //и ??? непонятное условие<br> * *{<br> * * * <br> * * *CreatInvItems (self, ItPo_Mana_01, 1); // ----Суть задачи всего примера: Добавление контрольного предмета каждые 15 сек---<br><br> * * *Npc_SetStateTime (self, 0); ** * * //обнулить время нахождения НПС в данном состоянии. Если убрать это действие НПС <br>}; * * * * * * * * * * * * * * *//будет дергаться возле бревна, но пилить так и не начнет. <br><br> * * *return LOOP_CONTINUE; //возврат к началу функции<br>};<br><br>FUNC VOID ZS_Saw_End () //функция завершения действия для НПС self над МОВ "BAUMSAEGE" <br>{<br> * * *AI_UseMob (self, "BAUMSAEGE", -1); //прекратить использовать МОВ (установка флага функции AI_UseMob в -1<br><br>}; <br><br><br>//* *int AI_UseMob(c_npc self,string schemeName,int targetState); - npc self использует MOB с именем schemeName до указанного состояния targetState.<br>Если указанное состояние у MOBа уже имеется, npc self приближается к нему, но ничего не делает.<br>На мой взгляд, здесь требуется уточнение - 1 это флаг начала использования МОВ, а -1 окончание использования, а не проверка состояния МОВ.
|
Re: Скриптинг в Готике
2Mitrich:
Цитата:
|
Re: Скриптинг в Готике
2Mitrich: <br>хммм... вот смотри что получается - получаетя сначала идет проверка "если НЕ завершена фаза анимации (в твоем варианте) и достигнута непосредственная близость":<br>
Цитата:
Цитата:
|
Re: Скриптинг в Готике
2Mitrich:
Цитата:
|
Re: Скриптинг в Готике
2Mitrich:<br>
Цитата:
|
Re: Скриптинг в Готике
Можно ли сделать так, что при убийстве каждого стажника начислялось 1 очко(как при поступлении в лагеря в Г1), а при наборе определенного кол-ва что-нибудь происходило?
|
Re: Скриптинг в Готике
2Pa: <br>Это пока демо-мод,там всего прару НПС.Переводить,ну можно,если у кого жедание будет.<br>2aleks999:<br>Можно миссию написать с условием ,что бы она срабатывала при определенном уровне. А что вообше теребуется?
|
Re: Скриптинг в Готике
2francisc: <br><br>Ну нужно мочить стражников, за убийство каждого дают +1 очко.<br>Когда набирается определенное кол-во этих очков, срабатывает скрипт... наподобие такого...<br><br>func void Info_Diego_JoinAnalyze_Info()<br>{<br> AI_Output(hero,self,"Info_Diego_JoinAna lyze_15_00"); //<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_11_01"); //<br> AI_Output(hero,self,"Info_Diego_JoinAna lyze_15_02"); //<br> Points_OC = 0;<br> if(Scatty_ChargeKirgo == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_01"); //<br> Points_OC = Points_OC + 2;<br> }<br> else if(Scatty_ChargeKirgo == LOG_FAILED)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_02"); //<br> Points_OC = Points_OC - 1;<br> }<br> else if(Scatty_ChargeKirgo == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_03"); //<br> };<br> if(Scatty_ChargeKharim == LOG_FAILED)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_04"); //<br> Points_OC = Points_OC + 2;<br> }<br> else if(Scatty_ChargeKharim == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_05"); //<br> Points_OC = Points_OC + 5;<br> }<br> else if(Scatty_ChargeKharim == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Scatty_11_06"); //<br> };<br> if(Whistler_BuyMySword == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Whistler_11_01"); //<br> Points_OC = Points_OC + 3;<br> }<br> else if((Whistler_BuyMySword == LOG_FAILED) || ((Whistler_BuyMySword == LOG_RUNNING) && (Whistler_BuyMySword_Day <= (Wld_GetDay() - 2))))<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Whistler_11_02"); //<br> Points_OC = Points_OC + 2;<br> }<br> else if(Whistler_BuyMySword == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Whistler_11_03"); //<br> };<br> if(Sly_LostNek == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Sly_11_01"); //<br> Points_OC = Points_OC + 4;<br> }<br> else if(Sly_LostNek == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Sly_11_02"); //<br> };<br> if(Fingers_Learnt == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Fingers_11_01"); //<br> }<br> else if(Fingers_Learnt == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Fingers_11_02"); //<br> Points_OC = Points_OC + 3;<br> };<br> if(Dexter_GetKalomsRecipe == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Dexter_11_01"); //<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Dexter_11_02"); //<br> }<br> else if(Dexter_GetKalomsRecipe == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Dexter_11_03"); //<br> Points_OC = Points_OC + 5;<br> };<br> if(Thorus_MordragKo == LOG_RUNNING)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Thorus_11_01"); //<br> }<br> else if(Thorus_MordragKo == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Thorus_11_02"); //<br> Points_OC = Points_OC + 5;<br> }<br> else<br> {<br> if(Thorus_MordragKo == LOG_FAILED)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Thorus_11_03"); //<br> Points_OC = Points_OC - 5;<br> };<br> if(Fisk_GetNewHehler == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Fisk_11_01"); //<br> Points_OC = Points_OC + 5;<br> }<br> else if((MordragKO_HauAb == TRUE) || (MordragKO_StayAtNC == TRUE))<br> {<br> AI_Output(self,hero,"Info_Diego_JoinAna lyze_Fisk_11_02"); //<br> };<br> };<br> if(Points_OC > 15)<br> {<br> AI_Output(self,hero,"Info_Diego_Points_ 11_00"); //<br> if(hero.level >= 5)<br> {<br> if(Diego_BringList == LOG_SUCCESS)<br> {<br> AI_Output(self,hero,"Info_Diego_Points_ 11_01"); //<br> Diego_GomezAudience = TRUE;<br> Log_SetTopicStatus(CH1_JoinOC,LOG_SUCCESS);< br> B_LogEntry(CH1_JoinOC,"Диего сказал, что я могу встретиться с Гомезом. Теперь я смогу стать одним из людей Гомеза и войти в замок. Нужно лишь поговорить с Торусом.");<br> }<br> else<br> {<br> AI_Output(self,hero,"Info_Diego_Points_ 11_02"); //<br> };<br> }<br> else<br> {<br> B_PrintGuildCondition(5);<br> };<br> }<br> else if(Points_OC > 10)<br> {<br> AI_Output(self,hero,"Info_Diego_Points_ 11_10"); //<br> }<br> else if(Points_OC >= 0)<br> {<br> AI_Output(self,hero,"Info_Diego_Points_ 11_20"); //<br> };<br>};<br><br><br>Только надо с убийством стражников сделать. Я пробовал, че то не получается...
|
Re: Скриптинг в Готике
2Pa: <br>
Цитата:
|
Re: Скриптинг в Готике
2aleks999: <br>
Цитата:
|
Re: Скриптинг в Готике
2TycoooN: <br>В Г1 файл ZS_Dead.d находится здесь: AI\ZS_Human *:) Еле нашел :)<br><br>if (self.guild == GIL_GRD) && (Npc_IsPlayer(other))<br>{<br> grd_counter += 1; - я делаю мод для Г1, а там счетчик начисляется по-другому: grd_counter = grd_counter + 1;<br>};
|
Re: Скриптинг в Готике
Идея для игры.<br>Вот то, что пока готово:<br><br>- Графические изменения<br> *- Интерфейс игры<br> *- Текстуры животных<br> * *- Мракорис<br> * *- Огненный ящер<br> * *- Ледяной голем<br> * *- Шныг<br> * *- Мясной жук<br> * *- Кротокрыс<br> * *- Орк-воин<br> * *- Падальщик<br> * *- Ящер<br> * *- ...<br> *- Текстуры людей<br> *- Текстуры брони (Легкие, средние, тяжелые)<br> * *- Стражник<br> * *- Маг огня<br> * *- Маг воды<br> * *- Послушник<br> * *- Вор<br> * *- Рудокоп<br> * *- Наемник<br> * *- Призрак<br> * *- Страж<br> *- Прочие текстуры<br> * *- Еда<br> * *- Некоторые предметы<br> * *- Оружие<br> * *- ...<br>- Игровой баланс<br> *- Действия<br> * *- Делать болотник<br> * *- Рубить деревья<br> * *- Добывать руду<br> * *- Готовить<br> * *- Ковать новое оружие<br> * *- ...<br> *- Руда подорожала, в обороте золото<br>- Новые предметы, оружие...<br>- И многое другое... (пока не знаю, что именно :) )
|
Re: Скриптинг в Готике
2aleks999:<br>
Цитата:
|
Re: Скриптинг в Готике
2Vam: Обращаюсь в первую очередь к тебе, но может быть, кто-нить еще знает.<br>В журнале миссий слева внизу указан сегодняшний день и время. Также время регистрируется при сейвах. Отсюда вопрос: каким образом игра узнает настоящее время? Может есть какая-нить функция?
|
Re: Скриптинг в Готике
2finch:<br>
Цитата:
|
Текущее время: 11:38. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
AGFC: Valley of Gothic © 2004-2022