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

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

Расширенный поиск
Старый 12.09.2011, 20:57   #2481
halogene

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

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

2ElderGamer: Попробуйте покопать в сторону func void init_oldmine() что находится в startup.d, ЕМНИП она выполняется движком каждый раз при загрузки локации, в данном случае шахты. Останется только проверить номер главы при входе в шахту (или еще какие-либо условия).
Ответить с цитированием
Старый 13.09.2011, 11:21   #2482
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

2Dimus: 2in soviet russia:

Спасибо! Прописал смену распорядка в эту функцию. Распорядок поменялся. Но вот отправляться на несуществующий WP страж не хочет, также стоит на своём месте. Максимум, что пока мне удалось, это отослать стража в дальний конец шахты и там убить. Но как сделать так, чтобы тело исчезло? Я попытался перед убийством удалить из инвентаря стража все предметы, даже доспех. Но там остаётся не пойми откуда взявшаяся "Старая монета". В живом состоянии у него монеты нет. Убрал монету уже после убийства - инвентарь стража пуст, но тело не исчезает. Можно ли вообще сделать так, чтобы тело исчезло?
Отправить личное сообщение для Ответить с цитированием
Старый 13.09.2011, 13:17   #2483
Dimus

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

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

2ElderGamer:
Старая монета добавляется в инвентарь убитого NPC в функции B_KillNpc():
Cпойлер(щелкните, чтобы прочесть):
func void B_KillNpc(var int npcInstance)
{
* * *var C_Npc npc;
* * *var int itemInstance;
* * *PrintDebugNpc(PD_ZS_DETAIL,"B_KillNpc");
* * *npc = Hlp_GetNpc(npcInstance);
* * *npc.flags = 0;
* * *CreateInvItem(npc,ItMi_Stuff_OldCoin_02);
* * *Npc_ChangeAttribute(npc,ATR_HITPOINTS,-npc.attribute[ATR_HITPOINTS_MAX]);
* * *if(Npc_GetInvItemBySlot(npc,INV_WEAPON,1))
* * *{
* * * * * *PrintDebugNpc(PD_ZS_DETAIL,"...Waffe in Slot 1 gefunden!");
* * * * * *itemInstance = Hlp_GetInstanceID(item);
* * * * * *Npc_RemoveInvItem(npc,itemInstance);
* * *};
* * *if(Npc_GetInvItemBySlot(npc,INV_WEAPON,2))
* * *{
* * * * * *PrintDebugNpc(PD_ZS_DETAIL,"...Waffe in Slot 2 gefunden!");
* * * * * *itemInstance = Hlp_GetInstanceID(item);
* * * * * *Npc_RemoveInvItem(npc,itemInstance);
* * *};
};

Это сделано для того, чтобы труп не исчезал, т.к. монета является квестовым предметом (флаг ITEM_MISSION). Если же нужно, чтобы труп исчез, напишите функцию, которая сначала чистит инвентарь непися, а затем обнуляет у него атрибут "HITPOINTS".
Ответить с цитированием
Старый 14.09.2011, 13:28   #2484
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

2Dimus:
К сожалению, и этот способ не помогает. Обнулил хиты так, как это сделано в Хроманине:

Npc_ChangeAttribute(Templer_OM,ATR_HITPOINTS,-Templer_OM.attribute[ATR_HITPOINTS_MAX]);

Тело не исчезает. Причём, результат не зависит от того, есть что-либо в инвентаре непися, или нет. Для того, чтобы тело исчезло, нужно подойти к нему и отойти на некоторое расстояние. Пока только так. *:square:

Добавление от 09/14/11, в 13:48:04
Две проблемы, связанные с бойцами арены в СЛ.

Проблема первая. Если вызвать кого-либо из них на бой, но не входить на арену, то боец будет стоять там и ждать... не знаю сколько времени, возможно, до конца игры, или пока его не убьёт скрипт. Можно ли каким-нибудь способом сбрасывать это состояние. Может быть, поможет контроль времени или контроль расстояния?

Проблема вторая. Если вызов приходится на время, когда на арене кто-то практикуется с мечом, то получается глупая ситуация, т.к. анимация практики не прерывается, и можно затеять "бой втроём". Я пробовал изменять распорядок бойцам в момент вызова на бой одного из них. Формально, распорядок изменяется, на деле, анимация практики продолжает выполняться. Через некоторое время практикующий боец не убирая оружия уходит с арены и продолжает практиковаться вне её. Можно ли как-то решить эту проблему?
Отправить личное сообщение для Ответить с цитированием
Старый 14.09.2011, 22:13   #2485
redleha

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

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

2ElderGamer:
чтоб остановить проигрывание анимации есть функция Npc_StopAni, актуальна как раз для длинных аним.
для временной смены расписания есть функции TA_BeginOverlay и TA_RemoveOverlay, я сам такими пользовался, правда, для Г2
Ответить с цитированием
Старый 15.09.2011, 09:37   #2486
kraw

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

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

