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

Страница 61 из 65 « Первая 11515455565758596061 62636465
Поиск в этой теме:

Расширенный поиск
Старый 20.12.2010, 21:15   #2401
JohaNBlack

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

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

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

По умолчанию 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") ;
     };
};
Ответить с цитированием
Старый 20.12.2010, 22:09   #2403
Olympus

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

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

Вставил твой скрипт вместо своего, всё равно пишет "Magic/ZS/ZS_Zapped.d(33): Ошибка: Функция должна возвращать значение"  >:(
Может можно сделать, чтоб компилятор игнорировал эту ошибку? За какое заклинание вообще отвечает этот скрипт?
Ответить с цитированием
Старый 20.12.2010, 22:26   #2404
Olympus

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

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

Не хочет. И после AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") убрал return Loop_Continue, функцию сменил, и скриптом JohaNBlack'а свой заменил - всё равно не компилируется, упорно твердит своё  >:(
За какое заклинание отвечает этот скрипт? Может можно сделать, чтобы компилятор игнорировал ошибку?
Ответить с цитированием
Старый 20.12.2010, 22:32   #2405
halogene

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

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

2Olympus:
Версия соурсера 3.14?
Могу еще предложить закрыть соурсер и заменить файл на приложенный, потом открыть заново и попробовать скомпилировать.
Вот новый файл — http://ifolder.ru/20924047
Ответить с цитированием
Старый 20.12.2010, 22:55   #2406
Olympus

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

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

Спасибо огромное! Теперь скомпилировал! :D
Пойду проверять

Добавление от 12/20/10, в 22:05:37
Работает! Вот ещё вопрос: Можно сделать, чтобы меч убивал, а не просто вырубал людей, не убирая повреждения от оружия (EDGE)?
Ответить с цитированием
Старый 21.12.2010, 16:39   #2407
halogene

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

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

2Olympus:
Работает! Вот ещё вопрос: Можно сделать, чтобы меч убивал, а не просто вырубал людей, не убирая повреждения от оружия (EDGE)?
Ну для этого надо немного логику игры разбирать. По умолчанию за обработку всего урона отвечает движок и именно он переключает персонажа между состояниями ZS_Attack (атакующее состояние) и ZS_Unconscious (бессознательное состояние)
Можно всунуть в начало ф-ции состояния ZS_Unconscious проверку на экипированное\активное оружие ГГ и убивать НПЦ в случае, если выбран тот или иной меч.

И да, EDGE - не повреждение от оружие, а режущий урон, есть еще BLUNT - дробящий, POINT - колющий, FIRE - от огня, MAGIC- магический, FALL - от падения и FLY от кулака тролля. Соответственно и резист у НПЦ может быть от разных видов урона, например, тот же голем, неуязвимый для режущего и колющего оружия.

А вообще почитайте Уроки скриптологии, это основа основ.
Ответить с цитированием
Старый 26.12.2010, 18:19   #2408
ForestDark

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

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

Люди есть вопрос))Как поменять оригинальный загрузочный экран с тремя магами воды на свою картинку?Плиз подскажите кто чё знает оч надо.За ранее благодарен :)
Ответить с цитированием
Старый 26.12.2010, 23:38   #2409
JokeR

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

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

2ForestDark:
Как поменять оригинальный загрузочный экран
Это же элементарно Форест...
Cпойлер(щелкните, чтобы прочесть):
для начала мы должны подготовить твою новую загрузочную текстуру, она должна быть размером 1024x 1024 (квадрат) и в разширении *.Tex *конвертировать её в этот формат можно с помощью программы Goman там сделать всё просто...
далее можно пойти по 1му пути -это запихнуть готовую текстуру StartScreen.tex в папку _work\data\textures\_compiled

или залить её в свой файл-мод , всё просто :)
Ответить с цитированием
Старый 27.12.2010, 13:55   #2410
ForestDark

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

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

JokeR огромное спасибо, ты оч помог мне)) ;D
Ответить с цитированием
Старый 17.01.2011, 02:51   #2411
zovsna

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

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

2leet it b: О, спасибо. Честно говоря, не особенно рассчитывал на ответ.
Текстуру лысого ГГ я не мудрствуя лукаво стащил из всё того же Sammel, и, в принципе,  часа за полтора вдохновенных экспериментов сумел заменить дефолтную визуализацию гг на новую, но с диалогом всё будет гораздо приятнее.
А где может быть механизм проверки при загрузке сейва? Я бы тоже его позаимствовал.
Ответить с цитированием
Старый 17.01.2011, 21:28   #2412
halogene

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

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

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

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


Спасибо.
Ответить с цитированием
Старый 04.02.2011, 20:12   #2414
halogene

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

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

2bbbk:
У меня в исходниках там вообще пустое место *;)

Насчет 0 или LOOP_CONTINUE, заглядываем в ai_constants.d и видим, что const int LOOP_CONTINUE = 0;
Значит с точки зрения компилятора — ему все равно, с точки зрения человека - LOOP_CONTINUE кмк правильнее, читаемость кода будет лучше, ну и красивее же.

Согласитесь, всегда приятнее (и понятнее) читать что-то вроде hStatus = hstLive;, чем hStatus = 1337; *;)
Ответить с цитированием
Старый 07.02.2011, 12:23   #2415
bbbk

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

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

Да, там пустое место; я исправляю ошибки *function should return value*, и поэтому возник вопрос, что именно в этом случае вставлять - return LOOP_CONTINUE или, может быть, вообще  Return True.
Спасибо.

Ответить с цитированием
Старый 17.03.2011, 04:36   #2416
Wandar

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

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

Не знаю точно, где про это лучше спрашивать, так что пусть будет здесь. :)
Господа Готоманы, у кого-ибудь имеется таблица отношений между гильдиями в Г2НВ? Ну, то есть тот самый константный массив, что лежит в AI\Human\Guilds.d, но в каком-нибудь более наглядном виде? Был бы очень признателен.
Ответить с цитированием
Старый 20.03.2011, 19:22   #2417
Magmatic

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

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

2Wandar:  там и так все доступно написано, если конечно ты смотришь скрипты из модкита.

Ответить с цитированием
Старый 23.03.2011, 22:44   #2418
Wandar

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

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

Вопрос по Г2НВ - какой считается причина атаки, если ГГ просто взял и ни с того ни с сего напал на кого-нибудь? AR_NONE? "Причина атаки" - это понятие вообще применимо к ГГ? Заранее спасибо.
Ответить с цитированием
Старый 24.03.2011, 00:41   #2419
B_Wolf

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

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

2Wandar:
это понятие вообще применимо к ГГ?
Нет. Потому как, причина атаки - это ответная реакция других НПЦ на определенные действия ГГ, или события в игровом мире.
К примеру если ГГ на глазах у охраны просто отметелит мирных прохожих, охранник атакуют ГГ с причиной атаки наказания ГГ. Если же ГГ убьет прохожего на глазах у других, у окружающих уже будет совсем другая причина атаки со смертельным исходом для ГГ.
Ответить с цитированием
Старый 24.03.2011, 04:22   #2420
Wandar

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

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

2Мухомор:
А вот, как оказалось, не совсем правы Вы, уважаемый. :) Ибо с точки зрения игры ГГ является таким же неписем, и, следовательно, обладает таким же набором параметров, что и другие. А это значит, что у него тоже есть массив переменных aivar, в котором в одном из элементов и записывается причина атаки. Только у ГГ этот элемент не меняется всю игру, а так и остаётся равным 0 (т.е. AR_NONE - я всё таки был прав :)). Значит, любая атака ГГ игрой считается атакой без причины.
Ответить с цитированием
Старый 26.03.2011, 22:25   #2421
halogene

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

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

2Wandar:
Значит, любая атака ГГ игрой считается атакой без причины.
Вы его можете изменить как и любой параметр аивара вот только, он не отрабатывается базовой логикой игры относительно ГГ, реакцию определяют взаимоотношения между гг и атакуемой целью, наблюдателями и гг, наблюдателями и атакуемой целью.

Проще говоря, зачем оно вам нужно? :)
Ответить с цитированием
Старый 02.04.2011, 09:45   #2422
JohaNBlack

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

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

Есть модель .mdm от второй Готы. Можно ли из нее получить .asc, для вставки в первую Готу?
Ответить с цитированием
Старый 02.04.2011, 13:07   #2423
MaGoth
A.G.F.C.
  Аватар для MaGoth
 
Регистрация: 04.09.2006
Сообщений: 20
MaGoth вне форума

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

2JohaNBlack:
А причем тут тема скриптинга, тебе с этими вопросами в тему модостроения нужно.

