• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

    Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
    По желанию, аргументировать свой выбор можете в теме обсуждения голосования.

Не стесняюсь спросить....

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Я горшков не делаю, но иногда почитываю макулатуру всякую-разную Гот., тематики... :D


Не совсем понял какие функции ты там собрался создавать..?
Я тебе написал как надо делать, а эту ересь с отдельными функциями в топку..

Вот как примерно будет выглядеть:

func void startup_addon_part_adanostemple_01()
{
if(Locate3 == 1)
{
addon_plus();
};
Wld_InsertNpc(BDT_1090_Addon_Raven,"ADW_ADANOSTEMPEL_RAVEN_11");
Wld_InsertNpc(BDT_10400_Addon_DeadBandit,"ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_01");
Wld_InsertNpc(BDT_10401_Addon_DeadBandit,"ADW_ADANOSTEMPEL_RHADEMES_DEADBDT_02");
Wld_InsertNpc(Stoneguardian_ADANOSTEMPELENTRANCE_01,"ADW_ADANOSTEMPEL_ENTRANCE_17");
Wld_InsertNpc(Stoneguardian_ADANOSTEMPELENTRANCE_03,"ADW_ADANOSTEMPEL_ENTRANCE_20");
Wld_InsertNpc(Stoneguardian_ADANOSTEMPELENTRANCE_04,"ADW_ADANOSTEMPEL_ENTRANCE_13");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05A,"ADW_ADANOSTEMPEL_TREASUREPITS_05A");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05B,"ADW_ADANOSTEMPEL_TREASUREPITS_05B");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05C,"ADW_ADANOSTEMPEL_TREASUREPITS_05C");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05D,"ADW_ADANOSTEMPEL_TREASUREPITS_05D");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05E,"ADW_ADANOSTEMPEL_TREASUREPITS_05E");
Wld_InsertNpc(Stoneguardian_TREASUREPITS_05F,"ADW_ADANOSTEMPEL_TREASUREPITS_05F");
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07A");
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07B");

func void addon_plus()
{
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07A");
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07B");
Locate3 == 0;
};

Теоретически должно работать. Практически завтра буду проверять. Т.к. пора уже спать (полночь уже наступила). Чтобы все мои новые функции сидели в одной файле для функций, а не по телу всей игры были раскиданы.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
func void addon_plus()
{
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07A");
Wld_InsertNpc(Giant_Rat,"ADW_ADANOSTEMPEL_TREASUREPITS_07B");
Locate3 == 0;};
Сравнение в теле функции ?! Работать точно не будет, ибо сравнение - в условиях, присвоение - в теле функции.:
Код:
Locate3 = 0;
Учим мат часть..

Зы, Формально, даже компиллер на это должен орать благим матом, когда увидит сие..
Зы-зы, И да, копи-паста - членовая штука, надо от нее отвыкать, и больше писать код ручками.
Поэтому, прокачиваем скилл: глухой/слепой/немой секретарши.. :D
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Сравнение в теле функции ?! Работать точно не будет, ибо сравнение - в условиях, присвоение - в теле функции.:
Код:
Locate3 = 0;
Учим мат часть..

Зы, Формально, даже компиллер на это должен орать благим матом, когда увидит сие..
Зы-зы, И да, копи-паста - членовая штука, надо от нее отвыкать, и больше писать код ручками.
Поэтому, прокачиваем скилл: глухой/слепой/немой секретарши.. :D

Если во время загрузки информации в мире об предметах и (NPC, животных, Орков) не производить проверку, то тогда...

Насчёт Locate3 = 0; - это скажите спасибо тем кто придумал в проверке требовать два раза == (этой гадостью меня уже достали).

Ну тут все просто, например, так:
1. Когда ты молишься в Ярике, у тебя используется диалог/события, то в нем и прописываешь вставку для Непесей/Монстров для Ярика, и так для каждого мира в котором будет молится Гг..
1.1. Если нужно прописать вставку из Ярика для другого мира, то в этом диалоге используешь глобальную переменную, присваиваешь ей значение 1, из конкретного диалога молитвы и в нужное тебе время.
Условия и прочее можешь сам думать как делать и что тебе, где понадобится.. а далее..
1.2. Шуруешь в файл Startap.d и уже в нем, через проверку условия твоей глобальной переменной(ных), запускаешь вставку требуемых монстров/Нпс в мир игры..
Саму проверку этой переменной суешь в эту функцию:


И так для каждого отдельно взятого мира в твоем моде если требуется..
Так наверное.. ::)

Зы, т.е. функция: func void Wld_InsertNpc(var int instanceNpc, var string spawnPoint);
работает только в том мире, в котором в данный момент времени находится Гг.

Тогда пункт 1.1 не реализуем.
Т.к. как написано в пункт 1.2 (через проверку условия твоей глобальной переменной(ных), запускаешь вставку требуемых монстров/Нпс в мир игры) Т.е. нужно делать If. (Startap.d и так слишком длинная простыня (если ещё добавить локации, уже будет зверски длинная простыня))

Только в каждом мире ставить по статуе (минимум 1), чтобы в каждом мире можно было сделать respawn (если игрок в нём находится). Но условие срабатывания тогда, нет возможности создать т.к. единственный вариант ставить условие вызова respawn это зависимость от уровня игрока и наличия определённого числа золота. А если в каждом мире по отдельности, тогда условие нет возможности ставить (Т.к. точно высчитать, сколько в каком мире игрок заработает. Это не реально (т.к. тестер как идиот не будет сидеть в одном мире и выполнять все квесты и убивать всех монстров и орков только в одной локации)).
Чисто сидеть и высчитывать через код тоже издевательство т.к. данные об полученном опыте в одном файле, а тело квеста в других файлах.

Итого Respawn не реализуем.

Хотя если следовать такой логике это не должно работать:
instance ITAR_PIR_L_Addon(C_Item)
{
name = "Одежда пирата";
mainflag = ITEM_KAT_ARMOR;
flags = 0;
on_equip = equip_sss171;
on_unequip = unequip_sss171;
protection[PROT_EDGE] = 40;
protection[PROT_BLUNT] = 40;
protection[PROT_POINT] = 40;
protection[PROT_FIRE] = 0;
protection[PROT_MAGIC] = 0;
value = VALUE_ITAR_PIR_L_Addon;
wear = WEAR_TORSO;
visual = "ItAr_PIR_L_ADDON.3ds";
visual_change = "Armor_Pir_L_Addon.ASC";
visual_skin = 0;
material = MAT_LEATHER;
description = name;
text[1] = NAME_Prot_Edge;
count[1] = protection[PROT_EDGE];
text[2] = NAME_Prot_Point;
count[2] = protection[PROT_POINT];
text[3] = NAME_Prot_Fire;
count[3] = protection[PROT_FIRE];
text[4] = NAME_Prot_Magic;
count[4] = protection[PROT_MAGIC];
text[5] = NAME_Value;
count[5] = value;
};

func void equip_sss171()
{
KG_3 = 16;
equip_kgmaximum();
};

func void unequip_sss171()
{
unequip_kgm3();
unequip_kgmaximum();
};

