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

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

Расширенный поиск
Старый 13.02.2012, 18:00   #2521
halogene

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

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

2Berian:
Сделай собственную функцию расписания (ZS_), в которую НПЦ переходит после открытия ворот и в цикле которой проверяется дистанция до ГГ, и в случае ее увеличения до требуемой величины переводи НПЦ на другое расписание и закрывай ворота.

Либо (если свою ф-цию не хочется писать) добавь блок проверки дистанции для определенного нпц в ту функцию расписания в которой НПЦ находится после открытия ворот.
Ответить с цитированием
Старый 13.02.2012, 20:35   #2522
redleha

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

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

2Berian:
предложу свой вариант навскидку, хотя я бы сделал по-другому.
Делаешь Guard'у оверлей расписания, причем в этом расписании делаешь свою функцию на восприятие AssessPlayer. В этой функции следишь за положением ГГ. Когда расстояние от ГГ будет большим, причем, например, в течение нескольких секунд, то идёт выход из состояния с удалением оверлея расписания.
Ответить с цитированием
Старый 13.02.2012, 20:41   #2523
halogene

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

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

2redleha:
Это конкурс на более извращенную реализацию? ;D Особого ада добавят криво работающие оверлеи (в Г1, например)
Можно еще жука посадить, считающего дистанцию до ГГ и отслеживающего состояние НПЦ.
Ответить с цитированием
Старый 14.02.2012, 17:18   #2524
Berian

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

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

Сори за наглость :-/ а как это прописать? Если не трудно не могли бы примерно написать код, век буду помнить!
Я сделал так
Cпойлер(щелкните, чтобы прочесть):
func void DIA_ORG_2000_VOR_Info()
{
     AI_Output(other,self,"DIA_ORG_2000_VOR_15_00" ); //Вот 10 кусков руды.
     AI_Output(self,other,"DIA_ORG_2000_VOR_03_01" ); //Щас тебе откроют ворота.
     AI_StopProcessInfos(self);
     B_GiveInvItems(other,self,ItMiNugget,10);
     var C_Npc Guard;
     Guard = Hlp_GetNpc(ORG_2001_GUARD);
     AI_SetWalkMode(Guard,NPC_WALK);
     AI_GotoWP(Guard,"NC_LOCKOUT_VWHEEL");
     AI_UseMob(Guard,"VWHEEL",1);
     AI_UseMob(Guard,"VWHEEL",-1);
     if(Wld_GetMobState(Guard,"VWHEEL") == 1)
     {
           if(Npc_GetDistToNpc(Guard,hero) >= 3000)
           {
                 AI_SetWalkMode(Guard,NPC_WALK);
                 AI_UseMob(Guard,"VWHEEL",0);
                 AI_UseMob(Guard,"VWHEEL",-1);
                 AI_ContinueRoutine(Guard);
           };
     };
};


Добавление от 02/14/12, в 02:05:41
К примеру какова функция сканирования расстояния (self,other) :-/

Добавление от 02/14/12, в 17:38:01
Хех Спасибо всем в особенности "in soviet russia" за совет, разобрался! вот чё сделал, могет еому пригодиться
Создал новое ZS расписание
Cпойлер(щелкните, чтобы прочесть):

func void ZS_AAA()
{
     PrintDebugNpc(PD_TA_FRAME,"ZS_AAA");
     GuardPerception();
     AI_Standup(self);
     AI_SetWalkMode(self,NPC_WALK);
     AI_GotoWP(self,self.wp);
     if(Npc_GetDistToNpc(self,hero) >= 2000)
     {
           PrintDebugNpc(PD_TA_CHECK,"...Tor offen!");
           AI_UseMob(self,"VWHEEL",0);
           AI_UseMob(self,"VWHEEL",-1);
           AI_AlignToWP(self);
           Npc_ExchangeRoutine(self,"start");
           AI_ContinueRoutine(self);
     };
};


func void ZS_AAA_End()
{
     PrintDebugNpc(PD_TA_FRAME,"ZS_AAA_End");
};

Его можно менять под каждого непися
И вставил в функции диалога просто название рутины этого непися
Cпойлер(щелкните, чтобы прочесть):
func void DIA_ORG_2000_VOR_Info()
{
     AI_Output(other,self,"DIA_ORG_2000_VOR_15_00" ); //Вот 10 кусков руды.
     AI_Output(self,other,"DIA_ORG_2000_VOR_03_01" ); //Щас тебе откроют ворота.
     AI_StopProcessInfos(self);
     B_GiveInvItems(other,self,ItMiNugget,10);
     var C_Npc Guard;
     Guard = Hlp_GetNpc(ORG_2001_GUARD);
     AI_SetWalkMode(Guard,NPC_WALK);
     AI_GotoWP(Guard,"NC_LOCKOUT_VWHEEL");
     AI_UseMob(Guard,"VWHEEL",1);
     AI_UseMob(Guard,"VWHEEL",-1);
     Npc_ExchangeRoutine(Guard,"Open");
     AI_ContinueRoutine(Guard);
};
. Вот что у непися
Cпойлер(щелкните, чтобы прочесть):
     daily_routine = Rtn_start_2001;
};


