[Include] Server-Side Health ― Sem mais s0rvete nem cl3o
#1

Lй Introduction

Ah, seilб foda-se isso.

Lй Utiliser

No topo do GM, DE EXTREMA IMPORTВNCIA:
pawn Code:
#include <a_samp>
#include <AMINHAINCLUDE>
Sу.

E tem uma callback:
pawn Code:
forward OnPlayerHealthHacks(playerid, Float:serverhealth, Float:clienthealth, Float:serverarmour, Float:clientarmour);
Lй Transfйrer
pawn Code:
#if defined _server_health
    #endinput
#else
    #define _server_health
#endif

#define lazyfunction%0(%1) forward%0(%1); public%0(%1)

enum _SH_PINFO
{
    Float:shPlayerHealth,
    Float:shPlayerArmour
}
new _sg_PlayerInfo[MAX_PLAYERS][_SH_PINFO];
forward OnPlayerHealthHacks(playerid, Float:serverhealth, Float:clienthealth, Float:serverarmour, Float:clientarmour);



public OnPlayerSpawn(playerid)
{
    _sg_PlayerInfo[playerid][shPlayerHealth] = 100.0;
    _sg_PlayerInfo[playerid][shPlayerArmour] = 0.0;
    if (funcidx("SH_OnPlayerSpawn") != -1)
    {
        return CallLocalFunction("SH_OnPlayerSpawn", "i", playerid);
    }
    return 1;
}
#if defined _ALS_OnPlayerSpawn
  #undef OnPlayerSpawn
#else
  #define _ALS_OnPlayerSpawn
#endif
#define OnPlayerSpawn SH_OnPlayerSpawn
forward SH_OnPlayerSpawn(playerid);

/* */

public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
    _sg_PlayerInfo[playerid][shPlayerArmour] -= amount;

    if(_sg_PlayerInfo[playerid][shPlayerArmour] < 0)
    {
        _sg_PlayerInfo[playerid][shPlayerArmour] = 0.0;
        _sg_PlayerInfo[playerid][shPlayerHealth] += _sg_PlayerInfo[playerid][shPlayerArmour];
    }

    SetPlayerHealth(playerid, _sg_PlayerInfo[playerid][shPlayerHealth]);
    SetPlayerArmour(playerid, _sg_PlayerInfo[playerid][shPlayerArmour]);

    new Float:client_Health; GetPlayerHealth(playerid, client_Health);
    new Float:client_Armour; GetPlayerArmour(playerid, client_Armour);
    if(_sg_PlayerInfo[playerid][shPlayerHealth] != client_Health || _sg_PlayerInfo[playerid][shPlayerArmour] != client_Armour)
    {
        if(funcidx("OnPlayerHealthHacks") != -1)
            CallRemoteFunction("OnPlayerHealthHacks", "iffff", playerid, _sg_PlayerInfo[playerid][shPlayerHealth], client_Health, _sg_PlayerInfo[playerid][shPlayerArmour], client_Armour);
    }

    if (funcidx("SH_OnPlayerTakeDamage") != -1)
    {
        return CallLocalFunction("SH_OnPlayerTakeDamage", "iifi", playerid, issuerid, amount, weaponid);
    }
    return 1;
}
#if defined _ALS_OnPlayerTakeDamage
  #undef OnPlayerTakeDamage
#else
  #define _ALS_OnPlayerTakeDamage
#endif
#define OnPlayerTakeDamage SH_OnPlayerTakeDamage
forward SH_OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid);

/* */

lazyfunction SH_GetPlayerHealth(playerid, &Float:health)
{
    health = _sg_PlayerInfo[playerid][shPlayerHealth];
    return 1;
}
#define GetPlayerHealth SG_GetPlayerHealth

lazyfunction SH_SetPlayerHealth(playerid, Float:health)
{
    _sg_PlayerInfo[playerid][shPlayerHealth] = health;
    SetPlayerHealth(playerid, health);
    return 1;
}
#define SetPlayerHealth SH_SetPlayerHealth

lazyfunction SH_GetPlayerArmour(playerid, &Float:armour)
{
    armour = _sg_PlayerInfo[playerid][shPlayerArmour];
    return 1;
}
#define GetPlayerArmour SH_GetPlayerArmour

lazyfunction SG_SetPlayerArmour(playerid, Float:armour)
{
    _sg_PlayerInfo[playerid][shPlayerArmour] = armour;
    SetPlayerArmour(playerid, armour);
    return 1;
}
#define SetPlayerArmour SH_SetPlayerArmour

Apenas 0.3d+ e mantenham os crйditos, crianзas.
Reply
#2

Bom sistema, mas recomendo para quem for usar sempre banir o jogador na hora que a OnPlayerHealthHacks for chamada, pois tem uns cleos ae que trava a HP do cara, nem sethp muda a health dele (porйm no /slap ou /explode perde normal) e tem o cleo dos 5ps tmb, que a OnPlayerTakeDamage nгo й chamada mesmo quando o cara toma dano, enfim, cleo й foda de pegar...
Reply
#3

Eu tenho algumas dъvidas sobre esse sistema. Eu nгo tive a chance de testar a callback 100%.
(Eu nгo sei ao certo se o damage na OnPlayerTakeDamage й o damage que ele deveria tomar ou o que ele tomou).

Mas dб pra resolver isso rapidamente com uma simples array com o damage das armas.
Reply
#4

Stewie , poderia me tirar uma duvida?

Nгo sei se entendi bem.. Mas..

Oque a include faz й verificar se tal player perdeu HP quando levou dano, caso nгo ele chama a OnPlayerHealthHacks? Desculpe se a pergunta for ignorante.
Reply
#5

Uma duvida e se o player estiver esc o outro atirar ele vais ser ban/kick ?
Reply
#6

Explica melhor o que isso faz.. fazendo favor rs
Reply
#7

pawn Code:
if(_sg_PlayerInfo[playerid][shPlayerArmour] < 0)
    {
        _sg_PlayerInfo[playerid][shPlayerArmour] = 0.0;
        _sg_PlayerInfo[playerid][shPlayerHealth] += _sg_PlayerInfo[playerid][shPlayerArmour];
    }
Nгo deveria ser assim ?

pawn Code:
if(_sg_PlayerInfo[playerid][shPlayerArmour] < 0)
    {
        _sg_PlayerInfo[playerid][shPlayerHealth] += _sg_PlayerInfo[playerid][shPlayerArmour];
        _sg_PlayerInfo[playerid][shPlayerArmour] = 0.0;
    }
E outra coisa: De qualquer forma, se o jogador atingido nгo estiver usando cheat, a vida dele nгo serб esta que foi setada e sim a correta (entendeu ? '-').
Reply
#8

1 - Certo.
2 - Deixando de lado o fato que a include simplesmente nгo funciona (deve-se usar OPGD), Nгo terб uma 'vida dele'. Й uma vida client side. Ou isso ou vocк explicou bem mal :$
Reply
#9

O jogador pode ganhar health por via de mбquinas de refrigerante e lanchonetes causando a diferenзa que й checada no callback/sendo confundido com cheater.
Reply
#10

Eh so verificar se no momento ou proximo ao momento de ganhar vida GetPlayerSpecialAction == 23 e configurar isso como excessao pra nao banir pessoas erradas... https://sampwiki.blast.hk/wiki/GetPlayerSpecialAction
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)