| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- /************************
- File:
- - functions.inc
- Description:
- - New and improved backup system by Jay Cortez
- *************************/
- /* Creates a new backup request */
- stock CreateBackupRequest(playerid, forFactionID) {
- // Find a free backup ID
- new freeBkID = INVALID_BACKUP_ID;
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(!BackupInfo[i][bActive]) {
- freeBkID = i;
- break;
- }
- }
- if(freeBkID == INVALID_BACKUP_ID)
- return false;
- // Setup the backup request
- BackupInfo[freeBkID][bActive] = true;
- BackupInfo[freeBkID][bCaller] = playerid;
- BackupInfo[freeBkID][bFactionID] = forFactionID;
- BackupInfo[freeBkID][bTimestamp] = gettime();
- if(PlayerInfo[playerid][pGroup] != GROUP_S9)
- BackupInfo[freeBkID][bFromFaction] = PlayerInfo[playerid][pMember];
- else {
- if(forFactionID == GROUP_S9 || PlayerInfo[playerid][pMask])
- BackupInfo[freeBkID][bFromFaction] = GROUP_S9;
- else
- BackupInfo[freeBkID][bFromFaction] = FakeFaction[playerid];
- }
- return true;
- }
- /* Is the player allowed to call backup */
- stock BackupAllowed(playerid) {
- if(
- PlayerInfo[playerid][pMember] == 1 || // SAPD
- PlayerInfo[playerid][pMember] == 2 || // FBI
- PlayerInfo[playerid][pMember] == 3 || // SASD
- PlayerInfo[playerid][pMember] == 4 || // SAFMD
- PlayerInfo[playerid][pMember] == 5 || // DoC
- PlayerInfo[playerid][pGroup] == GROUP_S9 // Sector 9
- ) return true;
- return false;
- }
- /* Gets the count of backup calls for a faction */
- stock FactionBackupCallsCount(factionID) {
- new bkCount = 0;
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(BackupInfo[i][bActive] && BackupInfo[i][bFactionID] == factionID)
- bkCount++;
- }
- return bkCount;
- }
- /* Plays the backup sound */
- forward DoBackupSound(playerid, stage);
- public DoBackupSound(playerid, stage) {
- if(stage <= 3) {
- PlayerPlaySound(playerid, BACKUP_SOUND, 0.0, 0.0, 0.0);
- SetTimerEx("DoBackupSound", 80, false, "ii", playerid, stage + 1);
- }
- return 1;
- }
- /* Show a faction's backups to a player */
- stock ShowFactionBackups(playerid, bkFaction) {
- // Keep track of which faction we're looking at
- backupFaction[playerid] = bkFaction;
- // Create title
- new backupDiaTitle[50];
- format(backupDiaTitle, sizeof(backupDiaTitle), "{%06x}%s backup calls [%i]", GetFactionColour(bkFaction) >>> 8, GetFactionName(bkFaction), FactionBackupCallsCount(bkFaction));
- // Create content
- new backupDiaContent[1024];
- format(backupDiaContent, sizeof(backupDiaContent), "Requested by\tLocation\tTime");
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(BackupInfo[i][bActive] && BackupInfo[i][bFactionID] == bkFaction) {
- // Format the time
- new bkCallerTime[20];
- format(bkCallerTime, sizeof(bkCallerTime), "%i sec. ago", gettime() - BackupInfo[i][bTimestamp]);
- // Add to the dialog content
- format(backupDiaContent, sizeof(backupDiaContent),
- "%s\n%s\t%s\t%s",
- backupDiaContent,
- GetPlayerBackupName(BackupInfo[i][bCaller], BackupInfo[i][bFactionID]),
- GetPlayerBackupLocation(BackupInfo[i][bCaller]),
- bkCallerTime
- );
- }
- }
- // Show the dialog
- ShowPlayerDialog(playerid, DIALOG_BACKUPS, DIALOG_STYLE_TABLIST_HEADERS, backupDiaTitle, backupDiaContent, "Respond", "Close");
- return 1;
- }
- /* Gets the location of a backup caller */
- stock GetPlayerBackupLocation(playerid) {
- new bkCallerLocation[MAX_ZONE_NAME];
- if(CheckForJammer(playerid))
- format(bkCallerLocation, sizeof(bkCallerLocation), "No signal...");
- else if(GetPlayerVirtualWorld(playerid) || GetPlayerInterior(playerid))
- format(bkCallerLocation, sizeof(bkCallerLocation), "Inside");
- else
- GetPlayer2DZone(playerid, bkCallerLocation, sizeof(bkCallerLocation));
- return bkCallerLocation;
- }
- /* Gets the name of a backup caller */
- stock GetPlayerBackupName(playerid, bkFaction) {
- new nameToReturn[50];
- // Sector 9, special backup format
- if(PlayerInfo[playerid][pGroup] == GROUP_S9) {
- if(bkFaction == FACTION_S9)
- format(nameToReturn, sizeof(nameToReturn), "%s %s %s", GetGroupName(GROUP_S9), RealS9Rank(playerid), PlayerICName(playerid));
- else if(PlayerInfo[playerid][pMask])
- format(nameToReturn, sizeof(nameToReturn), "%s %s", GetGroupName(GROUP_S9), RealS9Rank(playerid));
- }
-
- // Normal name format
- if(!strlen(nameToReturn))
- format(nameToReturn, sizeof(nameToReturn), "%s %s %s", GetPlayerFactionName(playerid), GetPlayerRank(playerid), PlayerICName(playerid));
- return nameToReturn;
- }
- /* Checks if a player is responding to a backup call */
- stock IsPlayerRespondingToBackup(playerid) {
- return (BackupAllowed(playerid) && respondingToBackup[playerid] != INVALID_BACKUP_ID);
- }
- /* Check if a player currently has a backup request out (for a faction) */
- stock IsPlayerCallingBackup(playerid, forFactionID = 0) {
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(BackupInfo[i][bActive] && BackupInfo[i][bCaller] == playerid) {
- if(forFactionID != 0 && BackupInfo[i][bFactionID] != forFactionID)
- continue;
- return true;
- }
- }
- return false;
- }
- /* Called when a player selects a backup item in the dialog */
- stock OnPlayerRespondToBackup(playerid, listitem) {
- // Backups of which faction
- new bkFaction = backupFaction[playerid];
- // Try to find the backup ID from the listitem
- new backupID = INVALID_BACKUP_ID, backupCounter = 0;
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(BackupInfo[i][bActive] && BackupInfo[i][bFactionID] == bkFaction) {
- if(backupCounter == listitem) {
- backupID = i;
- break;
- }
- backupCounter++;
- }
- }
- // Check if the backup item was found
- if(backupID == INVALID_BACKUP_ID)
- return SendClientMessage(playerid, COLOR_GREY, "The backup call you were trying to respond to has expired.");
- if(BackupInfo[backupID][bCaller] == playerid)
- return SendClientMessage(playerid, COLOR_GREY, "You cannot respond to your own backup calls.");
- if(IsPlayerRespondingToBackup(playerid)) {
- if(respondingToBackup[playerid] == backupID)
- return SendClientMessage(playerid, COLOR_GREY, "You are already responding to this backup call.");
- CancelBackupResponding(playerid);
- }
- StartBackupResponding(playerid, backupID);
- return 1;
- }
- /* Starts responding to a backup call */
- stock StartBackupResponding(playerid, backupID) {
- // Send a message
- new acceptStr[128];
- format(acceptStr, sizeof(acceptStr), "You are now responding to %s's backup call.", GetPlayerBackupName(BackupInfo[backupID][bCaller], BackupInfo[backupID][bFactionID]));
- SendClientMessage(playerid, GetFactionColour(PlayerInfo[playerid][pMember]), acceptStr);
- // Set responding variable
- respondingToBackup[playerid] = backupID;
- // Start timer
- backupTimer[playerid] = SetTimerEx("BackupRespondUpdate", 1000, true, "i", playerid);
- return 1;
- }
- /* Cancels the current backup request a player is responding to */
- stock CancelBackupResponding(playerid, cancelReason = BK_CANCEL_REASON_SELF) {
- // Kill the update timer
- KillTimer(backupTimer[playerid]);
- // Get the backup ID of current responding backup
- new backupID = respondingToBackup[playerid];
- // Send the message in chat
- new cancelStr[128];
- if(cancelReason != BK_CANCEL_REASON_ARRIVE) {
- switch(cancelReason) {
- case BK_CANCEL_REASON_SELF:
- format(cancelStr, sizeof(cancelStr), "Cancelled");
- case BK_CANCEL_REASON_DEATH:
- format(cancelStr, sizeof(cancelStr), "Death");
- case BK_CANCEL_REASON_QUIT:
- format(cancelStr, sizeof(cancelStr), "They quit");
- }
- format(cancelStr, sizeof(cancelStr), "You have cancelled responding to %s's backup request. (( %s ))",
- GetPlayerBackupName(BackupInfo[backupID][bCaller], BackupInfo[backupID][bFactionID]),
- cancelStr
- );
- }
- else {
- format(cancelStr, sizeof(cancelStr), "You have arrived at the backup call.");
- }
- SendClientMessage(playerid, GetFactionColour(PlayerInfo[playerid][pMember]), cancelStr);
-
- // Reset responding variable
- respondingToBackup[playerid] = INVALID_BACKUP_ID;
- // Reset center HUD
- displayCenterHUDInfo(playerid, "", 1);
- // Reset player marker
- SetPlayerMarkerForPlayer(playerid, BackupInfo[backupID][bCaller], 0xFFFFFFAA);
- SetPlayerToTeamColor(BackupInfo[backupID][bCaller]);
- return 1;
- }
- /* Cancel all backup requests of a player */
- stock CancelAllBackupRequests(playerid, cancelReason) {
- // Cancel all their backup requests
- for(new i = 0; i < MAX_BACKUP_CALLS; i++) {
- if(BackupInfo[i][bActive] && BackupInfo[i][bCaller] == playerid) {
- CancelBackupRequest(i, cancelReason);
- }
- }
- // Send message
- new cancelStr[128];
- switch(cancelReason) {
- case BK_CANCEL_REASON_SELF:
- format(cancelStr, sizeof(cancelStr), "Cancelled");
- case BK_CANCEL_REASON_DEATH:
- format(cancelStr, sizeof(cancelStr), "You died");
- case BK_CANCEL_REASON_QUIT:
- format(cancelStr, sizeof(cancelStr), "You quit the game");
- }
- format(cancelStr, sizeof(cancelStr), "You have cancelled your backup requests. (( %s ))",
- cancelStr
- );
- SendClientMessage(playerid, GetFactionColour(PlayerInfo[playerid][pMember]), cancelStr);
- return 1;
- }
- /* Cancel a backup request */
- stock CancelBackupRequest(backupID, cancelReason) {
- BackupInfo[backupID][bActive] = false;
- foreach(new i:Player) {
- if(BackupAllowed(i) && respondingToBackup[i] == backupID) {
- CancelBackupResponding(i, cancelReason);
- }
- }
- return 1;
- }
- /* Get the player's distance to a backup call */
- stock GetPlayerDistanceToBackup(playerid, backupID) {
- new backupCaller = BackupInfo[backupID][bCaller];
- new distanceStr[30];
- if(CheckForJammer(backupCaller))
- format(distanceStr, sizeof(distanceStr), "No signal...");
- else if(GetPlayerVirtualWorld(backupCaller) || GetPlayerInterior(backupCaller))
- format(distanceStr, sizeof(distanceStr), "Unknown");
- else
- format(distanceStr, sizeof(distanceStr), "%im", floatround(GetDistanceBetweenPlayers(playerid, backupCaller)));
- return distanceStr;
- }
- /* Called every second for players who are responding to a backup call */
- forward BackupRespondUpdate(playerid);
- public BackupRespondUpdate(playerid) {
- new backupID = respondingToBackup[playerid];
- // HUD info
- new hudStr[128];
- format(hudStr, sizeof(hudStr), "~w~Responding to ~b~%s's~w~ backup call.~n~Distance: ~r~%s",
- GetPlayerBackupName(BackupInfo[backupID][bCaller], BackupInfo[backupID][bFactionID]),
- GetPlayerDistanceToBackup(playerid, backupID)
- );
- displayCenterHUDInfo(playerid, hudStr, 5);
- // Set marker
- if(BackupInfo[backupID][bFromFaction] == FACTION_S9 && PlayerInfo[playerid][pMember] != FACTION_S9) {
- SetPlayerMarkerForPlayer(playerid, BackupInfo[backupID][bCaller], 0xFFFFFF);
- }
- else {
- SetPlayerMarkerForPlayer(playerid, BackupInfo[backupID][bCaller],
- (GetFactionColour(BackupInfo[backupID][bFromFaction]) | 0x000000FF)
- );
- }
- if(GetDistanceBetweenPlayers(playerid, BackupInfo[backupID][bCaller]) <= 15)
- OnPlayerArriveAtBackup(playerid, backupID);
- return 1;
- }
- /* Called when a player arrives at a backup call */
- stock OnPlayerArriveAtBackup(playerid, backupID) {
- CancelBackupResponding(playerid, BK_CANCEL_REASON_ARRIVE);
- // Send message to caller
- new bkCaller = BackupInfo[backupID][bCaller];
- new bkStr[128];
- format(bkStr, sizeof(bkStr), "* %s has arrived at your backup call.", PlayerICName(playerid));
- SendClientMessage(bkCaller, GetFactionColour(BackupInfo[backupID][bFromFaction]), bkStr);
- return 1;
- }
|