func void Rtn_start_2001()
{
     TA_Boss(8,0,22,0,"VAROTA1");
     TA_Boss(22,0,8,0,"VAROTA1");
};


func void Rtn_Open_2001()
{      
     TA_AAA(8,0,22,0,"NC_LOCKOUT_VWHEEL");
     TA_AAA(22,0,8,0,"NC_LOCKOUT_VWHEEL");
};

Ну всё. Ещё раз огромное СПАСИБО за подсказку!  ;)
Ответить с цитированием
Старый 16.02.2012, 23:22   #2525
Berian

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

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

Всем привет. Ещё один вопросик! Надо добавить полноценный пункт меню со своими разветвления, в совершенно другое именно разветвление диалога :-/
Примерно как это мона реализовать. Вроде вставить получилось, но вот разветвление просто не отображаеться, так как в функциях разветвления "ClearChoices" применяеться на другой диалог :-/
Конечно можно прописать полностью весь диалог несколько раз, первй как полноценный диалог, а второй как разветвления другово диалога. Но как-то по мне такой вариант примитивен, так как этот полноценный диалог надо засунуть не в одно разветвление диалогов. Пасибо заранее!
Ответить с цитированием
Старый 16.02.2012, 23:59   #2526
B_Wolf

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

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

2Berian:
Всем привет. Ещё один вопросик! Надо добавить полноценный пункт меню со своими разветвления, в совершенно другое именно разветвление диалога
Создай новую часть диалога и условием соедини с предыдущим. Так сделаны все диалоги в игре, открой любого НПЦ с большим количеством ветвлений.
Ответить с цитированием
Старый 17.04.2012, 13:10   #2527
jokerrr2k7

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

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

Платформа Г2

1) Такой вопрос, господа мододелы: мне нужно изменять значение глобальной переменной при молитвах у статуй Белиара. Скрипт на использование айтемов (скроллы, документы) я нашел как вешать, но тут я так понял другое  - это не айтем. Можно как то это сделать без спейсера, только в скриптах? Или все таки нужно лезть в спейсер и вносить изменения в зен?

2) И еще: можно ли в скриптах отследить попадание по врагу оружием или магией?

Ответить с цитированием
Старый 27.04.2012, 16:04   #2528
jokerrr2k7

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

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

Извиняюсь, за повтор, но может кто то ответит, вообще возможно ли это? Делаю чисто скриптовый мод. Зен ковырять не хотелось бы. Если что - от некоторых вещей просто откажусь...
Ответить с цитированием
Старый 27.04.2012, 16:54   #2529
dimmell

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

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

2Злой Гений:
1. поконкретней напишите что хотите сделать. Если надо просто добавить функцию статуям Белиара, то это можно сделать и в простом блокноте типа Notepad++
Подробнее ЗДЕСЬ
2. Функции типа b_MM_AssessDamage(), B_AssessDamage(), B_AssessMagic() и т.д.
Ответить с цитированием
Старый 27.04.2012, 17:47   #2530
jokerrr2k7

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

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

Да, именно : при молитве - карма уменьшается к примеру.
Спасибо за инфу, попробую.
Ответить с цитированием
Старый 09.07.2012, 13:30   #2531
Tony92

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

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

Всем добрый день. Прочитав все посты про регенерацию здоровья/маны все таки остался такой вопрос: использование для регена параметров atr_regeneratehp/mana на мой взгляд рациональнее, но они регенят по 1 минимум за секунду. Собственно вопрос: никто не пытался найти механизм работы этой регенерации? Ведь должна же быть где то функция, которая работает с этими параметрами и делает весь этот процесс.
Ответить с цитированием
Старый 09.07.2012, 16:29   #2532
MaGoth
A.G.F.C.
  Аватар для MaGoth
 
Регистрация: 04.09.2006
Сообщений: 20
MaGoth вне форума

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

2Tony92: Конечно есть, она вшита движок. :)
Отправить личное сообщение для Ответить с цитированием
Старый 09.07.2012, 20:02   #2533
Tony92

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

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

И до нее никак не добраться? Это прискорбно(
Ответить с цитированием
Старый 11.07.2012, 16:47   #2534
Tony92

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

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

подскажите, как можно сделать меч-вампир? т.е. чтобы при ударе он восстанавливал определенное кол-во жизни?
Ответить с цитированием
Старый 22.07.2012, 14:59   #2535
dimmell

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

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

2Tony92:
Собственно вопрос: никто не пытался найти механизм работы этой регенерации? Ведь должна же быть где то функция, которая работает с этими параметрами и делает весь этот процесс.
без проблем и глюков работает любая регенерация с любым шагом сделанная с использованием циклического триггера без использования atr_regeneratehp/mana

Добавление от 07/22/12, в 15:01:12
подскажите, как можно сделать меч-вампир? т.е. чтобы при ударе он восстанавливал определенное кол-во жизни?
по аналогии с когтем Белиара. См. B_BeliarsWeaponSpecialDamage.d
Ответить с цитированием
Старый 03.09.2012, 01:34   #2536
Joha

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

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

Всем привет.Подскажите пожалуйста,вот скрипт игры в карты(21) проблема в том что в 3 раунде всегда получается только ничья
Cпойлер(щелкните, чтобы прочесть):
instance DIA_Nagur_Carts(C_Info)
{
     npc = VLK_493_Nagur;
     nr = 6;
     condition = DIA_Nagur_Carts_Condition;
     information = DIA_Nagur_Carts_Info;
     permanent = TRUE;
     description = "Давай сиграем в карты?";
};

func int DIA_Nagur_Carts_Condition()
{
     if(hero.guild == GIL_NONE)
     {
           return TRUE;
     };
     return FALSE;
};

func void DIA_Nagur_Carts_Info()
{
     AI_Output(other,self,"DIA_Nagur_Carts_15_00") ;      //Давай сиграем в карты?
     AI_Output(self,other,"DIA_Nagur_Carts_15_00") ;      //Давай!Делай ставки
     Info_ClearChoices(DIA_Nagur_Carts);
     Info_AddChoice(DIA_Nagur_Carts,"Но у меня недостаточно золота ... (НАЗАД)",DIA_Nagur_Carts_BACK);
     Info_AddChoice(DIA_Nagur_Carts,"(50  золота)",DIA_Nagur_Carts_50);
     Info_AddChoice(DIA_Nagur_Carts,"(100 золота)",DIA_Nagur_Carts_100);
     Info_AddChoice(DIA_Nagur_Carts,"(200 золота)",DIA_Nagur_Carts_200);
};

func void DIA_Nagur_Carts_BACK()
{
     AI_Output(other,self,"DIA_Nagur_Carts_BACK_15_00" );      //Но у меня недостаточно золота...
     AI_Output(self,other,"DIA_Nagur_Carts_BACK_10_01" );      //Тогда проваливай.
     Info_ClearChoices(DIA_Nagur_Carts);
};

func void DIA_Nagur_Carts_50()
{
     if(Npc_HasItems(other,ItMi_Gold) >= 50)
     {
           Nagur_Carts_banned = False;
           B_GiveInvItems(other,self,ItMi_Gold,50);
           Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
           CreateInvItems(self,ItMi_Gold,100);
           AI_Output(self,other,"DIA_Nagur_Carts_50_10_0 0");      //Начинаем 1 раунд.
           round = 1;
           random1 = Hlp_Random(11);
           random2 = Hlp_Random(11);
           if(random1 == 0)
           {
                 cartschange1 = 1;
           };
           if(random1 == 1)
           {
                 cartschange1 = 2;
           };
           if(random1 == 2)
           {
                 cartschange1 = 3;
           };
           if(random1 == 3)
           {
                 cartschange1 = 4;
           };
           if(random1 == 4)
           {
                 cartschange1 = 5;
           };
           if(random1 == 5)
           {
                 cartschange1 = 6;
           };
           if(random1 == 6)
           {
                 cartschange1 = 7;
           };
           if(random1 == 7)
           {
                 cartschange1 = 8;
           };
           if(random1 == 8)
           {
                 cartschange1 = 9;
           };
           if(random1 == 9)
           {
                 cartschange1 = 10;
           };
           if(random1 == 10)
           {
                 cartschange1 = 11;
           };
           if(random2 == 0)
           {
                 cartschange2 = 1;
           };
           if(random2 == 1)
           {
                 cartschange2 = 2;
           };
           if(random2 == 2)
           {
                 cartschange2 = 3;
           };
           if(random2 == 3)
           {
                 cartschange2 = 4;
           };
           if(random2 == 4)
           {
                 cartschange2 = 5;
           };
           if(random2 == 5)
           {
                 cartschange2 = 6;
           };
           if(random2 == 6)
           {
                 cartschange2 = 7;
           };
           if(random2 == 7)
           {
                 cartschange2 = 8;
           };
           if(random2 == 8)
           {
                 cartschange2 = 9;
           };
           if(random2 == 9)
           {
                 cartschange2 = 10;
           };
           if(random2 == 10)
           {
                 cartschange2 = 11;
           };
           AI_Output(self,other,"DIA_Nagur_Carts_50_10_0 1");      //Закончился 1 раунд.
           concatText = ConcatStrings("Мои очки - 1 раунд ",IntToString(cartschange1));
           PrintScreen(concatText,-1,35,FONT_Screen,5);
           concatText = ConcatStrings("Нагура очки - 1 раунд ",IntToString(cartschange2));
           PrintScreen(concatText,-1,40,FONT_Screen,5);
           round = 2;
           Info_ClearChoices(DIA_Nagur_Carts);
           Info_AddChoice(DIA_Nagur_Carts,"2 раунд",DIA_Nagur_Carts_50_2round);
     }
     else if(Npc_HasItems(other,ItMi_Gold) < 50)
     {
           AI_Output(self,other,"DIA_Nagur_Carts_50_10_1 2");      //Возвращайся, когда у тебя будет достаточно золота.
           PrintScreen(Print_NotEnoughGold,-1,-1,FONT_Screen,2);
     };
};      

func void DIA_Nagur_Carts_50_2round()
{
     if(round == 2)
     {
           AI_Output(self,other,"DIA_Nagur_Carts_50_2round_1 0_00");      //Начинаем 2 раунд.
           random1 = Hlp_Random(11);
           random2 = Hlp_Random(11);
           if(random1 == 0)
           {
                 cartschange1 = cartschange1 + 1;
           };
           if(random1 == 1)
           {
                 cartschange1 = cartschange1 + 2;
           };
           if(random1 == 2)
           {
                 cartschange1 = cartschange1 + 3;
           };
           if(random1 == 3)
           {
                 cartschange1 = cartschange1 + 4;
           };
           if(random1 == 4)
           {
                 cartschange1 = cartschange1 + 5;
           };
           if(random1 == 5)
           {
                 cartschange1 = cartschange1 + 6;
           };
           if(random1 == 6)
           {
                 cartschange1 = cartschange1 + 7;
           };
           if(random1 == 7)
           {
                 cartschange1 = cartschange1 + 8;
           };
           if(random1 == 8)
           {
                 cartschange1 = cartschange1 + 9;
           };
           if(random1 == 9)
           {
                 cartschange1 = cartschange1 + 10;
           };
           if(random1 == 10)
           {
                 cartschange1 = cartschange1 + 11;
           };
           if(random2 == 0)
           {
                 cartschange2 = cartschange2 + 1;
           };
           if(random2 == 1)
           {
                 cartschange2 = cartschange2 + 2;
           };
           if(random2 == 2)
           {
                 cartschange2 = cartschange2 + 3;
           };
           if(random2 == 3)
           {
                 cartschange2 = cartschange2 + 4;
           };
           if(random2 == 4)
           {
                 cartschange2 = cartschange2 + 5;
           };
           if(random2 == 5)
           {
                 cartschange2 = cartschange2 + 6;
           };
           if(random2 == 6)
           {
                 cartschange2 = cartschange2 + 7;
           };
           if(random2 == 7)
           {
                 cartschange2 = cartschange2 + 8;
           };
           if(random2 == 8)
           {
                 cartschange2 = cartschange2 + 9;
           };
           if(random2 == 9)
           {
                 cartschange2 = cartschange2 + 10;
           };
           if(random2 == 10)
           {
                 cartschange2 = cartschange2 + 11;
           };
           AI_Output(self,other,"DIA_Nagur_Carts_50_2round_1 0_01");      //Закончился 2 раунд.
           concatText = ConcatStrings("Мои очки - 2 раунд ",IntToString(cartschange1));
           PrintScreen(concatText,-1,45,FONT_Screen,5);
           concatText = ConcatStrings("Нагура очки - 2 раунд ",IntToString(cartschange2));
           PrintScreen(concatText,-1,50,FONT_Screen,5);
           if((round == 2) && (cartschange1 > 21) && (cartschange2 < 21) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_2round_1 0_04");      //Ты проиграл во 2 раунде.
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round == 2) && (cartschange2 > 21) && (cartschange1 < 21) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_10_2roun d_03");      //Ты выиграл во 2 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,100);
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round == 2) && (cartschange1 > 21) && (cartschange2 > 21) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_2round_1 0_04");      //Ничья во 2 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,50);
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else
           {
                 round = 3;
                 Info_ClearChoices(DIA_Nagur_Carts);
                 Info_AddChoice(DIA_Nagur_Carts,"3 раунд",DIA_Nagur_Carts_50_3round);
           };
     };      
};      

