Magiczna Broń 10559 35

O temacie

Autor

Zaczęty 25.08.2008 roku

Wyświetleń 10559

Odpowiedzi 35

Whiteye
  • Gość

Whiteye
Gość

Magiczna Broń
2008-08-25, 16:28(Ostatnia zmiana: 2008-08-25, 17:21)
Witam wszystkich, zdarzyło mi się ostatnio napisać skrypt uwalniający zaklęcie w momencie uderzenia bronią białą (nie oszukujmy się, większość dzięki tutkowi :P  )...no i niby wszystko fajnie, zaklęcie jest wywoływane...ale nie jeden raz w momencie uderzenia, ale kilkanaście a nawet kilkadziesiąt razy PO nim  <_<  (aż mi się gra zawiesza). Całkowicie zgłupiałem, nie przypominam sobie żebym wstawiał gdziekolwiek pętlę, zaklęcie nieważne jak zmienię skrypt powtarza się non stop do chwili schowania broni albo odejścia od przeciwnika, oczywiście efekt magii znika gdy usunę "weaponreaction(other,self);" z ZS_ReacttoDamage itp.itd. Bardzo bym prosił was - bardziej doświadczonych modderów o pomoc.

Na wszelki wypadek zamieszczam zawartość skryptu weaponreaction.d:

func void weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
  {
return;
  };
var c_item weapon;
weapon=Npc_GetReadiedWeapon(hero);
if(Hlp_IsItem(weapon,ItMw_Blade_Blessed_01))
{
Wld_PlayEffect("SPELLFX_ICECUBE",hero,self,0,10,DAM_MAGIC,FALSE);
};
};
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Gdy ma się wyciągniętą broń, to jest to nieskończona funkcja:
if(Hlp_IsItem(weapon,ItMw_Blade_Blessed_01))
{
Wld_PlayEffect("SPELLFX_ICECUBE",hero,self,0,10,DAM_MAGIC,FALSE);
};

Aby działało jak należy, trzeba to jakoś ograniczyć. Nie jestem co do tego pewny, ale spróbuj coś takiego:
func void weaponreaction(var c_npc Hero,var c_npc Self)
{
var int random; random = Hlp_Random (2); //ewentualnie może być większa liczba w nawiasie
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
  {
return;
  };
var c_item weapon;
weapon=Npc_GetReadiedWeapon(hero);
if((Hlp_IsItem(weapon,ItMw_Blade_Blessed_01)) && (random==1))
{
Wld_PlayEffect("SPELLFX_ICECUBE",hero,self,0,10,DAM_MAGIC,FALSE);
};
};

Whiteye
  • Gość
Fajnie wszystko działa :D  , magia nie jest wyzwalana przy każdym trafieniu, ale za to tylko RAZ, wielkie dzięki, sam bym nie wpadł o zadeklarowaniu zmiennej random i jej użyciu jak tutaj:

var int random;
random = Hlp_Random (2);
...
if((Hlp_IsItem(weapon,ItMw_Blade_Blessed_01)) && (random==1))

Jeszcze raz dzięki, ja jeszcze pomieszam z tą funkcją żeby za każdym trafieniem wyzwalało magię, ale z tym już sobie chyba poradzę. :|
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
Jeszcze raz dzięki, ja jeszcze pomieszam z tą funkcją żeby za każdym trafieniem wyzwalało magię, ale z tym już sobie chyba poradzę. 13.gif
Gdyby ci się udało, to podaj rozwiązanie tego, bo chciałbym coś podobnego zrobić, ale na razie nie mam czasu nad tym myśleć  :D

Whiteye
  • Gość
Cytuj
Gdyby ci się udało, to podaj rozwiązanie tego, bo chciałbym coś podobnego zrobić, ale na razie nie mam czasu nad tym myśleć 10.gif - Adanos

Udało mi się napisać (prawie) normalne wywoływanie magii za każdym trafieniem...

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 weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
  {
return;
  };
var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,ItMw_Blade_Blessed_01))
{
 Wld_SendTrigger("weaponreaction");
 Wld_PlayEffect("SPELLFX_ICECUBE",hero,hero,0,10,DAM_MAGIC,FALSE);
 Wld_SendTrigger("Sbd_is_damaged");
 Wld_SendTrigger("CmpNpc");
}
else if (Hlp_IsItem(eqweapon,ItMw_Blade_Blessed_01))
{
 Wld_SendTrigger("weaponreaction");
 Wld_SendTrigger("Sbd_is_damaged");
 Wld_SendTrigger("CmpNpc");
};
};

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

...dlaczego "prawie"? Ano dlatego że podczas uderzenia bronią zdarzają się 2 wywołania czaru, potem 1, potem znowu 2, 3, itd.itp. Generalnie ilość wywołań raczej nie przekracza 4 na uderzenie. nie mam jednak pewności czy się znowu na chwilę nie zapętli i zacznie trzaskać magią non-stop. Wciąż nad tym skryptem pracuję, więc jak już uda mi się go poprawnie napisać to dam znać.
 

Whiteye
  • Gość
Po wielu zmaganiach z tym...ekhem...skryptem :D  , udało mi się w końcu dojść do efektu jaki chciałem - mianowicie, efekt magii jest wyzwalany za każdym trafieniem broni białej, tylko raz, bez żadnych pętli i innych takich tam, oto gotowy skrypt:

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 weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
  {
return;
  };
var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,ItMw_Blade_Blessed_01))
{
 Wld_PlayEffect("SPELLFX_ICEWAVE",self,self,0,50,DAM_MAGIC,FALSE);  
}
else if (Hlp_IsItem(eqweapon,ItMw_Blade_Blessed_01))
{
 Wld_SendTrigger("weaponreaction");  
};
};

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

!!!UWAGA!!!

W "Wld_PlayEffect("SPELLFX_ICEWAVE",self,self,0,50,DAM_MAGIC,FALSE);" trzeba pamiętać żeby ZAWSZE obydwie pogrubione wartości były "self", jeżeli zostanie wstawione "hero" albo "other" w dowolnie jakim innym miejscu utworzy się znowu nieskończona pętla. Starałem się jak najbardziej, ale zabrakło mi już sił i pomysłów więc zostało tak....

!!!JESZCZE JEDNO!!!

Jako że obydwie wartości są "self" zaklęcie "zaczyna się" i "kończy" W PRZECIWNIKU, więc jeśli użyjemy tak jak powyżej SPELLFX_ICEWAVE, fala lodu będzie się rozchodzić OD przeciwnika zadając mu obrażenia zdefiniowane przez nas w funkcji i zamrażając (bez obaw, nas nie zamrozi i nie zrani, ale innych NPC-ów w zasięgu już raczej tak, nie wiem dokładnie, nie sprawdzałem :D  )

Jeśli natomiast użyjemy SPELLFX_ICECUBE albo SPELLFX_FIRESTORM, nie będzie wybuchu czy efektu zamrożenia tylko w momencie trafienia bronią utworzy się w przeciwniku "kula" zaklęcia (wszyscy wiedzą o co chodzi) a nie efekt kolizji, więc efekty uderzenia trzeba będzie znaleźć samemu w "Visualfxinst" - więc zamiast SPELLFX_FIRESTORM będzie SPELLFX_FIRESTORM_SPREAD, a zamiast SPELLFX_ICECUBE będzie SPELLFX_ICECUBE_COLLIDE (chyba)....

Mam nadzieję że to innym ułatwi jakoś modowanie, a tobie Adanos dziękuję za pomoc i motywację do pracy :P  

(jeśli ma ktoś pytanie co do tego, to piszcie na PM, jeżeli zdołam odpowiedzieć i będę miał czas, to odpowiem)
 

Artex
  • Gość

Artex
Gość

Magiczna Broń
#6 2008-09-05, 15:20(Ostatnia zmiana: 2008-09-05, 15:22)
Mam pytanie. Gdzie należy zamieścić ten skrypt?

I jeszcze coś:

var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,ItMw_Blade_Blessed_01))   /*Czy jeżeli wstawię tutaj nazwę swojej broni to skrypt będzie działać dla niej?*/
{
 Wld_PlayEffect("SPELLFX_ICEWAVE",self,self,0,50,DAM_MAGIC,FALSE);  /*Jeżeli zmienię nazwę czaru to przy uderzeniu powinno się wyzwolić dowolne zaklęcie? Czy trzeba to wcześniej jakoś przygotować?*/
}
else if (Hlp_IsItem(eqweapon,ItMw_Blade_Blessed_01)) // Tu też zamienić?
{
 Wld_SendTrigger("weaponreaction");  
};
};

Te trzy komentarze są średnio widoczne, ale nie potrafię ich pokolorować.
 

Zubot

Zubot

Użytkownicy
posty202
Propsy2
Profesjabrak
  • Użytkownicy
Cytat: Adanos link=topic=3495.msg29679#msg29679 date=Aug 26 2008, 10:27\'
Gdyby ci się udało, to podaj rozwiązanie tego, bo chciałbym coś podobnego zrobić, ale na razie nie mam czasu nad tym myśleć  :D

ja również. Może ktoś by dał to jako poprawiony tutek, jak bedzie można  :P
 

Artex
  • Gość
Cytat: "Zubenos"\'
Może ktoś by dał to jako poprawiony tutek, jak bedzie można  :P

Dokładnie. Bo ten od Zysk#msgote author="Zubenos"\']Może ktoś by dał to jako poprawiony tutek, jak bedzie można  :P [/quote]

Dokładnie. Bo ten od [url=http://themodders.org/index.php?topic=100]Zyska
jest dosyć skomplikowany : P.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
Te trzy komentarze są średnio widoczne, ale nie potrafię ich pokolorować.
3 razy odpowiem tak.
Dopowiem do tego jeszcze:
Cytuj
Jeżeli zmienię nazwę czaru to przy uderzeniu powinno się wyzwolić dowolne zaklęcie? Czy trzeba to wcześniej jakoś przygotować?
to zależy jaki efekt dasz.
Cytuj
Mam pytanie. Gdzie należy zamieścić ten skrypt?
Spróbuj stworzyć plik magicznabron.d np. w folderze items.

Artex
  • Gość
Errm...

Nie ma czegoś takiego. Czy mówisz o skryptach do G1 czy G2???

A jeśli G2 to czy jest możliwość zrobienia takiej broni w G1? (raczej jest, skoro w czas zapłaty to zrobili).
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
A czy masz zainstalowane GMDK? Jeśli tak to powinien być taki folder c:\Program Files\Piranha Bytes\Gothic\_Work\Data\Scripts\Content\Items

Cytuj
A jeśli G2 to czy jest możliwość zrobienia takiej broni w G1? (raczej jest, skoro w czas zapłaty to zrobili).
Skoro w CZ zrobili, to wygląda na to, że można...

Zubot

Zubot

Użytkownicy
posty202
Propsy2
Profesjabrak
  • Użytkownicy
W G2 inaczej to można zrobić niż w G1 jest pewna różnica
 

Artex
  • Gość

Artex
Gość

Magiczna Broń
#13 2008-09-05, 18:33(Ostatnia zmiana: 2008-09-05, 18:50)
Oczywista że mam GMDK. Jak inaczej mógłbym modować?

Tyle że instalowałem sobie potem polskie skrypty, może tam tego brakuję...

Ściągnę jeszcze raz GMDK i zobaczę.



EDIT:

Ahh... Sorry, źle przeczytałem. Miałem stworzyć plik a nie go znaleźć : P.

Folder Items oczywiście mam.

To teraz troszkę popróbuję : ).

Jeszcze jedna sprawa, czy ten .d to ma być zwykły tekstowy czy musi być jakiś specjalny edytor żeby stworzyć taki plik?
 

Dracon

Dracon

Użytkownicy
posty1068
Propsy904
Profesjabrak
  • Użytkownicy
Oczywiście - Notatnik windows'a :D
 
,,Dobry, to człowiek, który nie ukrywa siedzącego w nim zwierzęcia. A taki co usiłuje udawać dobrego, jest wręcz niebezpieczny. Najgroźniejsi są ci, którzy sami głęboko wierzą, że są dobrzy. Odrażający, ohydny przestępca może zamordować jednego człowieka, dziesięciu, stu, ale nigdy nie zabija milionów. Miliony mordują ci, którzy mają się za samą dobroć.''

Wiktor Suworow, Akwarium

Artex
  • Gość
Okej, zrobiłem. Ale miecz ciągle nie zamraża.

Wygląda to tak.

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 weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
  {
return;
  };
var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,Kill_Lame))
{
 Wld_PlayEffect("SPELLFX_ICEWAVE",self,self,0,50,DAM_MAGIC,FALSE);  
}
else if (Hlp_IsItem(eqweapon,Kill_Lame))
{
 Wld_SendTrigger("weaponreaction");  
};
};

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

i tak

//-----------------------------------------------------------
//ARTEX
//-----------------------------------------------------------
INSTANCE Kill_Lame (C_Item)
{
name = "Zguba Lamera";

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

value = 2500;

damageTotal = 110;
damagetype = DAM_EDGE;
range =  130;

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

owner = Non_2001_Artex;
visual = "ItMw_1H_Sword_Bastard_04.3DS";

description = name;
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_TwoHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};


Jestem może troszkę upierdliwy, ale zależy mi żeby dowiedzieć się jak to działa. A miecz jest jak był (stworzyłem go już wcześniej i działał jak należy) i nie wyzwala zaklęcia.

Tak, repasowałem skrypty.

Czy potrzeba ingerencji w jeszcze jakiś plik?
 

Artex
  • Gość
Nikt mi nie pomoże  ;p  ?


Sorry za double post, ale chcę żeby ktoś to zauważył.
 

Zubot

Zubot

Użytkownicy
posty202
Propsy2
Profesjabrak
  • Użytkownicy
No ja bym pomógł, ale sam się nad tym głowię.
 

Artex
  • Gość
Od razu zapytam o kolejną rzecz. Otóż wszystkie gothicowe skrypty windows rozpoznaję jako "plik D" czy to że mój plik z magiczną bronią rozpoznaje jako "Dokument tekstowy" niczemu nie przeszkadza?
 

sebinho

sebinho

Użytkownicy
posty339
Propsy44
Profesjabrak
  • Użytkownicy
Dodawaj do nazwy .d
 


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