/* Base to flag 1.0, by Foly http://www.jazz2online.com/snippets/67/base-to-flag/ */ /***Constants***/ enum BASE { BLUE = 0, RED = 1 } const int PLAYSLOT = 32768; /***Variables***/ int BlueBase = -1; int RedBase = -1; bool RedKill = false; bool BlueKill = false; int RedFlagHolder = -1; int BlueFlagHolder = -1; /***Other functions***/ void ChangeBase(int playerID) { //Create a new base int NewBase = jjAddObject(OBJECT::CTFBASE, jjPlayers[playerID].xPos, jjPlayers[playerID].yPos); //Change the color to red if the player lost the red flag if (!jjPlayers[playerID].teamRed) jjObjects[NewBase].var[1] = BASE::RED; //Change the global base variable to the new one if (jjObjects[NewBase].var[1] == BASE::BLUE) BlueBase = NewBase; else RedBase = NewBase; //Remove the old base, also if there are any bugged extra bases it will also remove them for (int i = 0; i < jjObjectCount; i++) if (jjObjects[i].isActive && jjObjects[i].eventID == 244) if (jjObjects[i].var[1] == BASE::BLUE && i != BlueBase) jjDeleteObject(i); else if (jjObjects[i].var[1] == BASE::RED && i != RedBase) jjDeleteObject(i); } void InitBaseID() { for (int i = 0; i < jjObjectCount; i++) if (jjObjects[i].isActive && jjObjects[i].eventID == 244) if (jjObjects[i].var[1] == 0) BlueBase = i; else RedBase = i; } /***Gameplay functions***/ void onMain() { if (jjGameTicks == 1) InitBaseID(); if (jjGameState == GAME::STARTED) { //Detect when a flag is captured and change flagvar to 2 for the player that captured the flag if (jjObjects[BlueBase].var[0] > 0 && BlueFlagHolder == -1) { BlueFlagHolder = jjObjects[BlueBase].var[0] - PLAYSLOT; BlueKill = false; } if (jjObjects[RedBase].var[0] > 0 && RedFlagHolder == -1) { RedFlagHolder = jjObjects[RedBase].var[0] - PLAYSLOT; RedKill = false; } //Check if the flag holder is killed (CLIENT ONLY) if (jjObjects[BlueBase].var[0] > 0) { if (jjPlayers[BlueFlagHolder].health == 0 && jjPlayers[BlueFlagHolder].isActive) BlueKill = true; } if (jjObjects[RedBase].var[0] > 0) { if (jjPlayers[RedFlagHolder].health == 0 && jjPlayers[RedFlagHolder].isActive) RedKill = true; } //Check if the flag is back to base, if so: is it because of a score or player kill? if (jjObjects[BlueBase].var[0] == 0 && BlueFlagHolder > -1) { if ((!jjIsServer && BlueKill) || (jjIsServer && jjPlayers[BlueFlagHolder].flag == 0)) { //The server uses the .flag variable of a player to see if the player died with the flag, the client uses .health instead if (jjPlayers[BlueFlagHolder].isActive) //We dont want to lose the base when someone is ctoĆ­ng :D ChangeBase(BlueFlagHolder); BlueKill = false; } else { jjObjects[RedBase].counter = 0; jjObjects[RedBase].var[4] = 1; } BlueFlagHolder = -1; } if (jjObjects[RedBase].var[0] == 0 && RedFlagHolder > -1) { if ((!jjIsServer && RedKill) || (jjIsServer && jjPlayers[RedFlagHolder].flag == 0)) { if (jjPlayers[RedFlagHolder].isActive) ChangeBase(RedFlagHolder); RedKill = false; } else{ jjObjects[BlueBase].counter = 0; jjObjects[BlueBase].var[4] = 1; } RedFlagHolder = -1; } //Also, swapping while holding the flag is not a bug, just a good troll! (A.k.a. im too lazy to fix that) } }