Resp po zabiciu 8630 22

O temacie

Autor Buras

Zaczęty 27.01.2011 roku

Wyświetleń 8630

Odpowiedzi 22

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Od razu powiem sorry, że piszę nowy temat, a powienienem pisać w starszym, ale dopiero teraz sprawdziłem dokładnie...
Jak już pisałem we wczesniejszym temacie, chodzi mi o to, że po zabiciu stworka respi się nowy. Ten problem już rozwiązałem. Zabijam 1 respi 2, zabijam 2 respi 3... Ale gdy zabije 3 znowu respi 3 (Ale głupio to zabrzmiało)
Mój skrypt wygląda tak: (ZS_Dead)
func void Mis_CheckRespawn(var c_npc slf)
{
        if (slf.id == 5000)
        {
                Wld_InsertNpc(arcansas2,Npc_GetNearestWP(slf));
        };
};
 
func void Mis_CheckRespawn1(var c_npc slf)
{
        if (slf.id == 5001)
        {
                Wld_InsertNpc(arcansas3,Npc_GetNearestWP(slf));
        };
};
 


func void ZS_Dead ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Dead" );
PrintGlobals (PD_ZS_CHECK);
Mis_CheckRespawn(self);
Mis_CheckRespawn1(self);

[...]

Nie ma pojęcia co może być powodem, gdyż wcześniej zanim dodałem tego 3 mobka wszystko działało... Być może problem tkwi w tym: Mis_CheckRespawn1(self);
 

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
Po 1 napisz ten skrypt jakos rozsadniej, chocby tak:

func void Mis_CheckRespawn(var c_npc slf)
{
        if (slf.id == 5000)
        {
                Wld_InsertNpc(arcansas2,Npc_GetNearestWP(slf));
        }
        else if (slf.id == 5001)
        {
                Wld_InsertNpc(arcansas3,Npc_GetNearestWP(slf));
        };          
};
 
func void ZS_Dead ()
{      
        PrintDebugNpc   (PD_ZS_FRAME, "ZS_Dead" );              
        PrintGlobals    (PD_ZS_CHECK);
        Mis_CheckRespawn(self);


Po drugie zmien id npcta o instancji arcanas3 na inne niz 5001...
 



Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Dobra, problem rozwiązany... Ale co zastosować, aby mobek respił w konkretnym waypoincie?
 

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
Dobra, problem rozwiązany... Ale co zastosować, aby mobek respił w konkretnym waypoincie?

Zamiast: Npc_GetNearestWP(slf)
wpisujesz "KONKRETNYWAYPOINT"
 



Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Okey, wszystko skończyłem. Jest jeszcze jedna rzecz, którą chciałbym dodać jako urozmaicenie niewidowiskowego respa potworka. Otóż kojarzycie może świątynie Śniącego. Pod koniec pojawiał się Xardas i o ile dobrze kojarzę fakty, znajdowała się wokół niego taka jakby "poświata".

Jak zrobić takie coś podczas respa? Czy to wogóle możliwe w G1, bo może zaistnieć możliwość, że nie będzie wymaganych pfx'ów...
 

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Odświeżam powyższe pytanie, oraz zapytam o jeszcze jedną rzecz:
Co zrobić, aby dany miecz zamrażał? Próbowałem na zasadzie czegoś takiego, ale sami wiecie... Nie działa...

INSTANCE beliar (C_Item)
{
name = "Szpon Beliara";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 0;
spell = SPL_ICECUBE;

damageTotal = 150;
damagetype = DAM_EDGE|SPL_FREEZE_DAMAGE;
range     =   100;

cond_atr[2]   = ATR_STRENGTH;
cond_value[2]   = 75;

visual = "ItMw_BeliarWeapon_1H.3ds";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_OneHanded;
TEXT[5] = "Szpon Beliara jest teraz bronią jednoręczną...";
};



Najpierw dodałem to: SPL_FREEZE_DAMAGE, ale zamiast zamrażania gościa odrzuca do tyłu. Później dodałem to coś: spell = SPL_ICECUBE, ale też nie dało rady...
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Resp po zabiciu
#6 2011-01-31, 17:33(Ostatnia zmiana: 2011-01-31, 17:38)
Co zrobić, aby dany miecz zamrażał? Próbowałem na zasadzie czegoś takiego, ale sami wiecie... Nie działa...
Najpierw dodałem to: SPL_FREEZE_DAMAGE, ale zamiast zamrażania gościa odrzuca do tyłu. Później dodałem to coś: spell = SPL_ICECUBE, ale też nie dało rady...

musisz zrobić miecz magiczny polecam mój program z sygnaturki :D  
PFX poszukaj w _Work\Data\Scripts\system\PFX
PFX - efekt wywoływany podczas uderzenia mieczem szukaj coś z nazwą ICE ;)
aa i do skryptu musisz dodać jeszcze to
AI_StartState (self, ZS_MagicFreeze, 0, "");żeby postać się zamroziła :D

jak wolisz bez programu się grzebać w skryptach to poszukaj w tutorialach coś i mieczach magicznych ;)

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
No dobra, więc cały skrypt wygląda tak:

INSTANCE beliar (C_Item)
{
name = "Szpon Beliara";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 0;

damageTotal = 150;
damagetype = DAM_EDGE;
range     =   100;

cond_atr[2]   = ATR_STRENGTH;
cond_value[2]   = 75;

visual = "ItMw_BeliarWeapon_1H.3ds";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_OneHanded;
TEXT[5] = "Szpon Beliara jest teraz bronią jednoręczną...";
};

func void weaponreaction(var c_npc attacker,var c_npc defender)
{
 
if(!Npc_IsInFightMode(attacker,FMODE_MELEE))

{
return;
};
var c_item weapon;
weapon=Npc_GetReadiedWeapon(attacker);
if(Hlp_IsItem(weapon,beliar))
{
        Wld_PlayEffect("spellFX_IceCube",attacker,defender,0/*- poziom czaru 0, bo bryła nie ma poziomów*/,0/*obrażenia - obrażenie zadawane przez ZS_MagicFreeze*/,0/*rodzaj obrażeń (żadne)*/,FALSE);
}
else if(Hlp_IsItem(weapon,beliar))
{
    AI_StartState (defender, ZS_MagicFreeze, 0, "");
};
};


func void B_Orc_AssessCombatDamage()
{
weaponreaction(other,self);
};
func int CmpNpc(var c_npc p1,var c_npc p2)
{
var int old1;
var int old2;
var int result;
old1=p1.aivar[0];
old2=p2.aivar[0];
p1.aivar[0]=0;
p2.aivar[0]=1;
result=p1.aivar[0];
p1.aivar[0]=old1;
p2.aivar[0]=old2;
return result;
};


func void Sbd_is_damaged()
{
//ERRATA if (self==other&&hero==victim)
        if(Npc_IsPlayer(victim)&&CmpNpc(self,other))
                {weaponreaction(self,hero);};
};



Efekty ładnie działają, znaczy 1 efekt bo z dodaniem 2 coś mi nie idzie. Ale problemem jest to że miecz po uderzeniu nie zamraża :(
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
if(Hlp_IsItem(weapon,beliar))
{
        Wld_PlayEffect("spellFX_IceCube",attacker,defender,0/*- poziom czaru 0, bo bryła nie ma poziomów*/,0/*obrażenia - obrażenie zadawane przez ZS_MagicFreeze*/,0/*rodzaj obrażeń (żadne)*/,FALSE);
}
else if(Hlp_IsItem(weapon,beliar))
{
    AI_StartState (defender, ZS_MagicFreeze, 0, "");
};
:D  to jest piękne xD
w ogule rozumiesz w jaki sposób to działa ? :D

wytłumaczę ci jak to widzi komputer
if-jezeli ;)
else-jezeli NIE
czyli wygląda to tak
jezeli uderzmy bronią beliar to wywołuje PFX
jezeli to nie broń Beliar to sprawdz czy to broń beliar i zatrzymaj postac :D
czy to ma ses ;) ??

tobie by się przydał łatwiejszy skrypt ;p

daj sobie to

FUNC VOID weaponreaction()
{
    var c_item weapon; weapon = Npc_GetReadiedWeapon (other);


    if(Hlp_IsItem(weapon,beliar))
{
        Wld_PlayEffect("spellFX_IceCube",self,self,0,0,0,FALSE);
        AI_StartState (defender, ZS_MagicFreeze, 0, "");

//tutaj w tych klamrach wpisujesz tyle rzeczy ile zapragniesz wywołanych przy uderzeniu bronią beliar

};
};
zamiast całej pętli func void weaponreaction(var c_npc attacker,var c_npc defender)

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Dziękuję, że dzięki mnie mogłeś się napatrzyć na to "piekno", a tak na serio to ja jestem dopiero na poziomie, zrób dialog, npc, itemka... Te rzeczy potrzebuję, aby prace ruszyły do przodu...
Przez cały ten czas myślałem, że to else oznacza jakby ciąg dalszy warunku... Niedawno właśnie tak robiłem, że tworzyłem oddzielną funkcję z oddzielnym warunkiem, ale potem Orc powiedział, żebym zrobił właśnie else w jednej funkcji i wszystko działało. Ale dzięki, działa, z tym, że:

Jak uderzę, to owszem zamraża, ale efekty nie wyzwalają się tak intenswnie jak wcześniej. Były takie duże bryły lodu, a teraz w sumie nie ma nic...
Po drugie, ja raz gościa uderzę, to sobie stoi w bezruchu zamrożony, a co jakiś czas ciskają w niego bryły lodu zadając mu obrażenia... Da się ustawić czas, w którym ma stać w bezruchu? Bo te bryły lodu jakoś przeżyję...
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
moja wina powinno być tak
        Wld_PlayEffect("spellFX_IceCube",other,self,0,0,0,FALSE);
        AI_StartState (self, ZS_MagicFreeze, 0, "");

a co do czasu to nie wiem bo się nie bawiłem w zamrażanie nigdy :D
spróbuj dać 2 razy
AI_StartState (self, ZS_MagicFreeze, 0, "");może zadziała dłużej

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy

Buras

Resp po zabiciu
#11 2011-02-01, 18:09(Ostatnia zmiana: 2011-02-01, 18:16)
Sorki, z tym czasem miałem na myśli, że postać cały czas stoi zamrożona, a mi chodzi o to, że ma być to określony czas...

EDIT:
Ciekawe zjawisko, efekty działają już jak powinny, ale z tym zamrożeniem zaobserwowałem jeszcze jedną rzecz... Chodzi o to po prostu, że miecz zachowuje się jak żywy organizm. Znaczy się, zaatakujesz, zamraża, a gdy już sie odmrozi z miecza wylatuję samoistnie ten lodowy pocisk i znowu zamraża. Dlatego wydawało mi się, że postać otrzymuje samoistnie obrażenia, a to mój wyciągnięty miecz atakuje...

Ma ktoś jakiś pomysł, jak to naprawić...?
 

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Poraz kolejny odświeżam...
Tu mój skrypt, jakby co:

INSTANCE beliar (C_Item)
{
name = "Szpon Beliara";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 0;

damageTotal = 150;
damagetype = DAM_EDGE;
range     =   100;

cond_atr[2]   = ATR_STRENGTH;
cond_value[2]   = 75;

visual = "ItMw_BeliarWeapon_1H.3ds";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_OneHanded;
TEXT[5] = "Szpon Beliara jest teraz bronią jednoręczną...";
};

