[AGFC: Valley of Gothic] М: Скриптинг в Готике

Страница 3 из 65 123 456789101353 Последняя »
Поиск в этой теме:

Расширенный поиск
Старый 17.01.2005, 00:23   #81
Killer-XXX
Строители Миртаны
 
 
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
Killer-XXX вне форума

По умолчанию Re: Скриптинг в Готике

2Pa:
Я еще более смешную вещь готовлю к 1.04...
Интересно, интересно... может намекнешь хотя бы? :)
Ответить с цитированием
Старый 17.01.2005, 02:12   #82
B_Wolf

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Pa:
Тогда завяжи проверку условия обучения на наличие амулета - все равно свойство регенерации это умение ГГ и в меню это явно видно - обучен или нет.
ИМХО, не совсем верно!
То что видно в меню - это Умение. Если ГГ не обучен, умение равно 0.
Умение ГГ - это лишь зависимость устанавливающая количество прибавляемой жизни в ед. времени. А я эту зависимость вырезал начисто из функции описывающей регенерацию, определив явным образом количество прибавляемой жизни (урезанная версия скрипта приведена в пред. постах), отсюда следует, что ГГ даже с 0-евым умением т.е. необученный к регенерации в данном случае должен регенерировать жизнь при исп. амулета.
И функция описывающая регенерацию забита именно на амулет, а не на НПС.
Ответить с цитированием
Старый 17.01.2005, 09:59   #83
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

B Wolf:
И функция описывающая регенерацию забита именно на амулет, а не на НПС.
Предлагаю функцию регенерации повесить на npc, а активировать ее только тогда, когда одет амулет, должно сработать.  :)
Ответить с цитированием
Старый 17.01.2005, 16:46   #84
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Кто-нибудь может что-то подсказать по погодным явлениям? Как отследить наступление дождя, например? Похоже, что эффект вшит в движок, но есть безумная мысль попытаться отловить его через регистрацию проигрывания звука дождя.
Ответить с цитированием
Старый 18.01.2005, 04:28   #85
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
B_Wolf

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam:
Предлагаю функцию регенерации повесить на npc, а активировать ее только тогда, когда одет амулет, должно сработать.  
2Pa:
Тогда завяжи проверку условия обучения на наличие амулета - все равно свойство регенерации это умение ГГ и в меню это явно видно - обучен или нет.
Одно и тоже, только разными словами... Ээээ... немножко топорно, амулет получается именной и на других действовать не будет, если у всех остальных НПС это не прописывать... :)

2finch:
Ура, товарищи!  
Два дня "битья" над регенерацией не прошли даром!
Пробовал создать амулет регенерации разными способами, но в конце концов получилось только при использовании исходников мода Mana Reload.

Короче, описываю алгоритм действий для создания амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.


В папке AI\Human\TA_Human создаем файл ZS_Recharger.d

Вот его содержимое(взято из Mana Reload и немного подправлено):
Ну а эта... уже реальная тема. finch, большое спасибо за оперативное решение и полное разъяснение работы скрипта.
Хы... намано придумали... Летающий подзарядник, активирующийся при одетом амулете :))))
Ответить с цитированием
Старый 18.01.2005, 05:44   #87
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2B Wolf: Нема за цо! ;D

закралась ошибка...
амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.
Не каждую секунду, а каждые три секунды... Очепятался...  ;D
Ответить с цитированием
Старый 18.01.2005, 05:59   #88
B_Wolf

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2finch:
закралась ошибка...
амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.
Не каждую секунду, а каждые три секунды... Очепятался...  
Как я понял, это можно установить здесь: if (Npc_GetStateTime(self) > 3)
Ответить с цитированием
Старый 18.01.2005, 09:39   #89
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2B Wolf:
Как я понял, это можно установить здесь: if (Npc_GetStateTime(self) > 3)
Да.

hero.attribute[ATR_MANA]=hero.attribute[ATR_MANA]+1;
А здесь, сколько маны будет прибавляться в этот промежуток времени...

Ну да это и так понятно...
Ответить с цитированием
Старый 18.01.2005, 11:26   #90
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2finch:
AI_Teleport (self, Npc_GetNearestWP (hero));
А это зачем? ::)

Способ у тебя, конечно, хитрый, но не оптимальный...
Надо будет тоже попробовать :)
Отправить личное сообщение для Ответить с цитированием
Старый 19.01.2005, 00:31   #91
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
А это зачем?
Чтобы речарджер постоянно "догонял" ГГ. Эту строчку можно было бы не прописывать, если бы ГГ во время регенерации постоянно стоял на месте.

Надо будет тоже попробовать
А вот это ОБЯЗАТЕЛЬНО! :)
Ответить с цитированием
Старый 19.01.2005, 01:16   #92
B_Wolf

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Пару слов об амулете восстановления...

Попробовал я таки ввести ентот амулет в модификацию Бумшака.
Заметил несколько особенностей:

Хорошие:
1) Амулет работает :)

Нехорошие:
1) Иногда орки, звери и пр. существа начинают нападать на невидимку-реченджера (нужно гильдии смотреть).
2) Иногда невидимка-реченджер получает от меня оружием во время боя, т.к. все время путается под ногами.

А вообщем неплохо :)
Ответить с цитированием
Старый 19.01.2005, 09:25   #93
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2B Wolf:
А разве нельзя сделать регенерацию аналогично драконьей, только сначала проверять на наличие амулета, и никаких невидимок не надо?
Ответить с цитированием
Старый 19.01.2005, 13:05   #94
francisc

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

При создании миссий,надо ли что-нибудь писать в файл Story globals?
И вообше что содердится в этом файле?  
Ответить с цитированием
Старый 19.01.2005, 13:27   #95
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2francisc:
При создании миссий,надо ли что-нибудь писать в файл Story globals?
И вообше что содердится в этом файле?  
Файл содержит объявления нескольких констант и кучи переменных для скриптов папки globals.
А писать, или не писать - все зависит от тебя; будешь заводить переменные или нет; запишешь их в файл миссий или нет; обязательного в этом файле ничего нет!
Ответить с цитированием
Старый 19.01.2005, 19:26   #96
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Как сделать так, чтобы после разговора с НПС у другого НПС добавлялась новая тема типа "Кто-то говорил..." ??? :-/
Ответить с цитированием
Старый 19.01.2005, 19:51   #97
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2Vam:
Файл содержит объявления нескольких констант и кучи переменных для скриптов папки globals.
Не знаю такой папки. Может, ты имел в виду папку dialoge?

2francisc:
Я туда прописывал только переменыые MIS_*** для новых миссий ::)


2aleks999:
Как сделать так, чтобы после разговора с НПС у другого НПС добавлялась новая тема типа "Кто-то говорил..." ???
Для этого нужно прописать в Condition второго диалога условие. Например,

if (Npc_KnowsInfo (other, <твой C_Info>))
Отправить личное сообщение для Ответить с цитированием
Старый 19.01.2005, 20:37   #98
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
Не знаю такой папки. Может, ты имел в виду папку dialoge?
Пардон, я имел в виду папку Story.  :-[
Ответить с цитированием
Старый 19.01.2005, 22:42   #99
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Вопрос: какая функция создает в инвентаре НПС предмет?
Ответить с цитированием
Старый 19.01.2005, 22:51   #100
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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
francisc

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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, 01:05   #104
francisc

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
Это в скрипте нпс надо писать,как я понял.Или в тексте миссии нужно?
Вот следуюшй вопрос,как сделать так что бы нпс бежал на какое-то место с оружеем и нападал на кого-нибудь?(бандитов например)
Ответить с цитированием
Старый 20.01.2005, 08:58   #105
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
Mitrich

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Mitrich:
На мой взгляд в первом случае логика немного странная. Может все-таки тут что-то иное?
Необходимо функцию C_BodyStateContains рассмотреть подробно, там проверяются и другие параметры а не только аргумент "состояние тела".
Ответить с цитированием
Старый 20.01.2005, 15:00   #110
PA
Строители Миртаны
*
 
Регистрация: 29.08.2004
Сообщений: 1
PA вне форума

По умолчанию 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, 15:57   #111
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Можно ли сделать так, что при убийстве каждого стажника начислялось 1 очко(как при поступлении в лагеря в Г1), а при наборе определенного кол-ва что-нибудь происходило?
Ответить с цитированием
Старый 20.01.2005, 16:50   #112
francisc

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Pa:
Это пока демо-мод,там всего прару НПС.Переводить,ну можно,если у кого жедание будет.
2aleks999:
Можно миссию написать с условием ,что бы она срабатывала при определенном уровне. А что вообше теребуется?
Ответить с цитированием
Старый 20.01.2005, 18:00   #113
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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, 18:34   #116
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
В Г1 файл ZS_Dead.d находится здесь: AI\ZS_Human *:) Еле нашел :)

if (self.guild == GIL_GRD) && (Npc_IsPlayer(other))
{
grd_counter += 1; - я делаю мод для Г1, а там счетчик начисляется по-другому: grd_counter = grd_counter + 1;
};
Ответить с цитированием
Старый 20.01.2005, 20:05   #117
aleks999

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Идея для игры.
Вот то, что пока готово:

- Графические изменения
*- Интерфейс игры
*- Текстуры животных
* *- Мракорис
* *- Огненный ящер
* *- Ледяной голем
* *- Шныг
* *- Мясной жук
* *- Кротокрыс
* *- Орк-воин
* *- Падальщик
* *- Ящер
* *- ...
*- Текстуры людей
*- Текстуры брони (Легкие, средние, тяжелые)
* *- Стражник
* *- Маг огня
* *- Маг воды
* *- Послушник
* *- Вор
* *- Рудокоп
* *- Наемник
* *- Призрак
* *- Страж
*- Прочие текстуры
* *- Еда
* *- Некоторые предметы
* *- Оружие
* *- ...
- Игровой баланс
*- Действия
* *- Делать болотник
* *- Рубить деревья
* *- Добывать руду
* *- Готовить
* *- Ковать новое оружие
* *- ...

*- Руда подорожала, в обороте золото
- Новые предметы, оружие...
- И многое другое... (пока не знаю, что именно :) )
Ответить с цитированием
Старый 20.01.2005, 21:26   #118
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2aleks999:
grd_counter += 1; - я делаю мод для Г1, а там счетчик начисляется по-другому: grd_counter = grd_counter + 1;
Для любых Готик оба варианта приемлемы и работают одинаково.  :)
Ответить с цитированием
Старый 21.01.2005, 02:19   #119
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: Обращаюсь в первую очередь к тебе, но может быть, кто-нить еще знает.
В журнале миссий слева внизу указан сегодняшний день и время. Также время регистрируется при сейвах. Отсюда вопрос: каким образом игра узнает настоящее время?  Может есть какая-нить функция?
Ответить с цитированием
Старый 21.01.2005, 09:39   #120
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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. ***
Ответить с цитированием
Страница 3 из 65 123 456789101353 Последняя »


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе

Смайлы Вкл.
[IMG] код Вкл.
HTML код Вкл.


Текущее время: 06:31. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot

AGFC: Valley of Gothic © 2004-2022

Яндекс.Метрика