Цитата:
Сообщение от redleha link=board=gothic&t=1105030050&goto=6469258 date=09/14/11, в 22:13:34
для временной смены расписания есть функции TA_BeginOverlay и TA_RemoveOverlay, я сам такими пользовался, правда, для Г2
С оверлеем надо быть осторожным. мне не удалось заставить его нормально работать для персонажа, кому принадлежит диалог, работало только для сторонних персонажей. А в случае "диалогоносителя" часто происходили его "зависания".
Ответить с цитированием
Старый 15.09.2011, 09:38   #2487
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

ElderGamer:
Вопрос к знатокам. Можно ли в Г1 с помощью какой-либо функции контролировать окончание анимации обследования сундука?
Мухомор:
Можно поставить в условие диалога Горна

if(!C_BodyStateContains(hero,BS_MOBINTERACT_INTERR UPT))
ElderGamer:
Почему-то не работает.
Понял в чём проблема. Во время обыскивания сундука состояние тела определяется, не как BS_MOBINTERACT_INTERRUPT, а как BS_INVENTORY.
BS_MOBINTERACT_INTERRUPT определяется в фазе открытия сундука. Поменял в условии на BS_INVENTORY и всё заработало. :)
Отправить личное сообщение для Ответить с цитированием
Старый 19.09.2011, 14:07   #2488
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

Вопрос. Реально ли сделать так, чтобы в Г1 надписи "Отдан 1 предмет.", "Получен 1 предмет." и т. д. выводились на экран только после соответствующей фразы диалога, а не сразу?
Отправить личное сообщение для Ответить с цитированием
Старый 19.09.2011, 21:47   #2489
redleha

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

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

Возможно, два способа:
1) использовать команду AI_PrintScreen после соответствуещей AI_Output
2) использовать функцию ZS_Talk_End (сюда можно вносить всё то, что будет происходить сразу после окончания диалога с персонажем.)
Ответить с цитированием
Старый 20.09.2011, 10:47   #2490
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

Так. Первый способ понятен: игнорируем функцию B_GiveInvItems(), вставляем нужные команды вручную. А как использовать функцию ZS_Talk_End()? Хотя, первого способа, думаю, будет достаточно. Спасибо!  :)

Добавление от 09/20/11, в 11:07:35
UPD:
Первый способ не работает. *:( Функция PrintScreen() всё равно обрабатывается раньше, чем будут завершено воспроизведение всех звуковых файлов, предшествующих ей.
Отправить личное сообщение для Ответить с цитированием
Старый 20.09.2011, 22:27   #2491
redleha

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

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

Цитата:
Сообщение от ElderGamer link=board=gothic&t=1105030050&goto=6476654 date=09/20/11, в 10:47:35
Первый способ не работает. *:( Функция PrintScreen() всё равно обрабатывается раньше, чем будут завершено воспроизведение всех звуковых файлов, предшествующих ей.
не PrintScreen, а AI_PrintScreen (уж не знаю точно, есть ли она в двиге первой готы, в туторе Vam'а она описана как функция чисто Г2-двига)

по поводу второго способа (поглядел я скрипты первой готы, есть там ZS_Talk), так вот вырезка из моей функции ZS_Talk_End():
if(Npc_IsPlayer(other))
{
if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(fff)) && Npc_KnowsInfo(other,DIA_fff_Hello))
{
Wld_PlayEffect("FX_EarthQuake",other,other,0,0,0,F ALSE);
};
};
Ответить с цитированием
Старый 09.10.2011, 21:17   #2492
Black_Phantom

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

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

Подскажите, пожалуйста, ответ на следующий вопрос:
В описании к Golden Mod (Готика I) сказано, что он восстанавливает вырезанные квесты Готики. А откуда разрабочики узнали какими именно должны были быть эти квесты? Это где-то было зафиксировано или помечено в скриптах?
Или же разработчики просто додумали, про квесты с Квентином, Гильбертом и другими? И, почему тогда не сохранилась озвучка к этим квестам?

P.S. Возможно я задал вопрос не в той теме, но более подходящей не нашел.
Ответить с цитированием
Старый 09.10.2011, 22:15   #2493
B_Wolf

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

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

2Black Phantom:
Вырезанное додумали.
Ответить с цитированием
Старый 09.10.2011, 22:19   #2494
Dimus

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

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

2Black Phantom:
Скорее всего эти квесты были додуманы создателями мода. Во всяком случае, в скриптах из GMDK я их не видел даже в заблокированном виде.
Ответить с цитированием
Старый 10.10.2011, 09:11   #2495
Strongest

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

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

Сообщение перенесено из другой темы. Перенес: luciano
Привет всем! я недавно начал работать над скриптами моей любимой игры готика 2 :) скачал нужный мод ля работы спайсером g2mdk 2.6 так же нужные проги и gothicscourcer 3.14 . Так вот щас с работой gothicscourcer разобрался но кое что не могу понять , вот я декомплицивировал скрипты , отредактировав их приступаю к компиляции и тут мне выдается 27 ошибок парочку токо исправил остальные не могу :( я не оч шарю в скриптологии. даже не редактировав скрипты после декомпиляции не компилируются :( подскажите в чем проблема? может из за того что моя готика 2 линцензионная или из за чего???

Добавление от 10/10/11, в 07:36:36
ааа, вопрос вышесказаный отпадает... я тут со всем разобрался из 23 ошибок и 68 вниманий осталось 2 ошибки :) токо их я не как не могу исправить а они останавливают процес компиляции помогите исправить плз!!

Story\Dialoge\DIA_PC_Thief_NW.d(266): Ошибка: Нельзя преобразовать тип int в instance
Story\Dialoge\DIA_PC_Thief_NW.d(294): Ошибка: Ожидается ';'


Ответить с цитированием
Старый 10.10.2011, 10:08   #2496
Black_Phantom

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

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

Strongest, приведите, пожалуйста, указанные строчки + 3 строчки сверху и снизу.
Ответить с цитированием
Старый 06.11.2011, 22:40   #2497
Ultroman

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

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

А можете сказать,как заставить другого нпс сидеть,тренироваться,есть и т.д?
Ответить с цитированием
Старый 07.11.2011, 12:23   #2498
Dimus

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

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

2Ultroman:
Вы что-нибудь знаете о языке Daedalus? Потому что все скрипты G1 и G2 написаны на нём. Названия GMDK, G2MDK, Spacer, Gothic Sourcer вам что-нибудь говорят? Если ответ будет положительным, тогда можно перейти к деталям.

Чтобы в процессе игры NPC выполнял набор действий, нужно прописать ему ежедневное расписание деятельности (daily routine), которое находится в скриптах Story\NPC\*.d. В качестве примера возьмём простейший скрипт идола Кадара из Болотного лагеря (Story\NPC\GUR_1208_BaalCadar.d):
Cпойлер(щелкните, чтобы прочесть):
instance GUR_1208_BaalCadar(Npc_Default)
{
* * *name[0] = "Идол Кадар";
* * *npcType = npctype_main;
* * *guild = GIL_GUR;
* * *level = 28;
* * *voice = 2;
* * *id = 1208;
* * *attribute[ATR_STRENGTH] = 70;
* * *attribute[ATR_DEXTERITY] = 55;
* * *attribute[ATR_MANA_MAX] = 50;
* * *attribute[ATR_MANA] = 50;
* * *attribute[ATR_HITPOINTS_MAX] = 376;
* * *attribute[ATR_HITPOINTS] = 376;
* * *Mdl_SetVisual(self,"HUMANS.MDS");
* * *Mdl_ApplyOverlayMds(self,"Humans_Mage.mds");
* * *Mdl_SetVisualBody(self,"hum_body_Naked0",1,1,"Hum _Head_Psionic",20,1,gur_armor_m);
* * *B_Scale(self);
* * *Mdl_SetModelFatness(self,-1);
* * *Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);
* * *CreateInvItem(self,ItArRuneWindfist);
* * *B_Give_BaalCadarChapter1Runes();
* * *fight_tactic = FAI_HUMAN_MAGE;
* * *daily_routine = Rtn_start_1208;
};


