OnPlayerTakeDamage
#1

Tengo un problema, al utilizar OnPlayerTakeDamage fijo el daсo de algъn arma, por ejemplo, que la desert eagle quite 50, pero el problema que no sуlo quitar 50 al efectuarse un disparo, si no que tambiйn cuando estбn pegados los jugadores entonces le pega con la culata de la desert eagle, le quita 50.. їhay forma de modificar eso?

A mi se me ocurriу algo como definir GetPlayerAmmo como variable de municiуn, entonces usando el public OnPlayerTakeDamage crear una condicional que si se ejecuta el daсo del arma y la variable de municiуn no disminuya, el daсo no se efectъe o quite el daсo predeterminado..

Код:
new municion = GetPlayerAmmo(playerid);
Tambiйn otra, cuando uno golpea se produce una animaciуn, quizб tal animaciуn estй en la biblioteca de animaciones, entonces se crearнa una condicional detectando si se ejecuta tal animaciуn (GetPlayerAnimationIndex) haga que no quite el daсo que le fijй al arma.

їHay alguna mejor forma?
Reply
#2

tambiйn podrнas chequear si el jugador (el que recibe el golpe) esta a un radio de 2 del jugador que dio el golpe y si es positivo hacer que quite 2 o 5 de vida.
Reply
#3

Utiliza una variable para cuando el jugador tenga la desert eagle, entonces fijas la variable en 1 y luego en OnPlayerTakeDamage chequeas si esa variable estб en un 1 y si lo estб entonces le quitas los 50 de vida.
Es una manera eficaz para "reconocer" que esa variable en 1 sea una desert eagle.
Y sino proba usando la funciуn OnPlayerGiveDamage.

EDIT: Creo que va a seguir persitiendote el problema :/
Reply
#4

Tienes que ponerlo al principio del gamemode
Ya hice el cуdigo para OnPlayerTakeDamage, pero si, es importante ponerlo al principio del GM, el public donde tu quieras y lo demбs al principio despues de los includes
pawn Код:
new DesertAmmo[MAX_PLAYERS];
new RealizoDisparo[MAX_PLAYERS];

stock H_GivePlayerWeapon(playerid, weaponid, ammo)
{
    if(weaponid == 24)
    {
        DesertAmmo[playerid] = weaponid;
    }
    GivePlayerWeapon(playerid, weaponid, ammo);
}
#if defined _ALS_GivePlayerWeapon
    #undef GivePlayerWeapon
#else
    #define _ALS_GivePlayerWeapon
#endif
#define GivePlayerWeapon H_GivePlayerWeapon

stock H_ResetPlayerWeapons(playerid)
{
    DesertAmmo[playerid] = 0;
}
#if defined _ALS_ResetPlayerWeapons
    #undef GivePlayerWeapon
#else
    #define _ALS_GivePlayerWeapon
#endif
#define ResetPlayerWeapons H_ResetPlayerWeapons


stock H_SetPlayerAmmo(playerid, weapon, ammo)
{
    if(weapon == 24)
    {
        DesertAmmo[playerid] = ammo;
    }
    SetPlayerAmmo(playerid, weapon, ammo);
}
#if defined _ALS_SetPlayerAmmo
    #undef SetPlayerAmmo
#else
    #define _ALS_SetPlayerAmmo
#endif
#define SetPlayerAmmo H_SetPlayerAmmo

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if((newkeys & KEY_FIRE) && GetPlayerWeapon(playerid) == 24)
    {
        if(GetPlayerAmmo(playerid) < DesertAmmo[playerid])
        {
            RealizoDisparo[playerid] = 1;
        }
    }
}

public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
    if(issuerid != INVALID_PLAYER_ID)
    {
        if(RealizoDisparo[issuerid])
        {
            RealizoDisparo[issuerid] = 0;
            new Float:vida;
            GetPlayerHealth(playerid, vida);
            SetPlayerHealth(playerid, vida-50);
        }
    }
}
EDIT: Si quieres algo menos complejo puedes basarte en que tanta vida le baja con el parametro Float: amount
Reply
#5

pawn Код:
public OnPlayerConnect(playerid)
{
    SetPlayerTeam(playerid, 1); //para que al disparar no haya daсos, es decir, todos en un mismo equipo y el daсo es procesado server-side
    return 1;
}
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
    static Float:damage, Float:health, Float:armour;
    if(issuerid != INVALID_PLAYER_ID)
    {
        if(amount == 2.64) //Es el daсo del golpe de culata
        {
            damage = 60.0;
        }
        else
        {
            switch(weaponid)
            {
                case 31: damage = 40.0;//daсo de la m4
                case 34: damage = 200.0 // daсo de la sniper
                //....
        }
        GetPlayerHealth(playerid, health);
        GetPlayerArmour(playerid, armour);
        if(armour)
        {
            if(armour > damage) SetPlayerArmour(playerid, armour-damage);
            else
            {
                SetPlayerArmour(playerid, 0.0);
                armour = damage-armour;
                if(armour >= health) SetPlayerHealth(playerid, 0.0);
                else SetPlayerHealth(playerid, health-armour);
            }
        }
        else
        {
            if(health > damage) SetPlayerHealth(playerid, health-damage);
            else SetPlayerHealth(playerid, 0.0);
        }
    }
    return 1;
}
Tenйs que ir agregando las ids de armas en el case para modificar los daсos. Eso serнa un sistema de daсos mas o menos completo.
Reply
#6

Pues comprueba que no estй a menos de un metro del jugador. Es la soluciуn mбs fбcil y conveniente.

pawn Код:
new Float:playerid_pos[3];
GetPlayerPos( playerid, playerid_pos[0], playerid_pos[1], playerid_pos[2] );

if( !IsPlayerInRangeOfPoint( issuerid, 0.5, playerid_pos[0], playerid_pos[1], playerid_pos[2] ) )
{
// procesar daсos
Reply
#7

Quote:
Originally Posted by admantis
Посмотреть сообщение
Pues comprueba que no estй a menos de un metro del jugador. Es la soluciуn mбs fбcil y conveniente.

pawn Код:
new Float:playerid_pos[3];
GetPlayerPos( playerid, playerid_pos[0], playerid_pos[1], playerid_pos[2] );

if( !IsPlayerInRangeOfPoint( issuerid, 0.5, playerid_pos[0], playerid_pos[1], playerid_pos[2] ) )
{
// procesar daсos
Es lo que le dije yo ¬¬

Pero la forma mбs conveniente y avanzada es la que dijo CaptainMactavish
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)