Jak pisałem skrypt to z tego co pamiętam sprawdzałem na kilku innych zwierzętach i one atakowały, ale to było dawno więc nie jestem pewny na 100%
Może faktycznie cos spieprzyłem?... Sprawdzę to może dzisiaj wieczorem, albo jutro i dam znać, a jak będzie trzeba to spróbuję to naprawić. Tak czy inaczej, dzięki za info, postaram się to ogarnąć
[EDIT]
Sprawdziłem od razu, bo sam byłem ciekawy. Faktycznie, miałeś rację, skrypt jest zabugowany. Postaram się naprawić jak najszybciej. Debugowanie skryptu po roku - zawsze spoko
[EDIT2]
Naprawione, straszne głupoty zrobiłem
Dodatkowo poprawiłem działanie, żeby broń działała tak jak Ulu-Mulu, czyli że przyjaciele atakują orki i wargi, po namyśle uważam, że tak jednak jest lepiej. Poniżej poprawiony tutorial, będzie tutaj, aż moderator (jeśli będzie taka możliwość) podmieni go z tym pierwszym.
Witam,
Jest to mój pierwszy tutorial, więc proszę o wyrozumiałość
Na pewno myślał ktoś kiedyś o przeniesieniu Ulu-Mulu z pierwszego Gothica do Nocy Kruka. Broń ta powodowała, że kiedy mieliśmy ją założoną to orkowie nas nie atakowali. Właśnie to dzisiaj zrobimy.
1. Tworzymy broń. Jak pewnie każdy się domyślił, najpierw musimy stworzyć zwykłą, podstawową broń
Nie będę tego tłumaczył, jest wiele tutoriali jak robić broń.
INSTANCE LAGA_MOCY (C_Item)
{
name = "Laga Mocy";
mainflag = ITEM_KAT_NF;
flags = ITEM_AXE;
material = MAT_WOOD;
value = 1;
damageTotal = 1;
damagetype = DAM_BLUNT;
range = RANGE_BauMace;
cond_atr[2] = ATR_STRENGTH;
cond_value[2] = 1;
visual = "ItMw_010_1h_Club_01.3DS";
description = name;
TEXT[0] = "Groźnie wyglądająca laga.";
TEXT[1] = "Orkowie i Wargi Ci nie podskoczą...";
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_OneHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};
2. Wyszukujemy potrzebne informacje. Chcemy uzyskać efekt, że orkowie i wargi nie będą nas atakować. Szukamy w plikach gry skryptów orków i warga. Znajdują się one w pliku
_Work\data\Scripts\Content\Story\NPC\Monster\MST_Warg.d
oraz pliki orków znajdują się w katalogu
_Work\data\Scripts\Content\Story\NPC\Orc
W przypadku orków interesuje nas zablokowanie całej gildii, czyli interesuje nas informacja
GIL_ORC
Jednak przeglądając pliki warga zauważamy, że ma on gildię
GIL_WOLF
Do tej gildii należą również wilki, lodowe wilki itd., więc blokada tej gildii powodowałaby również brak ataku ze strony tamtych zwierząt. Możemy też zauważyć coś takiego:
aivar[AIV_MM_REAL_ID] = ID_WARG;
Ten aivar definiuje tak jakby subgildię, precyzując, czy jest to zwykły wilk, czy warg. To jest druga interesująca nas informacja.
3. Edycja pliku B_MM_AssessEnemy.d, czyli powodujemy, że orkowie nas nie atakują. Do pliku
B_MM_AssessEnemy.d
który znajduje się w katalogu
_Work\data\Scripts\Content\AI\Monster\B_Monster
dopisujemy na samym początku pod
func void B_MM_AssessEnemy ()
{
ten kod:
var C_Item LAGA_MOCY_eqwep;
LAGA_MOCY_eqwep = Npc_GetEquippedMeleeWeapon(hero);
if (Hlp_IsItem(LAGA_MOCY_eqwep, LAGA_MOCY) == TRUE) && ((self.guild == GIL_ORC) || (self.aivar[AIV_MM_REAL_ID] == ID_WARG))
{
return;
};
Pierwsza linijka definiuje zmienną. Kolejna sprawdza, czy nasza broń jest założona i przypisuje wynik do zmiennej. Następnie mamy warunek mówiący, że jeśli nasza broń jest założona i nasz przeciwnik ma gildię orka lub subgildię warga to przeciwnicy o podanych gildiach nie traktują nas jako wroga.
4. Edycja pliku ZS_MM_Attack.d, czyli powodujemy, że orkowie nie zabijają nas w przypadku zaatakowania ich przez naszego przyjaciela. Kiedy byliśmy sami - było OK, ale kiedy byliśmy prowadzeni przez jakiegoś NPC to on atakował orki, które po tym jak go zabiły, atakowały nas. Chcąc tego uniknąć musimy wprowadzić warunek do pliku
ZS_MM_Attack.d
znajdującego się w katalogu
_Work\data\Scripts\Content\AI\Monster\ZS_Monster
Pod wpisem:
func int ZS_MM_Attack_Loop ()
{
Npc_GetTarget (self); // other = target
musimy wpisać:
var C_Item LAGA_MOCY_eqwep;
LAGA_MOCY_eqwep = Npc_GetEquippedMeleeWeapon(hero);
if (Hlp_GetInstanceID (other) == PC_HERO) && (Hlp_IsItem(LAGA_MOCY_eqwep, LAGA_MOCY) == TRUE) && ((self.guild == GIL_ORC) || (self.aivar[AIV_MM_REAL_ID] == ID_WARG))
{
Npc_ClearAIQueue(self);
AI_StandUp (self);
AI_TurnToNpc (self, hero);
AI_PlayAni (self, "T_WARN");
self.aivar[AIV_PursuitEnd] = TRUE;
return LOOP_END;
};
Tak samo jak wcześniej, pierwsza linijka definiuje zmienną, druga sprawdza, czy mamy założoną naszą lagę i przypisuje wynik do zmiennej. Następnie mamy warunek, który mówi, że jeśli kod INSTANCE człowieka, którego chce zaatakować ork to PC_HERO (kod Bezimiennego) i mamy założoną naszą broń oraz gildia przeciwnika to ork lub warg to wtedy czyścimy kolejkę czynności, które miał zaplanowane przeciwnik, mówimy potworowi, żeby wstał, powodujemy, że przeciwnik obróci się w naszą stronę, wykona animację ostrzeżenia, mówimy mu, że pościg za nami się skończył i przeskakujemy do końca pętli. Opis tego warunku to chyba najdłuższe zdanie jakie było mi dane napisać
Teraz wystarczy zreparsować skrypty i mamy nasze "Ulu-Mulu"
Kolorem zielonym zaznaczono miejsca, gdzie należy wpisać INSTANCE naszej broni.Chciałem podziękować Bogdanowi Zwei za nakierowanie mnie, które pliki powinienem edytować, żeby to zadziałało oraz Vamperowi za znalezienie buga
Wybaczcie momentami chaotyczne tłumaczenie, kiepski ze mnie nauczyciel
Tutorial kopiujcie ile wejdzie, ale proszę napisać, że pochodzi on z tego forum i że ja jestem autorem
Pozdrawiam, TNTalib
[TUTORIAL POPRAWIONY 05.03.2016]