func void DIA_Nagur_Carts_50_3round()
{
     if(round == 3)
     {
           AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_00");      //Начинаем 3 раунд.
           random1 = Hlp_Random(11);
           random2 = Hlp_Random(11);
           if(random1 == 0)
           {
                 cartschange1 = cartschange1 + 1;
           };
           if(random1 == 1)
           {
                 cartschange1 = cartschange1 + 2;
           };
           if(random1 == 2)
           {
                 cartschange1 = cartschange1 + 3;
           };
           if(random1 == 3)
           {
                 cartschange1 = cartschange1 + 4;
           };
           if(random1 == 4)
           {
                 cartschange1 = cartschange1 + 5;
           };
           if(random1 == 5)
           {
                 cartschange1 = cartschange1 + 6;
           };
           if(random1 == 6)
           {
                 cartschange1 = cartschange1 + 7;
           };
           if(random1 == 7)
           {
                 cartschange1 = cartschange1 + 8;
           };
           if(random1 == 8)
           {
                 cartschange1 = cartschange1 + 9;
           };
           if(random1 == 9)
           {
                 cartschange1 = cartschange1 + 10;
           };
           if(random1 == 10)
           {
                 cartschange1 = cartschange1 + 11;
           };
           if(random2 == 0)
           {
                 cartschange2 = cartschange2 + 1;
           };
           if(random2 == 1)
           {
                 cartschange2 = cartschange2 + 2;
           };
           if(random2 == 2)
           {
                 cartschange2 = cartschange2 + 3;
           };
           if(random2 == 3)
           {
                 cartschange2 = cartschange2 + 4;
           };
           if(random2 == 4)
           {
                 cartschange2 = cartschange2 + 5;
           };
           if(random2 == 5)
           {
                 cartschange2 = cartschange2 + 6;
           };
           if(random2 == 6)
           {
                 cartschange2 = cartschange2 + 7;
           };
           if(random2 == 7)
           {
                 cartschange2 = cartschange2 + 8;
           };
           if(random2 == 8)
           {
                 cartschange2 = cartschange2 + 9;
           };
           if(random2 == 9)
           {
                 cartschange2 = cartschange2 + 10;
           };
           if(random2 == 10)
           {
                 cartschange2 = cartschange2 + 11;
           };
           AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_01");      //Закончился 3 раунд.
           concatText = ConcatStrings("Мои очки - 3 раунд ",IntToString(cartschange1));
           PrintScreen(concatText,-1,55,FONT_Screen,5);
           concatText = ConcatStrings("Нагура очки - 3 раунд ",IntToString(cartschange2));
           PrintScreen(concatText,-1,60,FONT_Screen,5);
           if((round == 3) && (cartschange1 > 21) && (cartschange2 > 21) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_2");      //Ничья в 3 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,50);
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round == 3) && ((cartschange1 == cartschange2) < 22) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_3");      //Ничья в 3 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,50);
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round >= 3) && ((cartschange1 > cartschange2) < 22) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_4");      //Ты выиграл в 3 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,100);
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round >= 3) && (cartschange1 > 21) && (cartschange2 < 22) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_5");      //Ты проиграл в 3 раунде.
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round >= 3) && (cartschange2 > 21) && (cartschange1 < 22) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_5");      //Ты выиграл в 3 раунде.
                 B_GiveInvItems(self,other,ItMi_Gold,100);
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           }
           else if((round >= 3) && ((cartschange2 > cartschange1) < 22) && (Nagur_Carts_banned == FALSE))
           {
                 AI_Output(self,other,"DIA_Nagur_Carts_50_3round_1 0_5");      //Ты проиграл в 3 раунде.
                 Npc_RemoveInvItems(self,ItMi_Gold,Npc_HasItems(se lf,ItMi_Gold));
                 Nagur_Carts_banned = TRUE;
                 AI_StopProcessInfos(self);
                 Info_ClearChoices(DIA_Nagur_Carts);
           };
     };      
};      

func void DIA_Nagur_Carts_100()
{
     AI_StopProcessInfos(self);
};

func void DIA_Nagur_Carts_200()
{
     AI_StopProcessInfos(self);
};
Ответить с цитированием
Старый 03.09.2012, 01:44   #2537
Joha

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

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

Долгое время решался сюда зайти и задать вопросы по скриптингу. Много накопилось :)
1. Допустим при разговоре с нпс создается в блокноте запись - (сегодня 5 день).вопрос как сделать так чтобы топик менял цифру числа но запись не менял,не удаляя топик только.
2. Можно ли на экран линии жизни и маны поставить еще и цифры,если да то как примерно или где посмотреть пример.
3. хочу бриану сделать ежедневное появление сырой стали
Cпойлер(щелкните, чтобы прочесть):
var int briendaynow;

func void B_GiveTradeInv_Brian(var C_Npc slf)
{  
     if((Kapitel >= 1) && (Brian_ItemsGiven_Chapter_1 == FALSE))
     {
           CreateInvItems(slf,ItMi_Gold,20);
           CreateInvItems(slf,ItMiSwordraw,2);
           Brian_ItemsGiven_Chapter_1 = TRUE;
           briendaynow = Wld_GetDay();
     };
     if((Kapitel >= 1) && (Brian_ItemsGiven_Chapter_1 == TRUE) && (briendaynow < daynow))
     {
           CreateInvItems(Brian,ItMi_Gold,20);
           CreateInvItems(Brian,ItMiSwordraw,2);
           briendaynow = Wld_GetDay();
     };
только ничего не выходит
Ответить с цитированием
Старый 03.09.2012, 13:52   #2538
Dimus

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

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

2Joha:
1. Скачайте уроки скриптологии от Vam и изучите список функций работы с дневником - там нет средств для переименования или удаления тем.
2. Не знаю, т.к я видел только моды, изменяющие внешний вид и количество полосок. :-/
3. В функции B_GiveTradeInv инвентарь торговца пополняется только 1 раз в главу. Лучше введите генерацию нескольких стальных заготовок 1 раз в день в каком-нибудь диалоге с Брайаном, например, DIA_Brian_WASKAUFEN_Info. Или добавьте в расписание Брайана, чтобы он периодически подходил к кузнечному горну в то время, когда Харад работает на наковальне или охлаждает заготовки мечей - тогда в его инвентаре будут появляться сырые и раскалённые заготовки. Но учтите, что появление бесконечных стальных заготовок даже у одного NPC убьёт игровой баланс, т.к. на продаже простых самокованных мечей можно наварить значительный капитал. Недаром в G2a_NR_ScriptPatch этот эксплойт были ликвидирован:
- Больше нельзя получить от кузнецов дополнительные стальные заготовки, а от алхимиков дополнительные мензурки.
Ответить с цитированием
Старый 03.09.2012, 15:43   #2539
Joha

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

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

Добрый день. Возникла проблема при компиляции скрипта такого рода - сначала была ошибка неизвестного concatTex,объявил,теперь ошибка не возвращает значение MILWEAPONTAKE1Left.
Cпойлер(щелкните, чтобы прочесть):

var int concatText; // грубейшая ошибка в типе переменной - должно быть string!

instance DIA_MIL_6_WEAPONTAKE1(C_Info)
{
* * *nr = 3;
* * *condition = DIA_MIL_6_WEAPONTAKE1_Condition;
* * *information = DIA_MIL_6_WEAPONTAKE1_Info;
* * *permanent = TRUE;
* * *description = "Нужен меч?";
};


func int DIA_MIL_6_WEAPONTAKE1_Condition()
{
* * *if((MIS_MIL_WEAPONTAKE1 == LOG_Running) && (Npc_HasItems(self,ItMw_1H_Common_01) == 0) && (Npc_HasItems(other,ItMw_1H_Common_01) >= 1))
* * *{
* * * * * *return TRUE;
* * *};
* * *return FALSE;
};

func void DIA_MIL_6_WEAPONTAKE1_Info()
{
* * *AI_Output(other,self,"DIA_MIL_6_WEAPONTAKE_15_00" ); * * *//Нужен меч?
* * *AI_Output(self,other,"DIA_MIL_6_WEAPONTAKE_06_01" ); * * *//Конечно, давай *его сюда. Кто же откажется от такого подарка судьбы.
* * *B_GiveInvItems(other,self,ItMw_1H_Common_01,1);
* * *MILWEAPONTAKE1 = MILWEAPONTAKE1 + 1;
* * *AI_EquipBestMeleeWeapon(self);
* * *MILWEAPONTAKE1Left = (MIL_POPULARY - MILWEAPONTAKE1);
* * *concatText = ConcatStrings("Осталось мечей ",IntToString(MILWEAPONTAKE1Left));
* * *PrintScreen(concatText,-1,45,FONT_Screen,5);
};

func void B_AssignAmbientInfos_MIL_6(var C_Npc slf)
{
* * *dia_mil_6_exit.npc = Hlp_GetInstanceID(slf);
* * *dia_mil_6_join.npc = Hlp_GetInstanceID(slf);
* * *dia_mil_6_people.npc = Hlp_GetInstanceID(slf);
* * *dia_mil_6_location.npc = Hlp_GetInstanceID(slf);
* * *dia_mil_6_standard.npc = Hlp_GetInstanceID(slf);
* * *DIA_MIL_6_WEAPONTAKE1.npc = Hlp_GetInstanceID(slf);
};

А вот етот скрипт работает
Cпойлер(щелкните, чтобы прочесть):
instance DIA_Wambo_WEAPONTAKE1(C_Info)
{
* * *npc = Mil_316_Wambo;
* * *nr = 3;
* * *condition = DIA_Wambo_WEAPONTAKE1_Condition;
* * *information = DIA_Wambo_WEAPONTAKE1_Info;
* * *permanent = TRUE;
* * *description = "Нужен меч?";
};


func int DIA_Wambo_WEAPONTAKE1_Condition()
{
* * *if((MIS_MIL_WEAPONTAKE1 == LOG_Running) && (Npc_HasItems(self,ItMw_1H_Common_01) == 0) && (Npc_HasItems(other,ItMw_1H_Common_01) >= 1))
* * *{
* * * * * *return TRUE;
* * *};
* * *return FALSE;
};

func void DIA_Wambo_WEAPONTAKE1_Info()
{
* * *AI_Output(other,self,"DIA_Wambo_WEAPONTAKE_15_00" ); * * *//Нужен меч?
* * *AI_Output(self,other,"DIA_Wambo_WEAPONTAKE_06_01" ); * * *//Конечно, давай его сюда. Кто же откажется от такой стали.
* * *B_GiveInvItems(other,self,ItMw_1H_Common_01,1);
* * *MILWEAPONTAKE1 = MILWEAPONTAKE1 + 1;
* * *AI_EquipBestMeleeWeapon(self);
* * *MILWEAPONTAKE1Left = (MIL_POPULARY - MILWEAPONTAKE1);
* * *concatText = ConcatStrings("Осталось мечей",IntToString(MILWEAPONTAKE1Left));
* * *PrintScreen(concatText,-1,45,FONT_Screen,5);
};

Ответить с цитированием
Старый 03.09.2012, 21:43   #2540
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

2Joha:

var int concatText;
...
concatText = ConcatStrings("Осталось мечей ",IntToString(MILWEAPONTAKE1Left));
Если не ошибаюсь, имеет место несовпадение типов переменных.

Добавление от 09/03/12, в 21:50:27
2Dimus:

изучите список функций работы с дневником - там нет средств для переименования или удаления тем
А строковую переменную можно в дневник записать? Если да, то можно для каждой записи в дневнике (там, где это нужно по замыслу автора) сформировать строковую переменную "Сегодня NN день." и сделать такую запись в дневник.
Отправить личное сообщение для Ответить с цитированием
Старый 03.09.2012, 23:00   #2541
Joha

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

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

Добрый вечер. Кто-нибудь может подсказать ответ на мой пост выше про карты?Заранее благодарен.
Ответить с цитированием
Старый 03.09.2012, 23:06   #2542
Dimus

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

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

2ElderGamer:
Если не ошибаюсь, имеет место несовпадение типов переменных.
Да, вместо типа int должен быть string.

А строковую переменную можно в дневник записать?
Разумеется, можно.
Ответить с цитированием
Старый 03.09.2012, 23:25   #2543
Joha

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

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

Cпойлер(щелкните, чтобы прочесть):
AI_Output(other,self,"DIA_Wambo_WEAPONTAKE_15_00") ; * * *//Нужен меч?
* * *AI_Output(self,other,"DIA_Wambo_WEAPONTAKE_06_01" ); * * *//Конечно, давай его сюда. Кто же откажется от такой стали.
* * *B_GiveInvItems(other,self,ItMw_1H_Common_01,1);
* * *MILWEAPONTAKE1 = MILWEAPONTAKE1 + 1;
* * *AI_EquipBestMeleeWeapon(self);
* * *MILWEAPONTAKE1Left = (MIL_POPULARY - MILWEAPONTAKE1);
* * *concatText = ConcatStrings("Осталось мечей",IntToString(MILWEAPONTAKE1Left));
* * *PrintScreen(concatText,-1,45,FONT_Screen,5);
попробую еще раз спросить.вот эта часть скрипта в диалоге с ополченцем с имеющим личный например dia_mil_wambo работает а вот вставляю этот скрипт сюда B_AssignAmbientInfos_MIL_6 то ругается компилятор 1 ошибка неопределен concatText . 2 ошибка функция не возвращает return - int
Cпойлер(щелкните, чтобы прочесть):
concatText = ConcatStrings("Осталось мечей",IntToString(MILWEAPONTAKE1Left));
* * *PrintScreen(concatText,-1,45,FONT_Screen,5);


И может кто ответить на этот пост? http://forums.gothic.ag/showthread.p...0&goto=6991947 Спасибо
Ответить с цитированием
Старый 04.09.2012, 06:46   #2544
luciano

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

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

2Joha:
неопределен concatText
Ну так определи переменную заранее, в чем дело-то?
Или ты думаешь, что мы тут тебя будем программированию учить?
а вот вставляю этот скрипт сюда
Значит при вставлянии пропадает определение переменной, только и всего.
Ответить с цитированием
Старый 26.09.2012, 15:37   #2545
dimmell

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

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

2Joha:
И может кто ответить на этот пост?
А что это за условия такие:
((cartschange1 == cartschange2) < 22)
Даже если предположить что движок сможет додуматься и обработать -  любом случае и 1 и 0 < 22
Распишите отдельно:
(cartschange1 == cartschange2) && (cartschange1 < 22)

И еще: лучше прописывать условия в виде:
if(random1 <= 1)
...
else if(random1 <= 2)
...
else if(random1 <= 9)
...
else // для значения <= 10
...
для более корректной обработки, тогда в любом случае присвоится значение
Ответить с цитированием
Старый 31.10.2012, 20:32   #2546
Halzcedon

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

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

Каким образом можно произвести подсчёт стрел в инвентаре гг?
Заранее спасибо!
Ответить с цитированием
Старый 01.11.2012, 10:48   #2547
Dimus

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

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

2DEXARD:
Для подсчёта количества предметов у ГГ и NPC используется функция
Cпойлер(щелкните, чтобы прочесть):
int Npc_HasItems (c_npc n0, int itemInstance); - возвращает количество предметов itemInstance у НПС n0.
Эта инфа взята из уроков скриптологии от Vam (ссылка на на предидущей странице темы).
Ответить с цитированием
Старый 01.11.2012, 16:16   #2548
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

Есть и более сложные случаи. Не знаю, как это делается в Г2, а в Г1 для определения количества боеприпасов для экипированного в данный момент оружия (либо лук, либо арбалет - боеприпасы разные) используется функция

func int Npc_GetInvItemBySlot(var C_NPC npc, var int category, var int slot);

Cпойлер(щелкните, чтобы прочесть):
// возвращает кол- во предметов, которые находятся у НПС npc,
// где category – категория инвентаря
// (INV_WEAPON, INV_ARMOR, INV_RUNE, INV_MAGIC, INV_FOOD, INV_POTION, INV_DOC, INV_MISC)
// slot – номер слота предмета.
Отправить личное сообщение для Ответить с цитированием
Старый 15.11.2012, 20:49   #2549
JohaNBlack

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

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

Не знаю, в ту ли тему пишу. Проблема с анимацией во второй части. Переношу из первой анимацию Excalibur_1, используется в храме Спящего,  где герой втыкает клинок в камень в полу. Перенес .asc модель, все .man'ы, прописал в Humans.mds. Но хоть тресни, анимация не работает, герой просто встает перед камнем и все. До этого переносил по этому же алгоритму анимацию Barrelo, где герой прячется в бочку, она работает, а Excalibur_1 нет.
Ответить с цитированием
Старый 16.11.2012, 10:16   #2550
B_Wolf

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

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

2JohaNBlack:
Я тоже переносил, все работает.
1. humans.mds не забыл перекомпилировать в humans.msb?
2. в Спейсере, в вобе, куда тыкаешь меч правильное имя требуемого итема указано?
Ответить с цитированием
Старый 16.11.2012, 19:30   #2551
JohaNBlack

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

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

2UkroLeha: Имя указано правильное. Зачем перекомпилировать в .msb, если в оригинале так и остается .mds? Да и другие перенесенные анимации прекрасно работают с .mds. И кстати, я не знаю, как перекомпилировать в msb.
Ответить с цитированием
Старый 16.11.2012, 22:15   #2552
B_Wolf

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

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

2JohaNBlack:
Г2-НВ работает только с MSB. Чтобы MDS перекомпилировать в MSB, нужно удалить текущий MSB.
Ответить с цитированием
Старый 17.11.2012, 12:32   #2553
JohaNBlack

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

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

2UkroLeha: Попробовал удалить, так игра вообще не запускается, жалуется на огромное количество недостающих или уже существующих файлов анимации. Мне кажется, ты не прав насчет работы только с msb. Я уже перенес несколько анимации, отсутсвующих во второй части, и прописывал их только в mds файле мода, не удаляя старый mds или msb. И они работают, а конкретно эта - нет.
Ответить с цитированием
Старый 17.11.2012, 16:37   #2554
B_Wolf

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

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

2JohaNBlack:
Мне кажется, ты не прав насчет работы только с msb.
Каждый вправе иметь собственное мнение ;)

