|
|
17.01.2005, 00:23
|
#81
|
|
|
|
|
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
|
|
|
|
|
|
Re: Скриптинг в Готике
2Pa:
Я еще более смешную вещь готовлю к 1.04...
|
Интересно, интересно... может намекнешь хотя бы? :)
|
|
|
17.01.2005, 02:12
|
#82
|
|
Re: Скриптинг в Готике
2Pa:
Тогда завяжи проверку условия обучения на наличие амулета - все равно свойство регенерации это умение ГГ и в меню это явно видно - обучен или нет.
|
ИМХО, не совсем верно! То что видно в меню - это Умение. Если ГГ не обучен, умение равно 0. Умение ГГ - это лишь зависимость устанавливающая количество прибавляемой жизни в ед. времени. А я эту зависимость вырезал начисто из функции описывающей регенерацию, определив явным образом количество прибавляемой жизни (урезанная версия скрипта приведена в пред. постах), отсюда следует, что ГГ даже с 0-евым умением т.е. необученный к регенерации в данном случае должен регенерировать жизнь при исп. амулета. И функция описывающая регенерацию забита именно на амулет, а не на НПС.
|
|
|
17.01.2005, 09:59
|
#83
|
|
Re: Скриптинг в Готике
B Wolf:
И функция описывающая регенерацию забита именно на амулет, а не на НПС.
|
Предлагаю функцию регенерации повесить на npc, а активировать ее только тогда, когда одет амулет, должно сработать. :)
|
|
|
18.01.2005, 04:28
|
#85
|
|
Re: Скриптинг в Готике
Ура, товарищи! ;D Два дня "битья" над регенерацией не прошли даром! Пробовал создать амулет регенерации разными способами, но в конце концов получилось только при использовании исходников мода Mana Reload.
Короче, описываю алгоритм действий для создания амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.
В папке AI\Human\TA_Human создаем файл ZS_Recharger.d
Вот его содержимое(взято из Mana Reload и немного подправлено):
func void ZS_Recharger() { B_ResetAll (self); B_ClearPerceptions (self); };
func int ZS_Recharger_loop() { if (Npc_GetStateTime(self) > 3) { Npc_SetStateTime (self, 0);
if (hero.attribute[ATR_MANA] < hero.attribute[ATR_MANA_MAX]) { hero.attribute[ATR_MANA]=hero.attribute[ATR_MANA]+1; };
AI_Teleport (self, Npc_GetNearestWP (hero)); };
return LOOP_CONTINUE; };
func void ZS_Recharger_end() { AI_PlayAni (self,"T_LGUARD_2_STAND"); };
Далее в файле TA.d дописываем следующую строчку:
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);};
Теперь создаем НПС, который будет отвечать за нашу регенерацию.
В папку Story\NPC вставляем файл None_999_Recharger.d, следующего содержания:
instance None_999_Recharger (Npc_Default) { name = ""; guild = GIL_NONE; npctype = NPCTYPE_AMBIENT; flags = NPC_FLAG_IMMORTAL|NPC_FLAG_GHOST; level = 999; voice = 0; id = 999; noFocus = 1; bodyStateInterruptableOverride = 1;
damagetype = DAM_EDGE; damage [DAM_INDEX_EDGE] = 0;
//-------- visuals -------- B_SetNpcVisual (self, MALE, "Hum_Head_Fatbald", 0, 0, ITAR_MIL_M); Mdl_SetModelScale (self, 0.01, 0.01, 0.01);
//-------- talents -------- B_SetFightSkills (self, 0);
//------------- ai ------------- fight_tactic = FAI_HUMAN_COWARD;
daily_routine = Rtn_start_999; };
func void Rtn_Regeneration_999 () { TA_Recharger (0,00,13,00, Npc_GetNearestWP (hero)); TA_Recharger (13,00,0,00, Npc_GetNearestWP (hero)); };
func void Rtn_start_999 () { TA_Stand_WP (0,00,13,00, Npc_GetNearestWP (hero)); TA_Stand_WP (13,00,0,00, Npc_GetNearestWP (hero)); };
Обратите внимание, что НПС почти невидим!
Прописываем нового НПС в стартапе:
Wld_InsertNpc (None_999_Recharger,Npc_GetNearestWP (hero));
Ну и в конце-концов вставляем в файле It_Amulette.d следующее:
INSTANCE ItAm_Mana_Regener(C_Item) { name = NAME_Amulett;
mainflag = ITEM_KAT_MAGIC; flags = ITEM_AMULET;
value = Value_Mana_Regener;
visual = "ItAm_Strg_01.3ds";
visual_skin = 0; material = MAT_METAL; on_equip = Equip_ItAm_Mana_Regener; on_unequip = UnEquip_ItAm_Mana_Regener;
wear = WEAR_EFFECT; effect = "SPELLFX_ITEMGLIMMER";
description = "Амулет регенерации маны"; TEXT[5] = NAME_Value; COUNT[5] = value;
INV_ZBIAS = INVCAM_ENTF_AMULETTE_STANDARD; };
FUNC VOID Equip_ItAm_Mana_Regener() { Npc_ExchangeRoutine (None_999_Recharger,"Regeneration"); };
FUNC VOID UnEquip_ItAm_Mana_Regener() { Npc_ExchangeRoutine (None_999_Recharger,"Start"); };
Вот, собственно говоря и все. Амулет работает. Единственное, если пользоваться F8 для перелетов на большие расстояния, амулет перестает работать. Чтобы он снова заработал, его надо снять и снова одеть. Этот баг появляется из-за того, что наш речаджер не успевает за нами, т.к. не умеет пользоваться "марвином"! :D Но, в принципе, тем кто пользуется F8 регенерация маны ни к чему! :lol:
2Dagot_Ur: Если будешь читать этот топик, расскажи, плз, свой способ создания предмета с регенерирующими способностями.
|
|
|
18.01.2005, 05:15
|
#86
|
|
Re: Скриптинг в Готике
2Vam:
Предлагаю функцию регенерации повесить на npc, а активировать ее только тогда, когда одет амулет, должно сработать.
|
2Pa:
Тогда завяжи проверку условия обучения на наличие амулета - все равно свойство регенерации это умение ГГ и в меню это явно видно - обучен или нет.
|
Одно и тоже, только разными словами... Ээээ... немножко топорно, амулет получается именной и на других действовать не будет, если у всех остальных НПС это не прописывать... :) 2finch:
Ура, товарищи! Два дня "битья" над регенерацией не прошли даром! Пробовал создать амулет регенерации разными способами, но в конце концов получилось только при использовании исходников мода Mana Reload.
Короче, описываю алгоритм действий для создания амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.
В папке AI\Human\TA_Human создаем файл ZS_Recharger.d
Вот его содержимое(взято из Mana Reload и немного подправлено):
|
Ну а эта... уже реальная тема. finch, большое спасибо за оперативное решение и полное разъяснение работы скрипта. Хы... намано придумали... Летающий подзарядник, активирующийся при одетом амулете :))))
|
|
|
18.01.2005, 05:44
|
#87
|
|
Re: Скриптинг в Готике
2B Wolf: Нема за цо! ;D закралась ошибка...
амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.
|
Не каждую секунду, а каждые три секунды... Очепятался... ;D
|
|
|
18.01.2005, 05:59
|
#88
|
|
Re: Скриптинг в Готике
2finch:
закралась ошибка... амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду. Не каждую секунду, а каждые три секунды... Очепятался...
|
Как я понял, это можно установить здесь: if (Npc_GetStateTime(self) > 3)
|
|
|
18.01.2005, 09:39
|
#89
|
|
Re: Скриптинг в Готике
2B Wolf:
Как я понял, это можно установить здесь: if (Npc_GetStateTime(self) > 3)
|
Да.
hero.attribute[ATR_MANA]=hero.attribute[ATR_MANA]+1;
|
А здесь, сколько маны будет прибавляться в этот промежуток времени... Ну да это и так понятно...
|
|
|
18.01.2005, 11:26
|
#90
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2finch:
AI_Teleport (self, Npc_GetNearestWP (hero));
|
А это зачем? ::) Способ у тебя, конечно, хитрый, но не оптимальный... Надо будет тоже попробовать :)
|
|
|
19.01.2005, 00:31
|
#91
|
|
Re: Скриптинг в Готике
2TycoooN:
Чтобы речарджер постоянно "догонял" ГГ. Эту строчку можно было бы не прописывать, если бы ГГ во время регенерации постоянно стоял на месте.
Надо будет тоже попробовать
|
А вот это ОБЯЗАТЕЛЬНО! :)
|
|
|
19.01.2005, 13:27
|
#95
|
|
Re: Скриптинг в Готике
2francisc:
При создании миссий,надо ли что-нибудь писать в файл Story globals? И вообше что содердится в этом файле?
|
Файл содержит объявления нескольких констант и кучи переменных для скриптов папки globals. А писать, или не писать - все зависит от тебя; будешь заводить переменные или нет; запишешь их в файл миссий или нет; обязательного в этом файле ничего нет!
|
|
|
19.01.2005, 19:51
|
#97
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Vam:
Файл содержит объявления нескольких констант и кучи переменных для скриптов папки globals.
|
Не знаю такой папки. Может, ты имел в виду папку dialoge? 2francisc: Я туда прописывал только переменыые MIS_*** для новых миссий ::) 2aleks999:
Как сделать так, чтобы после разговора с НПС у другого НПС добавлялась новая тема типа "Кто-то говорил..." ???
|
Для этого нужно прописать в Condition второго диалога условие. Например, if (Npc_KnowsInfo (other, <твой C_Info>))
|
|
|
19.01.2005, 20:37
|
#98
|
|
Re: Скриптинг в Готике
2TycoooN:
Не знаю такой папки. Может, ты имел в виду папку dialoge?
|
Пардон, я имел в виду папку Story. :-[
|
|
|
19.01.2005, 22:51
|
#100
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Mitrich:
Вопрос: какая функция создает в инвентаре НПС предмет?
|
Из туторов Vam'a: void CreateInvItem(c_npc n0,int n1); - создает в инвентаре npc n0 предмет с ID n1. void CreateInvItems(c_npc n0,int n1,int n2); - создает в инвентаре npc n0 предметы с ID n1 количеством n2.Пример: CreateInvItems (self, ItMi_Gold, 10);
|
|
|
19.01.2005, 23:21
|
#101
|
|
Re: Скриптинг в Готике
void CreateInvItem(c_npc n0,int n1); - создает в инвентаре npc n0 предмет с ID n1. void CreateInvItems(c_npc n0,int n1,int n2); - создает в инвентаре npc n0 предметы с ID n1 количеством n2.
|
А еще есть что игра сама в произвольном порядке создает предметы. Вопрос,как сделать,что бы после передачи предмета,оружия неписю,он его одевал на себя?
|
|
|
20.01.2005, 00:14
|
#102
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2francisc:
Вопрос,как сделать,что бы после передачи предмета,оружия неписю,он его одевал на себя?
|
Для этого есть такая функция: void EquipItem(c_npc n0,int n1); - экипировать npc n0 предметом с ID n1.Пример: EquipItem(self,ItMw_1h_Bau_Axe);
|
|
|
20.01.2005, 01:02
|
#103
|
|
Re: Скриптинг в Готике
Хмм... Тогда попробуем зайти с другого конца. Это код ТА "пилить" // **************************** // NSC benutzt Sдge Mobsi // ****************************
FUNC VOID ZS_Saw () { Perception_Set_Normal(); B_ResetAll (self);
AI_SetWalkmode (self, NPC_WALK); if (Hlp_StrCmp (Npc_GetNearestWP(self), self.wp) == FALSE) { AI_GotoWP (self, self.wp); }; };
FUNC int ZS_Saw_Loop () { // ------ Saegen ------ if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"BAUMSAEGE")) { AI_UseMob (self, "BAUMSAEGE", 1); };
// ------ Random-Ani beim Hдmmern ------ if (Npc_GetStateTime(self) > 15) && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) { Npc_SetStateTime (self, 0); };
return LOOP_CONTINUE; };
FUNC VOID ZS_Saw_End () { AI_UseMob (self, "BAUMSAEGE", -1); };
Что выполняет данный блок? // ------ Random-Ani beim Hдmmern ------ if (Npc_GetStateTime(self) > 15) && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) { Npc_SetStateTime (self, 0); };
Особенно интересует /C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT/ в условии. Что это?
|
|
|
20.01.2005, 08:58
|
#105
|
|
Re: Скриптинг в Готике
2francisc:
Вот следуюшй вопрос,как сделать так что бы нпс бежал на какое-то место с оружеем и нападал на кого-нибудь?(
|
Из темы "уроки скриптологии":
void AI_SetWalkmode(c_npc n,int n0); - установить режим передвижения n0 для npc n. Определены следующие режимы: NPC_RUN – бег, NPC_WALK – ходьба шагом, NPC_SNEAK – подкрадывание, NPC_RUN_WEAPON – бег с оружием, NPC_WALK_WEAPON – ходьба с оружием, NPC_SNEAK_WEAPON – подкрадывание с оружием.
|
void AI_Attack(c_npc self); - npc self начинает сражение (эта функция должна вызываться внутри ZS_Attack_Loop). Атакуется внутренняя цель, которая была задана функцией Npc_SetTarget или Npc_GetNextTarget.
|
int Wld_IsRaining(); – возвращает 1, если идет дождь, иначе – 0.
|
Ура! Я ее нашел в дополнительных функциях второй Готики! :) Vam, ты гений, только об этом пока не догадываешься. (отпирался, что не знает) ;)
|
|
|
20.01.2005, 09:27
|
#106
|
|
Re: Скриптинг в Готике
По-моему я неудачно зашел с другого конца. Предлагаю рассмотреть ТА ZS_Saw с моими комментариями в качестве примера. Передо мной стоит задача добавлять НПС при пилении каждые 15 секунд некий контрольный предмет. Но некоторые вещи мне непонятны. Кто сможет что-то разьяснить или поправить, буду очень благодарен. Зеленым понятные вещи, красным неясности.
// **************************** // NSC benutzt Sдge Mobsi // ****************************
FUNC VOID ZS_Saw () //Объявление функции { * * *Perception_Set_Normal(); //Установка восприятия на нормальный уровень * * * * * *B_ResetAll (self); //Сбрасывание какого-то паретра(ов)??? * * *AI_SetWalkmode ** * *(self, NPC_WALK); * * //Перевод НПС в режим ходьбы шагом * * * * * * * * *if (Hlp_StrCmp (Npc_GetNearestWP(self), self.wp) == FALSE) * *{ * * * * * *AI_GotoWP * * *(self, self.wp); // npc n0 перемещается в указанную WP s0.
* * *}; };
FUNC int ZS_Saw_Loop () * *//Начало функции использования МОВ{ * * *
// ------ Saegen ------ * * *if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) //поверка на использование МОВ другим "телом"??? * * * && (Wld_IsMobAvailable(self,"BAUMSAEGE")) //подозреваю, что это условие непосредственной близости НПС с МОВ с именем "BAUMSAEGE" * * *{ * * * * * *AI_UseMob (self, "BAUMSAEGE", 1); ** * *//см сноску* * * *};
* * *// ------ Random-Ani beim Hдmmern ------ * * *if (Npc_GetStateTime(self) > 15) //если НПС находится в таком состоянии более 15 секунд * * *&& (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) //и ??? непонятное условие * *{ * * * * * *CreatInvItems (self, ItPo_Mana_01, 1); // ----Суть задачи всего примера: Добавление контрольного предмета каждые 15 сек---
* * *Npc_SetStateTime (self, 0); ** * * //обнулить время нахождения НПС в данном состоянии. Если убрать это действие НПС }; * * * * * * * * * * * * * * *//будет дергаться возле бревна, но пилить так и не начнет.
* * *return LOOP_CONTINUE; //возврат к началу функции };
FUNC VOID ZS_Saw_End () //функция завершения действия для НПС self над МОВ "BAUMSAEGE" { * * *AI_UseMob (self, "BAUMSAEGE", -1); //прекратить использовать МОВ (установка флага функции AI_UseMob в -1
};
//* *int AI_UseMob(c_npc self,string schemeName,int targetState); - npc self использует MOB с именем schemeName до указанного состояния targetState. Если указанное состояние у MOBа уже имеется, npc self приближается к нему, но ничего не делает. На мой взгляд, здесь требуется уточнение - 1 это флаг начала использования МОВ, а -1 окончание использования, а не проверка состояния МОВ.
|
|
|
20.01.2005, 09:28
|
#107
|
|
Re: Скриптинг в Готике
2Mitrich:
Что выполняет данный блок? // ------ Random-Ani beim Hдmmern ------ if (Npc_GetStateTime(self) > 15) && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) { Npc_SetStateTime (self, 0); };
|
Если прошло > 15 секунд и состояние тела (положение) НПС self соответствует BS_MOBINTERACT_INTERRUPT (какая-то фаза выполняемых действий с MOBом (MoveObject) завершена [в моем понимании анимационная фаза движения]), то время сбрасывается в 0 (начинается новый цикл работы в LOOP функции или работа заканчивается в END функции).
|
|
|
20.01.2005, 10:05
|
#108
|
|
Re: Скриптинг в Готике
2Mitrich: хммм... вот смотри что получается - получаетя сначала идет проверка "если НЕ завершена фаза анимации (в твоем варианте) и достигнута непосредственная близость":
// ------ Saegen ------ if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"BAUMSAEGE"))
|
а во втором случае "если находится в состоянии > 15 сек и фаза анимации закончилась":
if (Npc_GetStateTime(self) > 15) //если НПС находится в таком состоянии более 15 секунд && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) //и ??? непонятное условие
|
На мой взгляд в первом случае логика немного странная. Может все-таки тут что-то иное?
|
|
|
20.01.2005, 10:11
|
#109
|
|
Re: Скриптинг в Готике
2Mitrich:
На мой взгляд в первом случае логика немного странная. Может все-таки тут что-то иное?
|
Необходимо функцию C_BodyStateContains рассмотреть подробно, там проверяются и другие параметры а не только аргумент "состояние тела".
|
|
|
20.01.2005, 15:00
|
#110
|
|
|
|
|
*
Регистрация: 29.08.2004
Сообщений: 1
|
|
|
|
|
|
Re: Скриптинг в Готике
2Mitrich:
По-моему я неудачно зашел с другого конца. Предлагаю рассмотреть ТА ZS_Saw с моими комментариями в качестве примера. Передо мной стоит задача добавлять НПС при пилении каждые 15 секунд некий контрольный предмет. Но некоторые вещи мне непонятны.
|
Очень советую тебе и всем вскрыть МОД Dunkle Brut Demo v0.73 http://www.worldofgothic.de/dl/index.php?go=downloads&release_id=107 Там много новых умений разложено по полочкам (правда заточено на Г1). Еще раз спрашиваю - Нет ли желающих его перевести - очень интересный МОД!
|
|
|
20.01.2005, 18:00
|
#113
|
|
Re: Скриптинг в Готике
2francisc:
Ну нужно мочить стражников, за убийство каждого дают +1 очко. Когда набирается определенное кол-во этих очков, срабатывает скрипт... наподобие такого...
func void Info_Diego_JoinAnalyze_Info() { AI_Output(hero,self,"Info_Diego_JoinAnalyze_15_00 "); // AI_Output(self,hero,"Info_Diego_JoinAnalyze_11_01 "); // AI_Output(hero,self,"Info_Diego_JoinAnalyze_15_02 "); // Points_OC = 0; if(Scatty_ChargeKirgo == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_01"); // Points_OC = Points_OC + 2; } else if(Scatty_ChargeKirgo == LOG_FAILED) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_02"); // Points_OC = Points_OC - 1; } else if(Scatty_ChargeKirgo == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_03"); // }; if(Scatty_ChargeKharim == LOG_FAILED) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_04"); // Points_OC = Points_OC + 2; } else if(Scatty_ChargeKharim == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_05"); // Points_OC = Points_OC + 5; } else if(Scatty_ChargeKharim == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Scatt y_11_06"); // }; if(Whistler_BuyMySword == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Whist ler_11_01"); // Points_OC = Points_OC + 3; } else if((Whistler_BuyMySword == LOG_FAILED) || ((Whistler_BuyMySword == LOG_RUNNING) && (Whistler_BuyMySword_Day <= (Wld_GetDay() - 2)))) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Whist ler_11_02"); // Points_OC = Points_OC + 2; } else if(Whistler_BuyMySword == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Whist ler_11_03"); // }; if(Sly_LostNek == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Sly_1 1_01"); // Points_OC = Points_OC + 4; } else if(Sly_LostNek == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Sly_1 1_02"); // }; if(Fingers_Learnt == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Finge rs_11_01"); // } else if(Fingers_Learnt == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Finge rs_11_02"); // Points_OC = Points_OC + 3; }; if(Dexter_GetKalomsRecipe == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Dexte r_11_01"); // AI_Output(self,hero,"Info_Diego_JoinAnalyze_Dexte r_11_02"); // } else if(Dexter_GetKalomsRecipe == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Dexte r_11_03"); // Points_OC = Points_OC + 5; }; if(Thorus_MordragKo == LOG_RUNNING) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Thoru s_11_01"); // } else if(Thorus_MordragKo == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Thoru s_11_02"); // Points_OC = Points_OC + 5; } else { if(Thorus_MordragKo == LOG_FAILED) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Thoru s_11_03"); // Points_OC = Points_OC - 5; }; if(Fisk_GetNewHehler == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Fisk_ 11_01"); // Points_OC = Points_OC + 5; } else if((MordragKO_HauAb == TRUE) || (MordragKO_StayAtNC == TRUE)) { AI_Output(self,hero,"Info_Diego_JoinAnalyze_Fisk_ 11_02"); // }; }; if(Points_OC > 15) { AI_Output(self,hero,"Info_Diego_Points_11_00" ); // if(hero.level >= 5) { if(Diego_BringList == LOG_SUCCESS) { AI_Output(self,hero,"Info_Diego_Points_11_01" ); // Diego_GomezAudience = TRUE; Log_SetTopicStatus(CH1_JoinOC,LOG_SUCCESS); B_LogEntry(CH1_JoinOC,"Диего сказал, что я могу встретиться с Гомезом. Теперь я смогу стать одним из людей Гомеза и войти в замок. Нужно лишь поговорить с Торусом."); } else { AI_Output(self,hero,"Info_Diego_Points_11_02" ); // }; } else { B_PrintGuildCondition(5); }; } else if(Points_OC > 10) { AI_Output(self,hero,"Info_Diego_Points_11_10" ); // } else if(Points_OC >= 0) { AI_Output(self,hero,"Info_Diego_Points_11_20" ); // }; };
Только надо с убийством стражников сделать. Я пробовал, че то не получается...
|
|
|
20.01.2005, 18:10
|
#114
|
|
Re: Скриптинг в Готике
2Pa:
Очень советую тебе и всем вскрыть МОД Dunkle Brut Demo v0.73 http://www.worldofgothic.de/dl/index.php?go=downloads&release_id=107 Там много новых умений разложено по полочкам (правда заточено на Г1). Еще раз спрашиваю - Нет ли желающих его перевести - очень интересный МОД!
|
Сейчас докачаю, посмотрю, а там и переведу... :)
|
|
|
20.01.2005, 18:20
|
#115
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2aleks999:
Можно ли сделать так, что при убийстве каждого стажника начислялось 1 очко(как при поступлении в лагеря в Г1), а при наборе определенного кол-ва что-нибудь происходило?
|
Можно. Для этого в файле AI/Human/ZS_Human/ZS_Dead.d пропиши такое условие: if (self.guild == GIL_GRD) && (Npc_IsPlayer(other)) { *grd_counter += 1; };Соответственно, нужно прописать где-нибудь эту переменную: var int grd_counter;Ну и сделать миссию на основе этого счётчика :)
|
|
|
20.01.2005, 21:26
|
#118
|
|
Re: Скриптинг в Готике
2aleks999:
grd_counter += 1; - я делаю мод для Г1, а там счетчик начисляется по-другому: grd_counter = grd_counter + 1;
|
Для любых Готик оба варианта приемлемы и работают одинаково. :)
|
|
|
21.01.2005, 09:39
|
#120
|
|
Re: Скриптинг в Готике
2finch:
В журнале миссий слева внизу указан сегодняшний день и время. Также время регистрируется при сейвах. Отсюда вопрос: каким образом игра узнает настоящее время? *Может есть какая-нить функция?
|
Не понял вопроса - настоящее время это какое: игровое, или в котором мы живем? (Не помню что в журнале миссий указывается). В принципе без разницы, настоящее время берется с компа, а игровое время считается экзешником с начала новой игры, при сейвах оно сохраняется, при загрузке восстанавливается. *:) Вот функции, оперирующие игровым временем: int Wld_GetDay(); - получить текущий день, отсчет дней идет от дня старта (Gamestart) *= 0. int Wld_IsTime(int hour1,int min1,int hour2,int min2); - возвращает 1, если текущее время находится между границами (hour1, min1 – нижняя граница, hour2, min2 – верхняя граница в часах и минутах), иначе возвращает 0. void Wld_SetTime(int hour,int min); - установить текущее время в часах hour и минутах min. ***
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 20:27. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|