OnPlayerDeath & OnPlayerSpawn inutilizables.
#1

Volvн a esto de pawn, hace dos aсos que no lo toco. Estoy programando un gamemode desde 0 y me resultу un problema, es algo ilуgico a mi entender.

Cuando coloco alguna funciуn en OnPlayerDeath no se ejecuta, por ejemplo.

Код:
public OnPlayerDeath(playerid, killerid, reason)
{
	SetPVarInt(playerid, "IsDeath", 1);
        DeathPlayer(playerid);
        return 1;
}
Cuando el jugador muere el valor de la variable sigue en cero o en el que estaba anteriormente, es decir, no se modifica. Al igual que no se llama a la callback. No es un error de el cуdigo, ya que si yo coloco йste en un comando y luego muero realiza su funciуn. Lo mismo pasa con OnPlayerSpawn.

Код:
forward DeathPlayer(playerid);
public DeathPlayer(playerid)
{
	if(GetPVarInt(playerid, "IsDeath") > 0) return SendClientMessage(playerid, -1, "var in 0");
	{
	new string[1024], dialog[1024];
	format(string, sizeof(string), "{FFFFFF} Te encuentras herido y con probabilidades de morir. Teniendo en cuenta el entorno en el que te encuentras tendrбs\n");
	strcat(dialog, string);
	format(string, sizeof(string), "{FFFFFF} la posibilidad de alertar a la policнa roleando que un tercero a visto la situaciуn {fdfe8b} їQuieres alertar a la policнa?.\n\n");
	strcat(dialog, string);
	format(string, sizeof(string), "{FFFFFF} Usar esto para beneficiarte en caso de que no haya probabilidades de que\n alguien haya visto la situaciуn serб penado con una sanciуn.");
 	strcat(dialog, string);
  	ShowPlayerDialog(playerid, DIALOG_ENVIRONMENT, DIALOG_STYLE_MSGBOX, "Estбs herido. їQuй harбs?", dialog, "Llamar","Cancelar");

	ApplyAnimation(playerid, "CRACK", "null", 4.0, 0, 0, 0, 1, 0, 1);
	ApplyAnimation(playerid, "CRACK", "crckdeth4", 4.0, 0, 0, 0, 1, 0, 1);
	TogglePlayerControllable(playerid, 0);
	SetPlayerPos(playerid, DeadX[playerid], DeadY[playerid]-0.3, DeadZ[playerid]);
	}
Si coloco llamo a la callback en OnPlayerUpdate al spawnear el dialog aparece a cada rato, es decir, lee que el valor de la variable es mayor a 1, pero en ningъn momento establecн que йsta estй en 1, es mбs, en OnPlayerConnect establecн que la variable estй en 0 hasta que se modifique posteriormente. No sй cuбl es el problema, si de la variable o de las callbacks.
Reply
#2

Comprueba que OnPlayerDeath se llame:
pawn Код:
public OnPlayerDeath(player, killer, reason) {
    printf("playerDeath %d %d %d", player, killer, reason);
}
puede ser que algъn hook (es decir, algъn codigo que redefina OnPlayerDeath porque la necesita, ejemplo un anticheat o cualquier otro include) la retorne. Ejemplo:

gm.pwn:
pawn Код:
#include "include.pwn"

public OnPlayerDeath(playerid, killerid, reason) {
    printf("Este codigo no se llama porque include.pwn ya uso esta callback");
}
include.pwn
pawn Код:
public OnPlayerDeath(playerid, killerid, reason) {
    // Codigo
    return 0; // Retornar, el flujo se detiene y no se llama mбs nada.
}

#define OnPlayerDeath include_OnPlayerDeath
O prueba cуmo estб definido OnPlayerDeath en el momento que se llama:
pawn Код:
public OnGameModeInit() {
    print(#OnPlayerDeath); // Escribe la definiciуn actual de OnPlayerDeath
}
Reply
#3

Quote:
Originally Posted by spell
Посмотреть сообщение
Comprueba que OnPlayerDeath se llame:
pawn Код:
public OnPlayerDeath(player, killer, reason) {
    printf("playerDeath %d %d %d", player, killer, reason);
}
puede ser que algъn hook (es decir, algъn codigo que redefina OnPlayerDeath porque la necesita, ejemplo un anticheat o cualquier otro include) la retorne. Ejemplo:

gm.pwn:
pawn Код:
#include "include.pwn"

public OnPlayerDeath(playerid, killerid, reason) {
    printf("Este codigo no se llama porque include.pwn ya uso esta callback");
}

include.pwn

pawn Код:
public OnPlayerDeath(playerid, killerid, reason) {
    // Codigo
    return 0; // Retornar, el flujo se detiene y no se llama mбs nada.
}

#define OnPlayerDeath include_OnPlayerDeath
O prueba cуmo estб definido OnPlayerDeath en el momento que se llama:
pawn Код:
public OnGameModeInit() {
    print(#OnPlayerDeath); // Escribe la definiciуn actual de OnPlayerDeath
}
include.pwn no sera include.inc ? xD

saludos.
Reply
#4

En tu caso puedes usar PLAYER_STATE_WASTED en OnPlayerStateChange, a mi me gusta mбs para hacer cuando muera y aparezca un mensaje de que estб herido y eso
Reply
#5

Quote:
Originally Posted by OTACON
Посмотреть сообщение
include.pwn no sera include.inc ? xD

saludos.
No necesariamente, podes hacer include de un .pwn. Sin embargo, a esto se lo denomina lazy coding (programaciуn de perezosos ), ademбs de tener algunos cuantos problemitas de relaciуn de archivos.

"Header files are #included and not compiled, whereas source files are compiled and not #included."
Por lo menos, eso se aplica en C++.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)