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

[ROZWIĄZANE] problem z find_ent_by_owner


Najlepsza odpowiedź sebul, 12.08.2013 11:36

http://amxx.pl/topic...er/#entry562308
To

Ale jeszcze z małą poprawką
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
if(!is_user_connected(idattacker))
return HAM_IGNORED;

if(!ma_perk[idattacker])
return HAM_IGNORED;

if(get_user_weapon(idattacker) == CSW_USP)
{
new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);
if(WpnId && cs_get_weapon_silen(WpnId) && !random(5)) {
SetHamParamFloat(4, float(get_user_health(this)));
return HAM_HANDLED;
}
}

return HAM_IGNORED;
}

po zmianie obrażeń, zwracamy "HAM_HANDLED", taki mniej ważny szczegół, ale jednak. Przejdź do postu


  • Zamknięty Temat jest zamknięty
21 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 08.08.2013 07:00

Witam.

 

Stworzyłem sobie perk ( z pomocą forum) i jak chce skompilować to wyskakuje mi to:

 

undefined symbol ''id'' <40>

	new WpnId = find_ent_by_owner(-1, "weapon_usp", id);
		
	if(ma_perk[idattacker] && random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP && cs_get_weapon_silen(WpnId))

W dokumentacji nie ma nic o tej funkcji. proszę o pomoc


  • +
  • -
  • 0

#2 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 08.08.2013 09:26



if(ma_perk[idattacker] && random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP && get_pdata_int(idattacker, 74,4) == 1)

Tak nie szybciej??


Użytkownik BlackPerfum edytował ten post 08.08.2013 09:26

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#3 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 08.08.2013 20:38

Przetłumacz sobie błąd to się wiele dowiesz, a mianowicie kompilator nie wie co oznacza twoje "id", nie jest to zdefiniowane, podaj funkcje całą razem z argumentami.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#4 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 08.08.2013 21:03

