Broń z efektem trafienia 8700 2

O temacie

Autor

Zaczęty 20.01.2008 roku

Wyświetleń 8700

Odpowiedzi 2

Kazzmir
  • Gość

Kazzmir
Gość

Broń z efektem trafienia
2008-01-20, 22:16(Ostatnia zmiana: 2012-03-14, 10:55)
Cytat: Zysk link=topic=5900.msg363#msg363#msg363#msg363 date=#msg363Jul 31 2006, 17:13#msg363
Najpierw stwórzmy funkcję do wywołania podczas uderzenia bronią:
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,instance_broni_a))
{
//reakcja na broń a

}
else if(Hlp_IsItem(weapon,instance_broni_b))
{
//reakcja na broń b

};
};



Reakcjami zajmiemy się na końcu teraz podam na początku jakich funkcji należy użyć, aby to wywołać:
weaponreaction(other,self);
ZS_Reacttodamage
B_CombatReacttodamage
B_MM_ReactToDamage
B_MM_ReactToCombatDamage
B_Orc_AssessDamage

I to prawie wszystko, ale nadal kogoś brakuje, a są nimi walczący orkowie oraz gracz. Najpierw zajmiemy się pierwszym przypadkiem. Tworzymy funkcję:

func void B_Orc_AssessCombatDamage()
{
weaponreaction(other,self);
};


I należy dodać w ZS_Orc_Attack (przy innych Npc_PercEnable):
Npc_PercEnable (self, PERC_ASSESSDAMAGE, B_Orc_AssessCombatDamage );Teraz zajmijmy się graczem, tworzymy funkcję:

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);};
};

Jeśli broń może wpaść w ręce orka to dodajemy też do ZS_Orc_Attack (a jeśli w goblina to także w ZS_MM_Attack).

Mamy więc funkcję która jest wywołana, ale obiecałem też wywołanie czaru, najpierw znajdujemy instancję efektu w system\visualfx\visualfxinst.d, w moim przypadku (bryła lodu) jest to spellFX_IceCube, więc wywołanie wyglądać będzie następująco:


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)

//tu należy wstawić zawartość funkcji B_AssessMagic_IceCube gdzie self zmienimy na defender




Powodzenia życzę! Jeszcze można zrobić, aby zamrożeni mogli otrzymywać reakcję na trafienie, ale teraz powinniście sobie z tym poradzić.
 

oreca

oreca

Użytkownicy
posty196
Propsy72
Nagrody
Profesjabrak
  • Użytkownicy

oreca

Broń z efektem trafienia
#1 2009-05-17, 20:53(Ostatnia zmiana: 2009-07-11, 15:03)
Witam,

Na wstępie chciałbym zaznaczyć, że jest to mój pierwszy tutek więc proszę o wyrozumiałość ;] .


Chciałbym wam pokazać jak zrobić podobny efekt trafienia jaki masz Szpon Beliara.
A więc zaczynamy.
Robimy sobie broń (Jak to zrobić jest opisane TUTAJ)
Mój będzie taki:

Cytuj
INSTANCE test (C_Item)
{   
   name             =   "Potężny miecz zniszczenia";

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

   value             = 99999;

   damageTotal        =    1;
   damagetype          =   DAM_EDGE;
   range             =     120;      

   cond_atr[2]         =   ATR_STRENGTH;
   cond_value[2]        =   Condition_MiscSword;
   visual             =   "ItMw_020_1h_sword_old_01.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]            = NAME_Value;               COUNT[5]   = value;
};

Jak widać, niesamowicie potężna broń :D .
Teraz chcemy aby miecz walił nie z takiego pioruna jak Szpon tylko z ognistej kuli.
Otwieramy plik o nazwie:

Cytuj
B_AssessDamage.D

który to znajduje się w:

Cytuj
_Work\Data\Scripts\Content\AI\Human\B_Human

Teraz na początku przed:

Cytuj
func void B_AssessDamage ()
{

Dodajemy to:

Cytuj
func void B_U (var C_NPC oth, var C_NPC slf)
{

   if (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(hero))
   {
      var C_ITEM ready;
      var int randomdmg;
      var int procent_trafienia;
      var int obrazenia;

      ready = Npc_GetReadiedWeapon(hero);
      randomdmg = Hlp_Random (100);
      procent_trafienia = 50;
      obrazenia = 1000;

      if (Npc_HasItems(hero, test) == TRUE && Hlp_IsItem(ready, test) == TRUE)
      && (randomdmg <= procent_trafienia)
      {
            if (slf.flags != NPC_FLAG_IMMORTAL)
            {
               Wld_PlayEffect("spellFX_Firestorm_SPREAD", slf, slf, 0, 0, 0, FALSE );
               B_MagicHurtNpc (slf, slf, obrazenia);           
            };
            Wld_PlayEffect("spellFX_InstantFireball_FIRECLOUD", hero, hero, 0, 0, 0, FALSE );
      };
   
      if (Npc_HasItems(hero, test) == TRUE && Hlp_IsItem(ready, test) == TRUE)
      && (randomdmg <= procent_trafienia)
      {
            Wld_PlayEffect("spellFX_InstantFireball_FIRECLOUD", hero, hero, 0, 0, 0, FALSE );
      };
   };
};

Kolor fioletowy - To nazwa funkcji, musi być unikalna
Kolor zielony - To szansa z jaką możemy uderzyć ze specjalnego efektu zamiast 50 możemy wpisać np. 100
Kolor czerwony - To obrażenia jakie zada nasz specjalny efekt zamiast 1000 możemy dać też np. 50
Kolor niebieski - To INSTANCJA naszej broni
Kolor srebrny - to efekty jakie będą się wyzwalać przy uderzeniu "spellFX_InstantFireball_FIRECLOUD" jest to czar Ognista kula, ale tylko jej "wybuch", który następuje przy uderzeniu przeciwnika, "spellFX_InstantFireball_FIRECLOUD" to efekt który będzie tworzył się na rękach. Pierwsze wystąpienie wyzwolenia tego efektu jest wyzwalane przy uderzeniu, drugie takie wystąpienie jest losowe niekoniecznie przy uderzeniu.


Efekty można znaleźć w pliku:

Cytuj
_Work\Data\Scripts\System\VisualFX\VisualFxInst.D

Na koniec trzeba jeszcze dodać do:

B_AssessDamage.D

Który znajduje się w:

_Work\Data\Scripts\Content\AI\Human\B_Human

Oraz do:

B_MM_AssessDamage.D

Który znajduje się w:

_Work\Data\Scripts\Content\AI\Monster\B_Monster

Najłatwiej po wystąpieniu tego:

B_BeliarsWeaponSpecialDamage (other, self);

Dodać to:

B_U(other, self);

Teraz reparsować skrypty i cieszyć się nową bronią :D
Możliwe. że będzie działać w G1 i G2 ale nie testowałem nie jestem pewien
Mam nadzieję, że to wszystko i cieszę się, jeśli pomogłem.

Pozdrawiam
 

inż. Avallach

inż. Avallach

Administrator
Czego pragniesz?
posty7336
Propsy4636
Nagrody
ProfesjaProgramista
  • Administrator
  • Czego pragniesz?

inż. Avallach
Administrator

Broń z efektem trafienia
#2 2013-04-27, 15:40(Ostatnia zmiana: 2013-05-01, 16:53)
Oryginalny tutorial Zyska nie jest napisany najlepiej, a plagiat Oreci nie naprawia jego błędów, dlatego chciałbym dodatkowo wyjaśnić parę rzeczy.
Mechanizm jest oparty o "zmysł" (perception) odczuwania zranień w jaki są wyposażeni npc.
Na temat perceptionów można przeczytać tutaj: http://themodders.org/index.php?topic=13208.msg1036060#msg1036060 , zaś lista dostępnych efektów tutaj (sekcja VisualFX): http://themodders.org/index.php?/topic/17668-g2nk-lista-visualfx-i-particlefx/ . Aby użyć jakiegoś ParticleFX'a który nie ma swojego VFX, najpierw trzeba by napisać nowy VFX który byłby jego "opakowaniem" zawierającym informacje takie jak czas przez jaki ma być widoczny. Jest to dość proste, wystarczy wzorować się na tych już istniejących.

Można też chcieć zadać dodatkowe obrażenia. Wbrew pozorom nie jest to proste, bo nie istnieje funkcja zewnętrzna pozwalająca poprawnie zadać obrażenia npc. Trzeba by napisać własną, uwzględniającą sprawy takie jak sprawdzenie czy npc nie jest nieśmiertelny, zmniejszenie obrażeń biorąc pod uwagę jego atrybuty ochronne oraz wysłanie odpowiednich perceptionów. To ostatnie można próbować osiągnąć ogólnym sposobem (Npc_SendSinglePerc) lub korzystając z funkcji zewnętrznej która jest w silniku, ale nigdy nie została użyta i trudno powiedzieć jak w praktyce działa (AI_CombatReactToDamage).

Rozumiem że mój tutorial nie jest idealny, tłumaczę jak dany mechanizm działa, nie podając zarazem w ogóle gotowego kodu. Jednak preferuję takie podejście od tego które zastosowali moi poprzednicy, czyli kawałki dość średnio napisanego kodu, bez wyjaśnienia na czym jest on oparty.
Rozumiem też że współcześnie pisanie takich tutków wydaje się absurdem. Też tak myślałem, ale dziś, 27.04.2013 r. kolejny wannabe modder napisał w problematyce temat o tytule "Broń z efektem trafienia", pytając się jak coś takiego zrobić...




Oczywiście rozumiem że nie każdy kto chce robić moda z tego typu efektownymi skryptowymi dodatkami musi mieć ochotę na próby zrozumienia podstaw skryptów, nawet korzystając z tutoriali napisanych przez innych. Dla takich osób załączam zestaw gotowych skryptów które wystarczy wkleić do plików moda aby cieszyć się zestawem magicznego oręża :) :
Spoiler
No chyba was pojebało. Nie da się zrobić moda sklejając kawałki cudzych skryptów nawet ich nie rozumiejąc :facepalm:
W tym temacie jest podane wszystko czego potrzebuje osoba znająca podstawy skryptów do napisania czegoś takiego samodzielnie. Dodatkowo próbując, od razu nauczy się dużo więcej i w przyszłości może już nie będzie potrzebowała pomocy innych przy kolejnym problemie. Tak więc: do nauki!


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