Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Zabicie bytu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
23 odpowiedzi w tym temacie

#1 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 07.12.2012 10:33

Jeśli dam bytowi flagę kill, to czy wykona się funkcja zarejestrowana w ten sposób
RegisterHam(Ham_Killed, "info_target", "KilledMine", 0);

jak nie to w jaki sposób to zrobić, bo nie mam za bardzo czasu kombinować.

Oczywiście przy tworzeniu bytu jest coś takiego
entity_set_float(ent, EV_FL_takedamage, 1.0);
entity_set_float(ent, EV_FL_health, 200.0);
entity_set_float(ent, EV_FL_max_health, 200.0);

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 07.12.2012 11:18

Chodzi Ci o to, czy funkcja się wywoła, jeśli ustawisz śmierć bytu ręcznie? Hmm... ciężko powiedzieć, chyba tylko pozostaje Ci to wypróbować.
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

Napisano 07.12.2012 13:26

W Ham_TakeDamage zrób to sprawdzaj czy damage jest >= hp i wtedy byt zostanie zabity.
Co do flagi w Ham_Killed nie wiem
  • +
  • -
  • 0

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#4 Jak się nazwać

    Wszechmogący

  • Power User

Reputacja: 169
Profesjonalista

  • Postów:617
  • Imię:a
  • Lokalizacja:a
Offline

Napisano 07.12.2012 14:24

zamiast info_target wpisujesz classname bytu
  • +
  • -
  • -2
Pisze na zamówienie statystyki pod nvault. GG: 15600964

#5 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 07.12.2012 16:38

Chodzi Ci o to, czy funkcja się wywoła, jeśli ustawisz śmierć bytu ręcznie? Hmm... ciężko powiedzieć, chyba tylko pozostaje Ci to wypróbować.

Jak dobrze zrozumiałem, to tak, po prostu chodzi o to, czy funkcja się wywoła, jeśli bytowi ustawię flagę śmierci, czyli np.
entity_set_int(ent, EV_INT_flags, FL_KILLME);


W Ham_TakeDamage zrób to sprawdzaj czy damage jest >= hp i wtedy byt zostanie zabity.
Co do flagi w Ham_Killed nie wiem

Nie potrzeba tutaj "Ham_TakeDamage", po prostu akurat w tym przypadku po zadaniu 200 dmg byt zostaje zabity i funkcja z "Ham_Killed" się wywołuje.

zamiast info_target wpisujesz classname bytu

To nie działa w ten sposób, rejestrując funkcję wpisuje się to co jest przy "create_entity", a potem w danej funkcji trzeba sprwadzać nazwę klasy.

Może dzisiaj przetestuje to jakoś na hlds.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 radim

    Godlike

  • Moderator

Reputacja: 939
Master

  • Postów:2 725
  • Steam:steam
  • Imię:Arkadiusz
  • Lokalizacja:Janów Lub.
Offline

Napisano 07.12.2012 17:03

RegisterHam(Ham_Killed, "info_target", "KilledMine");

public KilledMine(iEnt)
{
new className[32];
entity_get_string(iEnt, EV_SZ_classname, className, charsmax(className))

if(!equali(className, "KLASA_BYTU"))
return HAM_IGNORED;

//SOLID (nie wiem jak to nazwa, te takie pole) nadal tam jest więc musimy go usunąć
entity_set_int(iEnt, EV_INT_solid, SOLID_NOT);
//byt jest martwy więc nie powinien otrzymywać żadnych obrażeń
entity_set_float(iEnt, EV_FL_takedamage, 0.0);

return HAM_SUPERCEDE
}
I powinno śmignąć. Podałem kod bo nie wiem czy dobrze Cię zrozumiałem

Użytkownik radim edytował ten post 07.12.2012 17:08

  • +
  • -
  • 0

Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !


#7 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 07.12.2012 18:22

RegisterHam(Ham_Killed, "info_target", "KilledMine");

public KilledMine(iEnt)
{
new className[32];
entity_get_string(iEnt, EV_SZ_classname, className, charsmax(className))

if(!equali(className, "KLASA_BYTU"))
return HAM_IGNORED;

//SOLID (nie wiem jak to nazwa, te takie pole) nadal tam jest więc musimy go usunąć
entity_set_int(iEnt, EV_INT_solid, SOLID_NOT);
//byt jest martwy więc nie powinien otrzymywać żadnych obrażeń
entity_set_float(iEnt, EV_FL_takedamage, 0.0);

return HAM_SUPERCEDE
}
I powinno śmignąć. Podałem kod bo nie wiem czy dobrze Cię zrozumiałem

Nie zrozumieliśmy się, o tym to ja wiem, chodzi mi tylko o to, czy funkcja taka jaką podałeś wykona się, jeśli bytowi damy flagę kill. Zaraz spróbuję ogarnąć jakiś testowy kod pod to co mam i sprawdzę to na serwerze.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#8 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 07.12.2012 19:00

*
Popularny

