Itharu Team

Forum grupy modderskiej Itharu Team.

  • Nie jesteś zalogowany.

Ogłoszenie

PATRONITE

#1 2016-12-10 16:39:05

Kruk
Administracja Itharu Team
Zarejestrowany: 2016-12-09
Posty: 982

[G2 NK] - Ustawianie NPC'om zaklęć

Czy denerwowało Was kiedyś, że NPC korzystały praktycznie z dwóch zaklęć? Z kuli ognia i ogłuszającego pocisku. Wyjątkiem byli oczywiście poszukiwacze, których arsenał był nieznacznie powiększony. Załóżmy, że chcemy, aby magowie wody posługiwali się zaklęciami skupionymi wokół wody jak w przypadku Gothica 1.

Otwieramy plik B_SelectSpell.d znajdujący się w _Work\data\Scripts\Content\AI\Magic.

Napiszmy sobie kod dla magów wody. Wyszukujemy // ------ Magier ------ i kod wklejamy przed. Możemy opatrzyć go komentarzem np. // ------ Wasser-Magier ------. Ważne jest, aby wkleić ten kod PRZED blokiem oznaczonym jako // ------ Magier ------, ponieważ on definiuje zachowania dla Magów ognia ORAZ postaci z aivarem AIV_MagicUser ustawionym na MAGIC_ALWAYS. Właśnie taką wartość mają ustawioną magowie wody, więc jeśli nasz kod umieścimy poniżej, wówczas nie zobaczymy żadnych efektów w grze.

Kod:

if (slf.guild == GIL_KDW)
    {
        if (Npc_HasItems (slf, ItRu_IceCube) == 0) 
        {
            CreateInvItems (slf, ItRu_IceCube, 1);
        };
        
        if (Npc_HasItems (slf, ItRu_Geyser) == 0)
        {
            CreateInvItems (slf, ItRu_Geyser, 1);
        };
        
        if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
        {
            CreateInvItems (slf, ItRu_FullHeal, 1);
        };
        
        if (self.attribute[ATR_HITPOINTS] < 100) 
        {
            B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
            return TRUE;
        }
        else if (!Npc_IsInState (oth, ZS_MagicFreeze))
        {
            B_ReadySpell (slf, SPL_ICECUBE, SPL_Cost_ICECUBE);
            return TRUE;
        }
        else
        {
            B_ReadySpell (slf, SPL_Geyser, SPL_Cost_Geyser);
            return TRUE;
        };
    };

Teraz po kolei - komentarz do danej części kodu umieściłem pod nim img/smilies/smile

Kod:

if (slf.guild == GIL_KDW)

Ten warunek odpowiada za to, aby z tego sposobu rzucania zaklęć korzystali tylko NPCy z gildią ustawioną na GIL_KDW co ustawiamy w pliku z postacią, np.

Kod:

    name     = "Saturas";
    guild         = GIL_KDW; 
    id         = 14000;
    voice     = 14;
    flags    = NPC_FLAG_IMMORTAL;                                                                    
    npctype        = NPCTYPE_MAIN;
    
    // ------ aivars ------
    aivar[AIV_MagicUser] = MAGIC_ALWAYS;
    aivar[AIV_IgnoresFakeGuild] = TRUE;
    aivar[AIV_IgnoresArmor]     = TRUE;

Teraz dochodzimy do części odpowiadającej za dodawanie NPCom interesujących ich run.

Kod:

if (Npc_HasItems (slf, ItRu_IceCube) == 0) 
        {
            CreateInvItems (slf, ItRu_IceCube, 1);
        };
        
        if (Npc_HasItems (slf, ItRu_Geyser) == 0)
        {
            CreateInvItems (slf, ItRu_Geyser, 1);
        };
        
        if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
        {
            CreateInvItems (slf, ItRu_FullHeal, 1);
        };

Mówiąc najprościej, mamy trzy, niezależne warunki. Jeśli NPC nie posiada runy bryły lodu, otrzyma jedną. Jeśli nie ma runy gejzeru, otrzyma jedną. Jeśli nie ma runy pełnego leczenia, otrzyma jedną.
----
Teraz najbardziej interesująca nas część, czyli konkretne zachowanie NPCów. Działanie tej części kodu również jest proste.