Killer masz zupełną rację :D To pewnie jest Ham_TakeDamage lub inna funkcja ham`a a błąd jest tu:

new WpnId = find_ent_by_owner(-1, "weapon_usp", id);

Zamień id na idattacker i będzie działać(wnioskuje po tym iż przy idattacker nie wyskakuje żaden błąd), ale zawsze możesz użyć podręcznej pamięci bytu. Według mnie takie coś jest troszkę bardziej wydajne(raczej):

if(ma_perk[idattacker] && random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP)
{
	if(get_pdata_int(idattacker, 74,4))
	{
		//Twój kod
	}
}

Użytkownik BlackPerfum edytował ten post 08.08.2013 21:08

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#5 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 08.08.2013 22:43

Zależy jakimi nazwami opisze sobie parametry, nie zawsze id to indeks gracza i nie zawsze jest on przekazywany, choć są użytkownicy którzy uważają że jak wpiszą sobie id to kompilator będzie wiedział o co i o kogo chodzi.
Być może twoja porada mu pomoże w co nie wątpię ale to jest strzał na ślepo, dlatego też poprosiłem o obszerniejszy kod :).
  • +
  • -
  • 1

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#6 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 08.08.2013 22:56


wnioskuje po tym iż przy idattacker nie wyskakuje żaden błąd

Dlatego to napisałem :D

To już nie do końca jest strzał na ślepo ale 100% nie ma gdyż mógł tak nazwać jakąś zmienną ale to już jest przypadek   :D


Użytkownik BlackPerfum edytował ten post 08.08.2013 22:57

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#7 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 09.08.2013 07:15

Wiem że undefined symbol to niezdefiniowany symbol

 

Dam ''obszerniejszy kod''

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;

    new WpnId = find_ent_by_owner(-1, "weapon_usp", id);
        
    if(ma_perk[idattacker] && random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP && cs_get_weapon_silen(WpnId))
    {
        SetHamParamFloat(4, float(get_user_health(this)));
        return PLUGIN_HANDLED
    }
        
    return HAM_IGNORED    
}

  • +
  • -
  • 0

#8 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 09.08.2013 11:26

Zamień id na idattacker

Spoiler

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#9 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

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

Napisano 09.08.2013 12:19

Zamień id na idattacker

Spoiler

A gdzie sprawdzenie, czy w ogóle znalazło te usp?
  • +
  • -
  • 1

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


#10 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 09.08.2013 12:57

Tutaj:

if(random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP && cs_get_weapon_silen(WpnId))

No może to nie jest sprawdzanie czy znalazło ale błędów ten warunek nie wywali :D Gdyby nie miał usp to nie doszedł by do "cs_get_weapon_silen(WpnId)"


Użytkownik BlackPerfum edytował ten post 09.08.2013 12:59

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#11 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

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

Napisano 09.08.2013 13:36

To już lepiej zrobić tak
if(get_user_weapon(idattacker) == CSW_USP) {
new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);
if(WpnId && cs_get_weapon_silen(WpnId) && !random(5))
SetHamParamFloat(4, float(get_user_health(this)))
}

  • +
  • -
  • 1

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


#12 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 09.08.2013 15:19

Jak już mowa o lepszym zrobieniu to tak będzie wydajniej (bynajmniej z mojego punktu widzenia):

if(get_pdata_int(idattacker, 43,5)==CSW_USP)
{
	if(random_num(1,5)==5 && get_pdata_int(idattacker, 74,5))
	{
		SetHamParamFloat(4, float(get_user_health(this)))
	}
}

sebul (09.08.2013 15:56):
Mój, czy Twój kod, To bynajmniej nie ma większego znaczenia ^ ^
Mi chodziło o sam fakt złego (a raczej niezbyt dobrego) ułożenia warunków.

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#13 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 10.08.2013 12:09

dzięki chłopacy xD

 

jakos wybiore


  • +
  • -
  • 0

#14 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 10.08.2013 13:10

kurcze nie moge edytowac

 

dajci mi gotowca bo nie wiem jak mam to zrobic. Czy dodac ma_perk ==true czy nie. i gdzie wogóle w tym get_pdata_int (xxxx) jest usp z tłumikiem??

 

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;

    new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker)
        
    if(ma_perk[idattacker] && random_num(1,5)==5 && get_user_weapon(idattacker)==CSW_USP && cs_get_weapon_silen(WpnId));
    {
        SetHamParamFloat(4, float(get_user_health(this)))
        return PLUGIN_HANDLED
    }
        
    return HAM_IGNORED    
}

  • +
  • -
  • 0

#15 Klakier

    Volenti non fit iniuria

  • Power User

Reputacja: 391
Wszechpomocny

  • Postów:878
  • GG:
  • Imię:Sebastian
  • Lokalizacja:Mogilno
Offline

Napisano 10.08.2013 16:24

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;
 
        if(get_user_weapon(idattacker) == CSW_USP) 
        {
            new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);

            if(WpnId && cs_get_weapon_silen(WpnId) && !random(5))
                SetHamParamFloat(4, float(get_user_health(this)))

        }

        
    return HAM_IGNORED    
}
 

  • +
  • -
  • 1

Sell - System Klanów (wojny, top15 etc)

 

Kontakt GG: 7285018


#16 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 10.08.2013 19:41

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;
 
        if(get_user_weapon(idattacker) == CSW_USP) 
        {
            new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);

            if(WpnId && cs_get_weapon_silen(WpnId) && !random(5))
                SetHamParamFloat(4, float(get_user_health(this)))

        }

        
    return HAM_IGNORED    
}
 

 

sebul nie ma racji ^^ Bo jak WpnId będzie równe -1 (przynajmniej w fakemecie miałem errorlogi), to wg warunku znajdzie tą broń.

 

Funkcja powinna wyglądać tak

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;
 
        if(get_user_weapon(idattacker) == CSW_USP)
        {
            new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);

            if(WpnId > 0 && cs_get_weapon_silen(WpnId) && !random(5))
                SetHamParamFloat(4, float(get_user_health(this)))

        }

        
    return HAM_IGNORED
}

  • +
  • -
  • 0

#17 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 10.08.2013 21:05

O ile się nie mylę można jeszcze tak:

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
	if(!is_user_connected(idattacker) || !ma_perk[idattacker])	return HAM_IGNORED
	
	if((get_pdata_int(idattacker,74,4) & (1<<0)) && !random(5))	SetHamParamFloat(4, float(get_user_health(this)))

    return HAM_IGNORED
}

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#18 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

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

Napisano 11.08.2013 08:29

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;
 
        if(get_user_weapon(idattacker) == CSW_USP) 
        {
            new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);

            if(WpnId && cs_get_weapon_silen(WpnId) && !random(5))
                SetHamParamFloat(4, float(get_user_health(this)))

        }

        
    return HAM_IGNORED    
}
 

 
sebul nie ma racji ^^ Bo jak WpnId będzie równe -1 (przynajmniej w fakemecie miałem errorlogi), to wg warunku znajdzie tą broń.
 
Funkcja powinna wyglądać tak
 
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;

    if(!ma_perk[idattacker])
        return HAM_IGNORED;
 
        if(get_user_weapon(idattacker) == CSW_USP)
        {
            new WpnId = find_ent_by_owner(-1, "weapon_usp", idattacker);

            if(WpnId > 0 && cs_get_weapon_silen(WpnId) && !random(5))
                SetHamParamFloat(4, float(get_user_health(this)))

        }

        
    return HAM_IGNORED
}

W tym przypadku "WpnId" nigdy nie będzie miało wartości -1, zawsze ma 0 lub id entu (czyli > 0), które znalazło. Dowód? Bardzo często używam, np. czegoś takiego
new ent = -1;
while((ent = find_ent_by_owner(ent, "weapon_usp", id))) {
// jakieś operacje na "ent"
}

i nigdy żadnych błędów związanych z takim kodem nie miałem, no chyba że akurat taki kod wrzuciłem do funkcji rozłączenia gracza z serwerem, ale wtedy błąd dotyczył samej funkcji "find_ent_by_owner" (a dokładniej, że ownera nie ma już na serwerze), a nie tego, że "ent" przyjął wartość -1. A nawet mam jeszcze lepszy dowód
static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params)  // native find_ent_by_owner(start_from_ent, classname[], owner_index); = 3 params
{
	int iEnt = params[1];
	int oEnt = params[3];
	// Check index to start searching at, 0 must be possible for iEnt.
	CHECK_ENTITY(oEnt);

	edict_t *pEnt = INDEXENT2(iEnt);
	edict_t *entOwner = INDEXENT2(oEnt);

	//optional fourth parameter is for jghg2 compatibility
	const char* sCategory = NULL; 
	switch(params[4]){ 
		case 1: sCategory = "target"; break; 
		case 2: sCategory = "targetname"; break; 
		default: sCategory = "classname"; 
	}

	// No need to check if there is a real ent where entOwner points at since we don't access it anyway.

	int len;
	char* classname = MF_GetAmxString(amx, params[2], 0, &len);

	while (true) {
		pEnt = FIND_ENTITY_BY_STRING(pEnt, sCategory, classname);
		if (FNullEnt(pEnt)) // break and return 0 if bad
			break;
		else if (pEnt->v.owner == entOwner) // compare pointers
			return ENTINDEX(pEnt);
	}

	// If it comes here, the while loop ended because an ent failed (FNullEnt() == true)
	return 0;
}
zwracane jest 0 lub id entu, więc -1 nigdy nie będzie.
  • +
  • -
  • 0

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


#19 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 12.08.2013 07:44

!!!

 

Czyli które? Już się pogubiłem


  • +
  • -
  • 0

#20 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 12.08.2013 11:30

http://amxx.pl/topic...er/#entry562308

To


  • +
  • -
  • 0




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

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