Base to flag

Version:

1.0

Added on:

14 Mar 2013 15:58

Tags:

Description:
This is a code that works only for CTF or death CTF. When a player carries the red/blue flag and dies, it will move the red/blue base to the player instead of the flag back to the red/blue base. Because the server has to have a different way of detecting when a player loses the flag, there can be an error in the position of the bases. This is why this script doesn't work well for open levels like JE. Still, it can be fun to change the overplayed gamemode CTF a bit :)
/***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)
  }
}