func void equip_kgmaximum()
{
if((Npc_HasItems(self,itar_pal_h_01) >= 1) || (Npc_HasItems(self,ItMw_1h_Bau_Mace) >= 1) || (Npc_HasItems(self,ItMw_1H_Mace_L_03) >= 1) || (Npc_HasItems(self,ItMw_1h_Vlk_Mace) >= 1) || (Npc_HasItems(self,ItMw_1h_Bau_Axe) >= 1) || (Npc_HasItems(self,ItMw_1H_Mace_L_01) >= 1) || (Npc_HasItems(self,ItMw_1h_Vlk_Dagger) >= 1) || (Npc_HasItems(self,ItMw_1h_Vlk_Axe) >= 1) || (Npc_HasItems(self,ItMw_1H_Mace_L_04) >= 1) || (Npc_HasItems(self,ItMw_ShortSword1) >= 1) || (Npc_HasItems(self,ItMw_Nagelknueppel) >= 1) || (Npc_HasItems(self,ItMw_1H_Sword_L_03) >= 1) || (Npc_HasItems(self,ItMw_ShortSword2) >= 1) || (Npc_HasItems(self,ItMw_Sense) >= 1) || (Npc_HasItems(self,ItMw_1h_Vlk_Sword) >= 1) || (Npc_HasItems(self,ItMw_1h_Nov_Mace) >= 1) || (Npc_HasItems(self,ItMw_2h_Bau_Axe) >= 1) || (Npc_HasItems(self,ItMw_2H_Axe_L_01) >= 1) || (Npc_HasItems(self,ItMw_1h_MISC_Sword) >= 1) || (Npc_HasItems(self,ItMw_1h_Misc_Axe) >= 1) || (Npc_HasItems(self,ItMw_2H_Sword_M_01) >= 1) || (Npc_HasItems(self,ItMw_1h_Mil_Sword) >= 1) || (Npc_HasItems(self,ItMw_1h_Sld_Axe) >= 1) || (Npc_HasItems(self,ItMw_1h_Sld_Sword) >= 1) || (Npc_HasItems(self,ItMw_2h_Sld_Axe) >= 1) || (Npc_HasItems(self,ItMw_2h_Sld_Sword) >= 1) || (Npc_HasItems(self,ItMw_1h_Pal_Sword) >= 1) || (Npc_HasItems(self,ItMw_2h_Pal_Sword) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcAxe_01) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcAxe_02) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcAxe_03) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcAxe_04) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcSword_01) >= 1) || (Npc_HasItems(self,ItMw_2H_OrcSword_02) >= 1) || (Npc_HasItems(self,ItMw_ShortSword3) >= 1) || (Npc_HasItems(self,ItMw_Nagelkeule) >= 1) || (Npc_HasItems(self,ItMw_ShortSword4) >= 1) || (Npc_HasItems(self,ItMw_Kriegskeule) >= 1) || (Npc_HasItems(self,ItMw_Richtstab) >= 1) || (Npc_HasItems(self,ItMw_ShortSword5) >= 1) || (Npc_HasItems(self,ItMw_Kriegshammer1) >= 1) || (Npc_HasItems(self,ItMw_Hellebarde) >= 1) || (Npc_HasItems(self,ItMw_Nagelkeule2) >= 1) || (Npc_HasItems(self,ItMw_Schiffsaxt) >= 1) || (Npc_HasItems(self,ItMw_Piratensaebel) >= 1) || (Npc_HasItems(self,ItMw_Schwert) >= 1) || (Npc_HasItems(self,ItMw_1H_Common_01) >= 1) || (Npc_HasItems(self,ItMw_Stabkeule) >= 1) || (Npc_HasItems(self,ItMw_Zweihaender1) >= 1) || (Npc_HasItems(self,ItMw_Steinbrecher) >= 1) || (Npc_HasItems(self,ItMw_Spicker) >= 1) || (Npc_HasItems(self,ItMw_Streitaxt1) >= 1) || (Npc_HasItems(self,ItMw_Schwert1) >= 1) || (Npc_HasItems(self,ItMw_Schwert2) >= 1) || (Npc_HasItems(self,ItMw_Doppelaxt) >= 1) || (Npc_HasItems(self,ItMw_Bartaxt) >= 1) || (Npc_HasItems(self,ItMw_Morgenstern) >= 1) || (Npc_HasItems(self,ItMw_Schwert3) >= 1) || (Npc_HasItems(self,ItMw_Schwert4) >= 1) || (Npc_HasItems(self,ItMw_1H_Special_01) >= 1) || (Npc_HasItems(self,ItMw_2H_Special_01) >= 1) || (Npc_HasItems(self,ItMw_Rapier) >= 1) || (Npc_HasItems(self,ItMw_Rubinklinge) >= 1) || (Npc_HasItems(self,ItMw_Streitkolben) >= 1) || (Npc_HasItems(self,ItMw_Zweihaender2) >= 1) || (Npc_HasItems(self,ItMw_Runenschwert) >= 1) || (Npc_HasItems(self,ItMw_Rabenschnabel) >= 1) || (Npc_HasItems(self,ItMw_Schwert5) >= 1) || (Npc_HasItems(self,ItMw_Inquisitor) >= 1) || (Npc_HasItems(self,ItMw_Streitaxt2) >= 1) || (Npc_HasItems(self,ItMw_Zweihaender3) >= 1) || (Npc_HasItems(self,ItMw_1H_Special_02) >= 1) || (Npc_HasItems(self,ItMw_2H_Special_02) >= 1) || (Npc_HasItems(self,ItMw_ElBastardo) >= 1) || (Npc_HasItems(self,ItMw_Kriegshammer2) >= 1) || (Npc_HasItems(self,ItMw_Meisterdegen) >= 1) || (Npc_HasItems(self,ItMw_Folteraxt) >= 1) || (Npc_HasItems(self,ItMw_Orkschlaechter) >= 1) || (Npc_HasItems(self,ItMw_Zweihaender4) >= 1) || (Npc_HasItems(self,ItMw_Schlachtaxt) >= 1) || (Npc_HasItems(self,ItMw_Krummschwert) >= 1) || (Npc_HasItems(self,ItMw_Barbarenstreitaxt) >= 1) || (Npc_HasItems(self,ItMw_Sturmbringer) >= 1) || (Npc_HasItems(self,ItMw_1H_Special_03) >= 1) || (Npc_HasItems(self,ItMw_2H_Special_03) >= 1) || (Npc_HasItems(self,ItMw_Berserkeraxt) >= 1) || (Npc_HasItems(self,ItMw_Drachenschneide) >= 1) || (Npc_HasItems(self,ItMw_1H_Special_04) >= 1) || (Npc_HasItems(self,ItMw_2H_Special_04) >= 1) || (Npc_HasItems(self,ItMw_1H_Blessed_01) >= 1) || (Npc_HasItems(self,ItMw_1H_Blessed_02) >= 1) || (Npc_HasItems(self,ItMw_1H_Blessed_03) >= 1) || (Npc_HasItems(self,ItMw_2H_Blessed_01) >= 1) || (Npc_HasItems(self,ItMw_2H_Blessed_02) >= 1) || (Npc_HasItems(self,ItMw_2H_Blessed_03) >= 1) || (Npc_HasItems(self,itmw_schwert_09) >= 1) || (Npc_HasItems(self,itar_tmag) >= 1) || (Npc_HasItems(self,itmw_sereb_01) >= 1) || (Npc_HasItems(self,itrw_staff_01) >= 1) || (Npc_HasItems(self,itrw_staff_15) >= 1) || (Npc_HasItems(self,itrw_staff_16) >= 1) || (Npc_HasItems(self,itrw_staff_17) >= 1) || (Npc_HasItems(self,itrw_staff_18) >= 1) || (Npc_HasItems(self,itrw_staff_19) >= 1) || (Npc_HasItems(self,itrw_staff_20) >= 1) || (Npc_HasItems(self,ItRw_Mil_Crossbow) >= 1) || (Npc_HasItems(self,ItRw_Sld_Bow) >= 1) || (Npc_HasItems(self,ItRw_Bow_L_01) >= 1) || (Npc_HasItems(self,ItRw_Bow_L_02) >= 1) || (Npc_HasItems(self,ItRw_Bow_L_03) >= 1) || (Npc_HasItems(self,ItRw_Bow_L_04) >= 1) || (Npc_HasItems(self,ItRw_Bow_M_01) >= 1) || (Npc_HasItems(self,ItRw_Bow_M_02) >= 1) || (Npc_HasItems(self,ItRw_Bow_M_03) >= 1) || (Npc_HasItems(self,ItRw_Bow_M_04) >= 1) || (Npc_HasItems(self,ItRw_Bow_H_01) >= 1) || (Npc_HasItems(self,ItRw_Bow_H_02) >= 1) || (Npc_HasItems(self,ItRw_Bow_H_03) >= 1) || (Npc_HasItems(self,ItRw_Bow_H_04) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_L_01) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_L_02) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_M_01) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_M_02) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_H_01) >= 1) || (Npc_HasItems(self,ItRw_Crossbow_H_02) >= 1) || (Npc_HasItems(self,itrw_orccrossbow) >= 1) || (Npc_HasItems(self,ItMW_Addon_Knife01) >= 1) || (Npc_HasItems(self,ItMW_Addon_Stab01) >= 1) || (Npc_HasItems(self,ItMW_Addon_Stab02) >= 1) || (Npc_HasItems(self,ItMW_Addon_Stab03) >= 1) || (Npc_HasItems(self,ItMW_Addon_Stab04) >= 1) || (Npc_HasItems(self,ItMW_Addon_Stab05) >= 1) || (Npc_HasItems(self,ItMW_Addon_Hacker_1h_01) >= 1) || (Npc_HasItems(self,ItMW_Addon_Hacker_1h_02) >= 1) || (Npc_HasItems(self,ItMW_Addon_Hacker_2h_01) >= 1) || (Npc_HasItems(self,ItMW_Addon_Hacker_2h_02) >= 1) || (Npc_HasItems(self,ItMW_Addon_Keule_1h_01) >= 1) || (Npc_HasItems(self,ItMW_Addon_Keule_2h_01) >= 1) || (Npc_HasItems(self,ItMw_FrancisDagger_Mis) >= 1) || (Npc_HasItems(self,ItMw_RangerStaff_Addon) >= 1) || (Npc_HasItems(self,ItMw_Addon_PIR2hAxe) >= 1) || (Npc_HasItems(self,ItMw_Addon_PIR2hSword) >= 1) || (Npc_HasItems(self,ItMw_Addon_PIR1hAxe) >= 1) || (Npc_HasItems(self,ItMw_Addon_PIR1hSword) >= 1) || (Npc_HasItems(self,ItMw_Addon_BanditTrader) >= 1) || (Npc_HasItems(self,ItMw_Addon_Betty) >= 1) || (Npc_HasItems(self,ItRw_Addon_MagicBow) >= 1) || (Npc_HasItems(self,ItRw_Addon_FireBow) >= 1) || (Npc_HasItems(self,ItRw_Addon_MagicCrossbow) >= 1) || (Npc_HasItems(self,ITAR_Governor) >= 1) || (Npc_HasItems(self,ITAR_Judge) >= 1) || (Npc_HasItems(self,ITAR_Smith) >= 1) || (Npc_HasItems(self,ITAR_Barkeeper) >= 1) || (Npc_HasItems(self,ITAR_Vlk_L) >= 1) || (Npc_HasItems(self,ITAR_Vlk_M) >= 1) || (Npc_HasItems(self,ITAR_Vlk_H) >= 1) || (Npc_HasItems(self,ITAR_Mil_L) >= 1) || (Npc_HasItems(self,ItAr_MIL_M) >= 1) || (Npc_HasItems(self,ItAr_PAL_M) >= 1) || (Npc_HasItems(self,ItAr_PAl_H) >= 1) || (Npc_HasItems(self,ITAR_Bau_L) >= 1) || (Npc_HasItems(self,ITAR_Bau_M) >= 1) || (Npc_HasItems(self,ItAr_Sld_L) >= 1) || (Npc_HasItems(self,itar_sld_M) >= 1) || (Npc_HasItems(self,ItAr_Sld_H) >= 1) || (Npc_HasItems(self,ITAR_DJG_Crawler) >= 1) || (Npc_HasItems(self,itar_djg_l) >= 1) || (Npc_HasItems(self,itar_djg_m) >= 1) || (Npc_HasItems(self,itar_djg_h) >= 1) || (Npc_HasItems(self,ItAr_NOV_L) >= 1) || (Npc_HasItems(self,ItAr_KDF_L) >= 1) || (Npc_HasItems(self,ItAr_KDF_H) >= 1) || (Npc_HasItems(self,ITAR_Leather_L) >= 1) || (Npc_HasItems(self,ItAr_BDT_M) >= 1) || (Npc_HasItems(self,ItAr_BDT_H) >= 1) || (Npc_HasItems(self,ITAR_Dementor) >= 1) || (Npc_HasItems(self,itar_kdw_h) >= 1) || (Npc_HasItems(self,ITAR_Prisoner) >= 1) || (Npc_HasItems(self,ItBE_Addon_Leather_01) >= 1) || (Npc_HasItems(self,ItBE_Addon_SLD_01) >= 1) || (Npc_HasItems(self,ItBE_Addon_NOV_01) >= 1) || (Npc_HasItems(self,ItBE_Addon_MIL_01) >= 1) || (Npc_HasItems(self,ItBE_Addon_KDF_01) >= 1) || (Npc_HasItems(self,ItBE_Addon_MC) >= 1) || (Npc_HasItems(self,ItBe_Addon_STR_5) >= 1) || (Npc_HasItems(self,ItBe_Addon_STR_10) >= 1) || (Npc_HasItems(self,ItBe_Addon_DEX_5) >= 1) || (Npc_HasItems(self,ItBe_Addon_DEX_10) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_EDGE) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_Point) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_MAGIC) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_FIRE) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_EdgPoi) >= 1) || (Npc_HasItems(self,ItBe_Addon_Prot_TOTAL) >= 1) || (Npc_HasItems(self,ITAR_PIR_L_Addon) >= 1) || (Npc_HasItems(self,ITAR_PIR_M_Addon) >= 1) || (Npc_HasItems(self,ITAR_PIR_H_Addon) >= 1) || (Npc_HasItems(self,ITAR_Thorus_Addon) >= 1) || (Npc_HasItems(self,ITAR_Raven_Addon) >= 1) || (Npc_HasItems(self,ITAR_OreBaron_Addon) >= 1) || (Npc_HasItems(self,ITAR_RANGER_Addon) >= 1) || (Npc_HasItems(self,ITAR_Bloodwyn_Addon) >= 1) || (Npc_HasItems(self,ITAR_MayaZombie_Addon) >= 1) || (Npc_HasItems(self,ItAr_FireArmor_Addon) >= 1) || (Npc_HasItems(self,ITAR_Bau_L1) >= 1) || (Npc_HasItems(self,ItMw_1h_Bau_Axe1) >= 1) || (Npc_HasItems(self,ITAR_AVATAR) >= 1))
{
if((Npc_HasItems(hero,itar_pal_h_01) >= 1) || (Npc_HasItems(hero,ItMw_1h_Bau_Mace) >= 1) || (Npc_HasItems(hero,ItMw_1H_Mace_L_03) >= 1) || (Npc_HasItems(hero,ItMw_1h_Vlk_Mace) >= 1) || (Npc_HasItems(hero,ItMw_1h_Bau_Axe) >= 1) || (Npc_HasItems(hero,ItMw_1H_Mace_L_01) >= 1) || (Npc_HasItems(hero,ItMw_1h_Vlk_Dagger) >= 1) || (Npc_HasItems(hero,ItMw_1h_Vlk_Axe) >= 1) || (Npc_HasItems(hero,ItMw_1H_Mace_L_04) >= 1) || (Npc_HasItems(hero,ItMw_ShortSword1) >= 1) || (Npc_HasItems(hero,ItMw_Nagelknueppel) >= 1) || (Npc_HasItems(hero,ItMw_1H_Sword_L_03) >= 1) || (Npc_HasItems(hero,ItMw_ShortSword2) >= 1) || (Npc_HasItems(hero,ItMw_Sense) >= 1) || (Npc_HasItems(hero,ItMw_1h_Vlk_Sword) >= 1) || (Npc_HasItems(hero,ItMw_1h_Nov_Mace) >= 1) || (Npc_HasItems(hero,ItMw_2h_Bau_Axe) >= 1) || (Npc_HasItems(hero,ItMw_2H_Axe_L_01) >= 1) || (Npc_HasItems(hero,ItMw_1h_MISC_Sword) >= 1) || (Npc_HasItems(hero,ItMw_1h_Misc_Axe) >= 1) || (Npc_HasItems(hero,ItMw_2H_Sword_M_01) >= 1) || (Npc_HasItems(hero,ItMw_1h_Mil_Sword) >= 1) || (Npc_HasItems(hero,ItMw_1h_Sld_Axe) >= 1) || (Npc_HasItems(hero,ItMw_1h_Sld_Sword) >= 1) || (Npc_HasItems(hero,ItMw_2h_Sld_Axe) >= 1) || (Npc_HasItems(hero,ItMw_2h_Sld_Sword) >= 1) || (Npc_HasItems(hero,ItMw_1h_Pal_Sword) >= 1) || (Npc_HasItems(hero,ItMw_2h_Pal_Sword) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcAxe_01) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcAxe_02) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcAxe_03) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcAxe_04) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcSword_01) >= 1) || (Npc_HasItems(hero,ItMw_2H_OrcSword_02) >= 1) || (Npc_HasItems(hero,ItMw_ShortSword3) >= 1) || (Npc_HasItems(hero,ItMw_Nagelkeule) >= 1) || (Npc_HasItems(hero,ItMw_ShortSword4) >= 1) || (Npc_HasItems(hero,ItMw_Kriegskeule) >= 1) || (Npc_HasItems(hero,ItMw_Richtstab) >= 1) || (Npc_HasItems(hero,ItMw_ShortSword5) >= 1) || (Npc_HasItems(hero,ItMw_Kriegshammer1) >= 1) || (Npc_HasItems(hero,ItMw_Hellebarde) >= 1) || (Npc_HasItems(hero,ItMw_Nagelkeule2) >= 1) || (Npc_HasItems(hero,ItMw_Schiffsaxt) >= 1) || (Npc_HasItems(hero,ItMw_Piratensaebel) >= 1) || (Npc_HasItems(hero,ItMw_Schwert) >= 1) || (Npc_HasItems(hero,ItMw_1H_Common_01) >= 1) || (Npc_HasItems(hero,ItMw_Stabkeule) >= 1) || (Npc_HasItems(hero,ItMw_Zweihaender1) >= 1) || (Npc_HasItems(hero,ItMw_Steinbrecher) >= 1) || (Npc_HasItems(hero,ItMw_Spicker) >= 1) || (Npc_HasItems(hero,ItMw_Streitaxt1) >= 1) || (Npc_HasItems(hero,ItMw_Schwert1) >= 1) || (Npc_HasItems(hero,ItMw_Schwert2) >= 1) || (Npc_HasItems(hero,ItMw_Doppelaxt) >= 1) || (Npc_HasItems(hero,ItMw_Bartaxt) >= 1) || (Npc_HasItems(hero,ItMw_Morgenstern) >= 1) || (Npc_HasItems(hero,ItMw_Schwert3) >= 1) || (Npc_HasItems(hero,ItMw_Schwert4) >= 1) || (Npc_HasItems(hero,ItMw_1H_Special_01) >= 1) || (Npc_HasItems(hero,ItMw_2H_Special_01) >= 1) || (Npc_HasItems(hero,ItMw_Rapier) >= 1) || (Npc_HasItems(hero,ItMw_Rubinklinge) >= 1) || (Npc_HasItems(hero,ItMw_Streitkolben) >= 1) || (Npc_HasItems(hero,ItMw_Zweihaender2) >= 1) || (Npc_HasItems(hero,ItMw_Runenschwert) >= 1) || (Npc_HasItems(hero,ItMw_Rabenschnabel) >= 1) || (Npc_HasItems(hero,ItMw_Schwert5) >= 1) || (Npc_HasItems(hero,ItMw_Inquisitor) >= 1) || (Npc_HasItems(hero,ItMw_Streitaxt2) >= 1) || (Npc_HasItems(hero,ItMw_Zweihaender3) >= 1) || (Npc_HasItems(hero,ItMw_1H_Special_02) >= 1) || (Npc_HasItems(hero,ItMw_2H_Special_02) >= 1) || (Npc_HasItems(hero,ItMw_ElBastardo) >= 1) || (Npc_HasItems(hero,ItMw_Kriegshammer2) >= 1) || (Npc_HasItems(hero,ItMw_Meisterdegen) >= 1) || (Npc_HasItems(hero,ItMw_Folteraxt) >= 1) || (Npc_HasItems(hero,ItMw_Orkschlaechter) >= 1) || (Npc_HasItems(hero,ItMw_Zweihaender4) >= 1) || (Npc_HasItems(hero,ItMw_Schlachtaxt) >= 1) || (Npc_HasItems(hero,ItMw_Krummschwert) >= 1) || (Npc_HasItems(hero,ItMw_Barbarenstreitaxt) >= 1) || (Npc_HasItems(hero,ItMw_Sturmbringer) >= 1) || (Npc_HasItems(hero,ItMw_1H_Special_03) >= 1) || (Npc_HasItems(hero,ItMw_2H_Special_03) >= 1) || (Npc_HasItems(hero,ItMw_Berserkeraxt) >= 1) || (Npc_HasItems(hero,ItMw_Drachenschneide) >= 1) || (Npc_HasItems(hero,ItMw_1H_Special_04) >= 1) || (Npc_HasItems(hero,ItMw_2H_Special_04) >= 1) || (Npc_HasItems(hero,ItMw_1H_Blessed_01) >= 1) || (Npc_HasItems(hero,ItMw_1H_Blessed_02) >= 1) || (Npc_HasItems(hero,ItMw_1H_Blessed_03) >= 1) || (Npc_HasItems(hero,ItMw_2H_Blessed_01) >= 1) || (Npc_HasItems(hero,ItMw_2H_Blessed_02) >= 1) || (Npc_HasItems(hero,ItMw_2H_Blessed_03) >= 1) || (Npc_HasItems(hero,itmw_schwert_09) >= 1) || (Npc_HasItems(hero,itar_tmag) >= 1) || (Npc_HasItems(hero,itmw_sereb_01) >= 1) || (Npc_HasItems(hero,itrw_staff_01) >= 1) || (Npc_HasItems(hero,itrw_staff_15) >= 1) || (Npc_HasItems(hero,itrw_staff_16) >= 1) || (Npc_HasItems(hero,itrw_staff_17) >= 1) || (Npc_HasItems(hero,itrw_staff_18) >= 1) || (Npc_HasItems(hero,itrw_staff_19) >= 1) || (Npc_HasItems(hero,itrw_staff_20) >= 1) || (Npc_HasItems(hero,ItRw_Mil_Crossbow) >= 1) || (Npc_HasItems(hero,ItRw_Sld_Bow) >= 1) || (Npc_HasItems(hero,ItRw_Bow_L_01) >= 1) || (Npc_HasItems(hero,ItRw_Bow_L_02) >= 1) || (Npc_HasItems(hero,ItRw_Bow_L_03) >= 1) || (Npc_HasItems(hero,ItRw_Bow_L_04) >= 1) || (Npc_HasItems(hero,ItRw_Bow_M_01) >= 1) || (Npc_HasItems(hero,ItRw_Bow_M_02) >= 1) || (Npc_HasItems(hero,ItRw_Bow_M_03) >= 1) || (Npc_HasItems(hero,ItRw_Bow_M_04) >= 1) || (Npc_HasItems(hero,ItRw_Bow_H_01) >= 1) || (Npc_HasItems(hero,ItRw_Bow_H_02) >= 1) || (Npc_HasItems(hero,ItRw_Bow_H_03) >= 1) || (Npc_HasItems(hero,ItRw_Bow_H_04) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_L_01) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_L_02) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_M_01) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_M_02) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_H_01) >= 1) || (Npc_HasItems(hero,ItRw_Crossbow_H_02) >= 1) || (Npc_HasItems(hero,itrw_orccrossbow) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Knife01) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Stab01) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Stab02) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Stab03) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Stab04) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Stab05) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Hacker_1h_01) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Hacker_1h_02) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Hacker_2h_01) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Hacker_2h_02) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Keule_1h_01) >= 1) || (Npc_HasItems(hero,ItMW_Addon_Keule_2h_01) >= 1) || (Npc_HasItems(hero,ItMw_FrancisDagger_Mis) >= 1) || (Npc_HasItems(hero,ItMw_RangerStaff_Addon) >= 1) || (Npc_HasItems(hero,ItMw_Addon_PIR2hAxe) >= 1) || (Npc_HasItems(hero,ItMw_Addon_PIR2hSword) >= 1) || (Npc_HasItems(hero,ItMw_Addon_PIR1hAxe) >= 1) || (Npc_HasItems(hero,ItMw_Addon_PIR1hSword) >= 1) || (Npc_HasItems(hero,ItMw_Addon_BanditTrader) >= 1) || (Npc_HasItems(hero,ItMw_Addon_Betty) >= 1) || (Npc_HasItems(hero,ItRw_Addon_MagicBow) >= 1) || (Npc_HasItems(hero,ItRw_Addon_FireBow) >= 1) || (Npc_HasItems(hero,ItRw_Addon_MagicCrossbow) >= 1) || (Npc_HasItems(hero,ITAR_Governor) >= 1) || (Npc_HasItems(hero,ITAR_Judge) >= 1) || (Npc_HasItems(hero,ITAR_Smith) >= 1) || (Npc_HasItems(hero,ITAR_Barkeeper) >= 1) || (Npc_HasItems(hero,ITAR_Vlk_L) >= 1) || (Npc_HasItems(hero,ITAR_Vlk_M) >= 1) || (Npc_HasItems(hero,ITAR_Vlk_H) >= 1) || (Npc_HasItems(hero,ITAR_Mil_L) >= 1) || (Npc_HasItems(hero,ItAr_MIL_M) >= 1) || (Npc_HasItems(hero,ItAr_PAL_M) >= 1) || (Npc_HasItems(hero,ItAr_PAl_H) >= 1) || (Npc_HasItems(hero,ITAR_Bau_L) >= 1) || (Npc_HasItems(hero,ITAR_Bau_M) >= 1) || (Npc_HasItems(hero,ItAr_Sld_L) >= 1) || (Npc_HasItems(hero,itar_sld_M) >= 1) || (Npc_HasItems(hero,ItAr_Sld_H) >= 1) || (Npc_HasItems(hero,ITAR_DJG_Crawler) >= 1) || (Npc_HasItems(hero,itar_djg_l) >= 1) || (Npc_HasItems(hero,itar_djg_m) >= 1) || (Npc_HasItems(hero,itar_djg_h) >= 1) || (Npc_HasItems(hero,ItAr_NOV_L) >= 1) || (Npc_HasItems(hero,ItAr_KDF_L) >= 1) || (Npc_HasItems(hero,ItAr_KDF_H) >= 1) || (Npc_HasItems(hero,ITAR_Leather_L) >= 1) || (Npc_HasItems(hero,ItAr_BDT_M) >= 1) || (Npc_HasItems(hero,ItAr_BDT_H) >= 1) || (Npc_HasItems(hero,ITAR_Dementor) >= 1) || (Npc_HasItems(hero,itar_kdw_h) >= 1) || (Npc_HasItems(hero,ITAR_Prisoner) >= 1) || (Npc_HasItems(hero,ItBE_Addon_Leather_01) >= 1) || (Npc_HasItems(hero,ItBE_Addon_SLD_01) >= 1) || (Npc_HasItems(hero,ItBE_Addon_NOV_01) >= 1) || (Npc_HasItems(hero,ItBE_Addon_MIL_01) >= 1) || (Npc_HasItems(hero,ItBE_Addon_KDF_01) >= 1) || (Npc_HasItems(hero,ItBE_Addon_MC) >= 1) || (Npc_HasItems(hero,ItBe_Addon_STR_5) >= 1) || (Npc_HasItems(hero,ItBe_Addon_STR_10) >= 1) || (Npc_HasItems(hero,ItBe_Addon_DEX_5) >= 1) || (Npc_HasItems(hero,ItBe_Addon_DEX_10) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_EDGE) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_Point) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_MAGIC) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_FIRE) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_EdgPoi) >= 1) || (Npc_HasItems(hero,ItBe_Addon_Prot_TOTAL) >= 1) || (Npc_HasItems(hero,ITAR_PIR_L_Addon) >= 1) || (Npc_HasItems(hero,ITAR_PIR_M_Addon) >= 1) || (Npc_HasItems(hero,ITAR_PIR_H_Addon) >= 1) || (Npc_HasItems(hero,ITAR_Thorus_Addon) >= 1) || (Npc_HasItems(hero,ITAR_Raven_Addon) >= 1) || (Npc_HasItems(hero,ITAR_OreBaron_Addon) >= 1) || (Npc_HasItems(hero,ITAR_RANGER_Addon) >= 1) || (Npc_HasItems(hero,ITAR_Bloodwyn_Addon) >= 1) || (Npc_HasItems(hero,ITAR_MayaZombie_Addon) >= 1) || (Npc_HasItems(hero,ItAr_FireArmor_Addon) >= 1) || (Npc_HasItems(self,ITAR_Bau_L1) >= 1) || (Npc_HasItems(self,ItMw_1h_Bau_Axe1) >= 1) || (Npc_HasItems(self,ITAR_AVATAR) >= 1))
{
if(self.id == 0)
{
KG_MAX = hero.attribute[ATR_STRENGTH] * 2;
...
};
};
};
};
};

Мне надо к каждой вещи с весом отдельно всё прописывать и раздувать скрипты на 300 кб и если что-то менять, то сидеть часами т.к. нужно изменять в 200+ местах, вместо 1.

Upd:

Всё работает, только единственная разница, но в этом же файле нужно прописывать ведь (кто-то сказал, работать не будет и компилятор даже и писка не подал):

func void init_oldworld()
{
INIT_SUB_Oldcamp();
INIT_SUB_Demontower();
INIT_SUB_Surface();
B_InitMonsterAttitudes();
B_InitGuildAttitudes();
B_InitNpcGlobals();
b_enter_oldworld();
if((MIS_ReadyforChapter4 == TRUE) && (B_Chapter4_OneTime == FALSE))
{
B_Kapitelwechsel(4,OldWorld_Zen);
B_Chapter4_OneTime = TRUE;
};
if(Locate2 >= 1)
{
oldworld_plus();
};
};

Мне достаточно +1/-1 км и в этой зоне ищи и найду. Привыкли к людям кому нужно разжевать, в рот положить и за них ещё нужно проглотить.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Насчёт Locate3 = 0; - это скажите спасибо тем кто придумал в проверке требовать два раза == (этой гадостью меня уже достали).
С этим все вопросы к создателям языков Си/С++ и Дедала, почему они не сделали это по вашему..

Мне надо к каждой вещи с весом отдельно всё прописывать и раздувать скрипты на 300 кб и если что-то менять, то сидеть часами т.к. нужно изменять в 200+ местах, вместо 1.
А кто тебя просил петрушку с "весами" городить, в оригинале и без этого всего бобра обходились не плохо, и скрипты были меньше .?!

Всё работает, только единственная разница, но в этом же файле нужно прописывать ведь (кто-то сказал, работать не будет и компилятор даже и писка не подал):
Кто-то подумал что ты там собрался писать собственные функции стартапов, это имелось ввиду, а если просто функцию которая вызывается из основы, то да, с ними нет проблем.. ::)
 

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
873
Благодарности
501
Баллы
245
Теперь вопрос: как прописать respawn монстров, но не конкретно в этой локации. А чтобы выбрать respawn и он по всем локациям идёт. По конкретной локации знаю respawn, это чисто новая функция с Wld_InsertNpc. Но как прописать respawn для 2 и более локаций сразу и он вызывался к примеру если помолиться богу (молишься в Хоринисе, respawn идёт в Хоринисе, Яркендаре и Минентале сразу и т.д.)?

Вот,самый простой пример.
Допустим имеется финдибоберный алтарь в городе Moscow,при молитве которому респавнятся звери НПС-ы во всех локациях.
1)В PreyShrine.d,в блоке "Помолиться",пишем B_Respawn(); :
func void PC_PrayShrine_Pray_Info()
{
B_Respawn();
Info_ClearChoices(PC_PrayShrine_Pray);
Info_AddChoice(PC_PrayShrine_Pray,Dialog_Back,PC_PrayShrine_Pray_Back);
Info_AddChoice(PC_PrayShrine_Pray,"Я хочу помолиться и пожертвовать 0 золотых монет.",PC_PrayShrine_Pray_NoPay);
........
.......
2)Cоздаем этот самый B_Respawn.d в B_Story,с кодом:

