[Pregunta] Como hago esto...
#1

Buenas a todos,
tengo una pregunta y es sobre las armas..

їComo puedo hacer para detectar cuando un usuario dispara un tiro?
Por ejemplo: Cuando un usuario dispara un tiro, salga un cartel a todos que diga: "El usuario DonPepe ha disparado un tiro con el arma Desert Deagle. Ahora tiene 230 balas."
Puse Desert Deagle como un ejemplo, pero que aparezca el arma que uso, y las balas que tiene despues de tirar el disparo.

Un saludo y espero que me ayuden,
JuliPera
Reply
#2

OnPlayerGiveDamage
OnPlayerTakeDamage
Reply
#3

Quote:
Originally Posted by TiNcH010
Посмотреть сообщение
Pero si disparo al aire?
Reply
#4

Proba usando INVALID_PLAYER_ID
Reply
#5

No funciona, el codigo lo tengo asi:
pawn Код:
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid)
{
    new Slot, Arma, Municion, String[128], ArmaNombre[24];
    GetWeaponName(weaponid, ArmaNombre, sizeof(ArmaNombre));
    Slot = GetWeaponSlot(weaponid);
    GetPlayerWeaponData(playerid, Slot, Arma, Municion);
    if(damagedid == INVALID_PLAYER_ID)
    {
        format(String, sizeof(String), "%s ha disparado al aire con su %s, ahora tiene %d balas.", NombreJugador(playerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    else
    {
        format(String, sizeof(String), "%s ha disparado a %s con su %s, ahora tiene %d balas.", NombreJugador(playerid), NombreJugador(damagedid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    return 1;
}
Me parece que no detecta nada porque este callback detecta cuando hace daсo, y si disparas al aire no le estas haciendo daсo a nadie.
Reply
#6

pawn Код:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
    new Slot, Arma, Municion, String[128], ArmaNombre[24];
    GetWeaponName(weaponid, ArmaNombre, sizeof(ArmaNombre));
    Slot = GetWeaponSlot(weaponid);
    GetPlayerWeaponData(inssuerid, Slot, Arma, Municion);
    if(playerid != INVALID_PLAYER_ID)
    {
        format(String, sizeof(String), "%s ha disparado al aire con su %s, ahora tiene %d balas.", NombreJugador(inssuerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    else
    {
        format(String, sizeof(String), "%s ha disparado a %s con su %s, ahora tiene %d balas.", NombreJugador(inssuerid), NombreJugador(playerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    return 1;
}
creo que debe funcionar
Reply
#7

Quote:
Originally Posted by nagato.samp
Посмотреть сообщение
pawn Код:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
    new Slot, Arma, Municion, String[128], ArmaNombre[24];
    GetWeaponName(weaponid, ArmaNombre, sizeof(ArmaNombre));
    Slot = GetWeaponSlot(weaponid);
    GetPlayerWeaponData(inssuerid, Slot, Arma, Municion);
    if(playerid != INVALID_PLAYER_ID)
    {
        format(String, sizeof(String), "%s ha disparado al aire con su %s, ahora tiene %d balas.", NombreJugador(inssuerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    else
    {
        format(String, sizeof(String), "%s ha disparado a %s con su %s, ahora tiene %d balas.", NombreJugador(inssuerid), NombreJugador(playerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
    }
    return 1;
}
creo que debe funcionar
No, es igual que con la otra.
Todavia no lo probe disparandole a otra persona, pero seguarmente funciona.
El problema es que si no le pegas a nada, no salta ningun mensaje.
Reply
#8

Lo pude hacer.
En OnPlayerKeyStateChange puse:
pawn Код:
if(oldkeys & KEY_FIRE)
    {
        new Slot, Arma, Municion, String[128], ArmaNombre[24];
        Slot = GetWeaponSlot(GetPlayerWeapon(playerid));
        GetPlayerWeaponData(playerid, Slot, Arma, Municion);
        GetWeaponName(Arma, ArmaNombre, sizeof(ArmaNombre));
        format(String, sizeof(String), "%s ha disparado con su %s, ahora tiene %d balas.", NombreJugador(playerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
        return 1;
    }
Entonces cuando termina de disparar dice el nombre, con que arma disparo y cuantas balas le quedan.
Pueden cerrar.
Reply
#9

Quote:
Originally Posted by JuliPera
Посмотреть сообщение
Lo pude hacer.
En OnPlayerKeyStateChange puse:
pawn Код:
if(oldkeys & KEY_FIRE)
    {
        new Slot, Arma, Municion, String[128], ArmaNombre[24];
        Slot = GetWeaponSlot(GetPlayerWeapon(playerid));
        GetPlayerWeaponData(playerid, Slot, Arma, Municion);
        GetWeaponName(Arma, ArmaNombre, sizeof(ArmaNombre));
        format(String, sizeof(String), "%s ha disparado con su %s, ahora tiene %d balas.", NombreJugador(playerid), ArmaNombre, Municion);
        SendClientMessageToAll(0xFFFFFFFF, String);
        return 1;
    }
Edita en vez de hacer doble post y
Entonces cuando termina de disparar dice el nombre, con que arma disparo y cuantas balas le quedan.
Pueden cerrar.
seguro que te funciona? ahi no comprueba si esta apie o a vehiculo asi que intenta ahcerlo estando en 1 carro y veras.
Reply
#10

Quote:
Originally Posted by nagato.samp
Посмотреть сообщение
seguro que te funciona? ahi no comprueba si esta apie o a vehiculo asi que intenta ahcerlo estando en 1 carro y veras.
Si lo haces estando en un vehiculo, aparece el mensaje pero en arma no aparece nada, y en balas aparece 0.
Pero yo no lo quiero usar para el mensaje, ese es un ejemplo.
Reply
#11

https://sampforum.blast.hk/showthread.php?tid=195439
Reply
#12

Aca te dejo un mini-script para hacer lo que tu quieres:
pawn Код:
#include <a_samp>

#define INTERVAL    (500)

enum PD
{
    Weapon[13],
    Ammo[13],
    Timer
};
new Info[MAX_PLAYERS][PD];

public OnPlayerConnect(playerid)
{
    Info[playerid][Timer] = SetTimerEx("PlayerStatusChecker", INTERVAL, 1, "i", playerid);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    KillTimer(Info[playerid][Timer]);
    return 1;
}

forward PlayerStatusChecker(playerid);
public PlayerStatusChecker(playerid)
{
    new weapon, ammo;
    for(new i;  i<13; i++){
        GetPlayerWeaponData(playerid, i, weapon, ammo);
        if(Info[playerid][Weapon][i] == weapon){
            if(Info[playerid][Ammo][i] > ammo){
                CallLocalFunction("OnPlayerShot", "iii", playerid, weapon, (Info[playerid][Ammo][i] - ammo));
                Info[playerid][Ammo][i] = ammo;
            }
            else if(Info[playerid][Ammo][i] < ammo)
                Info[playerid][Ammo][i] = ammo;
        }
        else
        {
            Info[playerid][Weapon][i] = weapon;
            Info[playerid][Ammo][i] = ammo;
        }
    }
}

forward OnPlayerShot(playerid, weapon, bullets);

public OnPlayerShot(playerid, weapon, bullets)
{
    //Aqui pones las acciones a realizar cuando el jugador dispara 1 o mas balas
    return 1;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)