Używanie czarów przez NPC 4763 0

O temacie

Autor krupam

Zaczęty 18.07.2011 roku

Wyświetleń 4763

Odpowiedzi 0

krupam

krupam

Użytkownicy
posty105
Propsy43
Profesjabrak
  • Użytkownicy

krupam

Używanie czarów przez NPC
2011-07-18, 11:07(Ostatnia zmiana: 2011-07-19, 10:27)
Wiecie o co chodzi, nie? No to jazda!
Wchodzimy do Content\AI\Magic\B_SelectSpell.d
Tam mamy długą funkcję z tymi wszystkimi gratami.
Na wstępie dodam - funkcja wywołuje się na pierwszym spełnionym warunku!
Co to znaczy?
A no bo ustawimy se gildię na GIL_KDW i jeszcze ustawimy postaci aivar [AIV_MagicUser] = MAGIC_ALWAYS. Wtedy niezależnie co wpiszemy pod gildię magów wody, postać i tak będzie używała czarów podpisanych pod ów aivar, bo jest on wyżej w funkcji.
Na początku mamy takie coś:
if (slf.npctype == NPCTYPE_FRIEND)
&& (Npc_IsPlayer (oth))
&& (oth.guild < GIL_SEPERATOR_HUM) //nicht gegen verwandelten Spieler
{
if (slf.guild == GIL_KDF)
|| (slf.guild == GIL_KDW)
|| (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
{
if (Npc_HasItems (slf, ItRu_Sleep) == 0)
{
CreateInvItems (slf, ItRu_Sleep, 1);
};

B_ReadySpell (slf, SPL_Sleep, SPL_Cost_Sleep);
return TRUE;
}
else //Nicht-KdF
{
return FALSE;
};
};
Co chcemy dopisać, piszemy pod tym. Czemu? A no bo jeśli nasz NPC jest magiem i nas kocha, to nas nie zaatakuje tylko przywali snem.
Dalej mamy:
if (slf.guild == GIL_KDF)
|| (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
Całą tę funkcję najlepiej podzielić na dwie - jedną na warunek. Tą od aivara najlepiej wtedy wyjebać przesunąć na sam dół funkcji i wtedy problem, który opisałem wcześniej, po prostu zniknie.
Dobra, to teraz dopisujemy funkcję. Chcemy zrobić, by postać o inscie SGR_534651_Sulejman(Tak, teraz mam wpierdol od niego... Trudno...) zaatakowała nas Dużą błyskawicą, jeśli nie chce nas zabić to gejzerem(który nie dobija), jeśli będzie mieć mało życia to się uleczy, a jeśli nazbyt się zbliżymy, to zacznie walkę wręcz(jak ork szaman). Czyli zaczynamy.
Wpierw ustawiamy pierwszy warunek funkcji:
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(SGR_534651_Sulejman))Dzięki temu jeśli slf to ta postać, to będzie bla, bla, bla...
Teraz trzebaby przywołać naszej postaci runy, jeśli jeszcze ich nie ma...
if (Npc_HasItems (slf, ItRu_LightningFlash) == 0) { CreateInvItems (slf, ItRu_LightningFlash, 1); };Czyli jeśli postać nie ma runy dużej błyskawicy, to se zrobi runę dużej błyskawicy. Proste? To robimy tak z każdą runą...
Teraz zaczynamy funkcję. Wpierw chcemy w końcu ustawić, by postać się uleczyła:
if (self.attribute[ATR_HITPOINTS] < 100)
{
B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
return TRUE;
}
Gdy nasza postać będzie miała mniej niż 100 hp, wtedy użyje runy leczenia.
return TRUE oznacza użycie czaru.
B_ReadySpell (slf, SPL_<czar>, SPL_Cost_<czar>) oznacza wybranie czaru. Owe stałe mamy w folderze Content\AI\Magic\Spells.
Dalej.
Jeśli wróg się zbliży, postać ma zaatakować bronią. Czyli robimy takie coś:
if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
{
///////Tu będziemy wpisywać to, co pisze niżej
}
else
{
return FALSE;
};
Wtedy nasza postać, jeśli wróg się zbliży, przestanie czarować i zacznie walczyć mieczem.(nie zapominamy - funkcje tu oddzielamy else)
Teraz błyskawica:
if (C_NpcHasAttackReasonToKill (self))
{
B_ReadySpell (slf, SPL_LightningFlash, SPL_Cost_LightningFlash);
return TRUE;
}
(C_NpcHasAttackReasonToKill (self)) oznacza, że jeśli postać ma powód by uśmiercić przeciwnika(który np. jest mordercą lub ma wrogą gildię) to warunek jest spełniony.
Ostatnia część - jeśli żaden z warunków dot. czarów nie zostaje spełniony - postać nie jest ranna i nie chce zabić przeciwnika - ma użyć gejzeru:
else
{
B_ReadySpell (slf, SPL_Geyser, SPL_Cost_Geyser);
return TRUE;
};
Teraz, całość powinna wyglądać tak:
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(SGR_534651_Sulejman))
{
if (Npc_HasItems (slf, ItRu_LightningFlash) == 0) { CreateInvItems (slf, ItRu_LightningFlash, 1); };
if (Npc_HasItems (slf, ItRu_FullHeal) == 0) { CreateInvItems (slf, ItRu_FullHeal, 1); };
if (Npc_HasItems (slf, ItRu_Geyser) == 0) { CreateInvItems (slf, ItRu_Geyser, 1); };

if (self.attribute[ATR_HITPOINTS] < 100)
{
B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
return TRUE;
}
else if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
{
if (C_NpcHasAttackReasonToKill (self))
{
B_ReadySpell (slf, SPL_LightningFlash, SPL_Cost_LightningFlash);
return TRUE;
}
else
{
B_ReadySpell (slf, SPL_Geyser, SPL_Cost_Geyser);
return TRUE;
};
}
else
{
return FALSE; //Nahkampfangriff
};
};

Dziękuję i do widzenia...

Żeby nie było, pomagał mi Sulejman.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry