Jujuv icon

[PAWN | GM] MG - Escape

Jujuv | PRO | 07/04/14 11:52:15 PM UTC | 0 ⭐ | 7797 👁️ | Never ⏰ | []
Pawn |

9.88 KB

|

None

|

0 👍

/

0 👎

#include "INC\NGE_Main"
 
 
//------------------[Enumérations]-------------------//
enum
{
    TEAM_ESCAPERS,
    TEAM_GUARDS
}
enum
{
    STEP1,
    STEP2,
    STEP3,
    Ended
}
enum E_CHECKPOINTS
{
    Float:xPos,
    Float:yPos,
    Float:zPos
}
enum E_PLAYERINFOS
{
    team,
    bool:IsSpawned,
    bool:IsTakingCP
}
enum E_TEAMSINFO
{
    players
}
//-------------------[Tableaux]--------------------//
new Float:gEscaperSpawns[][4] = //Points d'apparition de l'équipe "escaper"
{
    {5179.8052, -3395.5149, 12.8238, 10.0504},
    {5162.5498, -3393.5613, 12.8205, 34.1773},
    {5130.3335, -3392.2803, 12.8108, 20.7038},
    {5125.9805, -3373.5413, 12.8055, 195.2087}
};
 
new Float:gGuardSpawns[][4] = //Points d'apparition de l'équipe "guards"
{
    {5166.0029, -3368.1262, 8.3086, 182.7260},
    {5147.5791, -3390.4114, 8.2958, 11.3777},
    {5174.9072, -3384.6157, 8.3025, 126.6856},
    {5123.3975, -3381.1401, 12.7458, 185.5695}
};
 
new gTeams[2][E_TEAMSINFO];
new gEscapeCheckpoints[3][E_CHECKPOINTS];
new gPlayers[MAX_PLAYERS][E_PLAYERINFOS];
 
//------------------[Variables]-----------------//
new gEscapersAtCP = 0;//Quantitée de fuyards sur le CP
new gPlayersConnected = 0;
new gMaxPlayersConnected = 0;//ID de joueur le plus élevé connécté
new gGameState;
new CPTimer;
new TakeCPCalled;
new Text:TD_TeamChoice;
new Text:TD_CPTime;
 
//--------------------[Macros]------------------//
#define ShowFullTeamMessage(%0) ShowTextDrawMessage(%0, TD_TeamChoice, "~r~ Cette equipe est dèja remplie !")
 
//------------------[Fonctions]-----------------//
forward GameDelay();
public GameDelay()
{
    if(gEscapersAtCP)
    {
        KillTimer(CPTimer);
        TakeCPCalled = 0;
        gEscapersAtCP = 0;
        HideCPTimeForAll();
    }
    
    gGameState = Ended;
    DisableCPForAll();
    FreezeAll();
    SendClientMessageToAll(-1, "[SERVEUR]Les matons sont parvenus à repousser l'offensif et gagnent la partie !");
    SendRconCommand("gmx");
}
 
stock DisableCPForAll()
{
    for(new i = 0; i <= gMaxPlayersConnected; i++)
    {
        if(IsPlayerConnected(i))
            DisablePlayerCheckpoint(i);
    }
}
 
stock FreezeAll()
{
    for(new i = 0; i <= gMaxPlayersConnected; i++)
    {
        if(IsPlayerConnected(i))
            TogglePlayerControllable(i, 0);
    }
}
stock LoadCheckpoints()
{
        gEscapeCheckpoints[0][xPos] = 5148.6641;
        gEscapeCheckpoints[0][yPos] = -3390.521;
        gEscapeCheckpoints[0][zPos] = 8.2928;
 
        gEscapeCheckpoints[1][xPos] = 5148.6011;
        gEscapeCheckpoints[1][yPos] = -3398.3489;
        gEscapeCheckpoints[1][zPos] = 8.2942;
 
        gEscapeCheckpoints[2][xPos] = 5199.0000;
        gEscapeCheckpoints[2][yPos] = -3437.5762;
        gEscapeCheckpoints[2][zPos] = 8.2583;
 
        return 1;
}
 
stock RandomSpawn(playerid)
{
    new rdm = random(4);
    switch(gPlayers[playerid][team])
    {
            case TEAM_ESCAPERS:
                {
                    SetPlayerPos(playerid, gEscaperSpawns[rdm][0], gEscaperSpawns[rdm][1], gEscaperSpawns[rdm][2]);
                    SetPlayerFacingAngle(playerid, gEscaperSpawns[rdm][3]);
                }
            case TEAM_GUARDS:
                {
                    SetPlayerPos(playerid, gGuardSpawns[rdm][0], gGuardSpawns[rdm][1], gGuardSpawns[rdm][2]);
                    SetPlayerFacingAngle(playerid, gGuardSpawns[rdm][3]);
                }
    }
    gPlayers[playerid][IsSpawned] = true;
    
    return 1;
}
 
 
stock ShowTextDrawMessage(playerid, Text:textdrawID, message[])
{
    TextDrawHideForPlayer(playerid, textdrawID);
    TextDrawSetString(textdrawID, message);
    TextDrawShowForPlayer(playerid, textdrawID);
 
}
 
stock StopCapture()
{
    KillTimer(CPTimer);
    TakeCPCalled = 0;
    HideCPTimeForAll();
    
    return 1;
}
 
stock HideCPTimeForAll()
{
    for(new i = 0; i <= gMaxPlayersConnected; i++)
    {
        if(gPlayers[i][team] == TEAM_ESCAPERS)
            TextDrawHideForPlayer(i, TD_CPTime);
    }
 
    return 1;
}
 
forward TakeCP();
public TakeCP()
{
    TakeCPCalled++;
    if(TakeCPCalled == 30)
    {
        StopCapture();
        WinCP();
    }
    else
        ShowCPTime(30 - TakeCPCalled);
 
    return 1;
}
 
stock WinCP()
{
    if(gGameState == Ended)
        return 0;
        
    switch(gGameState)
    {
            case STEP1:
                {
                        SendClientMessageToAll(-1, "[SERVEUR] L'équipe fuyards a capturé le premier Checkpoint ! [1/3]");
                }
            case STEP2:
                {
                        SendClientMessageToAll(-1, "[SERVEUR] L'équipe fuyards a capturé le second Checkpoint ! [2/3]");
                }
            case STEP3:
                {
                        SendClientMessageToAll(-1, "[SERVEUR] L'équipe fuyards a capturé le dernier Checkpoint et remporte donc la partie ! [3/3]");
                        DisableCPForAll();
                        FreezeAll();
                        SendRconCommand("gmx");
                }
    }
 
    gGameState++;
    gEscapersAtCP = 0;
    SetCPForAll();
 
    return 1;
}
 
stock SetCP(playerid)
{
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid, gEscapeCheckpoints[gGameState][xPos], gEscapeCheckpoints[gGameState][yPos], gEscapeCheckpoints[gGameState][zPos], 3.0);
 
    return 1;
}
 
stock SetCPForAll()
{
        for(new i = 0; i <= gMaxPlayersConnected; i++)
        {
                if(IsPlayerConnected(i))
                        SetCP(i);
        }
 
        return 1;
}
 
stock ShowCPTime(CaptureTime)
{
    new message[10];
    format(message, sizeof(message), "%i", CaptureTime);
    for(new i = 0; i <= gMaxPlayersConnected; i++)
    {
        if(gPlayers[i][team] == TEAM_ESCAPERS)
        {
                ShowTextDrawMessage(i, TD_CPTime, message);
        }
    }
 
    return 1;
}
 
//------------------[Callbacks]-----------------//
main()
{
    print("\n----------------------------------");
    print("Mini-Game : Escape by Jujuv ");
    print("----------------------------------\n");
}
 
public OnGameModeInit()
{
    LoadCheckpoints();
    SetGameModeText("Mini-Game : Escape");
 
    AddPlayerClass(121, 5179.8052, -3395.5149, 12.8238, 10.0504, 30, 500, 33, 50, 25, 15);//TEAM_ESCAPERS
    AddPlayerClass(281, 5166.0029, -3368.1262, 8.3086, 0182.7260, 31, 500, 34, 50, 25, 15);//TEAM_GUARDS
 
    TD_TeamChoice = TextDrawCreate(320, 240, "");
    TD_CPTime = TextDrawCreate(320, 240, "");
    TextDrawFont(TD_TeamChoice, 1);
 
    gGameState = STEP1;
    
    SetTimer("GameDelay", 600000, false);
 
    #include "INC/MAP/prison"
 
return 1;
}
 
public OnPlayerRequestClass(playerid, classid)
{
    switch(classid)
    {
        case TEAM_ESCAPERS:
            {
                if(gTeams[TEAM_ESCAPERS][players] > gPlayersConnected / 2 && gPlayersConnected >= 2)
                {
                        ShowFullTeamMessage(playerid);
                        return 0;
                }
 
                SetPlayerSkin(playerid, 121);
                SetPlayerPos(playerid, 5159.8022, -3391.7324, 8.29562);
                SetPlayerFacingAngle(playerid, 1.1320);
                SetPlayerCameraPos(playerid, 5160.0029, -3389.7178, 8.2956);
                SetPlayerCameraLookAt(playerid, 5159.8022, -3391.7324, 8.29562);
                
 
                ShowTextDrawMessage(playerid, TD_TeamChoice, "~p~ Fuyards !");
                gPlayers[playerid][team] = TEAM_ESCAPERS;
            }
 
        case TEAM_GUARDS:
            {
                if(gTeams[TEAM_GUARDS][players] > gPlayersConnected / 2 && gPlayersConnected >= 2)
                {
                        ShowFullTeamMessage(playerid);
                        return 0;
                }
 
                SetPlayerSkin(playerid, 281);
                SetPlayerPos(playerid, 5141.0894, -3391.5962, 17.3525);
                SetPlayerFacingAngle(playerid, 30.1289);
                SetPlayerCameraPos(playerid, 5141.6567, -3374.1262, 17.3553);
                SetPlayerCameraLookAt(playerid, 5141.0894, -3391.5962, 17.3525);
                
                ShowTextDrawMessage(playerid, TD_TeamChoice, "~b~ Matons !");
                gPlayers[playerid][team] = TEAM_GUARDS;
            }
    }
    return 1;
}
 
public OnPlayerConnect(playerid)
{
    gPlayersConnected++;
    gPlayers[playerid][team] = NO_TEAM;
 
    if(gMaxPlayersConnected < playerid)
        gMaxPlayersConnected = playerid;
 
    gPlayers[playerid][IsSpawned] = false;
    gPlayers[playerid][IsTakingCP] = false;
 
    return 1;
}
 
public OnPlayerDisconnect(playerid, reason)
{
    gPlayersConnected--;
 
    if(playerid == gMaxPlayersConnected)
      {
         for(new i = gMaxPlayersConnected-1; i >= 0; i--)
            {
                  if(IsPlayerConnected(i))
                      {gMaxPlayersConnected = i; break;}
            }
      }
      
    if(gPlayers[playerid][IsTakingCP])
    {
        gPlayers[playerid][IsTakingCP] = false;
        gEscapersAtCP--;
 
        if(!gEscapersAtCP)
            StopCapture();
    }
 
    return 1;
}
 
public OnPlayerSpawn(playerid)
{
    TextDrawHideForPlayer(playerid, TD_TeamChoice);
 
    gTeams[gPlayers[playerid][team]][players]++;
    
    RandomSpawn(playerid);
 
    if(gPlayers[playerid][team] == TEAM_ESCAPERS)
        SetCP(playerid);
 
    return 1;
}
 
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid)
{
    if(gPlayers[playerid][team] == gPlayers[issuerid][team])
        {
            new Float:pHealth;
            GetPlayerHealth(playerid, pHealth);
            SetPlayerHealth(playerid, pHealth+amount);
        }
}
 
public OnPlayerEnterCheckpoint(playerid)
{
    if(gPlayers[playerid][team] != TEAM_ESCAPERS)
        return 1;
 
    if(!gEscapersAtCP)
        CPTimer = SetTimer("TakeCP", 1000, true);
 
    gEscapersAtCP++;
    gPlayers[playerid][IsTakingCP] = true;
 
    return 1;
}
 
public OnPlayerLeaveCheckpoint(playerid)
{
    if(!gPlayers[playerid][IsSpawned])
        return 0;
        
    gPlayers[playerid][IsTakingCP] = false;
    gEscapersAtCP--;
 
    if(!gEscapersAtCP)
        StopCapture();
 
 
    return 1;
}
 
 
public OnPlayerDeath(playerid, killerid, reason)
{
    if(IsPlayerInCheckpoint(playerid) && gPlayers[playerid][team] == TEAM_ESCAPERS)
        OnPlayerLeaveCheckpoint(playerid);
        
    gPlayers[playerid][IsSpawned] = false;
    
    return 1;
}
 
 
// Testing CMDS
public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp("/kill", cmdtext, true) && IsPlayerAdmin(playerid))
    {
        SetPlayerHealth(playerid, 0.0);
        return 1;
    }
    
    if(!strcmp("/debug", cmdtext, true) && IsPlayerAdmin(playerid))
    {
        new str[500];
        format(str, sizeof(str), "gEscaperAtCP: %i\ngPlayersConnected: %i\ngMaxPlayersConnected : %i\ngGameState: %i\nTakeCPCalled: %i", gEscapersAtCP, gPlayersConnected, gMaxPlayersConnected, gGameState, TakeCPCalled);
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_LIST, "DEBUG", str, "Close", "");
        return 1;
    }
    return 0;
}
 
public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
{
        if(IsPlayerAdmin(playerid))
            { SetPlayerPosFindZ(playerid, fX, fY, fZ); }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