Kod:

         if (self.attribute[ATR_HITPOINTS] < 100) 
        {
            B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
            return TRUE;
        }

Na początku gra sprawdza czy NPC ma mniej niż 100 hp. Jeśli ma mniej, wówczas wyciągnie runę pełnego leczenia.

Kod:

        else if (!Npc_IsInState (oth, ZS_MagicFreeze))
        {
            B_ReadySpell (slf, SPL_ICECUBE, SPL_Cost_ICECUBE);
            return TRUE;
        }

W przeciwnym wypadku jeśli cel nie jest zamrożony, NPC wykorzysta runę bryły lodu.

Kod:

       else
        {
            B_ReadySpell (slf, SPL_Geyser, SPL_Cost_Geyser);
            return TRUE;
        };

W przeciwnym wypadku będzie korzystać z zaklęcia gejzeru.
Warunki są cały czas sprawdzane od góry, więc miejsce umieszczenia danych bloków warunkowych ma znaczenie.
Aha i jeszcze jedna rzecz.
return TRUE oznacza, że NPC zostaje w trybie rzucania zaklęć. Jeśli natomiast damy return FALSE, NPC przejdzie do trybu walki wręcz/zasięgowej. Tutaj możemy natrafić na błędy, np. NPC wyciągnie broń i nagle stanie w bezruchu. Najprawdopodobniej przy kolejnym obrocie pętli znowu natrafiamy na return TRUE, ale ponieważ NPC jest w trybie walki wręcz/zasięgowej, wówczas nie jest w stanie rzucać zaklęć i się blokuje.

Ostatnio edytowany przez Kruk (2016-12-10 16:41:06)


while (!success) try{...}

https://media.discordapp.net/attachments/359470928389865483/410858992965910538/Leiwark_ITH_TEAM_Kruk.png

Offline

 

#2 2016-12-10 17:26:06

ParzivalZ
Administracja Itharu Team
Zarejestrowany: 2016-11-27
Posty: 2192

Re: [G2 NK] - Ustawianie NPC'om zaklęć

Niezły tutek img/smilies/big_smile


https://i.imgur.com/4MytkTe.png

Offline

 

#3 2018-05-11 14:08:02

Zertin
Doświadczony kopacz
Zarejestrowany: 2016-11-30
Posty: 66

Re: [G2 NK] - Ustawianie NPC'om zaklęć

Propsik leci img/smilies/tongue


https://cdn.discordapp.com/attachments/325776615160152064/410965228352700416/1518052130295.png

Offline

 

#4 2018-08-28 17:29:49

ParzivalZ
Administracja Itharu Team
Zarejestrowany: 2016-11-27
Posty: 2192

Re: [G2 NK] - Ustawianie NPC'om zaklęć

A jeśli bym ustawić oddzielne zaklęcia jednemu NPC?


https://i.imgur.com/4MytkTe.png

Offline

 

#5 2018-08-29 01:42:29

Kruk
Administracja Itharu Team
Zarejestrowany: 2016-12-09
Posty: 982

Re: [G2 NK] - Ustawianie NPC'om zaklęć

Wówczas musisz tworzyć indywidualne warunki. Np.

Kod:

if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Onar))

Czasem korzystam też z pola id, ponieważ jest konwencja, aby każdy NPC posiadał unikalną wartość. Wówczas wygląda to w ten sposób:

Kod:

if (slf.id == 997)

while (!success) try{...}

https://media.discordapp.net/attachments/359470928389865483/410858992965910538/Leiwark_ITH_TEAM_Kruk.png

Offline

 

#6 2018-08-29 09:26:53

ParzivalZ
Administracja Itharu Team
Zarejestrowany: 2016-11-27
Posty: 2192

Re: [G2 NK] - Ustawianie NPC'om zaklęć

Dobre. Dzięki img/smilies/smile


https://i.imgur.com/4MytkTe.png

Offline

 

Stopka forum

Powered by PunBB
Host by: Hosting
© Copyright 2002–2005 Rickard Andersson



Założ : stronę za darmo