func void B_Respawn()
{
if((Npc_GetDistToWP(hero,"PRAYINNOS_MOSCOW") < 2000) && PreyMoscow == false)
{
Wld_InsertNpc(Sheep,"MOSCOW");//респавн в этой же локации
....
....
PreyMoscow = true;//не дает респавнится при последующих молитвах.
};
};
где,"PREYINNOS_MOSCOW" вейпойнт у алтаря.
3)Прописываем var int PreyMoscow; в Story_Globals.d
4)Создаем скрипт посещения другой локации,к примеру Piter.
B_Enter_Piter.d:
func void B_ENTER_PITER()
{
var int RespawnPiter;

if(PreyMoscow == true && RespawnPiter == false)
{
Wld_InsertNpc(Sheep,"Piter");
....
....
RespawnPiter = true;
};
};
где переменная RespawnPiter,не дает респавнится при последующих посещениях локации.
(и для каждой другой локации делаем на подобии,но со своими переменными:RespawnSamara,RespawnSunSochi и тд)
5)в Startup.d,в блоке относящемуся к локе PITER,вставляем B_ENTER_PITER(); :
func void init_piter()
{
B_InitMonsterAttitudes();
B_InitGuildAttitudes();
B_InitNpcGlobals();
B_ENTER_PITER();
init_sub_piter();
};
(для других городов,в их соответствующих блоках)
6)В gothic.src прописываем:
Story\B_Story\B_Respawn.d сразу над мобси диалогами.
Story\B_Story\B_Enter_Piter.d(Story\B_Story\B_Enter_Samara.d,Story\B_Story\B_Enter_SunSochi.d),примерно сразу над диалогами неписей.
Если понадобится снова завести этот механизм,то обнуляй все переменные в диалоге с каким-нибудь неписем(только переменные типа RespawnPiter придется уже объявлять не на месте,а в Story_Globals.)
Проверено,работает.
А далее усложняй как хош.
 
Последнее редактирование:

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Я не совсем понял что это за файл и откуда он вообще, это твое творение?


Если есть зацикливание значит метод реализации ты выбрал не верный, надо искать другое решение.

Добрый день. Если бы мною было сделано, а оно в оригинале в самом начале файла C_NpcIsInQuarter.d

func int C_GetDistToCenter(var C_Npc slf,var int quarter)
{
var int dist;
if(quarter == Q_KASERNE)
{
if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CENTRE_03") < Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP"))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CENTRE_03");
}
else
{
dist = Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP");
};
}
else if(quarter == Q_GALGEN)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_33_B");
if(dist > 1900)
{
dist = 100000;
};
}
else if(quarter == Q_MARKT)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_36");
if(dist > 2300)
{
dist = 100000;
};
}
else if(quarter == Q_TEMPEL)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_TEMPLE_FRONT");
}
else if(quarter == Q_UNTERSTADT)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MAINSTREET_05");
}
else if(quarter == Q_HAFEN)
{
if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_PATH_07") < Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02"))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_PATH_07");
}
else
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02");
};
}
else if(quarter == Q_OBERSTADT)
{
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04");
};
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16");
};
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18");
};
}
else
{
PrintPlus("WRONG Q-PARAMETER!");
};
return dist;
};

func int C_IsQuarterNearest(var C_Npc slf,var int quart)
{
var int quartDist;
quartDist = C_GetDistToCenter(slf,quart);
if((quartDist <= C_GetDistToCenter(slf,Q_KASERNE)) && (quartDist <= C_GetDistToCenter(slf,Q_GALGEN)) && (quartDist <= C_GetDistToCenter(slf,Q_MARKT)) && (quartDist <= C_GetDistToCenter(slf,Q_TEMPEL)) && (quartDist <= C_GetDistToCenter(slf,Q_UNTERSTADT)) && (quartDist <= C_GetDistToCenter(slf,Q_HAFEN)) && (quartDist <= C_GetDistToCenter(slf,Q_OBERSTADT)))
{
return TRUE;
}
else
{
return FALSE;
};
};

func int C_NpcIsInQuarter(var C_Npc slf)
{
if(C_IsQuarterNearest(slf,Q_KASERNE))
{
return Q_KASERNE;
};
if(C_IsQuarterNearest(slf,Q_GALGEN))
{
return Q_GALGEN;
};
if(C_IsQuarterNearest(slf,Q_MARKT))
{
return Q_MARKT;
};
if(C_IsQuarterNearest(slf,Q_TEMPEL))
{
return Q_TEMPEL;
};
if(C_IsQuarterNearest(slf,Q_UNTERSTADT))
{
return Q_UNTERSTADT;
};
if(C_IsQuarterNearest(slf,Q_HAFEN))
{
return Q_HAFEN;
};
if(C_IsQuarterNearest(slf,Q_OBERSTADT))
{
return Q_OBERSTADT;
};
};

А если отследить взаимосвязи Q_KASERNE, Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT то мной и нашлись взаимосвязи этих переменных между файлами B_AssessTalk.d, B_AssignAmbientInfos_MIL_6.d, B_AssignAmbientInfos_MIL_7.d, B_AssignCityGuide.d, C_NpcIsInQuarter.d, а вот с dist не нашлось взаимосвязей в виде скриптовой обработки (Только условия, вероятно в движке идёт просчёт и что там сделано, не могу знать). Значит трогать то, что полностью не знаешь уже опасно для здоровья компьютера.

Может, что-то было мной пропущено в взаимосвязи переменных между файлами, но основа показывает "тронешь" и вероятность зацикливания 99.9% т.к. нет данных движка.

Боюсь соврать, но по-моему, данного оверлея в Готике 2 нет. Он есть только в Готике 1.
Для готики 2 нужно это:
Код:
Mdl_SetVisual(self,"HumanS.mds");
Mdl_SetVisualBody(self,"Ske_Body2",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);

И то, я бы проверил, что Ske_Body2.ASC в компилированном виде в Готике 2 есть. А сам скрипт не огрызок скрипта Г1.

