[Ajuda] Danos Bugados.
#1

Bom eu tenho um servidor de DeathMatch porem uma coisa muito importante no servidor esta bugado o dano, tipo voce acerta um fast (c-bug voce da varios tiros de eagle rapido na pessoa) e tipo vc acerta 7 tiros de eagle na pessoa so conta 3 tiros na vida/colete da pessoa, olha esse video !

https://www.youtube.com/watch?v=xPiKPOH8n-k

intao й esse o bug vou postar abaixo os codigos:

OnPlayerTakeDamage

Код:
public OnPlayerTakeDamage(playerid,issuerid,Float:amount,weaponid)
{
	if(Lagduel[playerid] == false) return 1;
	if(weaponid == 24) amount = 32;
	if(weaponid == 25) amount = 12;
	SetPlayerScore(issuerid,GetPlayerScore(issuerid) + floatround(amount) / 10);
	PlayerPlaySound(playerid,6401,0,0,0);
	new Float:life;
	GetPlayerHealth(playerid,life);
	if((life - amount) <= 0)
	{
		Morto[playerid] = true;
		SendDeathMessage(issuerid,playerid,weaponid);
		DeadPlayer(playerid,issuerid,weaponid);
	}
	return 1;
}
OnPlayerGiveDamage

Код:
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
	if(Aj[playerid] == false && GetPlayerSpecialAction(playerid) == 2) return SetPlayerHealth(playerid,0);
	switch(weaponid)
	{
		case 24: amount = 32;
		case 9: amount = 10;
		case 38: amount = 0;
	}
	if(Morto[damagedid] == true) return 1;
	if(Lagduel[damagedid] == true) return 1;
	PlayerPlaySound(damagedid,6401,0,0,0);
    new Float:Life, Float:Coleete, Float:Dano;
    GetPlayerArmour(damagedid,Coleete);
    GetPlayerHealth(damagedid,Life);
    if(Coleete > 0)
    {
        if(amount > Coleete)
        {
            Dano = amount - Coleete;
            Life = Life - Dano;
            SetPlayerArmour(damagedid, 0.0);
            SetPlayerHealth(damagedid, Life);
			SetPlayerScore(playerid,GetPlayerScore(playerid) + floatround(amount) / 10);
            return 1;
        }
		SetPlayerScore(playerid,GetPlayerScore(playerid) + floatround(amount) / 10);
        Coleete = Coleete - amount;
        SetPlayerArmour(damagedid, Coleete);
    }
    if(Coleete < 1)
    {
        Life = Life - amount;
		SetPlayerScore(playerid,GetPlayerScore(playerid) + floatround(amount) / 10);
        SetPlayerHealth(damagedid, Life);
		if(Life <= 0)
		{
			Morto[damagedid] = true;
			SendDeathMessage(playerid,damagedid,weaponid);
			DeadPlayer(damagedid,playerid,weaponid);
		}
    }
    return 1;
}
Me ajudem por favor !
Reply
#2

Eu que escrevi esse algoritmo jб tem alguns anos, e melhorei ele no hard a pбrtir da v20 para resolver esse problema que vocк citou. O defeito desse algoritmo й que ele trabalha com vida e colete cliente sided, enquanto meu novo algoritmo calcula tudo 100% server sided, eliminando qualquer problema de lag e ping.

Nгo posso passar o algoritmo atual, pois nгo sou mais o dono do servidor e nгo possuo mais o cуdigo fonte, mas posso te dar uma dica de como criб-lo:

Basta criar duas variбveis, uma per-player para colete e outra per-player para vida.
Hookar as funзхes de SetPlayerHealth para que trabalhem com estar variбveis ou criar novas funзхes.
E entгo sempre calcular qualquer dano usando elas, e entгo apуs os cбlculos todos setar o colete e a vida normalmente (apenas para efeitos visuais).

Caso a variбvel de vida chegue a 0, й sу chamar a funзгo DeadPlayer.
Reply
#3

poderia fazer isso pra min no codigo sou meio novo em pawno, por favor, ou tem algum outro topico q fale sobre pra min poder estudar?
Reply
#4

Й extremamente errado fazer sistemas de tirar life no OnPlayerGiveDamage. Bom, nгo irб funcionar. Se vocк acertar um tiro no player na tua tela, vai tirar a vida do player. Sempre irб tirar. Mesmo se na tela de quem tu atirou nгo pegou. Nгo й а toa que o samp criou o famoso 'tiro na skin'.
Reply
#5

alguem tem algum outro sistema de tiro na skin que nao tenha bugs ?
Reply
#6

alguem ?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)