2JohaNBlack:
Я уже перенес несколько анимации, отсутсвующих во второй части, и прописывал их только в mds файле мода, не удаляя старый mds или msb. И они работают, а конкретно эта - нет.
Я перенес ВСЕ анимации из Г1 в Г2-НВ, которых там не было и каждый раз движком игры перекомпилировал MDS в MSB. Чтобы удачно это сделать все анимации должны быть распакованы из vdf файлов, а для недостающих должны быть "сырые" декомпилированные ASC файлы.
Ответить с цитированием
Старый 17.11.2012, 16:42   #2555
JohaNBlack

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

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

2UkroLeha:  Анимации распакованы, asc файлы есть в vdf мода, и при загрузке уровня вылазит ошибка ANI ALREADY DEFINED: T_GRAVE_STAND_S0. MSB файл не компилируется до конца, в конце у него обрыв строки из-за вылета. Проверил, файл T_GRAVE_STAND_S0 прописан только в одной анимации в mds.
Ответить с цитированием
Старый 17.11.2012, 16:49   #2556
B_Wolf

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

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

2JohaNBlack:
asc файлы есть в vdf мода
В vdf вообще ничего не должно быть из сырья. Также после распаковки всех анимаций из VDF, сами vdf должны быть отключены (удалить или переименовать расширение vdf на другое, например .disabled)
Ответить с цитированием
Старый 17.11.2012, 17:16   #2557
JohaNBlack

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

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

2UkroLeha: То есть мне удалить asc и man файлы из vdf мода, и кинуть их же в папку _work самой игры? Так я тоже пробовал, не работает.
Ответить с цитированием
Старый 17.11.2012, 17:22   #2558
B_Wolf

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

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

2JohaNBlack:
_work\data\anims - сюда сырые ASC
_work\data\anims\_COMPILED - сюда компилированные

Игра первым делом читает файлы из VDF или MOD, уже потом распакованные, т.е. если у тебя внутри VDF уже есть файл с тем же именем, вначале игра попытается прочитать его оттуда. Нужно отключить ВСЕ VDF, где может встречаться файл, который нужно изменить.
Ответить с цитированием
Старый 17.11.2012, 17:41   #2559
JohaNBlack

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

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

2UkroLeha: Кинул в \anims excalibur_1.asc и HUM_EXCALIBUR_M01. В /_compiled кинул пять .man'ов. Из vdf мода удалил все эти файлы. Итог - в папке /compiled появляется excalibur_1.mdl, анимация так и не работает, герой тупо встает перед камнем.

Update: удалил humans.msb, докинул пару asc, которых не хватало, и анимация заработала. Какие файлы мне теперь кидать в vdf мода, чтобы анимация работала на любом компе? Т.е. чтобы юзеру не приходилось распаковывать vdf оригинала, или делать что-то еще?
Ответить с цитированием
Старый 17.11.2012, 21:40   #2560
B_Wolf

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

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

2JohaNBlack:
В vdf упаковывай все новые компилированные файлы из _work\data\anims\_COMPILED
Ответить с цитированием
Страница 64 из 65 « Первая 14545758596061626364 65


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

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

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

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


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

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

AGFC: Valley of Gothic © 2004-2022

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