Да, на заметку: скелеты в Готике 1 и 2 реализованы по-разному в плане "вижуала".

Если просто, то для Готики 2 возьми скрипт какого-нибудь Пети, и замени ему строку Mdl_SetVisualBody на ту, что чуть выше, убедившись, что Ske_Body2 в Готике 2 есть. Или возьми эту же строку от стандартного скелета в Готике 2.

Помню видео с мода где играешь за скелета и там говорили, что движок игры со скелетами не дружит. Спасибо. Всё работает и сейчас впервые было услышано, чтобы скелет говорил (немного был шок) (внешне он немного более белее, чем аналогичный скелет из гильдии скелетов).

Осталось дописать изменения в квест с скелетами далее, т.к. только тестовый вариант создан и проверять "
Создание скриптовой зацикленной функции при помощи Trigger-Script (ZEN)" на версии компилятора 3.14
 

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Добрый день. Если бы мною было сделано, а оно в оригинале в самом начале файла C_NpcIsInQuarter.d

func int C_GetDistToCenter(var C_Npc slf,var int quarter)
{
var int dist;
if(quarter == Q_KASERNE)
{
if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CENTRE_03") < Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP"))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CENTRE_03");
}
else
{
dist = Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP");
};
}
else if(quarter == Q_GALGEN)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_33_B");
if(dist > 1900)
{
dist = 100000;
};
}
else if(quarter == Q_MARKT)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_36");
if(dist > 2300)
{
dist = 100000;
};
}
else if(quarter == Q_TEMPEL)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_TEMPLE_FRONT");
}
else if(quarter == Q_UNTERSTADT)
{
dist = Npc_GetDistToWP(slf,"NW_CITY_MAINSTREET_05");
}
else if(quarter == Q_HAFEN)
{
if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_PATH_07") < Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02"))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_PATH_07");
}
else
{
dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02");
};
}
else if(quarter == Q_OBERSTADT)
{
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04");
};
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16");
};
if((Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04")) && (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16")))
{
dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18");
};
}
else
{
PrintPlus("WRONG Q-PARAMETER!");
};
return dist;
};

func int C_IsQuarterNearest(var C_Npc slf,var int quart)
{
var int quartDist;
quartDist = C_GetDistToCenter(slf,quart);
if((quartDist <= C_GetDistToCenter(slf,Q_KASERNE)) && (quartDist <= C_GetDistToCenter(slf,Q_GALGEN)) && (quartDist <= C_GetDistToCenter(slf,Q_MARKT)) && (quartDist <= C_GetDistToCenter(slf,Q_TEMPEL)) && (quartDist <= C_GetDistToCenter(slf,Q_UNTERSTADT)) && (quartDist <= C_GetDistToCenter(slf,Q_HAFEN)) && (quartDist <= C_GetDistToCenter(slf,Q_OBERSTADT)))
{
return TRUE;
}
else
{
return FALSE;
};
};

func int C_NpcIsInQuarter(var C_Npc slf)
{
if(C_IsQuarterNearest(slf,Q_KASERNE))
{
return Q_KASERNE;
};
if(C_IsQuarterNearest(slf,Q_GALGEN))
{
return Q_GALGEN;
};
if(C_IsQuarterNearest(slf,Q_MARKT))
{
return Q_MARKT;
};
if(C_IsQuarterNearest(slf,Q_TEMPEL))
{
return Q_TEMPEL;
};
if(C_IsQuarterNearest(slf,Q_UNTERSTADT))
{
return Q_UNTERSTADT;
};
if(C_IsQuarterNearest(slf,Q_HAFEN))
{
return Q_HAFEN;
};
if(C_IsQuarterNearest(slf,Q_OBERSTADT))
{
return Q_OBERSTADT;
};
};

А если отследить взаимосвязи Q_KASERNE, Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT то мной и нашлись взаимосвязи этих переменных между файлами B_AssessTalk.d, B_AssignAmbientInfos_MIL_6.d, B_AssignAmbientInfos_MIL_7.d, B_AssignCityGuide.d, C_NpcIsInQuarter.d, а вот с dist не нашлось взаимосвязей в виде скриптовой обработки (Только условия, вероятно в движке идёт просчёт и что там сделано, не могу знать). Значит трогать то, что полностью не знаешь уже опасно для здоровья компьютера.

Может, что-то было мной пропущено в взаимосвязи переменных между файлами, но основа показывает "тронешь" и вероятность зацикливания 99.9% т.к. нет данных движка.



Помню видео с мода где играешь за скелета и там говорили, что движок игры со скелетами не дружит. Спасибо. Всё работает и сейчас впервые было услышано, чтобы скелет говорил (немного был шок) (внешне он немного более белее, чем аналогичный скелет из гильдии скелетов).

Осталось дописать изменения в квест с скелетами далее, т.к. только тестовый вариант создан и проверять "
Создание скриптовой зацикленной функции при помощи Trigger-Script (ZEN)" на версии компилятора 3.14
А что такого страшного в зацикливании? Все программы... даже нет - любая ОСь работает по принципу зацикливания. А что насчет dist - то откуда могут взяться взаимосвязи, она ведь локальная переменная? Ты хоть немного программирования изучал? В любом случае бери книгу "С. Прата. Язык программирования C++. Лекции и упражнения" и грызи(с++ и даедал похожи синтаксисом и большинством принципов, как например циклы, видимости переменных и т.д, так-же именно эту книгу я читал когда начинал изучать с++).
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
А что такого страшного в зацикливании? Все программы... даже нет - любая ОСь работает по принципу зацикливания. А что насчет dist - то откуда могут взяться взаимосвязи, она ведь локальная переменная? Ты хоть немного программирования изучал? В любом случае бери книгу "С. Прата. Язык программирования C++. Лекции и упражнения" и грызи(с++ и даедал похожи синтаксисом и большинством принципов, как например циклы, видимости переменных и т.д, так-же именно эту книгу я читал когда начинал изучать с++).

Dist для определения дистанции (локально) служит, хорошо допустим. Как тогда работает Npc_GetDistToWP(Lester,"NW_XARDAS_TOWER_IN1_31") <= 500)?
И по какой причине должно сработать PrintPlus("WRONG Q-PARAMETER!");? (Будь добр назови)
Мне достаточно примера как готика 3 и Готика 3 + Аддон = компьютеров процессоры убивали. (Если у тебя миллионы долларов лежат, тогда всё ясно. Легко возьмёшь и новый процессор купишь и поставишь.)

Ещё один заводской глюк т.е. Пираний. Если у оружия будет параметр DAM_FLY противник если в состоянии B_Attack(self,other,AR_SuddenEnemyInferno,1) и аналогичных при отбрасывании (любая дистанция, хоть 1 игровая единица, хоть 50) оружие складывает и забывает, что хотел сделать. Это поправимо или в движке ошибка?
 
Последнее редактирование:

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Dist для определения дистанции (локально) служит, хорошо допустим. Как тогда работает Npc_GetDistToWP(Lester,"NW_XARDAS_TOWER_IN1_31") <= 500)?
И по какой причине должно сработать PrintPlus("WRONG Q-PARAMETER!");? (Будь добр назови)
Мне достаточно примера как готика 3 и Готика 3 + Аддон = компьютеров процессоры убивали. (Если у тебя миллионы долларов лежат, тогда всё ясно. Легко возьмёшь и новый процессор купишь и поставишь.)
1. Возвращается значение переменной "dist", а не она сама, и после каждого вызова функции она удаляется, и создаётся при вызове. То что ты написал - это условие которое происходит если функция "Npc_GetDistToWP" возвращает значение меньшее, или равное 500.
2. "PrintPlus("WRONG Q-PARAMETER!");" срабатывает если указан параметр "int quarter" дистанция для которого не может быть сосчитана(например когда такого пункта не существует).
3. Готика 3 лагает из-за плохой оптимизации, а не из-за зацикливания. Она давала процессору слишком много инструкции для выполнения чего-то что можно выполнить при меньшем усилии. И вообще если ты не заметил то комьюнити патч оптимизирует инструкции и контейнеры, что уменьшает время для выполнения команд игры. А про миллион, то просто смешно, я в готику 3 играл на железе что и в то время было не первой свежести.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
1. Возвращается значение переменной "dist", а не она сама, и после каждого вызова функции она удаляется, и создаётся при вызове. То что ты написал - это условие которое происходит если функция "Npc_GetDistToWP" возвращает значение меньшее, или равное 500.
2. "PrintPlus("WRONG Q-PARAMETER!");" срабатывает если указан параметр "int quarter" дистанция для которого не может быть сосчитана(например когда такого пункта не существует).
3. Готика 3 лагает из-за плохой оптимизации, а не из-за зацикливания. Она давала процессору слишком много инструкции для выполнения чего-то что можно выполнить при меньшем усилии. И вообще если ты не заметил то комьюнити патч оптимизирует инструкции и контейнеры, что уменьшает время для выполнения команд игры. А про миллион, то просто смешно, я в готику 3 играл на железе что и в то время было не первой свежести.

if(quarter == Q_KASERNE) и остальные сравнения (Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT) этот пункт был пропущен т.к. как компилятор требует:

Story\B_Story\C_NpcIsInQuarter.d(116): Внимание: Функция должна возвращать значение