FUNC VOID weaponreaction()
        {
    var c_item weapon; weapon = Npc_GetReadiedWeapon (other);
 
 
                if(Hlp_IsItem(weapon,beliar))  
                        {  
                Wld_PlayEffect("spellFX_IceCube",other,self,0,0,0,FALSE);
                AI_StartState (self, ZS_MagicFreeze, 0, "");
 
        };


};
func void B_Orc_AssessCombatDamage()
{
weaponreaction();
};
func int CmpNpc(var c_npc p1,var c_npc p2)
{
var int old1;
var int old2;
var int result;
old1=p1.aivar[0];
old2=p2.aivar[0];
p1.aivar[0]=0;
p2.aivar[0]=1;
result=p1.aivar[0];
p1.aivar[0]=old1;
p2.aivar[0]=old2;
return result;
};


func void Sbd_is_damaged()
{
//ERRATA if (self==other&&hero==victim)
        if(Npc_IsPlayer(victim)&&CmpNpc(self,other))
                {
weaponreaction();
};
};


Tak myślałem, czy by nie zrobić czegoś takiego że:
Jeśli
AI_StartState (self, ZS_MagicFreeze, 0, "");
skończy się, to weaponreaction = FALSE. No i wtedy broń by nie atakowała sama od siebie, bowiem weaponreaction by się nie wyzwalał samoistnie. Tylko to mi przychodzi narazie do głowy, ale całkowicie nie wiem jak się za to zabrać.

A i jeszcze jedno. Co oznaczają te cudzysłowia w tym:
AI_StartState (self, ZS_MagicFreeze, 0, "");
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Kiedy są wywoływane te funkcje B_Orc_AssessCombatDamage i Sbd_is_damaged? Są w pliku B_AssessDamage.d? Może ten temat okaże ci się pomocny: http://themodders.org/index.php?/topic/13247-g2nkjak-utworzyc-miecz-ktory-po-trafieniu-zamraza/page__pid__135713__st__20#entry135713?

Cytuj
A i jeszcze jedno. Co oznaczają te cudzysłowia w tym:

AI_StartState (self, ZS_MagicFreeze, 0, "");
Te cudzysłowy oznaczają nazwę waypointa, który w tym przypadku jest pustym napisem ;)

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy

Buras

Resp po zabiciu
#14 2011-02-06, 11:27(Ostatnia zmiana: 2011-02-06, 11:33)
B_AssessDamage to nazwa funkcji czy też pliku? U mnie pliku B_AssessDamage.d nie ma...

Jakby co, to robiłem na podstawie tego tutka:
http://themodders.org/index.php?/topic/100-magiczna-bron/
A pozatym przerabiałem to zgodnie z tym co mi wszyscy radzili w tym temacie.

Dodałem jeszcze to:
weaponreaction()
W tych plikach:
ZS_Reacttodamage
B_CombatReacttodamage
B_MM_ReactToDamage
B_MM_ReactToCombatDamage
B_Orc_AssessDamage

Może powinienem zmienić na weaponreaction(other,self)?
 

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Odświeżam...
 

kamiloops

kamiloops

Użytkownicy
posty161
Propsy11
ProfesjaProgramista
  • Użytkownicy
Cytuj
B_AssessDamage

Nazwa pliku.
 
Nie mam polskich znakow

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
Odświeżam, teraz przeszukałem calutki folder z gothicem i nie mam pliku B_AssessDamage.d
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Bo w G1 nie ma :D  Musisz go po prostu sam utworzyć :D

Buras

Buras

Użytkownicy
posty202
Propsy23
Profesjabrak
  • Użytkownicy
No tak, rozumiem  :lol:  
Ale co mam umieścić w tym pliku i jak to ma wyglądać?
Coś takiego:
func void B_Orc_AssessCombatDamage()  
{  
        weaponreaction();  
};

func void Sbd_is_damaged()  
{  
//ERRATA if (self==other&&hero==victim)  
        if(Npc_IsPlayer(victim)&&CmpNpc(self,other))  
                {
                weaponreaction();
                };  
};


A z pliku ze skryptem broni mam to wywalić?
 


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