Что до вопроса, то используй ГотикСоурсер, если не знаешь как, то читай мануалы которые будут лежать в корневом каталоге установленной программы.
Отправить личное сообщение для Ответить с цитированием
Старый 08.04.2011, 18:06   #2424
Halzcedon

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

По умолчанию 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, 17:05   #2425
JohaNBlack

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

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

Как заставить мобов и людей возвращаться на свои места в первой Готе? Т.е. если моб из моего мода, вставленный через StartUp, погонится за мной и я от него убегу, то он так и остается стоять на месте. Мобы из оригинала возвращаются на свои точки спауна.
Ответить с цитированием
Старый 10.04.2011, 21:24   #2426
Halzcedon

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

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

(снимаю свой вопрос!)
2JohaNBlack:
Вероятно, на карте у тебя мало или нет Waypoint`ов, NPC просто не может найти рядом с ним путь, чтобы вернуться назад.
ЗЫ: вроде этого
Ответить с цитированием
Старый 10.04.2011, 22:43   #2427
JohaNBlack

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

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

2DEXARD: Waypoint'ов? Эти мобы и вставляются на вейпойнт, т.е. дорогу назад должны найти. При этом добавленные орки, если от них убежать, возвращаются назад. А мобы не хотят.

PS. Хотя... вейнетов рядом с ними вроде нет. Может из-за этого их глючит?
Ответить с цитированием
Старый 16.04.2011, 20:47   #2428
halogene

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

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

2JohaNBlack:
А расписание-то у вашего НПЦ имеется, чтобы возвращаться  к нему?
Ответить с цитированием
Старый 17.04.2011, 09:42   #2429
JohaNBlack

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

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

2leet it b: Это мобы. В частности полевые хищники, конвертнутые из второй Готы. Для прототипа я взял краулеров, так что у хищников их расписание.
Ответить с цитированием
Старый 17.04.2011, 19:07   #2430
halogene

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

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

2JohaNBlack:
Тогда вариант DEXARD — в зоне восприятия НПЦ нет вейпоинтов\фрипоинтов и он стоит на месте, ибо идти ему некуда.  ;)
Ответить с цитированием
Старый 17.04.2011, 20:43   #2431
JohaNBlack

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

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

2leet it b: В том-то и дело, что не так  :( Попробовал пару увести места их спауна, плюс с ними побежал падальщик. Они за мной пробежали, отстали, и остались стоять на месте, а падальщик развернулся и ушел на точку старта.
Ответить с цитированием
Старый 22.04.2011, 20:33   #2432
SkaIneT

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

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

Люди вот такая просьба. Скажите плз где искать скрипты в Гтике 2 Ночь ворона + Возвращение Rebalance UNI. У меня exe версия возвращения. Скрипты нужно найти от возвращения. Я искал во всех папках есть скрипты только от ночи ворона.=(
Ответить с цитированием
Старый 22.04.2011, 21:27   #2433
Halzcedon

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

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

2SkaIneT:
Скрипты находятся в специальном *.Mod или *.VDF файле.
Декомпилируем файлы программой "GothicVDFS", а скрипты декомпилят с программой "GothicSourcerV3_14"
Cпойлер(щелкните, чтобы прочесть):
Не знаю, законно ли отсылать чужие скрипты... будь что будет (ВОТ) :P
Ответить с цитированием
Старый 30.04.2011, 20:58   #2434
JohaNBlack

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

По умолчанию 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, 22:25   #2435
Magmatic

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

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

2JohaNBlack: Зря анимацию рендомировал. Сделал бы рендом яблок-курева-бухла с припиской применения анимации соответственно предмету, а так у тебя двойной рендом выходит: сперва яблоко, потом анимация, поэтому анимация и продукт потребления не совпадают.
Ответить с цитированием
Старый 30.04.2011, 22:51   #2436
Dimus

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

По умолчанию 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, 22:53   #2437
JohaNBlack

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

По умолчанию 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 из второй Готы, так как там люди могут целый день есть одно яблоко, поэтому я решил дополнить расписание второй части тем, что люди меняют предметы как в первой.
Ответить с цитированием
Старый 30.04.2011, 23:12   #2438
Dimus

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

По умолчанию 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, 15:29   #2439
JohaNBlack

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

По умолчанию 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, 15:07   #2440
KnightDron

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

По умолчанию 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. Использовались декомпилированные скрипты Акеллы
Ответить с цитированием
Страница 61 из 65 « Первая 11515455565758596061 62636465


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

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

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

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


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

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

AGFC: Valley of Gothic © 2004-2020

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