func int C_NpcIsInQuarter(var C_Npc slf)
{
if(C_IsQuarterNearest(slf,Q_KASERNE))
{
return Q_KASERNE;
};
if(C_IsQuarterNearest(slf,Q_GALGEN))
{
return Q_GALGEN;
};
if(C_IsQuarterNearest(slf,Q_MARKT))
{
return Q_MARKT;
};
if(C_IsQuarterNearest(slf,Q_TEMPEL))
{
return Q_TEMPEL;
};
if(C_IsQuarterNearest(slf,Q_UNTERSTADT))
{
return Q_UNTERSTADT;
};
if(C_IsQuarterNearest(slf,Q_HAFEN))
{
return Q_HAFEN;
};
if(C_IsQuarterNearest(slf,Q_OBERSTADT))
{
return Q_OBERSTADT;
};
};

Т.е. поставь возврат числа которое вне диапазона чисел 1 от 7 т.к. согласно AI_Constants.d
const int Q_KASERNE = 1;
const int Q_GALGEN = 2;
const int Q_MARKT = 3;
const int Q_TEMPEL = 4;
const int Q_UNTERSTADT = 5;
const int Q_HAFEN = 6;
const int Q_OBERSTADT = 7;

Если quarter не равен цифре от 1 до 7 (Q_KASERNE, Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT) то и должно сработать "PrintPlus("WRONG Q-PARAMETER!");".

Т.е. согласно компилятора поставь любое число и получишь срабатывание из-за проверочного условия. К чему оно приведёт у меня нет информации и на ресурсах по Gothic не указано.

В готику 3 мною на Pentium 4 игралось и тогда это был мой единственный компьютер дома. Фанатский патч на Готику 3 изменяет сюжет на такой "бред", что предпочитаю его не вспоминать т.к. от такого ночью ужасы будут сниться.

Насчёт урона через ветер, где ноги зарыты?
 
Последнее редактирование:

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
if(quarter == Q_KASERNE) и остальные сравнения (Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT) этот пункт был пропущен т.к. как компилятор требует:

Story\B_Story\C_NpcIsInQuarter.d(116): Внимание: Функция должна возвращать значение

func int C_NpcIsInQuarter(var C_Npc slf)
{
if(C_IsQuarterNearest(slf,Q_KASERNE))
{
return Q_KASERNE;
};
if(C_IsQuarterNearest(slf,Q_GALGEN))
{
return Q_GALGEN;
};
if(C_IsQuarterNearest(slf,Q_MARKT))
{
return Q_MARKT;
};
if(C_IsQuarterNearest(slf,Q_TEMPEL))
{
return Q_TEMPEL;
};
if(C_IsQuarterNearest(slf,Q_UNTERSTADT))
{
return Q_UNTERSTADT;
};
if(C_IsQuarterNearest(slf,Q_HAFEN))
{
return Q_HAFEN;
};
if(C_IsQuarterNearest(slf,Q_OBERSTADT))
{
return Q_OBERSTADT;
};
};

Т.е. поставь возврат числа которое вне диапазона чисел 1 от 7 т.к. согласно AI_Constants.d
const int Q_KASERNE = 1;
const int Q_GALGEN = 2;
const int Q_MARKT = 3;
const int Q_TEMPEL = 4;
const int Q_UNTERSTADT = 5;
const int Q_HAFEN = 6;
const int Q_OBERSTADT = 7;

Если quarter не равен цифре от 1 до 7 (Q_KASERNE, Q_GALGEN, Q_MARKT, Q_TEMPEL, Q_UNTERSTADT, Q_HAFEN, Q_OBERSTADT) то и должно сработать "PrintPlus("WRONG Q-PARAMETER!");".

Т.е. согласно компилятора поставь любое число и получишь срабатывание из-за проверочного условия. К чему оно приведёт у меня нет информации и на ресурсах по Gothic не указано.

В готику 3 мною на Pentium 4 игралось и тогда это был мой единственный компьютер дома. Фанатский патч на Готику 3 изменяет сюжет на такой "бред", что предпочитаю его не вспоминать т.к. от такого ночью ужасы будут сниться.

Насчёт урона через ветер, где ноги зарыты?

1. "PrintPlus("WRONG Q-PARAMETER!");" сработает только если дать функции C_IsQuarterNearest неверный параметр.
2. Любое число можно ставить, т.к ничего не мешает добавить "const int Q_CUSTOM = 8;".
3. Поверь - процессор у меня был не на много лучше твоего.
4. Я вообще не понял про какой "кошмарный" патч ты говоришь. Я играл с community patch v1.74.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ещё один заводской глюк т.е. Пираний. Если у оружия будет параметр DAM_FLY противник если в состоянии B_Attack(self,other,AR_SuddenEnemyInferno,1) и аналогичных при отбрасывании (любая дистанция, хоть 1 игровая единица, хоть 50) оружие складывает и забывает, что хотел сделать. Это поправимо или в движке ошибка?

Этот баг наблюдается если это оружие ближнего боя или магия (заклинание Spell_WindFist им страдает). Как возможно данный баг излечить? Т.к. в скриптах написано ведь, если определённая дистанция пройдена NPC бросает бежать за ГГ (более 500 игровой дистанции). Но из-за урона через ветер игнорируется всё.

Ну циклический триггер работает по принципу рекурсии(рекурсию я например изучил когда только начинал программировать) т.е функция вызывает триггер, который через определённое время вызывает опять функцию.
Вот небольшой тутор:
1.Идёшь например в центр мира:
UYw7NH8.jpg


9HN0vo5.jpg

2.Создаёшь триггер:
o90HdZL.jpg


RgKRei3.jpg

3.Прописываешь в него следующие параметры(имя триггера и функции вызова можно изменить, и они должны быть на латинице с ЗАГЛАВНЫМИ буквами) и жмёшь "Apply".
9mvyoIA.jpg

4.Создаешь файл (например в "_work\data\Scripts\Content\Story") с именем "Triggers.d", и в него вписываешь следующий код:
Код:
func void CYCLE() //Имя функции замени на параметр "scriptFunc" из параметров триггера.
{
    if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Если ГГ не находится в мире, то триггер будет зациклен пока ГГ не появиться.
    {
        Wld_SendTrigger("TRIGGER"); //Замени на имя триггера.
        return;
    };

    //Если ГГ есть, то будет выполняться код.

    //Здесь вставляй свой код.

    Wld_SendTrigger("TRIGGER"); //А это рекурсия(то, о чём я говорил).
};

5.В файле gothic.src прописываешь файл(в данном случае "Story\Triggers.d") ПЕРЕД "Story\Startup.d".

6.В файле "Story\Startup.d" в функции "init_ИмяУровня" прописываешь это:
Код:
Wld_SendTrigger("TRIGGER"); //Замени на имя триггера.

Теперь всё должно работать(Я проверял!).

Добрый вечер. Уже вторые сутки изучаю твой вариант, вариант Мухомора и вариант JACTYL и не могу понять, почему только 1 раз выполнение происходит скрипта https://worldofplayers.ru/threads/31401/#post-440054 уже не пойму.

Зацикливание не происходит.

func void Mahou()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
{
Wld_SendTrigger("SASAMI");
return;
};

B_GetTime();

Wld_SendTrigger("SASAMI");
};

func void INIT_NewWorld()
{
B_InitMonsterAttitudes();
B_InitGuildAttitudes();
B_InitNpcGlobals();
b_enter_newworld();
if(Diebesgilde_Verraten && (Andre_Diebesgilde_aufgeraeumt != TRUE))
{
if(!Npc_IsDead(Cassia) || !Npc_IsDead(Jesper) || !Npc_IsDead(Ramirez))
{
B_KillNpc(VLK_447_Cassia);
B_KillNpc(VLK_446_Jesper);
B_KillNpc(VLK_445_Ramirez);
Andre_Diebesgilde_aufgeraeumt = TRUE;
};
};
INIT_SUB_NewWorld_Part_City_01();
INIT_SUB_NewWorld_Part_Farm_01();
INIT_SUB_NewWorld_Part_Xardas_01();
INIT_SUB_NewWorld_Part_Monastery_01();
INIT_SUB_NewWorld_Part_GreatPeasant_01();
INIT_SUB_NewWorld_Part_TrollArea_01();
INIT_SUB_NewWorld_Part_Forest_01();
INIT_SUB_NewWorld_Part_Pass_To_OW_01();
if((MIS_ReadyForChapter3 == TRUE) && (B_Chapter3_OneTime == FALSE))
{
B_Kapitelwechsel(3,NEWWORLD_ZEN);
B_Chapter3_OneTime = TRUE;
};
if((MIS_AllDragonsDead == TRUE) && (B_Chapter5_OneTime == FALSE))
{
B_Kapitelwechsel(5,NEWWORLD_ZEN);
B_Chapter5_OneTime = TRUE;
};
Mahou();
};

func void init_global()
{
Game_InitGerman();
Wld_SendTrigger("SASAMI");
};

SASAMI - название триггера
Mahou - название функции

Выводит на экран ровно на 1 секунду 00:00 и исчезает и больше не срабатывает (даже если вместо функции часов ставить, вывести строчку с текстом - 1 раз срабатывание и снова тишина)

Что в func void init_global, что в INIT_NewWorld (1 раз срабатывает Wld_SendTrigger("SASAMI");)

