#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
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