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
Klasa

Bugowanie sie w klasie 1/1 z awp

klasa

Najlepsza odpowiedź ferdias , 12.07.2014 22:41

Już se sam poradziłem ale dziękuje.

Przejdź do postu


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

#1 ferdias

    Zaawansowany

  • Zbanowany

Reputacja: 3
Nowy

  • Postów:79
  • Lokalizacja:Białystok
Offline

Napisano 08.07.2014 22:05

Mam problem z klasa buguje się tzn awp jest 1/1 raz działa a raz nie jak działa to i z deagla też mam 1/1 plus małe info gdzie popełniłem błąd.

 

Spoiler

 



#2 ex0

    Wolny strzelec.

  • Power User

Reputacja: 383
Wszechpomocny

  • Postów:1 127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 08.07.2014 22:30

Czemu Ty to fw_takedamage robisz a nie takim czymś:

 

public TakeDamage(this, idinflictor, idattacker, Float:damage,

damagebits)
{
if(!is_user_connected(idattacker))
return HAM_IGNORED;

if(!ma_klase[idattacker])
return HAM_IGNORED;

if(damagebits & DMG_BULLET)
{
new weapon = get_user_weapon(idattacker);

if(weapon == CSW_BRON && damage > 20.0 &&

random_num(1,2) == 1)
cod_inflict_damage(idattacker, this,

float(get_user_health(this))-damage+1.0, 0.0, idinflictor,

damagebits);

}

return HAM_IGNORED;
}

Lub SetParamFloat? 


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#3 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

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

Napisano 08.07.2014 23:35

Czemu Ty to fw_takedamage robisz

Boże uchroń mnie... To tylko nazwa funkcji ;D Ja swoją nazwę SramPijeIPale i będzie działać xD

Co do całej klasy to można by było popracować nad optymalnością ale chce mi się spać dlatego porozmawiamy na temat 1/1 i +10% dmg
Zatem twój kod wygląda tak:

public fw_TakeDamage(id, iEnt, iAttacker, Float:fDamage, iDamageBits)
{
    if(!is_user_connected(id) || !is_user_connected(iAttacker) || !g_iKlasaGracza[iAttacker] || get_user_team(id) == get_user_team(iAttacker))
        return HAM_IGNORED;
    
    static iWeapon;
    iWeapon = get_user_weapon(id);
    
    if(iWeapon == CSW_AWP)
    {
        cod_inflict_damage(iAttacker, id, float(get_user_health(id) + 1), 0.0, iEnt, (1<<1));
        return HAM_IGNORED;
    }
    else if(iWeapon == CSW_DEAGLE)
        cod_inflict_damage(iAttacker, id, fDamage * 0.1, 0.0, iEnt, (1<<1));
    
    return HAM_IGNORED;
}

Proponuje zacząć od samego początku czyli od if(!is_user_connected(id) || !is_user_connected(iAttacker) || !g_iKlasaGracza[iAttacker] || get_user_team(id) == get_user_team(iAttacker))
pogrubiony tekst jest niepotrzebny dlaczego? Bo trafiliśmy w gracza (bo jego classname to "player" (rejestr funkcji)) a nie wadzi nam to czy gracz trafiony jest online czy offline ważne by żył a zdażają się sporadyczne przypadki choć rzadko że gracz żyjący jest offline tzn. byt gracza został na serwerze ale gracz się rozłączył :/ Zatem zamień pogrubiony tekst na is_user_alive bo nie interesuje nas łapanie dmg w gracza który już jest martwy.