Всё сделано в соответствии с указаниями cool_er.
 
Последнее редактирование:

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Этот баг наблюдается если это оружие ближнего боя или магия (заклинание Spell_WindFist им страдает). Как возможно данный баг излечить? Т.к. в скриптах написано ведь, если определённая дистанция пройдена NPC бросает бежать за ГГ (более 500 игровой дистанции). Но из-за урона через ветер игнорируется всё.



Добрый вечер. Уже вторые сутки изучаю твой вариант, вариант Мухомора и вариант JACTYL и не могу понять, почему только 1 раз выполнение происходит скрипта https://worldofplayers.ru/threads/31401/#post-440054 уже не пойму.

Зацикливание не происходит.

func void Mahou()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
{
Wld_SendTrigger("SASAMI");
return;
};

B_GetTime();

Wld_SendTrigger("SASAMI");
};

SASAMI - название триггера
Mahou - название функции

Выводит на экран ровно на 1 секунду 00:00 и исчезает и больше не срабатывает

Всё сделано в соответствии с указаниями cool_er.
Возможно спейсер изменил название функции на заглавные буквы. Попробуй использовать "MAHOU ".
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Возможно спейсер изменил название функции на заглавные буквы. Попробуй использовать "MAHOU ".

1 срабатывание остаётся и всё. Зацикливание не идёт. Прямое зацикливание если

func void Mahou()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
{
Wld_SendTrigger("SASAMI");
return;
};

B_GetTime();

Mahou();
};

Даёт зацикливание, что с ошибкой игра выкидывается Windows. Уже догадок не хватает, твой вариант, JACTYL, Мухомора совпадают в Spacer. В скриптовой части почти полностью совпадают. Где собака зарыта не пойму.

Одна гипотеза, что с такими локациями как Хоринис, Миненталь и Яркендар данный способ не работает из-за склеенных локаций.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Даёт зацикливание, что с ошибкой игра выкидывается Windows. Уже догадок не хватает, твой вариант, JACTYL, Мухомора совпадают в Spacer. В скриптовой части почти полностью совпадают. Где собака зарыта не пойму.
Одна гипотеза, что с такими локациями как Хоринис, Миненталь и Яркендар данный способ не работает из-за склеенных локаций.
Эм.. что из этого тебе не понятно?

Запуск скриптовой функции из startup.d

func void init_world() //функция инициализации мира, срабатывает при каждой загрузке мира, в том числе из сохранения игры, где world является именем WORLD.ZEN.
{
B_CYCLE_FUNCTION(); //вызов описанной ниже скриптовой функции при инициализации мира.
};

все сделал как указано здесь, точно сделал ?!
Работа со скриптами.
Создание функции, вызываемой триггером, можно разместить где-угодно, но не после startup.d

func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, находится ли ГГ в мире, иначе сразу вызов триггера без продолжения выполнения функции.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
return; //Выход из функции.
};

//Дальше можно вставлять множество своих функций...

MyFunction1();
MyFunction2();
MyFunction3();

Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};

----
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Эм.. что из этого тебе не понятно?



все сделал как указано здесь, точно сделал ?!

// GothicSourcer workspace file
// WARNING: DO NOT EDIT OR DELETE THIS FILE!

_Intern\Constants.d
_Intern\Classes.d
AI\AI_Intern\AI_Constants.d
AI\AI_Intern\BodyStates.d
AI\AI_Intern\Focus.d
AI\AI_Intern\Npc_SetToMad.d
AI\AI_Intern\Species.d
AI\AI_Intern\PrintDebug.d
AI\AI_Intern\PrintPlus.d
Story\Events\B_Awake_StoneGuardian.d
Story\Log_Entries\LOG_Constants_Hoshi.d
Story\Log_Entries\LOG_Constants_Mattes.d
Story\Log_Entries\LOG_Constants_Notes.d
Story\Log_Entries\LOG_Constants_Yoly.d
Story\XP_Constants.d
Story\Story_Globals.d
_misk_\0Misk_Form.d
_misk_\SASAMI.d
....
Story\Startup.d

func void B_GetTime()
{
var string concatText;

var int t;
var int m;

if(Wld_IsTime(time_hour,0,time_hour,59))
{
t = time_hour;
};
if(Wld_IsTime(t,time_minutes,t,time_minutes + 2))
{
m = time_minutes + 1;
};

time_hour += 1;
time_minutes += 1;

if(time_hour >= 24)
{
time_hour = 0;
};
if(time_minutes >= 60)
{
time_minutes = 0;
};

concatText = "";
if(t < 10)
{
concatText = ConcatStrings(concatText, "0");
};
concatText = ConcatStrings(concatText, IntToString(t));

concatText = ConcatStrings(concatText,":");

if(m < 10)
{
concatText = ConcatStrings(concatText, "0");
};
concatText = ConcatStrings(concatText, IntToString(m));
PrintScreen(concatText,50,90,FONT_ScreenSmall,1);
};

func void MAHOU()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
{
Wld_SendTrigger("SASAMI");
return;
};
B_GetTime();
Wld_SendTrigger("SASAMI");
};

const string FONT_Screen = "FONT_OLD_20_WHITE.TGA";
const string FONT_ScreenSmall = "FONT_OLD_10_WHITE.TGA";
const string FONT_Book = "FONT_10_BOOK.TGA";
const string FONT_BookHeadline = "FONT_20_BOOK.TGA";

var int time_hour;
var int time_minutes;
var int crime_day;
var int skelet_day;
var int men_day;
var int dov_day;
var int dov1_day;
var int dov2_day;
var int leva;
var int Locate3;
var int Locate2;
var int Locate1;
var int prizo;
var int prizo1;
var int prizo2;
var int prizo3;
var int prizo4;
var int prizo5;
var int prizo6;
var int prizo7;
var int prizo8;
var int prizo9;
var int prizo10;
var int prizo11;
var int prizo12;
var int vor;
var int amazonka;
var int kg_max;
var int kg_min;
var int kg_1;
var int kg_2;
var int kg_3;
var int kg_4;
var int kgp_1;
var int kgp_2;
var int kgp_3;
var int kgp_4;
var int kgp_5;
var int kgp_6;
var int kgp_7;
const int SPL_Cost_Scroll = 5;
const int ATR_HITPOINTS = 0;
const int ATR_HITPOINTS_MAX = 1;
const int ATR_MANA = 2;
const int ATR_MANA_MAX = 3;
const int ATR_STRENGTH = 4;
const int ATR_DEXTERITY = 5;
const int ATR_REGENERATEHP = 6;
const int ATR_REGENERATEMANA = 7;
const int ATR_INDEX_MAX = 8;

func void INIT_NewWorld()
{
B_InitMonsterAttitudes();
B_InitGuildAttitudes();
B_InitNpcGlobals();
b_enter_newworld();
if(Diebesgilde_Verraten && (Andre_Diebesgilde_aufgeraeumt != TRUE))
{
if(!Npc_IsDead(Cassia) || !Npc_IsDead(Jesper) || !Npc_IsDead(Ramirez))
{
B_KillNpc(VLK_447_Cassia);
B_KillNpc(VLK_446_Jesper);
B_KillNpc(VLK_445_Ramirez);
Andre_Diebesgilde_aufgeraeumt = TRUE;
};
};
INIT_SUB_NewWorld_Part_City_01();
INIT_SUB_NewWorld_Part_Farm_01();
INIT_SUB_NewWorld_Part_Xardas_01();
INIT_SUB_NewWorld_Part_Monastery_01();
INIT_SUB_NewWorld_Part_GreatPeasant_01();
INIT_SUB_NewWorld_Part_TrollArea_01();
INIT_SUB_NewWorld_Part_Forest_01();
INIT_SUB_NewWorld_Part_Pass_To_OW_01();
if((MIS_ReadyForChapter3 == TRUE) && (B_Chapter3_OneTime == FALSE))
{
B_Kapitelwechsel(3,NEWWORLD_ZEN);
B_Chapter3_OneTime = TRUE;
};
if((MIS_AllDragonsDead == TRUE) && (B_Chapter5_OneTime == FALSE))
{
B_Kapitelwechsel(5,NEWWORLD_ZEN);
B_Chapter5_OneTime = TRUE;
};
MAHOU();
};

Изображение триггера из Spacer нужно?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Да е..
Как у тебя триггер называется в мире игры? Его название давай из вкладки Спейсера, а не своих кривых скриптов..
Как называется функция триггера в скриптах? ее тоже здесь укажи..
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Да е..
Как у тебя триггер называется в мире игры? Его название давай из вкладки Спейсера, а не своих кривых скриптов..
Как называется функция триггера в скриптах? ее тоже здесь укажи..

До слов cool_er "Возможно спейсер изменил название функции на заглавные буквы. Попробуй использовать "MAHOU "." название функции было Mahou. Результат один и тот же, 1 срабатывание.
2015-08-11_20-47-47.jpg


Функция триггера MAHOU.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Измени название функции триггера в его свойствах с Mahou на MAHOU, последняя строка на картинке.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Измени название функции триггера в его свойствах с Mahou на MAHOU, последняя строка на картинке.

Спасибо MaGoth и cool_er, замена названия функции на большие буквы сделало нужный эффект. Теперь всё зациклено работает.
 
Сверху Снизу