func void Rtn_start_1208()
{
* * *TA_Sleep(2,0,8,0,"PSI_23_HUT_IN");
* * *TA_Teaching(8,0,2,0,"PSI_TEACH_CADAR");
};

У него прописано ежедневное расписание
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_start_1208(): с 2:00 до 8:00 он спит в своей хижине (waypoint PSI_23_HUT_IN), а с 8:00 до 2:00 обучает послушников магии Спящего под тренировочной площадкой для храмовников (waypoint PSI_TEACH_CADAR)
. Например, пусть ночью он не спит, а тренируется в использовании магии на том же месте, что и днём - тогда заменяем ему функцию сна на другую:
Cпойлер(щелкните, чтобы прочесть):
TA_PracticeMagic(2,0,8,0,"PSI_TEACH_CADAR");
, компилируем скрипты, делаем резервную копию файлов _work\Data\Scripts\_compiled\GOTHIC.DAT и _work\Data\Scripts\Content\Cutscene\OU.BIN, затем заменяем эти файлы полученными после компиляции. Запускаем игру, через консоль устанавливаем время на 2 часа ночи (set time 2) и переходим к нему командой goto waypoint PSI_TEACH_CADAR.
Список задействованных в игре действий NPC задан в скрипте Story\ZS\Ta.d (G1) или AI\Human\TA.d (G2).

Учтите, что у некоторых NPC расписание жизнедеятельности в процессе игры может изменяться с помощью функции B_StartOtherRoutine(инстанция NPC, "новое расписание"). В качестве примера рассмотрим расписание Секоба (Story\NPC\BAU_930_Sekob.d):
Cпойлер(щелкните, чтобы прочесть):
instance BAU_930_Sekob(Npc_Default)
{
* * *name[0] = "Секоб";
* * *guild = GIL_OUT;
* * *id = 930;
* * *voice = 1;
* * *flags = NPC_FLAG_IMMORTAL;
* * *npcType = npctype_main;
* * *aivar[AIV_ToughGuy] = TRUE;
* * *B_SetAttributesToChapter(self,1);
* * *fight_tactic = FAI_HUMAN_COWARD;
* * *EquipItem(self,ItMw_1h_Bau_Mace);
* * *B_CreateAmbientInv(self);
* * *B_SetNpcVisual(self,MALE,"Hum_Head_Fatbald",Face_ P_OldMan_Gravo,BodyTex_P,ITAR_Vlk_H);
* * *Mdl_SetModelFatness(self,0);
* * *Mdl_ApplyOverlayMds(self,"Humans_Arrogance.mds");
* * *B_GiveNpcTalents(self);
* * *B_SetFightSkills(self,20);
* * *daily_routine = Rtn_Start_930;
};


func void Rtn_Start_930()
{
* * *TA_Sit_Throne(8,0,22,0,"NW_FARM4_SEKOB");
* * *TA_Sleep(22,0,8,0,"NW_FARM4_IN_BED");
};

func void Rtn_FleeDMT_930()
{
* * *TA_Stand_WP(8,0,22,0,"NW_BIGFARM_FARM4_PATH_01");
* * *TA_Stand_WP(22,0,8,0,"NW_BIGFARM_FARM4_PATH_01");
};

func void Rtn_Obsessed_930()
{
* * *TA_Stand_Guarding(8,0,22,0,"NW_FARM4_02");
* * *TA_Stand_Guarding(22,0,8,0,"NW_FARM4_02");
};

Его начальное расписание описано
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_Start_930(): с 8:00 до 22:00 сидит в кресле (NW_FARM4_SEKOB), а с 22:00 до 8:00 спит на кровати (NW_FARM4_IN_BED). Затем в 3-й главе, когда ищущие выгоняют его семью из дома, Секоб круглые сутки стоит на улице (функция Rtn_FleeDMT_930()) до тех пор, пока ГГ не уничтожит ищущих. А когда Секоб становится одержимым, тогда от него сбегают жена и сын, а сам он круглые сутки стоит на waypoint NW_FARM4_02 (функция Rtn_Obsessed_930()).


Внимание: Новое расписание должно ссылаться на функцию вида Rtn_Routine_xxx, но без префиксов "Rtn" и "xxx"! Т.е. Секоб в 3-й главе покидает свой дом по команде B_StartOtherRoutine(Sekob,"FleeDMT");, прописанной в скрипте Story\B_Story\B_Enter_NewWorld.d.
Ответить с цитированием
Старый 07.11.2011, 20:45   #2499
Ultroman

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

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

Да более менее понял :)
а вот например если создал типа insert fh то как его например с ним?как команду указать?
Ответить с цитированием
Старый 11.11.2011, 02:23   #2500
Magmatic

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

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

Есть ли в Г2 ограничение на число неписей? И еще у меня персы не вставляются. Все скрипты вставлены как надо, разве что диалогов нет, в gothic.src правку провел, впихнул перса под Ксара. Однако после запуска новой игры непись не появляется, его можно разве что читом вызвать.

Процесс таков:
Создаю перса в Gothic II\_work\Data\Scripts\Content\Story\NPC
Вставляю его в Gothic II\_work\Data\Scripts\Content\Story\StartUp.d *соответственно остальным неписям.
Все манипуляции производятся в новом проекте, точнее модернизируется старый, имененный ранее с добавкой пары квестов, скрипты созданы в этом проекте, так что косяков быть не должно, ошибок в скриптах нет.
Прописал перса в gothic.src, сохранил, скомпилил скрипты в сорсере, заменил Gothic.dat и OU.bin.
Запуск новой игры и пустота.

Возможно ошибка в выборе вейпоинта, хотя я пробовал и другие варианты, к примеру изначально перс должен был стоять недалеко от Ксардаса, но не пошло. Тогда я перенес его на вейпоинт на первом этаже, но рядом были фрипоинты демонов из четвертой главы, и возможно поэтому перс не воткнулся. Затем я вынес перса на улицу и прописал на фрипоинт овцы (один из трех по которым она перемещается, при этом данный поинт свободен, тк овца прописана на соседнем). Однако и тут облом. *
Ответить с цитированием
Старый 11.11.2011, 10:30   #2501
kraw

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

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

Думаю, еще надо было создать файл *.mod, куда упаковать полученные 2 файла. Ну. и ini-файл...
Ответить с цитированием
Старый 12.11.2011, 00:45   #2502
Halzcedon

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

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

2Лавовый:
Попробуй вызвать перса через марвина.
Ответить с цитированием
Старый 12.11.2011, 10:34   #2503
redleha

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

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

Ограничения на кол-во неписей нет. Просто чем их больше, тем больше нагрузка на железо.
Ответить с цитированием
Старый 12.11.2011, 17:17   #2504
Dyom_sn1p

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

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

Всём привет! Вот решил заняться моддингом gothic 2 ну и решил начать со скриптинга. Прочитал много туторов полазил по форумам но ни чего не нашёл для новичка типо меня... Есть конечно понятные туторы но не понятно чё куда пихать! Может ктонибудь расписать всё по подробнее для чайника! Ну для начала я хотел бы поставить двух волков прям в башне Ксардаса. Покажити мне какими прогами это делать сам скрипт и куда пихать! Буду очень благодарен!
Ответить с цитированием
Старый 12.11.2011, 23:03   #2505
Dimus

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

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