Następnie widze że używasz cod_inflict_damage do zabijanie co jest błędem gdyż ta funkcja nie zabija lecz zadaje dmg!! Nawet jeśli zadasz 908490321 dmg to jakiś inny plugin może je zmodyfikować i sprawić że nie będzie to śmiertelne dmg!!! Tak samo z dodawaniem 10% dmg używasz cod_inflict_damage a ta funkcja nie modyfikuje już istniejącego dmg a zadaje nowe niestety dmg zadane tą funkcją nie da się wychwycić (bynajmniej nie za pomocą Ham_TakeDamage) zatem jeśli my mamy tą klasę a gracza w przeciwnym team'ie ma klase która jest odporna na dmg zadawane z deagla (bo z deagla mam +10% dmg) to nie będziemy jej bić po 0 (a powinniśmy bo jest na nas odporna) lecz po dmg/10 dlaczego? Bo zadawane jej dmg to dmg z cod_inflict_damage którego nie mogliśmy złapać a zarazem zatrzymać :(

dodatkowo nie sprawdzasz czy czasem to dmg nie jest z HE gdyż gracz rzuci HE zmieni broń na awp i ma 1/1 z HE bo get_user_weapon zwróci CSW_AWP :D

Poprawiony kod:

public fw_TakeDamage(id, iEnt, iAttacker, Float:fDamage, iDamageBits)
{
	if(!is_user_alive(id) || !is_user_connected(iAttacker) || !g_iKlasaGracza[iAttacker] || get_user_team(id) == get_user_team(iAttacker))	return HAM_IGNORED;

	if(iAttacker == iEnt && ~iDamageBits & 1<<24)
	{
		static iWeapon;
		iWeapon = get_user_weapon(id)
	
		if(iWeapon == CSW_AWP)	KillPlayer(id,iEnt,iAttacker,CSW_AWP,HIT_HEAD,3,iDamageBits)
		else if(iWeapon == CSW_DEAGLE)
		{
			SetHamParamFloat(4,fDamage*1.1)
			return HAM_HANDLED
		}
	}

	return HAM_IGNORED;
}


KillPlayer(id,inflictor,attacker,weapon,body,shouldgib,damagebits)
{
	if(weapon > 30 || !is_user_alive(id) || !is_user_connected(attacker))	return
	
	const GrenadeWeapon = 1<<CSW_HEGRENADE | 1<<CSW_C4 | 1<<CSW_SMOKEGRENADE | 1<<CSW_FLASHBANG
	const m_LastHitGroup = 75
	const m_bitsDamageType = 76
	const m_fHasTakenHighDamage = 107
	static DeathMsgId
	new msgblock,weaponname[32],effect
	if (!DeathMsgId)	DeathMsgId = get_user_msgid("DeathMsg")
	
	set_pdata_int(id,m_LastHitGroup,body,5)
	set_pdata_int(id,m_bitsDamageType,damagebits,5)
	set_pdata_int(id,m_fHasTakenHighDamage,1,5)
	set_pev(id,pev_dmg_inflictor,inflictor)
	msgblock = get_msg_block(DeathMsgId)
	set_msg_block(DeathMsgId, BLOCK_SET)
	ExecuteHamB(Ham_Killed,id,attacker,shouldgib)
	set_msg_block(DeathMsgId, msgblock)
	effect = pev(id,pev_effects)
	if(effect & 128)	set_pev(id,pev_effects,effect-128)
	
	new len
	if(get_weaponname(weapon,weaponname,31))
	{
		if(~GrenadeWeapon & 1<<weapon) len = 7
		else weaponname = "grenade"
	}
	else if(weapon == 2)	weaponname = "tracktrain"
	else	weaponname = "world"
	
	emessage_begin(MSG_ALL, DeathMsgId)
	ewrite_byte(attacker)
	ewrite_byte(id)
	ewrite_byte(body == HIT_HEAD ? 1:0)
	ewrite_string(weaponname[len])
	emessage_end()
}

Funkcja KillPlayer jest stąd polecam poczytać


  • +
  • -
  • 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

#4 ferdias

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 3
Nowy

  • Postów:79
  • Lokalizacja:Białystok
Offline

Napisano 12.07.2014 22:41   Najlepsza odpowiedź

Już se sam poradziłem ale dziękuje.







Również z jednym lub większą ilością słów kluczowych: klasa

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

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