Problem with the system of life
#1

Hello all!

I'm having a problem with health in my server, I did a system that uses a variable (pHealth) to store a player's health and calculate his damage, but when I set his health higher, the "Update" function sets it back to the previous value.
OBS: sometimes it works normally.

Код:
#define UPDATE_HEALTH                   4

new pUpdate[MAX_PLAYERS];
new Float:pHealth[MAX_PLAYERS];

stock SetPlayerSysHealth(playerid, Float:health)
{
    pHealth[playerid] = health;
    SetPlayerHealth(playerid, pHealth[playerid]);
    return pUpdate[playerid] |= UPDATE_HEALTH;
}

stock AddPlayerSysHealth(playerid, Float:health)
{
    pHealth[playerid] += health;
    SetPlayerHealth(playerid, pHealth[playerid]);
    return pUpdate[playerid] |= UPDATE_HEALTH;
}

stock GetPlayerSysHealth(playerid, &Float:health)
    health = pHealth[playerid];

public OnGameModeInit()
{
    SetTimer("Update", 50, true);
}

public Update()
{
    for(new n = 0; n < MAX_PLAYERS; n++)
    {
        if(IsPlayerConnected(n) && IsPlayerLogged(n))
        {
            if(pUpdate[n] & UPDATE_HEALTH)
            {
                if(pHealth[n] < 1.0)
                    pHealth[n] = 1.0;
                    
                if(pHealth[n] > 100.0)
                    pHealth[n] = 100.0;
                    
                SetPlayerHealth(n, pHealth[n]);
                pUpdate[n] &= ~UPDATE_HEALTH;
            }
            
            else
            {
            	new Float:H;

	        GetPlayerHealth(n, H);

     	       	if(H < pHealth[n])
        	{
            	    new Float:D;
                
                    D = pHealth[n] - H;
                    SetPlayerSysHealth(n, H);
                    OnPlayerDamage(n, D);
            	}
	    }
        }
    }
}
public OnPlayerDamage(playerid, Float:damage)
{
	if(Limp[playerid] != 0)
	    return 0;
	    
	new Float:health;
	
	GetPlayerHealth(playerid, health);
	
	if(health < 25.0)
	{
	    if(Limp[playerid] != 2)
	    {
	    	HideTextRed(playerid);
	    	Rob[playerid] = 0;
			Limp[playerid] = 2;
	   		ShowTextGray(playerid);
	   		SetPlayerDrunkLevel(playerid, 40000);
	   		SetTimerEx("Limping", 3000, false, "d", playerid);
		}
	}
	
	else
	{
	    ShowTextRed(playerid);

		if(damage < 10.0)
		    SetTimerEx("HideTextRed", 400, false, "d", playerid);

		else
		{
		    Rob[playerid] = 0;
		    
		    if(!IsPlayerInAnyVehicle(playerid))
		    {
		        Limp[playerid] = 1;
				SetTimerEx("StopAnimation", 200, false, "d", playerid);
		    	SetTimerEx("DamageAnimation", 500, false, "df", playerid, damage);
			}
			
			else
			    SetTimerEx("HideTextRed", 3000, false, "d", playerid);
		}
	}
	
	return 1;
}

public DamageAnimation(playerid, Float:damage)
{
	new anim;

	if(damage >= 22.0)
	{
	    new getupid;
	    
	    anim = random(4);
	    
		if(anim == 0)
		{
		    getupid = 1;
			ApplyAnimation(playerid, "PED", "KO_shot_face", 4.1, 0, 1, 1, 1, -1, 1);
		}
		
		else if(anim == 1)
		{
		    getupid = 0;
		    ApplyAnimation(playerid, "PED", "KO_shot_stom", 4.1, 0, 1, 1, 1, -1, 1);
		}
		
		else if(anim == 2)
		{
		    getupid = 0;
		    ApplyAnimation(playerid, "KNIFE", "KILL_Knife_Ped_Die", 4.1, 0, 1, 1, 1, -1, 1);
		}
		
		else
		{
		    getupid = 1;
		    ApplyAnimation(playerid, "KNIFE", "knife_hit_3", 4.1, 0, 1, 1, 1, -1, 1);
		}
		
		SetTimerEx("DamageAnimationGetUp", 7000, false, "dd", playerid, getupid);
	}
	
	else
	{
	    anim = random(3);
	    
	    if(anim == 0)
			ApplyAnimation(playerid, "MD_END", "END_SC1_PLY", 4.1, 0, 1, 1, 1, -1, 1);
			
		else if(anim == 1)
			ApplyAnimation(playerid, "MD_END", "END_SC1_RYD", 4.1, 0, 1, 1, 1, -1, 1);
			
		else
			ApplyAnimation(playerid, "MD_END", "END_SC1_SWE", 4.1, 0, 1, 1, 1, -1, 1);
        	
        SetTimerEx("DamageEnd", 5000, false, "d", playerid);
	}
	
	SetPlayerDrunkLevel(playerid, 50000);
}

public DamageAnimationGetUp(playerid, getupid)
{
	if(getupid == 0)
		ApplyAnimation(playerid, "PED", "getup_front", 4.1, 0, 1, 1, 1, -1, 1);

	else
	    ApplyAnimation(playerid, "PED", "getup", 4.1, 0, 1, 1, 1, -1, 1);
	    
	SetTimerEx("DamageEnd", 1500, false, "d", playerid);
}

public DamageEnd(playerid)
{
    Limp[playerid] = 0;
    SetPlayerDrunkLevel(playerid, pDrunk[playerid]);
    HideTextRed(playerid);
    ClearAnimations(playerid);
}

public Limping(playerid)
{
	if(Limp[playerid] == 2)
	{
		new Float:health;
		
		GetPlayerHealth(playerid, health);
	
		if(health < 25.0)
		{
		    if(!IsPlayerInAnyVehicle(playerid))
		    	ApplyAnimation(playerid, "RYDER", "RYD_Die_PT1", 4.1, 1, 1, 1, 1, 1, 1);
		    	
		    SetTimerEx("Limping", 5000, false, "d", playerid);
		    return;
		}
	}
	    
	SetPlayerDrunkLevel(playerid, pDrunk[playerid]);
	Limp[playerid] = 0;
	HideTextGray(playerid);
}
Reply
#2

Help :/
Reply
#3

help :S
Reply
#4

I think you are going to have to set the variable to the health that you setting the player. Because if you aren't its just working as an AC of some sort
Reply
#5

I give up, I think nobody knows about repairing ... As would be if I used the native functions of the SA: MP?
Reply
#6

Put the full script please? As in where you defined health?
Reply
#7

#define UPDATE_HEALTH 4
Reply
#8

What is Limp?
And why would you want to set it higher?
You can just do some sort of command that does NEGATIVE damage, to reverse the action.
Reply
#9

If you ask me I cant see where the problem is
But i question me what this part is about ?

pawn Код:
if(pUpdate[n] & UPDATE_HEALTH)
            {
                if(pHealth[n] < 1.0)
                    pHealth[n] = 1.0;
                   
                if(pHealth[n] > 100.0)
                    pHealth[n] = 100.0;
                   
                SetPlayerHealth(n, pHealth[n]);
                pUpdate[n] &= ~UPDATE_HEALTH;
            }
This would have the same effect if it would be in SetPlayerSysHealth
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)