2Dyom sn1p:
1. Для этого вам понадобятся или Spacer 2 (входит в состав G2MDK) или Gothic Sourcer v3.14, который лучше выявляет ошибки скриптов. Также вам потребуются декомпилированные скрипты оригинальной Gothic II или аддона (лучше всего взять очищенные от ошибок скрипты, например, декомпилировать G2a_NR_ScriptPatch). Ссылки на программы найдёте сами, а различные статьи по модостроению можно найти здесь.
2. [rul] запрещают дублировать сообщения - смотрите статью 3, пункт 6. Поэтому тема с дубликатом вашего сообщения удалена.
Ответить с цитированием
Старый 13.11.2011, 06:49   #2506
Dyom_sn1p

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

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

Dimus, большое спасибо! И извени, больше не повторится!
Ответить с цитированием
Старый 15.11.2011, 14:29   #2507
Dyom_sn1p

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

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

Dimus. А что имменно надо открывать?
Ответить с цитированием
Старый 22.11.2011, 14:35   #2508
_ZEN_

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

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

Возможно ли в Готике 2НВ отследить стоит ли ГГ на траве, на камне или на воде, ведь звук шагов как-то получается же правильным?
Ответить с цитированием
Старый 22.11.2011, 22:53   #2509
MaGoth
A.G.F.C.
  Аватар для MaGoth
 
Регистрация: 04.09.2006
Сообщений: 20
MaGoth вне форума

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

2 ZEN : Нет нельзя, а сами звуковые эффекты о которых ты пишешь, накладываются/привязываются к материалам модели/меша в максе, таким образом и задаются параметры звучания...  ::)
Отправить личное сообщение для Ответить с цитированием
Старый 27.11.2011, 14:28   #2510
_ZEN_

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

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

Установил новую видеокарту GeForce GTX560 Windows XP SP3. Теперь в Spacer2 стало невозможно работать (пробовал различные разрешения) небольшое движение и «мёртвое» зависание. Единственный выход - двойной клик в меню по какому-либо мобу. После перехода на моб зависание исчезает, но начинаешь движение по миру - опять зависает. Может быть кто-нибудь знает в чём здесь причина?
Ответить с цитированием
Старый 09.12.2011, 14:11   #2511
_ZEN_

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

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

Во флагах состояния тела есть модификатор состояния const int BS_MOD_DRUNK  =   256; //Пьяный
Как с помощью этого модификатора сделать НПС пьяным? Кто-нибудь пробовал?
Ответить с цитированием
Старый 09.12.2011, 15:42   #2512
Dimus

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

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

2 ZEN :
Вообще-то этот флаг нигде не используется, а для того, чтобы сделать ГГ или NPC пьяным, нужно применить для него анимацию "Humans_drunken.mds", например, с помощью консоли:
Cпойлер(щелкните, чтобы прочесть):
apply overlaymds humans_drunken
или через скрипты:
Cпойлер(щелкните, чтобы прочесть):
Mdl_ApplyOverlayMds(self,"Humans_drunken.mds");

Эта анимация есть только в G1.
Ответить с цитированием
Старый 10.12.2011, 06:37   #2513
_ZEN_

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

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

Dimus

Спасибо.
Ответить с цитированием
Старый 10.12.2011, 14:13   #2514
Dimus

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

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

2 ZEN :
Повторяю в последний раз: все выражения благодарностей - в личку или репу. Пост удалён.
Ответить с цитированием
Старый 15.12.2011, 16:37   #2515
Magmatic

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

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

Привет люди, решил поскриптить на досуге и вот такое дело накарябал, однако сорсер ошибки там на ровном месте находит, одни строки принимает как должное, а другие похожие в штыки. В общем и целом, это скрипт игры в кости (вроде кто-то такой уже делал), осталось доделать часть, чтобы можно было играть по-новой.

Cпойлер(щелкните, чтобы прочесть):


var int Player;
instance NPC_Game(C_Info)
{
* * *npc = VLK_454_Buerger;
* * *nr = 3;
* * *condition = PC_Game_Condition;
* * *information = PC_Game_Info;
* * *permanent = TRUE;
* * *description = "Сыграем в кости?";
};
func int PC_Game_Condition()
{
* * *if(Npc_KnowsInfo(other,DIA_VLK_454_Hello))
* * *{
* * * * * *return TRUE;
* * *};
};

func void PC_Game_Info()

{
*AI_Output(other,self,"DIA_PlayGame_15_01"); //Сыграем в кости?
*AI_Output(self,other,"DIA_PlayGame_15_02"); //Не терпится расстаться с золотом? (смеется) Хорошо.Какая ставка?
*Info_ClearChoices(PC_Game);
*Info_AddChoice(PC_Game,"20 золотых",PC_Game_1);
*Info_AddChoice(PC_Game,"30 золотых",PC_Game_2);
*Info_AddChoice(PC_Game,"50 золотых",PC_Game_3);
*Info_AddChoice(PC_Game,"100 золотых",PC_Game_4);
};

var int Round;
func void PC_Game_1()
{
* * *AI_Output(other,self,"DIA_PlayGame_15_03"); *// 20золотых
* * *Round = 20;
};

func void PC_Game_2()
{
* ** * *AI_Output(other,self,"DIA_PlayGame_15_04"); *//30 золотых
* * *Round = 30;
};

func void PC_Game_3()
{
* * *AI_Output(other,self,"DIA_PlayGame_15_05"); *//50 золотых
* * *Round = 50;
};

func void PC_Game_4()
{
* * *AI_Output(other,self,"DIA_PlayGame_15_06"); *//100 золотых
* * *Round = 100;
};


instance NPC_Game_Start(C_Info)
{
* * *npc = VLK_454_Buerger;
* * *nr = 3;
* * *condition = PC_Game_Start_Condition;
* * *information = PC_Game_Start_Info;
* * *permanent = TRUE;
* * *
};
func int PC_Game_Start_Condition()
{
* * *if(Npc_KnowsInfo(other,NPC_Game))
* * *{
* * * * * *return TRUE;
* * *};
};
var int Game;
var int MyGame;
func void PC_Game_Start_Info()

{ * * *Game = Hlp_Random(12);
* if(Game <= 2)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_01"); * * *//Проклятье! Двойка.
*}
else if(Game = 3)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_02"); * * *//Три очка. * * *
*}

else if(Game = 4)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_03"); * * *//Четыре, паршиво. * * *
*}
else if(Game = 5)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_04"); * * *//Пять. * * *
*}
else if(Game = 6)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_05"); * * *//Шесть, хоть что-то. * * *
*}
else if(Game = 7)
{
* * *AI_Output(other,self,"DIA_BigGame_15_06"); * * *//Семь. * * *
}
else if(Game = 8)
{
* * *AI_Output(other,self,"DIA_BigGame_15_07"); * * *//Восемь, неплохо, совсем неплохо. * * *
}
else if(Game = 9)
{
* * *AI_Output(other,self,"DIA_BigGame_15_08"); * * *//Девять. Посмотрим, что ты на это скажешь. * * *
}
else if(Game = 10) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Нельзя выполнить присвоение if. Прикол в том, что стоило перенести if строкой ниже, а потом вернуть на место, эта ошибка пропала, но два нижних условия по прежнему считаются ошибочными. Если же убрать if, начинает выдавать ошибки в строках с условиями ранее признанные программой как правильные.
*{
* * *AI_Output(other,self,"DIA_BigGame_15_09"); * * *//Десятка, разрази меня гром! Я сегодня в ударе.
*}
else if(Game = 11)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_10"); // Одинадцать.(хвастливо) Попробуй кинуть лучше! * * * * * *
*}
else if(Game = 12)
*{
* * *AI_Output(other,self,"DIA_BigGame_15_11"); // Двенадцать.Ха-ха, теперь твои деньги уплывут в мой карман!
*};
};


instance NPC_HGame(C_Info)
{
* * *npc = VLK_454_Buerger;
* * *nr = 3;
* * *condition = PC_HGame_Condition;
* * *information = PC_HGame_Info;
* * *permanent = TRUE;
* * *description = "Моя очередь";
};


func int PC_HGame_Condition()
{
* * *if(Npc_KnowsInfo(other,NPC_Game_Start))
* * *{
* * * * * *return TRUE;
* * *};
};

func void PC_HGame_Info()
{
MyGame = Hlp_Random(12);
if(MyGame <= 2) && (Game > 2)
{
* * *AI_Output(other,self,"DIA_BigGame_16_01"); * * *//Двойка. (усмехается) Тебе невезет приятель.
* * *B_GiveInvItems(other,self,ItMi_Gold,Round);
}
else if(MyGame <= 2) && (Game <= 2)
{
* * *AI_Output(other,self,"DIA_BigGame_17_01"); * * *//Двойка. Ничья.
}
else if(MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) *|| (MyGame > 4) && (Game <= 4) * || (MyGame = 5) && (Game <= 4) ||
Ошибка синтаксиса.|| (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) ||
||(MyGame = 9) && (Game <= 8) *||(MyGame > 9) && (Game <= 9) ||(MyGame = 10) && (Game <= 9) ||(MyGame > 10) && (Game <= 10) ||(MyGame = 11) && (Game <= 10) ||(MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11)
Здесь не очень хорошо видно, ситуация такова: условие было слишком длинным, и я решил разделить его в три строки. Такое встречается в скриптах готики, однако в данном случае это не сработало. Попытка удаления "лишних палочек" также как попытка написать условие в одну строку, без переносов приводят к вылету программы на рабочий стол.

{
* * *AI_Output(other,self,"DIA_BigGame_16_02"); * * *//Зараза, ты победил!
* * *B_GiveInvItems(self,other,ItMi_Gold,Round);
}

else if(MyGame = 3) && (Game > 3)
{
* * *AI_Output(other,self,"DIA_BigGame_17_02"); * * *//Три очка. * * *Твои деньги стали моими.
* * *B_GiveInvItems(other,self,ItMi_Gold,Round);
}
else if(MyGame = 3) && (Game = 3)
{
* * *AI_Output(other,self,"DIA_BigGame_17_03"); * * *//Ничья.
}

else if(MyGame = 4) && (Game > 4)
{
* * *AI_Output(other,self,"DIA_BigGame_16_03"); * * *//Четыре, гони золотишко.
* *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}

else if(MyGame = 4) && (Game = 4)
{
* * *AI_Output(other,self,"DIA_BigGame_17_03"); * * *//Ни тебе, ни мне. Ничья.
}
else if(MyGame = 5) && (Game > 5)
{
* * *AI_Output(other,self,"DIA_BigGame_16_04"); * * *//Пять, золото гони опять. (ржет)
* *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}
else if(MyGame = 5) && (Game = 5) || *(MyGame = 6) && (Game = 6)
{
* * *AI_Output(other,self,"DIA_BigGame_16_05"); * * *//Одинаковый результат тоже результат. Вот только карман от него не тяжелеет.
}
else if(MyGame = 6) && (Game > 6)
{
* * *AI_Output(other,self,"DIA_BigGame_16_06"); * * *//Шесть,отличная попытка, но до меня далеко.
* *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}
else if(MyGame = 7) && (Game > 7)
{
* * *AI_Output(other,self,"DIA_BigGame_16_07"); * * *//Семь. * * *Хороший бросок,но мой лучше.
* * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}
else if(MyGame = 7) && (MyGame = 7) || (MyGame = 7) && (Game = 7) *|| (MyGame = 8) && (Game = 8) || (MyGame = 9) && (Game = 9) *|| (MyGame = 10) && (Game = 10) || (MyGame = 11) && (Game = 11)
{
* * *AI_Output(other,self,"DIA_BigGame_16_08"); * * *//Однако, счет равный.
}
else if(MyGame = 8) && (Game > 8)
{
* * *AI_Output(other,self,"DIA_BigGame_16_09"); * * *//Восемь. Совсем неплохо. А теперь гони мои деньги. * * *
* * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}
else if(MyGame = 9) && (Game > 9)
{
* * *AI_Output(other,self,"DIA_BigGame_16_10"); * * *//Девять. Для новичка ты хорош, однако удача на моей стороне.
* *B_GiveInvItems(other,self,ItMi_Gold,Round); * * * * * *
}
else if(MyGame = 10) && (Game > 10)
{
* * *AI_Output(other,self,"DIA_BigGame_16_11"); * * *//Десятка.
* * *B_GiveInvItems(other,self,ItMi_Gold,Round); * * *
}
else if(MyGame = 11) && (Game > 11)
{
* * *AI_Output(other,self,"DIA_BigGame_16_12"); // Одинадцать.Ты почти достал меня.
B_GiveInvItems(other,self,ItMi_Gold,Round); * * * * * *
}
else if(MyGame = 12) && (Game = 12)
{
* * *AI_Output(other,self,"DIA_BigGame_16_13"); // Двенадцать! Чтоб тебя! Вот это везение, я уж думал тебе не отвертеться.
}



*


Help anybody!!!
Ответить с цитированием
Старый 15.12.2011, 17:16   #2516
MaGoth
A.G.F.C.
  Аватар для MaGoth
 
Регистрация: 04.09.2006
Сообщений: 20
MaGoth вне форума

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

2Лавовый:
}else if(Game = 10) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Нельзя выполнить присвоение if. Прикол в том, что стоило перенести if строкой ниже, а потом вернуть на место, эта ошибка пропала, но два нижних условия по прежнему считаются ошибочными. Если же убрать if, начинает выдавать ошибки в строках с условиями ранее признанные программой как правильные.
}
Ппц, справку когда читать будете прежде чем в скрипты лезть?!
Конечно нельзя, оператор присвоения = допустим только в теле блока функции, а не в условии куда ты ее присобачил. Там должен стоять оператор сравнения ==.
Должно быть:
Код:
else if(Game == 10)

else if(MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) *|| (MyGame > 4) && (Game <= 4) * || (MyGame = 5) && (Game <= 4) ||
Ошибка синтаксиса.|| (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) ||
||(MyGame = 9) && (Game <= 8) *||(MyGame > 9) && (Game <= 9) ||(MyGame = 10) && (Game <= 9) ||(MyGame > 10) && (Game <= 10) ||(MyGame = 11) && (Game <= 10) ||(MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11)
Здесь не очень хорошо видно, ситуация такова: условие было слишком длинным, и я решил разделить его в три строки. Такое встречается в скриптах готики, однако в данном случае это не сработало. Попытка удаления "лишних палочек" также как попытка написать условие в одну строку, без переносов приводят к вылету программы на рабочий стол.
Попробуй прописать так:
Код:
else if ((MyGame > 2) && (Game <= 2) || (MyGame = 3) && (Game <= 2) || (MyGame > 3) && (Game <= 3) || (MyGame = 4) && (Game <= 3) || (MyGame > 4) && (Game <= 4) || (MyGame = 5) && (Game <= 4) || (MyGame > 5) && (Game <= 5) || (MyGame = 6) && (Game <= 5) || (MyGame > 6) && (Game <= 6) || (MyGame = 7) && (Game <= 6) || (MyGame > 7) && (Game <= 7) || (MyGame = 8) && (Game <= 7) || (MyGame > 8) && (Game <= 8) || (MyGame = 9) && (Game <= 8) || (MyGame > 9) && (Game <= 9) || (MyGame = 10) && (Game <= 9) || (MyGame > 10) && (Game <= 10) || (MyGame = 11) && (Game <= 10) || (MyGame > 11) && (Game <= 11) || (MyGame = 12) && (Game <= 11))
Отправить личное сообщение для Ответить с цитированием
Старый 15.12.2011, 18:32   #2517
B_Wolf

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

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

2MaGoth:
Этот мегаблок условий можно вообще не писать, а перенести его в конец скрипта через один else. И там где счет равный совсем не обязательно сравнивать все возможные комбинации - достаточно сравнить значение game и mygame
Ответить с цитированием
Старый 28.12.2011, 14:51   #2518
Skaarj

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

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

Объясните пож-ста, если нужно выполнить проверку условия:

if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(LordHagen)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Parcival)))

1. можно ли заменить этот блок на условие:

if(self.id == (LordHagen.id | Parcival.id))

2. почему GS выдает ошибку "нельзя пребразовать тип instance в int" , если условие в виде

if((Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(LordHagen)) | Hlp_GetInstanceID(Parcival))

или

if((Hlp_GetInstanceID(self) == (LordHagen.id | Parcival.id))



Добавление от 12/28/11, в 15:11:16
Как присвоить глобальной переменной var C_Item значение, переданное в функцию через внутр. переменную?

Cпойлер(щелкните, чтобы прочесть):
var C_Item itmpick;

func int C_Beklauen(var C_Item itm,var int TheftGold)
{
     if((Npc_GetTalentSkill(other,NPC_TALENT_PICKPOCKE T) == TRUE) && (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE) && (NpcObsessedByDMT == FALSE))
     {
           TheftGoldGlob = 0;
           if((Npc_IsInState(self,ZS_Talk)) && (Hlp_IsValidItem(itm)))
           {
                 if((Hlp_IsItem(itm,ItMi_Gold)) || (Hlp_IsItem(itm,ItRw_Arrow)))
                 {
                       TheftGoldGlob = 25 + Hlp_Random(TheftGold);
                 };
                 if(Hlp_IsItem(itm,ItMi_Nugget))
                 {
                       TheftGoldGlob = 1 + Hlp_Random(TheftGold);
                 };
                 if((Npc_HasItems(self,itm) == 0) && (TheftGold < 0))
                 {
                       TheftGoldGlob = 1;
                 };
                 if((TheftGoldGlob > 0) || (Npc_HasItems(self,itm) > 0))
                 {
                       itmpick = Npc_GetInvItem(self,itm);
                       return TRUE;
                 };
                 return FALSE;
           };
     };
     return FALSE;
};
Ответить с цитированием
Старый 29.12.2011, 16:54   #2519
ElderGamer
A.G.F.C.
  Аватар для ElderGamer
 
Регистрация: 18.02.2008
Сообщений: 0
ElderGamer вне форума

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

2Skaarj:
2. почему GS выдает ошибку "нельзя пребразовать тип instance в int" , если условие в виде

if((Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(LordHagen)) | Hlp_GetInstanceID(Parcival))
Попробуйте использовать для сравнения не сами функции Hlp_GetInstanceID(npc), а локальные переменные, которым присвоено значение с помощью этих функций. А ещё, возможно, следует в условии использовать два сравнения, а не одно (не уверено, но, вдруг, поможет).

if((A == B) || (A == C))
Отправить личное сообщение для Ответить с цитированием
Старый 13.02.2012, 17:35   #2520
Berian

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

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

Помогите люди добрые! Что прописать в свойстве диалога Непися чтобы после фразы другой НПЦ ушёл со своего расписания, открыл Ворота,( эту часть я знаю как делать), а потом подождал пока я уйду на 20 метров от него и только огда закроет ворота обратно и вернёться к расписанию? Вобщем буду оочень признателе за помощ! Вроде всё ясно только вот что прописывать в if(если расстояние между НПЦ и ГГ >= 2000) вот такое условие примерно надо. Пробовал "if(Npc_CanSeeNpcFreeLOS(Guard,other))" где "Guard" прописан и в "var C_Npc" и в "Hlp_GetNpc" но ничего не происходит, надо чтоб вот этот второй НПЦ "Guard" не один раз при фразе проверал расстояние а постоянно следил за ним! Всем заранее спасибо.

Добавление от 02/13/12, в 17:37:11
пробовал if(Npc_GetDistToNpc(Guard,hero) <= 1000)
Ответить с цитированием
Страница 63 из 65 « Первая 13535657585960616263 6465


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

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

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

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


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

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

AGFC: Valley of Gothic © 2004-2022

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