Grupa NPCów c_npc 4393 14

O temacie

Autor TheKetrab

Zaczęty 24.01.2017 roku

Wyświetleń 4393

Odpowiedzi 14

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Witam,

mierzę się ze skryptem trucizny. Funkcję B_HeroAssessDamage wywołuję za pomocą perceptiona:

Npc_PercEnable (hero, PERC_ASSESSDAMAGE , B_Hero_AssessDamage);
var int HeroPreviousHP;
func void B_Hero_AssessDamage()
{
if (C_BodyStateContains(NASZ_101_Korth,BS_HIT)) {

if (hero.attribute[ATR_HITPOINTS] < HeroPreviousHP)
{
TruciznaFunction();
};

HeroPreviousHP = hero.attribute[ATR_HITPOINTS];

};

};

func void TruciznaFunction ()
{
WillZatruty = 1;
PrintScreen ("zatruty", -1,-1, "font_old_20_white.tga",3);

};

Póki co jest ustawione, że gdy uderzy mnie NASZ_101_Korth, włącza się skrypt. Jak napisać zmienną c_npc, aby każdy potwór o aivarze "aivar[AIV_Trucizna] = 1;" wywoływał funkcję TruciznaFunction()?
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Albo musisz zapisać NPC'tów do zmiennej/tablicy, lub spróbować użyć pakietu BroadCast.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Będą to różne zwierzęta po prostu z aivarem TRUCIZNA. Kiedy zamiast NASZ_101_Korth napisałem wolf, to nie skompilowalo.
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
A... Przepraszam źle zrozumiałem.
Prościej byłoby chyba wykorzystać ten skrypt(Wymagany Ikarus)
Ale to da się też załatwić za pomocą Perceptionów.
Wywołaj coś takiego w B_AssesDamage:
if(self.aivar[AIV_Trucizna]) && (NpcIsPlayer(other)) //Atakujący ma Aivar, a ofiarą jest nasz bohater
{
TruciznaFunction(); //To zatruj
};
Na łeb powinno działać :F
P.S zrób jakiś warunek typu x% szans na zatrucie, bo takie coś nie ma sensu (100% zatrucie xD)
Można użyć Aivara i ustalić mu wartość 0-100 Gdzie wartość Aivara to % szans na zatrucie od potwora(Ale to już takie moje gdybanie ;f )
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Podejrzyj budzis skrypt mod.nie trzeba ikariusa
 

FOgidel

FOgidel

Użytkownicy
posty60
Propsy100
ProfesjaSkrypter
  • Użytkownicy
A nie wystarczy przypadkiem other.aivar[trucizna]?
 

pawbuj

pawbuj

Użytkownicy
posty1622
Propsy135
ProfesjaSkrypter
  • Użytkownicy
A nie wystarczy przypadkiem other.aivar[trucizna]?
ja mam za ciebie sprawdzić to? dostałes podpowiedzi, czego jeszcze oczekujesz.
 

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
aivar nie jest potrzebny - osobiście preferuję nie ingerować w istniejące już klasy. Łatwo o bugi i trudno o przewidzenie każdej implikacji, która nastąpi.

Możesz nawet zrobić funkcję, która za argument przyjmuje atakującego C_NPC, a zwraca TRUE, gdy po ataku ma nastąpić zatrucie. Samą funkcję wykorzystałbyś w warunku.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy

TheKetrab

Grupa NPCów c_npc
#8 2017-01-25, 12:29(Ostatnia zmiana: 2017-01-25, 12:49)
A nie wystarczy przypadkiem other.aivar[trucizna]?
ja mam za ciebie sprawdzić to? dostałes podpowiedzi, czego jeszcze oczekujesz.
Wydaje mi się, czy pomyliłeś FOgidela ze mną? :D

@Siemekk @PS - pewnie, funkcję random i wszystko już mam przemyślane, tylko cały czas borykam się z problemem wywołania trucizny.

@pawbuj Popatrzyłem jak to robi BudzisSkryptMod. W ZS_MM_Master.d jest wywoływana funkcja:
func int ZS_MM_Attack_Loop ()
{
zatrucie();
.
.
.
};

Z kolei funkcja zatrucie wygląda następująco:

Spoiler
//
func void zatrucie(){

if (other.guild == GIL_BLOODFLY)
{
zatruty = 1;
};


if (other.guild == GIL_WOLF)
{
chory = 1;
};


if (other.guild == GIL_ORCDOG)
{
        chory = 1;
};


};

i później jak zmienna jest taka a taka to TickTock odejmuje HP.
Ale gdzie jest zdefiniowane kim jest other?
Gdy w swoim modzie (G2) robię podobnie:

Spoiler
func void TruciznaFunction ()
{
if (other.aivar[AIV_Trucizna] == 1)
{
WillZatruty = 1;
PrintScreen ("zatruty przez wilka", -1,-1, "font_old_20_white.tga",3);
};

PrintScreen ("zatruty jest", -1,-1, "font_old_20_white.tga",3);
};

to działa funkcja (bo wyświetla się "ZATRUTY JEST"), ale nie działa warunek z other, mimo że wilk ma aivara.

Jak zdefiniować kim jest other? Dodam, że funkcję wywołuję w: ZS_MM_Attack tutaj:
Spoiler
func int ZS_MM_Attack_Loop ()
{
TruciznaFunction ();

Npc_GetTarget (self); // other = target

// ------ Regeneration ------
if (self.guild == GIL_DRAGON)
{
self.aivar[AIV_TAPOSITION] += 1;
if (self.attribute[ATR_HITPOINTS] < self.attribute[ATR_HITPOINTS_MAX])
&& (self.aivar[AIV_TAPOSITION] >= 2)
{
self.attribute[ATR_HITPOINTS] += 1;
self.aivar[AIV_TAPOSITION] = 0;
};
};

.
.
.

};



Ogółem to rozwiązanie nie wydaje mi się najlepsze, bo wywoływanie funkcji w ZS_Attack Loop sprawia, że funkcja wywołuje się niekoniecznie, gdy wilk mnie zranił. I tak musiałbym skorzystać z C_BodyStateContains(xxx,BS_HIT)


@Cruc Mógłbyś jaśniej? Troszkę nie rozumiem zaproponowanej idei.
 

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy

Cruc

Grupa NPCów c_npc
#9 2017-01-25, 12:52(Ostatnia zmiana: 2017-01-25, 12:57)
Chodzi mi mniej więcej o coś podobnego do tego co pokazałeś.
func int zatrucie(var C_NPC other){

if (other.guild == GIL_BLOODFLY)
{
return TRUE;
};

};

Wtedy wykorzystanie w warunku wyglądałoby tak
if (zatrucie(other)){fajna_funkcja();};
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
other = Hlp_GetNpc(npcInstance);
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Cruc

Cruc

Użytkownicy
posty666
Propsy235
Profesjabrak
  • Użytkownicy
Jeśli nie przekazujemy instancji pomiędzy funkcjami to tak.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Weź mi powiedz którego Gothic'a modujesz 1 czy 2?
Other przyjmuje różne wartości w zależności od tego co się dzieje...
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
@Siemekk Oraz możesz sam go ustawić. Możesz olać robienie dodatkowych zmiennych i użyć self, other, victim.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Wiem :F, ale jak robię funkcję z argumentami np. self i other zawsze daję slf, i oth. Nie wiem czemu tak robię, ale wolę mieć pewność, że nic się nie spierdzieli.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.


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