#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); } }