Deathmatch Winner Declaring Help
#1

Well, I'm trying to make a Deathmatch script where a winner is declared when theres only one player left. Maybe this is what called as Last Man Standing. Whatever, I have a problem. No compilation errors. But when tested, Winner is not declared even when theres only one player left. Check the code and help me in rectifying it. And yes I'm a noob, newbie or whatever.

Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    if(InDM[playerid] ==1)
    {
	  InDM[playerid] =0;
	  cn--;
	  new str[100];
	  new pName[MAX_PLAYER_NAME],kName[MAX_PLAYER_NAME];
	  GetPlayerName(killerid,kName,MAX_PLAYER_NAME);
	  GetPlayerName(playerid,pName,MAX_PLAYER_NAME);
	  format(str, sizeof(str),"%s(%d) has been killed by %s(%d) in Deathmatch Minigame",pName,kName);
          PlayerInfo[killerid][pKills]++;
	  PlayerInfo[playerid][pDeaths]++;
	  CheckWin();   // Here I call to check winner
   	}
	return 1;
}
Here's the function :
Код:
forward CheckWin();
public CheckWin()
{
  if(cn ==1)
  {
	for(new i=0;i<MAX_PLAYERS;i++)
	{
	  if(InDM[i] ==1)
	  {
		new string[128], winner[MAX_PLAYER_NAME];
		GetPlayerName(i,winner,MAX_PLAYER_NAME);
		format(string,sizeof(string),"%s(%d) Has won the DeathMatch[Minigame]",winner,i);
	  }
    }
  }
}
Well, If the problem isn't in here but somewhere else in the code, Here's the link for the whole script I Made

http://pastebin.com/UWFNqMSi

Thank you.
Reply
#2

You forgot to use SendClientMessageToAll after formatting the message...
Reply
#3

first thing use this on player disconnect
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
        new INI:File = INI_Open(UserPath(playerid));
        INI_SetTag(File,"PlayerInfo");
        INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
        INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
        if(InDM[playerid] == 1)
                   {
                     cn--;
                     InDM[playerid] = 0;
                   }

        CheckWin();
        return 1;
}
well the main reason behind problem is because u are not sending any message

so this will be the CheckPlayer--
pawn Код:
forward CheckWin();
public CheckWin()
{
  if(cn ==1)
  {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
      if(InDM[i] ==1)
      {
        new string[128], winner[MAX_PLAYER_NAME];
        GetPlayerName(i,winner,MAX_PLAYER_NAME);
        format(string,sizeof(string),"%s(%d) Has won the DeathMatch[Minigame]",winner,i);
                break;
      }
    }
SendClientMessageToAll(-1, string);//forgoted this
  }
}
Reply
#4

pawn Код:
#include <a_samp>
#include <zcmd>
#include <YSI\y_ini>

#define PATH "/MJDM/%s.ini"
#define COLOR_RED 0xFF3300FF

new bool:InDM[MAX_PLAYERS], Float:OrigPos[MAX_PLAYERS][3], DMCount;

new Float:Spawns[][4] = {
   {-2491.8706, -237.2221, 39.3019, 295.0867},
   {-2482.0308, -283.6506, 40.5421, 180.7190},
   {-2444.0479, -271.4679, 35.6237, 258.4264},
   {-2490.9055, -298.6101, 35.8574, 172.5956},
   {-2525.5771, -313.8878, 39.0723, 327.6012},
   {-2554.4729, -291.1451, 25.9594, 118.0751}
};

enum pInfo
{
    pKills,
    pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];

forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
  INI_Int("Kills", PlayerInfo[playerid][pKills]);
  INI_Int("Deaths", PlayerInfo[playerid][pDeaths]);
  return 1;
}

stock UserPath(playerid)
{
    new string[40], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string,sizeof(string), PATH, pName);
    return string;
}

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" DM[Minigame] by DuskXtremeX");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}


public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid))) INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra =true, .extra = playerid);
    else
    {
        new INI:File = INI_Open(UserPath(playerid));
        INI_SetTag(File, "data");
        INI_WriteInt(File,"Kills",0);
        INI_WriteInt(File,"Deaths",0);
        INI_Close(File);
    }
    InDM[playerid] = false;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File, "data");
    INI_WriteInt(File, "Kills", PlayerInfo[playerid][pKills]);
    INI_WriteInt(File, "Deaths", PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
    if(InDM[playerid]) DMCount--;
    InDM[playerid] = false;
    CheckWin();
    return 1;
}

public OnPlayerSpawn(playerid)
{
    GivePlayerWeapon(playerid, 26, 300);
    GivePlayerWeapon(playerid, 32, 300);
    GivePlayerWeapon(playerid, 34, 100);
    GivePlayerWeapon(playerid, 27, 50);
    if(InDM[playerid]) SetPlayerPos(playerid, OrigPos[playerid][0], OrigPos[playerid][1], OrigPos[playerid][2]);
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    if(InDM[playerid])
    {
        InDM[playerid] = false;
        DMCount--;
        new str[105], pName[MAX_PLAYER_NAME];
        GetPlayerName(playerid, pName, sizeof(pName));
        if(killerid != INVALID_PLAYER_ID)
        {
            new kName[MAX_PLAYER_NAME];
            GetPlayerName(killerid, kName, sizeof(kName));
            format(str, sizeof(str), "%s(%d) has been killed by %s(%d) in Deathmatch Minigame", pName, playerid, kName, killerid);
            PlayerInfo[killerid][pKills]++;
        }
        else format(str, sizeof(str), "%s(%d) has died in Deathmatch Minigame", pName, playerid);
        SendClientMessageToAll(COLOR_RED, str);
        PlayerInfo[playerid][pDeaths]++;
        CheckWin();
    }
    return 1;
}

COMMAND:deathmatch(playerid, params[])
{
    if(InDM[playerid]) return SendClientMessage(playerid, COLOR_RED, "You're already in DM");
    InDM[playerid] = true;
    DMCount++;
    ResetPlayerWeapons(playerid);
    new string[45], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "%s(%d) has joined DM", pName, playerid);
    GetPlayerPos(playerid, OrigPos[playerid][0], OrigPos[playerid][1], OrigPos[playerid][2]);
    new Random = random(sizeof(Spawns));
    SetPlayerPos(playerid, Spawns[Random][0], Spawns[Random][1], Spawns[Random][2]);
    SetPlayerFacingAngle(playerid, Spawns[Random][3]);
    SetPlayerSkin(playerid, random(50));
    return 1;
}


COMMAND:leavedm(playerid,params[])
{
    if(!InDM[playerid]) return SendClientMessage(playerid, COLOR_RED, "You're not in DM");
    InDM[playerid] = false;
    DMCount--;
    SetPlayerPos(playerid, OrigPos[playerid][0], OrigPos[playerid][1], OrigPos[playerid][2]);
    ResetPlayerWeapons(playerid);
    CheckWin();
    return 1;
}

forward CheckWin();
public CheckWin()
{
    if(DMCount == 1)
    {
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            if(!IsPlayerConnected(i)) continue;
            if(!InDM[i]) continue;
            new string[65], winner[MAX_PLAYER_NAME];
            GetPlayerName(i, winner, sizeof(winner));
            format(string, sizeof(string), "%s(%d) Has won the DeathMatch [Minigame]", winner, i);
            SendClientMessageToAll(COLOR_RED, string);
            InDM[i] = false;
            DMCount = 0;
            SetPlayerPos(i, OrigPos[i][0], OrigPos[i][1], OrigPos[i][2]);
            ResetPlayerWeapons(i);
            break;
        }
    }
    return 1;
}
Reply
#5

Well, I added that SendClientMessage as you guys said and edited like this

Command /leavedm
Код:
COMMAND:leavedm(playerid,params[])
{
   if(InDM[playerid] ==0)
   {
      SendClientMessage(playerid, COLOR_RED, "You're not in DM");
   }
   else if(InDM[playerid] ==1)
   {
      ResetPlayer(playerid);  // The Function I declared.
   }
   return 1;
}
CheckWin() Function
Код:
forward CheckWin();
public CheckWin()
{
  if(cn ==1)
  {
	for(new i=0;i<MAX_PLAYERS;i++)
	{
	  if(InDM[i] ==1)
	  {
		new string[128], winner[MAX_PLAYER_NAME];
		GetPlayerName(i,winner,MAX_PLAYER_NAME);
		format(string,sizeof(string),"%s(%d) Has won the DeathMatch[Minigame]",winner,i);
		SendClientMessageToAll(-1, string);
		ResetPlayer(i); // The Same Function.
		break;
	  }
    }
 
  }
}
And that ResetPlayer() Function which I declared to make it easier to call whenever necessary.
Код:
forward ResetPlayer(playerid);
public ResetPlayer(playerid)
{
  InDM[playerid] =0;
  cn--;
  SetPlayerPos(playerid,x1,y1,z1);
  SetPlayerSkin(playerid,skin);
  ResetPlayerWeapons(playerid);
  for(new p=0;p<13;p++)
  {
    GivePlayerWeapon(playerid,weapdat[p][0],weapdat[p][1]);
  }
}
Any problem in this? I didn't test this yet as non of my friends are online.

The complete Code for your reference

http://pastebin.com/7EJ8Q0Qt
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)