home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58b_TRIBES.iso / Tribes / base / scripts.vol / objectives.cs < prev    next >
Encoding:
Text File  |  1998-12-16  |  43.1 KB  |  1,191 lines

  1. exec("game.cs");                                
  2. $flagReturnTime = 45;
  3.  
  4. function ObjectiveMission::missionComplete()
  5. {
  6.    $missionComplete = true;
  7.    %group = nameToID("MissionCleanup/ObjectivesSet");
  8.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  9.    {
  10.       ObjectiveMission::objectiveChanged(%obj);
  11.     }
  12.    for(%i = 0; %i < getNumTeams(); %i++) { 
  13.        Team::setObjective(%i, $firstObjectiveLine-2, " ");
  14.        Team::setObjective(%i, $firstObjectiveLine-1, "<f5>Mission Summary:");
  15.     }
  16.     ObjectiveMission::setObjectiveHeading();
  17.    ObjectiveMission::refreshTeamScores();
  18.     %lineNum = "";
  19.    $missionComplete = false;
  20.  
  21.    // back out of all the functions...
  22.    schedule("Server::nextMission();", 0);
  23. }
  24.  
  25. function ObjectiveMission::setObjectiveHeading()
  26. {
  27.    if($missionComplete)
  28.    {
  29.       %curLeader = 0;
  30.         %tieGame = false;
  31.         for(%i = 0; %i < getNumTeams() ; %i++) 
  32.            echo("GAME: teamfinalscore " @ %i @ " " @ $teamScore[%i]);
  33.       
  34.         for(%i = 1; %i < getNumTeams() ; %i++) 
  35.       {
  36.            if($teamScore[%i] == $teamScore[%curLeader])
  37.             %tieGame = true;
  38.          else if($teamScore[%i] > $teamScore[%curLeader])
  39.          {
  40.             %curLeader = %i;
  41.             %tieGame = false;
  42.          }
  43.       }
  44.         for(%i = -1; %i < getNumTeams(); %i++)
  45.       {
  46.             objective::displayBitmap(%i,0);
  47.             if(!%tieGame) {
  48.              if(%i == %curLeader) { 
  49.                     if($teamScore[%curLeader] == 1)
  50.                        Team::setObjective(%i, 1, "<F5>           Your team won the mission with " @ $teamScore[%curLeader] @ " point!");
  51.                     else
  52.                        Team::setObjective(%i, 1, "<F5>           Your team won the mission with " @ $teamScore[%curLeader] @ " points!");
  53.                 }
  54.                 else {
  55.                     if($teamScore[%curLeader] == 1)
  56.                         Team::setObjective(%i, 1, "<F5>     The " @ getTeamName(%curLeader) @ " team won the mission with " @ $teamScore[%curLeader] @ " point!");
  57.                       else
  58.                       Team::setObjective(%i, 1, "<F5>     The " @ getTeamName(%curLeader) @ " team won the mission with " @ $teamScore[%curLeader] @ " points!");
  59.                 }
  60.               }    
  61.             else
  62.                Team::setObjective(%i, 1, "<F5>     The mission ended in a tie where each team had a score of " @ $teamScore[%curLeader]);
  63.             Team::setObjective(%i, 2, " ");
  64.         }
  65.    }
  66.    else {
  67.       for(%i = -1; %i < getNumTeams(); %i++)
  68.       {
  69.             objective::displayBitmap(%i,0);
  70.               Team::setObjective(%i,1, "<f5>Mission Completion:");
  71.            Team::setObjective(%i, 2,"<f1>   - " @ $teamScoreLimit @ " points needed to win the mission.");
  72.         }
  73.     }
  74.    if(!$Server::timeLimit)
  75.       %str = "<f1>   - No time limit on the game.";
  76.    else if($timeLimitReached)
  77.       %str = "<f1>   - Time limit reached.";
  78.    else if($missionComplete)
  79.    {
  80.       %time = getSimTime() - $missionStartTime;
  81.       %minutes = Time::getMinutes(%time);
  82.       %seconds = Time::getSeconds(%time);
  83.       if(%minutes < 10)
  84.          %minutes = "0" @ %minutes;
  85.       if(%seconds < 10)
  86.          %seconds = "0" @ %seconds;
  87.       %str = "<f1>   - Total match time: " @ %minutes @ ":" @ %seconds;
  88.    }
  89.    else
  90.       %str = "<f1>   - Time remaining: " @ floor($Server::timeLimit - (getSimTime() - $missionStartTime) / 60) @ " minutes.";
  91.    for(%i = -1; %i < getNumTeams(); %i++) {
  92.           Team::setObjective(%i, 3, " ");
  93.           Team::setObjective(%i, 4, "<f5>Mission Information:");
  94.         Team::setObjective(%i, 5, "<f1>   - Mission Name: " @ $missionName); 
  95.       Team::setObjective(%i, 6, %str);
  96.     }
  97. }
  98.  
  99. function objective::displayBitmap(%team, %line)
  100. {
  101.     if($Game::missionType == "CTF") {
  102.         %bitmap1 = "capturetheflag1.bmp";
  103.         %bitmap2 = "capturetheflag2.bmp";
  104.     }
  105.     else if($Game::missionType == "C&H") {
  106.         %bitmap1 = "captureandhold1.bmp";
  107.         %bitmap2 = "captureandhold2.bmp";
  108.     }
  109.     else if($Game::missionType == "D&D") {
  110.         %bitmap1 = "defendanddest1.bmp";
  111.         %bitmap2 = "defendanddest2.bmp";
  112.     }       
  113.     else if($Game::missionType == "F&R") {
  114.         %bitmap1 = "findandret1.bmp";
  115.         %bitmap2 = "findandret2.bmp";
  116.     }
  117.     if(%bitmap1 == "" || %bitmap2 == "")
  118.          Team::setObjective(%team, %line, " ");
  119.     else
  120.          Team::setObjective(%team, %line, "<jc><B0,0:" @ %bitmap1 @ "><B0,0:" @ %bitmap2 @ ">");
  121. }
  122.  
  123. function Game::checkTimeLimit()
  124. {
  125.    // if no timeLimit set or timeLimit set to 0,
  126.    // just reschedule the check for a minute hence
  127.    $timeLimitReached = false;
  128.    ObjectiveMission::setObjectiveHeading();
  129.  
  130.    if(!$Server::timeLimit)
  131.    {
  132.       schedule("Game::checkTimeLimit();", 60);
  133.       return;
  134.    }
  135.  
  136.    %curTimeLeft = ($Server::timeLimit * 60) + $missionStartTime - getSimTime();
  137.    if(%curTimeLeft <= 0 && $matchStarted)
  138.    {
  139.       echo("GAME: timelimit");
  140.       $timeLimitReached = true;
  141.       //echo("checking for objective time limit status...");
  142.       %set = nameToID("MissionCleanup/ObjectiveSet");
  143.       for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  144.          GameBase::virtual(%obj, "timeLimitReached", %clientId);
  145.       ObjectiveMission::missionComplete();
  146.    }
  147.    else
  148.    {
  149.       if(%curTimeLeft >= 20)
  150.          schedule("Game::checkTimeLimit();", 20);
  151.       else
  152.          schedule("Game::checkTimeLimit();", %curTimeLeft + 1);
  153.       UpdateClientTimes(%curTimeLeft);
  154.    }
  155. }
  156.  
  157. function Vote::changeMission()
  158. {
  159.    $missionComplete = true;
  160.    ObjectiveMission::refreshTeamScores();
  161.    %group = nameToID("MissionCleanup/ObjectivesSet");
  162.     %lineNum = "";
  163.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  164.    {
  165.       ObjectiveMission::objectiveChanged(%obj);
  166.     }
  167.    for(%i = 0; %i < getNumTeams(); %i++) { 
  168.        Team::setObjective(%i, $firstObjectiveLine-2, " ");
  169.        Team::setObjective(%i, $firstObjectiveLine-1, "<f5>Mission Summary:");
  170.     }
  171.     ObjectiveMission::setObjectiveHeading();
  172.    $missionComplete = false;
  173. }
  174.  
  175. function ObjectiveMission::checkScoreLimit()
  176. {
  177.    %done = false;
  178.    ObjectiveMission::refreshTeamScores();
  179.  
  180.    for(%i = 0; %i < getNumTeams(); %i++)
  181.       if($teamScore[%i] >= $teamScoreLimit)
  182.          %done = true;
  183.  
  184.    if(%done)
  185.       ObjectiveMission::missionComplete();
  186. }
  187.  
  188. function ObjectiveMission::checkPoints()
  189. {
  190.    for(%i = 0; %i < getNumTeams(); %i++)
  191.       $teamScore[%i] += $deltaTeamScore[%i] / 12;
  192.    schedule("ObjectiveMission::checkPoints();", 5);
  193.    ObjectiveMission::checkScoreLimit();
  194. }
  195.  
  196. function ObjectiveMission::initCheck(%object)
  197. {
  198.    %object.trainingObjectiveComplete = "";
  199.    %object.objectiveLine = "";
  200.    if(GameBase::virtual(%object, objectiveInit))
  201.       addToSet("MissionCleanup/ObjectivesSet", %object);
  202. }
  203.  
  204. function Game::refreshClientScore(%clientId)
  205. {
  206.    %team = Client::getTeam(%clientId);
  207.    if(%team == -1) // observers go last.
  208.       %team = 9;
  209.    // objective mission sorts by team first.
  210.    Client::setScore(%clientId, "%n\t%t\t  " @ %clientId.score  @ "\t%p\t%l", %clientId.score + (9 - %team) * 10000);
  211. //   Client::setScore(%clientId, "%n\t%t\t  " @ %clientId.score, %clientId.score);
  212. }
  213.  
  214. function ObjectiveMission::refreshTeamScores()
  215. {
  216.    %nt = getNumTeams();
  217.    Team::setScore(-1, "%t\t  0", 0);
  218.    for(%i = 0; %i < %nt; %i++)
  219.    {
  220.       Team::setScore(%i, "%t\t  " @ $teamScore[%i], $teamScore[%i]);
  221.       for(%j = 0; %j < %nt; %j++) 
  222.          Team::setObjective(%i,%j+$firstTeamLine, "<f1>   - Team " @ getTeamName(%j) @ " score = " @ $teamScore[%j]);
  223.    }
  224. }
  225.  
  226. function ObjectiveMission::objectiveChanged(%this)
  227. {
  228.     if(%this.objectiveLine)
  229.       for(%i = -1; %i < getNumTeams(); %i++)
  230.          Team::setObjective(%i,%this.objectiveLine, 
  231.             "<f1> " @ GameBase::virtual(%this, getObjectiveString, %i));
  232. }
  233.  
  234.  
  235. function Mission::init()
  236. {
  237.    setClientScoreHeading("Player Name\t\x6FTeam\t\xA6Score\t\xCFPing\t\xEFPL");
  238. //   setClientScoreHeading("Player Name\t\x6FTeam\t\xD6Score");//\t\xFFPing\t\xFFPL");
  239.    setTeamScoreHeading("Team Name\t\xD6Score");
  240.  
  241.    $firstTeamLine = 7;
  242.    $firstObjectiveLine = $firstTeamLine + getNumTeams() + 1;
  243.    for(%i = -1; %i < getNumTeams(); %i++)
  244.    {
  245.       $teamFlagStand[%i] = "";
  246.         $teamFlag[%i] = "";
  247.       Team::setObjective(%i, $firstTeamLine - 1, " ");
  248.       Team::setObjective(%i, $firstObjectiveLine - 1, " ");
  249.       Team::setObjective(%i, $firstObjectiveLine, "<f5>Mission Objectives: ");
  250.       $firstObjectiveLine++;
  251.         $deltaTeamScore[%i] = 0;
  252.       $teamScore[%i] = 0;
  253.       newObject("TeamDrops" @ %i, SimSet);
  254.       addToSet(MissionCleanup, "TeamDrops" @ %i);
  255.       %dropSet = nameToID("MissionGroup/Teams/Team" @ %i @ "/DropPoints/Random");
  256.       for(%j = 0; (%dropPoint = Group::getObject(%dropSet, %j)) != -1; %j++)
  257.          addToSet("MissionCleanup/TeamDrops" @ %i, %dropPoint);
  258.    }
  259.    $numObjectives = 0;
  260.    newObject(ObjectivesSet, SimSet);
  261.    addToSet(MissionCleanup, ObjectivesSet);
  262.    
  263.    Group::iterateRecursive(MissionGroup, ObjectiveMission::initCheck);
  264.    %group = nameToID("MissionCleanup/ObjectivesSet");
  265.  
  266.     ObjectiveMission::setObjectiveHeading();
  267.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  268.    {
  269.       %obj.objectiveLine = %i + $firstObjectiveLine;
  270.       ObjectiveMission::objectiveChanged(%obj);
  271.    }
  272.    ObjectiveMission::refreshTeamScores();
  273.    for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl))
  274.    {
  275.       %cl.score = 0;
  276.       Game::refreshClientScore(%cl);
  277.    }
  278.  
  279.    schedule("ObjectiveMission::checkPoints();", 5);
  280. }
  281.  
  282. function Game::pickRandomSpawn(%team)
  283. {
  284.    %spawnSet = nameToID("MissionCleanup/TeamDrops" @ %team);
  285.    %spawnCount = Group::objectCount(%spawnSet);
  286.    if(!%spawnCount)
  287.       return -1;
  288.       %spawnIdx = floor(getRandom() * (%spawnCount - 0.1));
  289.       %value = %spawnCount;
  290.     for(%i = %spawnIdx; %i < %value; %i++) {
  291.         %set = newObject("set",SimSet);
  292.         %obj = Group::getObject(%spawnSet, %i);
  293.         if(containerBoxFillSet(%set,$SimPlayerObjectType|$VehicleObjectType,GameBase::getPosition(%obj),2,2,4,0) == 0) {
  294.             deleteObject(%set);
  295.             return %obj;        
  296.         }
  297.         if(%i == %spawnCount - 1) {
  298.             %i = -1;
  299.             %value = %spawnIdx;
  300.         }
  301.         deleteObject(%set);
  302.     }
  303.    return false;
  304. }
  305.  
  306. //handles all scoring based on distance to Towers
  307. function Client::leaveGame(%clientId)
  308. {
  309.    echo("GAME: clientdrop " @ %clientId);
  310.    %set = nameToID("MissionCleanup/ObjectivesSet");
  311.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  312.       GameBase::virtual(%obj, "clientDropped", %clientId);
  313. }
  314.  
  315. function Game::clientKilled(%playerId, %killerId)
  316. {
  317.    %set = nameToID("MissionCleanup/ObjectivesSet");
  318.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  319.       GameBase::virtual(%obj, "clientKilled", %playerId, %killerId);
  320. }
  321.  
  322. function Player::enterMissionArea(%this)
  323. {
  324.    %set = nameToID("MissionCleanup/ObjectivesSet");
  325.     %this.outArea = "";
  326.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  327.       GameBase::virtual(%obj, "playerEnterMissionArea", %this);
  328. }
  329.  
  330. function Player::leaveMissionArea(%this)
  331. {
  332.     %this.outArea=1;
  333.     Client::sendMessage(Player::getClient(%this),1,"You have left the mission area.");
  334.     alertPlayer(%this, 3);
  335. }
  336.    
  337. function alertPlayer(%player, %count)
  338. {
  339.     if(%player.outArea == 1) {
  340.         if(%count > 0) {
  341.               Client::sendMessage(Player::getClient(%player),1,"~wLeftMissionArea.wav");
  342.            schedule("alertPlayer(" @ %player @ ", " @ %count - 1 @ ");",1.5,%player);
  343.         }
  344.         else { 
  345.             %set = nameToID("MissionCleanup/ObjectivesSet");
  346.             for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  347.                   GameBase::virtual(%obj, "playerLeaveMissionArea", %player);
  348.         }
  349.     }
  350. }
  351. function checkObjectives(%this)
  352. {
  353.    //echo("checking for objective player leave mission area...");
  354. }
  355.  
  356. // objective init must return true
  357. function TowerSwitch::objectiveInit(%this)
  358. {
  359.    return %this.scoreValue || %this.deltaTeamScore;
  360. }
  361.  
  362. function TowerSwitch::onAdd(%this)
  363. {
  364.     %this.numSwitchTeams = 0;    
  365. }
  366.  
  367. function TowerSwitch::onDamage()
  368. {
  369.    // tower switches can't take damage
  370. }
  371.  
  372. function TowerSwitch::getObjectiveString(%this, %forTeam)
  373. {
  374.    %thisTeam = GameBase::getTeam(%this);
  375.    
  376.    if($missionComplete)
  377.    {
  378.       if(%thisTeam == -1)
  379.          return "<Btowers_neutral.bmp>\nNo team claimed " @ %this.objectiveName @ ".";
  380.       else if(%thisTeam == %forTeam)
  381.          return "<Btower_teamcontrol.bmp>\nYour team finished the mission in control of " @ %this.objectiveName @ ".";
  382.       else {
  383.            if(%forTeam != -1)
  384.                return "<Btower_enemycontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  385.            else
  386.                return "<Btower_teamcontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  387.         }
  388.     }
  389.    else
  390.    {
  391.         if(%forTeam != -1) {
  392.              if(%this.deltaTeamScore)
  393.              {                                                                      
  394.                 if(%thisTeam == -1)
  395.                     return "<Btowers_neutral.bmp>\nClaim " @ %this.objectiveName @ " to gain " @ %this.deltaTeamScore @ " points per minute."; 
  396.                 else if(%thisTeam == %forTeam)
  397.                    return "<Btower_teamcontrol.bmp>\nDefend " @ %this.objectiveName @ " to retain " @ %this.deltaTeamScore @ " points per minute.";
  398.                 else
  399.                    return "<Btower_enemycontrol.bmp>\nCapture " @ %this.objectiveName @ " from the " @ getTeamName(%thisTeam) @ " team to gain " @ %this.deltaTeamScore @ " points per minute.";
  400.             }
  401.              else if(%this.scoreValue)
  402.              {
  403.                  if(%thisTeam == -1)
  404.                    return "<Btowers_neutral.bmp>\nClaim and defend " @ %this.objectiveName @ " to gain " @ %this.scoreValue @ " points.";
  405.                 else if(%thisTeam == %forTeam)
  406.                    return "<Btower_teamcontrol.bmp>\nDefend " @ %this.objectiveName @ " to retain " @ %this.scoreValue @ " points.";
  407.                 else
  408.                    return "<Btower_enemycontrol.bmp>\nCapture " @ %this.objectiveName @ " from the " @ getTeamName(%thisTeam) @ " team to gain " @ %this.deltaTeamScore @ " points.";
  409.               }
  410.         }
  411.         else {
  412.              if(%thisTeam == -1)
  413.                    return "<Btowers_neutral.bmp>\n" @ %this.objectiveName @ " has not been claimed."; 
  414.              else
  415.                 return "<Btower_teamcontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team is in control of the " @ %this.objectiveName @ ".";
  416.           }
  417.    }
  418. }
  419.  
  420. function TowerSwitch::onCollision(%this, %object)
  421. {
  422.    //echo("switch collision ", %object);
  423.    if(getObjectType(%object) != "Player")
  424.       return;
  425.  
  426.    if(Player::isDead(%object))
  427.       return;
  428.  
  429.    %playerTeam = GameBase::getTeam(%object);
  430.    %oldTeam = GameBase::getTeam(%this);
  431.    if(%oldTeam == %playerTeam)
  432.       return;
  433.  
  434.    %this.trainingObjectiveComplete = true;
  435.    
  436.    %playerClient = Player::getClient(%object);
  437.    %touchClientName = Client::getName(%playerClient);
  438.    %group = GetGroup(%this);
  439.    Group::iterateRecursive(%group, GameBase::setTeam, %playerTeam);
  440.  
  441.    %dropPoints = nameToID(%group @ "/DropPoints");
  442.    %oldDropSet = nameToID("MissionCleanup/TeamDrops" @ %oldTeam);
  443.    %newDropSet = nameToID("MissionCleanup/TeamDrops" @ %playerTeam);
  444.  
  445.    $deltaTeamScore[%oldTeam] -= %this.deltaTeamScore;
  446.    $deltaTeamScore[%playerTeam] += %this.deltaTeamScore;
  447.    $teamScore[%oldTeam] -= %this.scoreValue;
  448.    $teamScore[%playerTeam] += %this.scoreValue;
  449.  
  450.    if(%dropPoints != -1)
  451.    {
  452.       for(%i = 0; (%dropPoint = Group::getObject(%dropPoints, %i)) != -1; %i++)
  453.       {
  454.          if(%oldDropSet != -1)
  455.             removeFromSet(%oldDropSet, %dropPoint);
  456.          addToSet(%newDropSet, %dropPoint);
  457.       }
  458.    }
  459.  
  460.    if(%oldTeam == -1)
  461.    {
  462.       MessageAllExcept(%playerClient, 1, %touchClientName @ " claimed " @ %this.objectiveName @ " for the " @ getTeamName(%playerTeam) @ " team!");
  463.       Client::sendMessage(%playerClient, 1, "You claimed " @ %this.objectiveName @ " for the " @ getTeamName(%playerTeam) @ " team!");
  464.      }
  465.    else
  466.    {
  467.       if(%this.objectiveLine)
  468.       {
  469.          MessageAllExcept(%playerClient, 1, %touchClientName @ " captured " @ %this.objectiveName @ " from the " @ getTeamName(%oldTeam) @ " team!");
  470.          Client::sendMessage(%playerClient, 1, "You captured " @ %this.objectiveName @ " from the " @ getTeamName(%oldTeam) @ " team!");
  471.             %this.numSwitchTeams++;    
  472.             schedule("TowerSwitch::timeLimitCheckPoints(" @ %this @ "," @ %playerClient @ "," @ %this.numSwitchTeams @ ");",60);
  473.       }
  474.    }
  475.    if(%this.objectiveLine)
  476.    {
  477.       TeamMessages(1, %playerTeam, "Your team has taken an objective.~wCapturedTower.wav", "The " @ getTeamName(%playerTeam) @ " has taken an objective.");
  478.         if(%oldTeam != -1)
  479.           TeamMessages(1, %oldTeam, "The " @ getTeamName(%playerTeam) @ " team has taken your objective.~wLostTower.wav");
  480.       ObjectiveMission::ObjectiveChanged(%this);
  481.    }
  482.    ObjectiveMission::checkScoreLimit();
  483. }
  484.  
  485. function TowerSwitch::timeLimitCheckPoints(%this,%client,%numChange)
  486. {
  487.    //give player 5 points for capturing tower!
  488.     if(%this.numSwitchTeams == %numChange) {
  489.        %client.score+=5;
  490.         Game::refreshClientScore(%client);
  491.        Client::sendMessage(%client, 0, "You receive 5 points for holding your captured tower!");
  492.     }
  493. }
  494.  
  495. function TowerSwitch::clientKilled(%this, %playerId, %killerId)
  496. {      
  497.    if(!%this.objectiveLine)
  498.       return;
  499.  
  500.    %killerTeam = Client::getTeam(%killerId);
  501.    %playerTeam = Client::getTeam(%playerId);
  502.    %killerPos = GameBase::getPosition(%killerId);
  503.       
  504.    if(%killerId && (%playerTeam != %killerTeam))
  505.    {   
  506.       %dist = Vector::getDistance(%killerPos, GameBase::getPosition(%this));
  507.       //echo(%dist);
  508.       if(%dist <= 80)
  509.       {
  510.          //echo("distance to objective" @ %this @ " : " @ %dist);
  511.          if(GameBase::getTeam(%this) == Client::getTeam(%killerId) && getObjectType(%killerId) == "Player")
  512.          {
  513.             %killerId.score++;
  514.             Game::refreshClientScore(%killerId);
  515.             messageAll(0, strcat(Client::getName(%killerId), " receives a bonus for defending " @ %this.objectiveName @ "."));
  516.          }
  517.       }
  518.    }
  519. }
  520.  
  521. // objective init must return true
  522. function Flag::objectiveInit(%this)
  523. {
  524.    %this.originalPosition = GameBase::getPosition(%this);
  525.    %this.atHome = true;
  526.    %this.pickupSequence = 0;
  527.    %this.carrier = -1;
  528.    %this.holdingTeam = -1;
  529.    %this.holder = "";
  530.  
  531.    %this.enemyCaps = 0;
  532.    %this.caps[0] = 0;
  533.    %this.caps[1] = 0;
  534.    %this.caps[2] = 0;
  535.    %this.caps[3] = 0;
  536.    %this.caps[4] = 0;
  537.    %this.caps[5] = 0;
  538.    %this.caps[6] = 0;
  539.    %this.caps[7] = 0;
  540.  
  541.     $teamFlag[GameBase::getTeam(%this)] = %this;
  542.  
  543.    return true;
  544. }
  545.  
  546. function Flag::getObjectiveString(%this, %forTeam)
  547. {
  548.    %thisTeam = GameBase::getTeam(%this);
  549.    //echo("Flag objectiveString");
  550.    
  551.    if($missionComplete)
  552.    {
  553.       if(%thisTeam == -1)
  554.       {
  555.          if(%this.holdingTeam == %forTeam && %forTeam != -1)
  556.             return "<Bflag_atbase.bmp>\nYour team finished the mission in control of " @ %this.objectiveName @ ".";
  557.          else if(%this.holdingTeam == -1)
  558.             return "<Bflag_neutral.bmp>\nNo team finished the mission in control of " @ %this.objectiveName @ ".";
  559.          else {
  560.                 if(%forTeam != -1)
  561.                     return "<Bflag_enemycaptured.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  562.               else
  563.                     return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  564.             }
  565.         }
  566.       else if(%forTeam != -1)
  567.       {
  568.          if(%thisTeam == %forTeam)
  569.             return "<Bflag_atbase.bmp>\nYour flag was captured " @ %this.enemyCaps @ " times.";
  570.          else
  571.             return "<Bflag_enemycaptured.bmp>\nYour team captured the " @ getTeamName(%thisTeam) @ " flag " @ %this.caps[%forTeam] @ " times.";
  572.       }
  573.           else 
  574.           return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%thisTeam) @ "'s flag was captured " @ %this.enemyCaps @ " times.";
  575.    }
  576.    else
  577.    {
  578.       if(%thisTeam == -1)
  579.       {
  580.             if(%forTeam != -1) {
  581.              if(%this.holdingTeam == %forTeam)
  582.                 return "<Bflag_atbase.bmp>\nDefend " @ %this.objectiveName @ ".";
  583.              else if(%this.holdingTeam != -1)
  584.                 return "<Bflag_enemycaptured.bmp>\nGrab " @ %this.objectiveName @ " from the " @ getTeamName(%this.holdingTeam) @ " team.";
  585.              else if(%this.carrier != -1)
  586.              {
  587.                 if(GameBase::getTeam(%this.carrier) == %forTeam)
  588.                    return "<Bflag_atbase.bmp>\nConvey " @ %this.objectiveName @ " to an empty flag stand. (carried by " @ Client::getName(Player::getClient(%this.carrier)) @ ")";
  589.                 else
  590.                    return "<Bflag_enemycaptured.bmp>\nWaylay " @ Client::getName(Player::getClient(%this.carrier)) @ " and convey " @ %this.objectiveName @ " to your base.";
  591.              }
  592.              else if(%this.atHome)
  593.                 return "<Bflag_neutral.bmp>\nGrab " @ %this.objectiveName @ " and convey it to an empty flag stand.";
  594.              else
  595.                 return "<Bflag_notatbase.bmp>\nFind " @ %this.objectiveName @ " and convey it to an empty flag stand.";
  596.           }
  597.             else {
  598.              if(%this.holdingTeam != -1)
  599.                 return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team has " @ %this.objectiveName @ ".";
  600.              else if(%this.carrier != -1)
  601.                   return "<Bflag_atbase.bmp>\n" @ Client::getName(Player::getClient(%this.carrier)) @ " has " @ %this.objectiveName @ ".";
  602.              else if(%this.atHome)
  603.                 return "<Bflag_neutral.bmp>\n" @ %this.objectiveName @ " has not been found.";
  604.                 else
  605.                    return "<Bflag_notatbase.bmp>\n" @ %this.objectiveName @ " has been dropped in the field.";
  606.             }
  607.         }
  608.       else
  609.       {
  610.          if(%thisTeam == %forTeam)
  611.          {
  612.             if(%this.atHome)
  613.                return "<Bflag_atbase.bmp>\nDefend your flag to prevent enemy captures.";
  614.             else if(%this.carrier != -1)
  615.                return "<Bflag_enemycaptured.bmp>\nReturn your flag to base. (carried by " @ Client::getName(Player::getClient(%this.carrier)) @ ")";
  616.             else
  617.                return "<Bflag_notatbase.bmp>\nReturn your flag to base. (dropped in the field)";
  618.          }
  619.          else
  620.          {
  621.                 if(%forTeam != -1) {
  622.                 if(%this.atHome)
  623.                    return "<Bflag_enemycaptured.bmp>\nGrab the " @ getTeamName(%thisTeam) @ " flag and touch it to your's to score " @ %this.scoreValue @ " points.";
  624.                 else if(%this.carrier == -1)
  625.                    return "<Bflag_notatbase.bmp>\nFind the " @ getTeamName(%thisTeam) @ " flag and touch it to your's to score " @ %this.scoreValue @ " points.";
  626.                 else if(GameBase::getTeam(%this.carrier) == %forTeam)
  627.                    return "<Bflag_atbase.bmp>\nEscort friendly carrier " @ Client::getName(Player::getClient(%this.carrier)) @ " to base.";
  628.                 else
  629.                    return "<Bflag_enemycaptured.bmp>\nWaylay enemy carrier " @ Client::getName(Player::getClient(%this.carrier)) @ " and steal his flag.";
  630.              }
  631.                 else {
  632.                 if(%this.atHome)
  633.                    return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%thisTeam) @ " flag is at their base.";
  634.                 else if(%this.carrier == -1)
  635.                    return "<Bflag_notatbase.bmp>\nThe " @ getTeamName(%thisTeam) @ " flag has been dropped in the field.";
  636.                 else 
  637.                    return "<Bflag_atbase.bmp>\n" @ Client::getName(Player::getClient(%this.carrier)) @ " has the " @ getTeamName(%thisTeam) @ " flag.";
  638.                 }
  639.             }         
  640.       }
  641.    }
  642. }
  643.  
  644. function Flag::onDrop(%player, %type)
  645. {
  646.    %playerTeam = GameBase::getTeam(%player);
  647.    %flag = %player.carryFlag;
  648.    %flagTeam = GameBase::getTeam(%flag);
  649.    %playerClient = Player::getClient(%player);
  650.    %dropClientName = Client::getName(%playerClient);
  651.  
  652.    if(%flagTeam == -1)
  653.    {
  654.       MessageAllExcept(%playerClient, 1, %dropClientName @ " dropped " @ %flag.objectiveName @ "!");
  655.       Client::sendMessage(%playerClient, 1, "You dropped "  @ %flag.objectiveName @ "!");
  656.    }
  657.    else
  658.    {
  659.       MessageAllExcept(%playerClient, 1, %dropClientName @ " dropped the " @ getTeamName(%flagTeam) @ " flag!");
  660.       Client::sendMessage(%playerClient, 1, "You dropped the " @ getTeamName(%flagTeam) @ " flag!");
  661.       TeamMessages(1, %flagTeam, "Your flag was dropped in the field.", -2, "", "The " @ getTeamName(%flagTeam) @ " flag was dropped in the field.");
  662.    }
  663.    GameBase::throw(%flag, %player, 10, false);
  664.    Item::hide(%flag, false);
  665.    Player::setItemCount(%player, "Flag", 0);
  666.    %flag.carrier = -1;
  667.    %player.carryFlag = "";
  668.    Flag::clearWaypoint(%playerClient, false);
  669.  
  670.    schedule("Flag::checkReturn(" @ %flag @ ", " @ %flag.pickupSequence @ ");", $flagReturnTime);
  671.     %flag.dropFade = 1;
  672.    ObjectiveMission::ObjectiveChanged(%flag);
  673. }
  674.  
  675. function Flag::checkReturn(%flag, %sequenceNum)
  676. {
  677.    //echo("checking for flag return: ", %flag, ", ", %sequenceNum);
  678.    if(%flag.pickupSequence == %sequenceNum)
  679.    {
  680.         if(%flag.dropFade) { 
  681.             GameBase::startFadeOut(%flag);
  682.               %flag.dropFade= "";
  683.             %flag.fadeOut= 1;
  684.            schedule("Flag::checkReturn(" @ %flag @ ", " @ %sequenceNum @ ");", 2.5);
  685.         }
  686.         else {
  687.           %flagTeam = GameBase::getTeam(%flag);
  688.           if(%flagTeam == -1)
  689.           {
  690.              if(%flag.flagStand == "" || %flag.flagStand.flag != "") {
  691.                     MessageAll(0, %flag.objectiveName @ " was returned to its initial position.");
  692.                    GameBase::setPosition(%flag, %flag.originalPosition);
  693.                Item::setVelocity(%flag, "0 0 0");
  694.                    %flag.flagStand = "";
  695.                }
  696.                else
  697.                {
  698.                 %holdTeam = GameBase::getTeam(%flag.flagStand);
  699.                     TeamMessages(0, %holdTeam, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(GameBase::getTeam(%flag.flagStand)) @ " flag was returned to base.~wflagreturn.wav");
  700.                    GameBase::setPosition(%flag, GameBase::getPosition(%flag.flagStand));
  701.                %flag.flagStand.flag = %flag;
  702.                    %flag.holdingTeam = %holdTeam;
  703.                    %flag.carrier = -1;
  704.                    $teamScore[%holdTeam] += %flag.scoreValue;
  705.                    $deltaTeamScore[%holdTeam] += %flag.deltaTeamScore;
  706.                    %flag.holder = %flag.flagStand;
  707.                    TeamMessages(1,%holdTeam, "Your team holds " @ %flag.objectiveName @ ".~wflagcapture.wav", -2, "", "The " @ getTeamName(%playerTeam) @ " team holds " @ %flag.objectiveName @ ".");
  708.                    ObjectiveMission::checkScoreLimit();
  709.                }
  710.             }
  711.          else
  712.          {
  713.              TeamMessages(0, %flagTeam, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(%flagTeam) @ " flag was returned to base.~wflagreturn.wav");
  714.                 GameBase::setPosition(%flag, %flag.originalPosition);
  715.             Item::setVelocity(%flag, "0 0 0");
  716.          }
  717.          %flag.atHome = true;
  718.             GameBase::startFadeIn(%flag);
  719.           %flag.fadeOut= "";
  720.             ObjectiveMission::ObjectiveChanged(%flag);
  721.         }
  722.    }
  723. }
  724.  
  725. function Flag::onCollision(%this, %object)
  726. {
  727.    //echo("Flag collision ", %object);
  728.    if(getObjectType(%object) != "Player")
  729.       return;
  730.  
  731.    if(%this.carrier != -1)
  732.       return; // spurious collision
  733.    
  734.    %name = Item::getItemData(%this);
  735.    %playerTeam = GameBase::getTeam(%object);
  736.    %flagTeam = GameBase::getTeam(%this);
  737.    %playerClient = Player::getClient(%object);
  738.    %touchClientName = Client::getName(%playerClient);
  739.                              
  740.  
  741.    if(%flagTeam == %playerTeam)
  742.    {
  743.       // player is touching his own flag...
  744.       if(!%this.atHome)
  745.       {
  746.          // the flag isn't home! so return it.
  747.             GameBase::startFadeOut(%this);
  748.             GameBase::setPosition(%this, %this.originalPosition);
  749.          Item::setVelocity(%this, "0 0 0");
  750.             GameBase::startFadeIn(%this);
  751.          %this.atHome = true;
  752.          MessageAllExcept(%playerClient, 1, %touchClientName @ " returned the " @ getTeamName(%playerTeam) @ " flag!~wflagreturn.wav");
  753.          Client::sendMessage(%playerClient, 1, "You returned the " @ getTeamName(%playerTeam) @ " flag!~wflagreturn.wav");
  754.          teamMessages(1, %playerTeam, "Your flag was returned to base.", -2, "", "The " @ getTeamName(%playerTeam) @ " flag was returned to base.");
  755.          %this.pickupSequence++;
  756.          ObjectiveMission::ObjectiveChanged(%this);
  757.       }
  758.       else
  759.       {
  760.          // it's at home - see if we have an enemy flag!
  761.          if(%object.carryFlag != "")
  762.          {
  763.             // can't cap the neutral flags, duh
  764.                %enemyTeam = GameBase::getTeam(%object.carryFlag);
  765.                if(%enemyTeam != -1)
  766.             {
  767.                MessageAllExcept(%playerClient, 1, %touchClientName @ " captured the " @ getTeamName(%enemyTeam) @ " flag!~wflagcapture.wav");
  768.                Client::sendMessage(%playerClient, 1, "You captured the " @ getTeamName(%enemyTeam) @ " flag!~wflagcapture.wav");
  769.                TeamMessages(1, %playerTeam, "Your team captured the flag.", %flagTeam, "Your team's flag was captured.");
  770.             
  771.                %flag = %object.carryFlag;
  772.                %flag.atHome = true;
  773.                %flag.carrier = -1;
  774.                %flag.caps[%playerTeam]++;
  775.                %flag.enemyCaps++;
  776.                
  777.                
  778.                Item::hide(%flag, false);
  779.                $flagAtHome[1] = true;
  780.                GameBase::setPosition(%flag, %flag.originalPosition);
  781.                Item::setVelocity(%flag, "0 0 0");
  782.  
  783.                %flag.trainingObjectiveComplete = true;
  784.                ObjectiveMission::ObjectiveChanged(%flag);
  785.  
  786.                Player::setItemCount(%object, Flag, 0);
  787.                %object.carryFlag = "";
  788.                Flag::clearWaypoint(%playerClient, true);
  789.  
  790.                $teamScore[%playerTeam] += %flag.scoreValue;
  791.                ObjectiveMission::checkScoreLimit();
  792.  
  793.                //flag carrier gets 5 points for caputure
  794.                %playerClient.score += 5;
  795.                Game::refreshClientScore(%playerClient);
  796.                messageAll(0, Client::getName(%playerClient) @ " receives 5 point capture bonus.");
  797.             }
  798.          }
  799.       }
  800.    }
  801.    else
  802.    {
  803.       // it's an enemy's flag! woohoo!
  804.       if(%object.carryFlag == "")
  805.       {
  806.             if(%object.outArea == "") {
  807.                 // don't pick up our flags
  808.                 if(%this.holdingTeam == %playerTeam)
  809.                    return;
  810.  
  811.                 Player::setItemCount(%object, Flag, 1);
  812.                 Player::mountItem(%object, Flag, $FlagSlot, %flagTeam);
  813.                 Item::hide(%this, true);
  814.                 $flagAtHome[1] = false;
  815.                 %this.atHome = false;
  816.                 %this.carrier = %object;
  817.                 %this.pickupSequence++;
  818.                 %object.carryFlag = %this;
  819.                  Flag::setWaypoint(%playerClient, %this);
  820.      
  821.                  if(%this.fadeOut) {
  822.                     GameBase::startFadeIn(%this);
  823.                      %this.fadeOut= "";
  824.                 }
  825.                 if(%flagTeam != -1)
  826.                 {
  827.                     MessageAllExcept(%playerClient, 1, %touchClientName @ " took the " @ getTeamName(%flagTeam) @ " flag! ~wflag1.wav");
  828.                    Client::sendMessage(%playerClient, 1, "You took the " @ getTeamName(%flagTeam) @ " flag! ~wflag1.wav");
  829.                    TeamMessages(1, %playerTeam, "Your team has the " @ getTeamName(%flagTeam) @ " flag.", %flagTeam, "Your team's flag has been taken.");
  830.                 }
  831.                 else
  832.                 {
  833.                    %hteam = %this.holdingTeam;
  834.                     if(%hteam != -1)
  835.                    {
  836.                       $teamScore[%hteam] -= %this.scoreValue;
  837.                       $deltaTeamScore[%hteam] -= %this.deltaTeamScore;
  838.  
  839.                        MessageAllExcept(%playerClient, 1, %touchClientName @ " took " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.~wflag1.wav");
  840.                       Client::sendMessage(%playerClient, 1, "You took " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.~wflag1.wav");
  841.                       TeamMessages(1, %playerTeam, "Your team has " @ %this.objectiveName @ ".", %hteam, "Your team lost " @ %this.objectiveName @ ".", "The " @ getTeamName(%playerTeam) @ " team has taken " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.");
  842.                       %this.holdingTeam = -1;
  843.                       %this.holder.flag = "";
  844.                    }
  845.                    else
  846.                    {
  847.                        MessageAllExcept(%playerClient, 1, %touchClientName @ " took " @ %this.objectiveName @ ".~wflag1.wav");
  848.                       Client::sendMessage(%playerClient, 1, "You took " @ %this.objectiveName @ ".~wflag1.wav");
  849.                       TeamMessages(1, %playerTeam, "Your team has " @ %this.objectiveName @ ".", -2, "", "The " @ getTeamName(%playerTeam) @ " team has taken " @ %this.objectiveName @ ".");
  850.                    }
  851.                 }
  852.                 %this.trainingObjectiveComplete = true;
  853.                 ObjectiveMission::ObjectiveChanged(%this);
  854.             }
  855.             else
  856.                 Client::sendMessage(%playerClient, 1, "Flag not in mission area.");
  857.         }
  858.    }
  859. }
  860.  
  861. function Flag::clearWaypoint(%client, %success)
  862. {
  863.    if(%success)
  864.       setCommandStatus(%client, 0, "Objective completed.~wobjcomp");
  865.    else
  866.       setCommandStatus(%client, 0, "Objective failed.");
  867. }
  868.  
  869. function Flag::setWaypoint(%client, %flag)
  870. {
  871.    if(!%client.autoWaypoint)
  872.       return;
  873.    %flagTeam = GameBase::getTeam(%flag);
  874.    %team = Client::getTeam(%client);
  875.  
  876.     if(%flagTeam == -1)
  877.     { 
  878.         for(%s = $teamFlagStand[%team]; %s != ""; %s = %s.nextFlagStand) 
  879.         {
  880.             if(%s.flag == "") {
  881.                 %pos = GameBase::getPosition(%s);
  882.                 %posX = getWord(%pos,0);
  883.                 %posY = getWord(%pos,1);
  884.               issueCommand(%client, %client, 0,"Take " @ %flag.objectiveName @ " to empty flag stand.~wcapobj", %posX, %posY);
  885.                 return;
  886.             }
  887.       }
  888.     }
  889.     else
  890.     {
  891.         %pos = ($teamFlag[%team]).originalPosition;
  892.         %posX = getWord(%pos,0);
  893.         %posY = getWord(%pos,1);
  894.          issueCommand(%client, %client, 0,"Take the " @ getTeamName(%flagTeam) @ " flag to our flag.~wcapobj", %posX, %posY);
  895.         return;
  896.     }
  897. }
  898.  
  899. function FlagStand::objectiveInit(%this)
  900. {
  901.    %this.flag = "";
  902.    %team = GameBase::getTeam(%this);
  903.  
  904.    %this.nextFlagStand = $teamFlagStand[%team];
  905.    $teamFlagStand[%team] = %this;
  906.     
  907.    return false;
  908. }
  909.  
  910. function FlagStand::onCollision(%this, %object)
  911. {
  912.    //echo("FlagStand collision ", %object);
  913.    %standTeam = GameBase::getTeam(%this);
  914.    %playerTeam = GameBase::getTeam(%object);
  915.  
  916.    if(%standTeam == -1 || getObjectType(%object) != "Player" || %object.carryFlag == ""
  917.          || %playerTeam != %standTeam || %this.flag != "" || GameBase::getTeam(%object.carryFlag) != -1)
  918.       return;
  919.  
  920.    // if we're here, we're carrying a flag, we've hit 
  921.    // our flag stand, it doesn't have a flag, and we're not carrying
  922.    // a team coded flag.
  923.  
  924.    %flag = %object.carryFlag;
  925.    %flag.carrier = -1;
  926.    Item::hide(%flag, false);
  927.    GameBase::setPosition(%flag, GameBase::getPosition(%this));
  928.     %flag.flagStand = %this;
  929.    Player::setItemCount(%object, Flag, 0);
  930.    %object.carryFlag = "";
  931.    %playerClient = Player::getClient(%object);
  932.    Flag::clearWaypoint(%playerClient, true);
  933.  
  934.    $teamScore[%playerTeam] += %flag.scoreValue;
  935.    $deltaTeamScore[%playerTeam] += %flag.deltaTeamScore;
  936.    %flag.holder = %this;
  937.    %flag.holdingTeam = %playerTeam;
  938.    %this.flag = %flag;
  939.  
  940.  
  941.    MessageAllExcept(%playerClient, 1, Client::getName(%playerClient) @ " conveyed " @ %flag.objectiveName @ " to base.");
  942.    Client::sendMessage(%playerClient, 1, "You conveyed " @ %flag.objectiveName @ " to base.");
  943.    TeamMessages(1, %playerTeam, "Your team holds " @ %flag.objectiveName @ ".~wflagcapture.wav", -2, "", "The " @ getTeamName(%playerTeam) @ " team holds " @ %flag.objectiveName @ ".");
  944.  
  945.    %flag.trainingObjectiveComplete = true;
  946.    ObjectiveMission::ObjectiveChanged(%flag);
  947.    ObjectiveMission::checkScoreLimit();
  948. }
  949.  
  950. function Flag::clientKilled(%this, %playerId, %killerId)
  951. {
  952.    %player = Client::getOwnedObject(%playerId);
  953.    %killer = Client::getOwnedObject(%killerId);
  954.  
  955.    if(%player == -1 || %killer == -1)
  956.       return;
  957.  
  958.    %flagTeam = GameBase::getTeam(%this);
  959.    if(%flagTeam == -1)
  960.       return;
  961.  
  962.    %playerTeam = GameBase::getTeam(%player);
  963.    %killerTeam = GameBase::getTeam(%killer);
  964.  
  965.    if(%playerTeam == %killerTeam)
  966.       return;
  967.  
  968.    // killer's the only guy who gets a bonus.
  969.    if(%killerTeam == %flagTeam)
  970.    {
  971.       // check for defending the flag
  972.       // only if the flag is not being carried
  973.       if(%this.carrier == -1)
  974.       {
  975.          %flagPos = GameBase::getPosition(%this);
  976.          %playerPos = GameBase::getPosition(%player);
  977.  
  978.          if(Vector::getDistance(%flagPos, %playerPos) < 80)
  979.          {
  980.             %killerId.score++;
  981.             Game::refreshClientScore(%killerId);
  982.             messageAll(0, Client::getName(%killerId) @ " gets a bonus for defending the flag!");
  983.          }
  984.       }
  985.    }
  986.    else
  987.    {
  988.       if(%this.carrier != -1)
  989.       {
  990.          %carrierTeam = GameBase::getTeam(%this.carrier);
  991.          // check for defending the carrier bonus
  992.          if(%carrierTeam == %killerTeam)
  993.          {
  994.             if(Vector::getDistance(GameBase::getPosition(%this.carrier),
  995.                GameBase::getPosition(%killer)) < 80)
  996.             {
  997.                %killerId.score++;
  998.                Game::refreshClientScore(%killerId);
  999.                messageAll(0, Client::getName(%killerId) @ " gets a bonus for defending the flag carrier!");
  1000.             }               
  1001.          }
  1002.       }
  1003.    }
  1004. }
  1005.  
  1006. function Flag::clientDropped(%this, %clientId)
  1007. {
  1008.    //echo(%this @ " " @ %clientId);
  1009.    %type = Player::getMountedItem(%clientId, $FlagSlot);
  1010.    if(%type != -1)
  1011.       Player::dropItem(%clientId, %type);
  1012. }
  1013.  
  1014. function Flag::playerLeaveMissionArea(%this, %playerId)
  1015. {
  1016.    // if a guy leaves the area, warp the flag back to its base
  1017.    if(%this.carrier == %playerId)
  1018.    {
  1019.         GameBase::startFadeOut(%this);
  1020.       Player::setItemCount(%playerId, "Flag", 0);
  1021.         %playerClient = Player::getClient(%playerId);
  1022.          %clientName = Client::getName(%playerClient);
  1023.        %flagTeam = GameBase::getTeam(%this);
  1024.          if(%flagTeam == -1 && (%this.flagStand == "" || (%this.flagStand).flag != "") ) 
  1025.        {
  1026.           MessageAllExcept(%playerClient, 1, %clientName @ " left the mission area while carrying " @ %this.objectiveName @ "!  It was returned to its initial position.");
  1027.           Client::sendMessage(%playerClient, 1, "You left the mission area while carrying " @ %this.objectiveName @ "!  It was returned to its initial position.");
  1028.             GameBase::setPosition(%this, %this.originalPosition);
  1029.          Item::setVelocity(%this, "0 0 0");
  1030.             %this.flagStand = "";
  1031.        }
  1032.        else
  1033.        {
  1034.             if(%flagTeam != -1) {
  1035.                 %team = %flagTeam;
  1036.                 GameBase::setPosition(%this, %this.originalPosition);
  1037.             Item::setVelocity(%this, "0 0 0");
  1038.             }
  1039.             else {
  1040.                 %team = GameBase::getTeam(%this.flagStand);
  1041.                 GameBase::setPosition(%this, GameBase::getPosition(%this.flagStand));
  1042.             Item::setVelocity(%this, "0 0 0");
  1043.             }
  1044.             MessageAllExcept(%playerClient, 1, %clientName @ " left the mission area while carrying the " @ getTeamName(%team) @ " flag!");
  1045.           Client::sendMessage(%playerClient, 1, "You left the mission area while carrying the " @ getTeamName(%team) @ " flag!");
  1046.           TeamMessages(1, %team, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(%team) @ " flag was returned to base.");
  1047.           %holdTeam = GameBase::getTeam(%this.flagStand);
  1048.            $teamScore[%holdTeam] += %this.scoreValue;
  1049.            $deltaTeamScore[%holdTeam] += %this.deltaTeamScore;
  1050.             %this.holder = %this.flagStand;
  1051.            %this.flagStand.flag = %this;
  1052.             %this.holdingTeam = %holdTeam;
  1053.         }
  1054.         GameBase::startFadeIn(%this);
  1055.       %this.carrier = -1;
  1056.         Item::hide(%this, false);
  1057.  
  1058.         %playerId.carryFlag = "";
  1059.       Flag::clearWaypoint(%playerClient, false);
  1060.       ObjectiveMission::ObjectiveChanged(%this);
  1061.         ObjectiveMission::checkScoreLimit();
  1062.    }
  1063. }
  1064.  
  1065. function Sensor::objectiveInit(%this)
  1066. {
  1067.    return StaticShape::objectiveInit(%this);
  1068. }
  1069.  
  1070. function Turret::objectiveInit(%this)
  1071. {
  1072.    return StaticShape::objectiveInit(%this);
  1073. }
  1074.  
  1075. function StaticShape::objectiveInit(%this)
  1076. {
  1077.    %this.destroyerTeam = "";
  1078.    return %this.scoreValue != "";
  1079. }
  1080.  
  1081. function Sensor::getObjectiveString(%this, %forTeam)
  1082. {
  1083.    return StaticShape::getObjectiveString(%this, %forTeam);
  1084. }
  1085.  
  1086. function Turret::getObjectiveString(%this, %forTeam)
  1087. {
  1088.    return StaticShape::getObjectiveString(%this, %forTeam);
  1089. }
  1090.  
  1091. function StaticShape::getObjectiveString(%this, %forTeam)
  1092. {
  1093.    %thisTeam = GameBase::getTeam(%this);
  1094.    if(%this.destroyerTeam != "")
  1095.    {
  1096.       if(%forTeam == %this.destroyerTeam && %thisTeam != %forTeam)
  1097.          return "<Bitem_ok.bmp>\nYour team successfully destroyed the " @ getTeamName(%thisTeam) @ " " @ %this.objectiveName @ " objective.";
  1098.       else if(%forTeam == %thisTeam)
  1099.          return "<Bitem_damaged.bmp>\nYour team failed to defend " @ %this.objectiveName;
  1100.       else
  1101.          return "<Bitem_ok.bmp>\n" @ getTeamName(%this.destroyerTeam) @ " team destroyed the " @ getTeamName(%thisTeam) @ " " @ %this.objectiveName @ " objective.";
  1102.    }
  1103.    else
  1104.    {
  1105.       if($missionComplete)
  1106.       {
  1107.          if(%forTeam != -1) {
  1108.                 if(%forTeam == %thisTeam)
  1109.                 return "<Bitem_ok.bmp>\nYour team successfully defended " @ %this.objectiveName @ ".";
  1110.              else
  1111.                 return "<Bitem_damaged.bmp>\nYour team failed to destroy " @ getTeamName(%thisTeam) @ " objective, " @ %this.objectiveName @ ".";
  1112.           }
  1113.             else 
  1114.                return "<Bitem_ok.bmp>\n" @ getTeamName(%thisTeam) @ " failed to destroy the " @ %this.objectiveName @ " objective.";
  1115.         }
  1116.       else
  1117.       {
  1118.          if(%forTeam != -1) {
  1119.              if(%forTeam == %thisTeam)
  1120.                 return "<Bitem_ok.bmp>\nDefend " @ %this.objectiveName @ ".";
  1121.              else
  1122.                   return "<Bitem_damaged.bmp>\nDestroy " @ getTeamName(%thisTeam) @ " objective, " @ %this.objectiveName @ "(" @ %this.scoreValue @ " points).";
  1123.           }
  1124.             else 
  1125.                return "<Bitem_ok.bmp>\n" @ getTeamName(%thisTeam) @ " must defend the " @ %this.objectiveName @ " objective.";
  1126.  
  1127.       }
  1128.    }
  1129. }
  1130.  
  1131. function StaticShape::timeLimitReached(%this)
  1132. {
  1133.    if(%this.scoreValue && !%this.destroyerTeam)
  1134.    {
  1135.       // give the defense some props!
  1136.       $teamScore[GameBase::getTeam(%this)] += %this.scoreValue;
  1137.    }
  1138. }
  1139.  
  1140. function StaticShape::objectiveDestroyed(%this)
  1141. {
  1142.     if(%this.destroyed == "") {
  1143.        // test if it's really an objective
  1144.        if(!%this.objectiveLine)
  1145.           return;
  1146.        %destroyerTeam = %this.lastDamageTeam;
  1147.         %thisTeam = GameBase::getTeam(%this);
  1148.       %playerClient = GameBase::getControlClient(%this.lastDamageObject);
  1149.       if(%playerClient != -1)
  1150.          %clientName = Client::getName(%playerClient);
  1151.  
  1152.        if(%thisTeam == %destroyerTeam)
  1153.        {
  1154.           // uh-oh... we killed our own stuff.
  1155.           // award the points to everyone else
  1156.           for(%i = 0; %i < getNumTeams(); %i++)
  1157.           {
  1158.              if(%i == %thisTeam)
  1159.                 continue;
  1160.              $teamScore[%i] += %this.scoreValue;
  1161.           }
  1162.          if(%playerClient != -1)
  1163.          {
  1164.              MessageAllExcept(%playerClient, 1, %clientName @ " destroyed a friendly objective.");
  1165.              Client::sendMessage(%playerClient, 1, "You destroyed a friendly objective!");
  1166.          }
  1167.          MessageAll(0, getTeamName(%destroyerTeam) @ " objective " @ %this.objectiveName @ " destroyed.");
  1168.        }
  1169.        else
  1170.        {
  1171.           $teamScore[%destroyerTeam] += %this.scoreValue;
  1172.          if(%playerClient != -1)
  1173.          {
  1174.              MessageAllExcept(%playerClient, 1, %clientName @ " destroyed an objective!");
  1175.              Client::sendMessage(%playerClient, 1, "You destroyed an objective!");
  1176.          }
  1177.          MessageAll(0, getTeamName(%thisTeam) @ " objective " @ %this.objectiveName @ " destroyed.");
  1178.        }
  1179.        %this.destroyerTeam = %destroyerTeam;
  1180.        ObjectiveMission::ObjectiveChanged(%this);
  1181.        ObjectiveMission::checkScoreLimit();
  1182.         %this.destroyed = 1;
  1183.     }
  1184. }
  1185.  
  1186. function StaticShape::objectiveDisabled(%this)
  1187. {
  1188. }
  1189.  
  1190.  
  1191.