/**
* Description: Normally called whenever an entity dies.
* Forward params: function(this, idattacker, shouldgib)
* Return type: None.
* Execute params: ExecuteHam(Ham_Killed, this, idattacker, shouldgib);
*/
Ham_Killed,
Ham_Killed wykrywa śmierć dowolnego bytu o określonej klasie.

Samo ustawienie flagi FL_KILLMEjednak nie usuwa jednak bytu, konieczne jest wywołanie procesu myślenia bytu, by został on zabity.
Tym samym odpowiedź na pytanie jest negatywna, ustawienie glagi FL_KILLMEnie wywołuje Ham_Killed, a dopiero proces myślenia po ustawieniu flagi.
Jednakże, i to nie zawsze zadziała, a tym samym nie zawsze aktywuje Ham_Killed, gdyż niektóre typy bytów nie potrafią obsłużyć procesu samozagłady,
nawet posiadając pdatę flag na śmierć i przyjąwszy flagę FL_KILLME, gdyż nie będą w stanie usunąć się, co wynika ze specyfikacji procesu samozagłady:
void CBaseEntity::UpdateOnRemove( void )
{
int i;

if ( FBitSet( pev->flags, FL_GRAPHED ) )
{
// this entity was a LinkEnt in the world node graph, so we must remove it from
// the graph since we are removing it from the world.
for ( i = 0 ; i < WorldGraph.m_cLinks ; i++ )
{
if ( WorldGraph.m_pLinkPool [ i ].m_pLinkEnt == pev )
{
// if this link has a link ent which is the same ent that is removing itself, remove it!
WorldGraph.m_pLinkPool [ i ].m_pLinkEnt = NULL;
}
}
}
if ( pev->globalname )
gGlobalState.EntitySetState( pev->globalname, GLOBAL_DEAD );
}
pev->targetname nie przechowuje bowiem w przypadku niektórych bytów danych, co uniemożliwia zakończenia procesu samozagłady.
Tym samym, nie dla każdego typu bytów zostanie wywołane Ham_Killed, a bez wywołania procesu myślenia, nigdy.

#9 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 07.12.2012 19:13

To już nie będę nawet tego testowego pluginu robił.

Czyli jak najlepiej zrobić, żeby "zabić" byt w taki sposób, aby zostało to wykryte w "Ham_Killed"? Potrzebuje to do tego, aby "zabić" byt po dotknięciu przez inny byt.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#10 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 07.12.2012 19:44

Jeśli sam tworzysz te byty, to powinno normalnie wywoływać Ham_Killed.
Inna sprawa ma się z np. zakładnikami, respem czy bombsitem.
speedkill (07.12.2012 20:20):
Z tego co podałeś wyżej, Ham_Killed zadziała:
* Description:         Normally called whenever an entity dies.
(07.12.2012 20:41):
Tak, tylko chodzi o to, że nie zawsze flaga FL_KILLME zabija byt. Czasem nie robi nic, a czasem jedynie usuwa byt, bez informacji o zabiciu.
sebul (07.12.2012 20:44):
Czyli sama flaga kill wystarczy?
speedkill (08.12.2012 08:10):
@Benio, jeśli byt jest stworzony przez nas, to nie powinno być problemu z zabiciem jego. Aczkolwiek ręki nie dam :D

@Sebul, powinno zadziałać ;)


#11 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 08.12.2012 09:00

Sebul, z tego wynika że event wywoła się po ustawieniu flagi (znaczy po wykonaniu thinka gdy flagę ustawisz już) na każdym bycie, na którym event wywołałby się przy normalnej śmierci. Jeśli jednak się nie wywoła to będzie to raczej zależało od klasy bytu, nie będzie to raczej losowe zachowanie
(08.12.2012 09:46):
Dokładnie, dla pewnych klas wykona się zawsze, dla innych zaś nigdy.
Utworzenie własnej klasy z reguły nie sprawi problemu z zabiciem bytu flagę FL_KILLME.

  • +
  • -
  • 2

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#12 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 161
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 17.12.2012 17:13

Jeżeli nie zadziała to z FL_KILLME to możesz tak:
Zarejstrować Ham_TakeDamage i jeżeli wartość hp tego enta jest mniejsza niż 0 to wywołać ExecuteHam/B(Ham_Killed, ...

Użytkownik Cypis' edytował ten post 17.12.2012 17:16

  • +
  • -
  • 0

#13 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.12.2012 17:21

Zarejstrować Ham_TakeDamage i jeżeli wartość hp tego enta jest mniejsza niż 0 to wywołać ExecuteHam/B(Ham_Killed, ...

A przeczytałeś wcześniejsze posty? :facepalm:
Tu nie chodzi o zwykłe zabijanie bytu, jeśli ktoś strzela.

Mam jeszcze jedno pytanie, bo jakiś czas temu sprawdziłem to przy użyciu
entity_set_int(id, EV_INT_flags, FL_KILLME);

lub
entity_set_int(id, EV_INT_flags, FL_KILLME);
entity_set_float(id, EV_FL_nextthink, halflife_time()+0.1);

lub
remove_entity(arrow);

lub
ExecuteHamB(Ham_TakeDamage, id, arrow, arrow, 100.0, (1<<1)|(1<<2));

i w żadnym przypadku funkcja zabicia się nie wywołała. Teraz tak się zastanawiam czy to może nie przez to, że owner w obydwu bytach jest ten sam? Pisząc owner, mam na myśli to, że przy tworzeniu bytu dodana jest taka linijka
entity_set_edict(Ent, EV_ENT_owner, id);


A jeszcze zaraz sprawdzę to z tym "ExecuteHam/B(Ham_Killed", bo wydaje się, że to może zadziałać.
sebul (17.12.2012 17:34):
Dalej to samo, nie działa.

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#14 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 161
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 17.12.2012 19:24

A przeczytałeś wcześniejsze posty?

Tak, ale nie wiem co chcesz dokładnie osiągnąć.

Po wywołaniu ExecuteHam(Ham_TakeDamage, ..) z odpowiednia ilosca zadanych dmg musi się wywołać Ham_Killed. Kiedyś napisałem tamat o tym chyba w support zone albo w mod zone.

ExecuteHam(Ham_TakeDamage, obrywajacy, atakujacy, atakujacy, 200.0, (1<<1));

Użytkownik Cypis' edytował ten post 17.12.2012 19:25

  • +
  • -
  • 0

#15 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.12.2012 21:06

Czyli jak najlepiej zrobić, żeby "zabić" byt w taki sposób, aby zostało to wykryte w "Ham_Killed"? Potrzebuje to do tego, aby "zabić" byt po dotknięciu przez inny byt.

Nie koniecznie za pierwszym razem, ale w każdym razie po kolejnych testach już wiadomo, że jeśli w obydwu bytach owner jest ten sam, to wtedy choćbym nie wiadomo co robił, to i tak bytu nie zabije, bo nie wykrywa się "touch". Teraz ownera jednego bytu zapisałem gdzie indziej i chyba zabijanie bytu działa, ale nie wiedzieć czemu nie zawsze wykrywa dotyk obydwu bytów, szczególnie gdy położę tylko jeden byt (jednego typu) lub byty (jednego typu) są na czymś płaskim.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#16 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 161
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 17.12.2012 22:52

no jak ownera tego samego ustawisz to wiadomo że nie będzie dało się zabić bo ten byt wtedy nie jest "solidny" (mozna przez niego przechodzic)
  • +
  • -
  • 0

#17 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.12.2012 23:14

no jak ownera tego samego ustawisz to wiadomo że nie będzie dało się zabić bo ten byt wtedy nie jest "solidny" (mozna przez niego przechodzic)

Jeśli bytowi ustawimy ownera jako siebie, to wiadomo, że dla mnie będzie "jak powietrze", ale nie wiedziałem, że jeśli dwa byty będą miały ownera ustawionego jako mnie, to nie będzie można wykryć ich dotyku, a właśnie o to mi tutaj chodzi, aby jeden byt zabić drugim bytem w taki sposób, aby zostało to wykryte w funckji zabicia od "kanapki". Do testów w jednym bycie zapisałem ownera w innym miejscu i niby już jest ok, ale jednak często nie wykrywa dotyku tych bytów, a zarazem nie zabija tego jednego bytu.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#18 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 161
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 17.12.2012 23:37

a co używasz do wykrania dotyku ?
  • +
  • -
  • 0

#19 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.12.2012 23:46

register_touch(MINE_CLASS, "*", "DotkniecieMiny");
(...)
public DotkniecieMiny(mine, id) {
if(!is_valid_ent(mine) || !is_valid_ent(id))
return PLUGIN_CONTINUE;

new classname[32];
entity_get_string(id, EV_SZ_classname, classname, 31);

if(equal(classname, "player")) {
if(!is_user_alive(id))
return PLUGIN_CONTINUE;

new owner = entity_get_edict(mine, EV_ENT_owner);
//new owner = entity_get_edict(mine, EV_ENT_euser4);
if(get_user_team(owner) == get_user_team(id))
return PLUGIN_CONTINUE;

ExecuteHamB(Ham_Killed, mine, id, 0);
}
else if(equal(classname, "nazwaklasy")) {
//entity_set_int(mine, EV_INT_flags, FL_KILLME);
//client_print(0, print_chat, "Dotkniecie miny przez belt");
//entity_set_float(mine, EV_FL_nextthink, halflife_time()+0.1);
//ExecuteHamB(Ham_TakeDamage, mine, id, id, 120.0, (1<<1)|(1<<2));
ExecuteHamB(Ham_Killed, mine, id, (1<<1)|(1<<2));
}

return PLUGIN_CONTINUE;
}

Wywalałem warunek ten od drużyny i normalnie mina wybuchała jak w nią wdepnąłem, oczywiście wcześniej zmieniając miejsce zapisu ownera do "EV_ENT_euser4".
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#20 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 161
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 19.12.2012 20:18

Tak, ownera wcale nie ustawiaj, jak chcesz zapisać id gracza co tworzył tą mine to dajesz np. EV_ENT_euser3/4
Co do dotyku bytów czy ustawiłeś dla nich mins i maks ?
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych