Author Topic: Integrating MeatBot?  (Read 3732 times)

Offline Mwh65

  • Rank: Private
  • *
  • Posts: 13
    • http://www.cod4.agls.org.uk
Integrating MeatBot?
« on: September 14, 2008, 05:07:16 am »
Goo'day Lads,

I love Extreme+ and want to use it for the next LAN-Party. 'Til today we were always playin' with MeatBot.
So I wondered if it would be possible to use both an tried to integrate Meatbot into Extreme+ 2.3.

Without succes 'til now.   :?

I managed to combine all scripts, with one exeptional line in the tdm.gsc
When I'd include the line, i'd get a a "script compile error".
When I leave the line, the Addbot command is unknow to Cod2.

Any suggestions? I'd appreciate any help.

Thanks in advance,

   Manticor

Offline PvtGomerPyle

  • Rank: Private
  • *
  • Posts: 577
Integrating MeatBot?
« Reply #1 on: September 14, 2008, 05:17:34 pm »
What line is causing the error???

Include full tdm.gsc

Quote

When I'd include the line, i'd get a a "script compile error".
When I leave the line, the Addbot command is unknow to Cod2.


Above is a little confusing. Please clarify......

Offline Mwh65

  • Rank: Private
  • *
  • Posts: 13
    • http://www.cod4.agls.org.uk
Integrating MeatBot?
« Reply #2 on: September 15, 2008, 03:38:23 am »
As you wish.

It's about "extremev2.3.iwd\maps\mp\gametypes\tdm.gsc"

The error appears when I include the red highlighted line to the script, due to my lack of experience, I don't know, why the error occures or how to fix it.





#include extreme\_ex_drm;

main()
{
   level.callbackStartGameType = ::Callback_StartGameType;
   level.callbackPlayerConnect = ::Callback_PlayerConnect;
   level.callbackPlayerDisconnect = ::Callback_PlayerDisconnect;
   level.callbackPlayerDamage = ::Callback_PlayerDamage;
   level.callbackPlayerKilled = ::Callback_PlayerKilled;
   maps\mp\gametypes\_callbacksetup::SetupCallbacks();

   level.autoassign = extreme\_ex_clientcontrol::menuAutoAssign;
   level.allies = extreme\_ex_clientcontrol::menuAllies;
   level.axis = extreme\_ex_clientcontrol::menuAxis;
   level.spectator = extreme\_ex_clientcontrol::menuSpectator;
   level.weapon = extreme\_ex_clientcontrol::menuWeapon;
   level.spawnplayer = ::spawnplayer;
   level.endgameconfirmed = ::endMap;

   // set eXtreme+ variables and precache
   extreme\_ex_varcache::main();
}

Callback_StartGameType()
{
   if(!isDefined(game["precachedone"]))
   {
      if( !level.ex_ranksystem)
      {
         precacheStatusIcon("hud_status_dead");
         precacheStatusIcon("hud_status_connecting");
      }
      precacheRumble("damage_heavy");
      precacheString(&"PLATFORM_PRESS_TO_SPAWN");
      maps\mp\mbot\_mbot::precache();    // MBot
      game["precachedone"] = true;
   }

   thread maps\mp\gametypes\_menus::init();
   thread maps\mp\gametypes\_serversettings::init();
   thread maps\mp\gametypes\_clientids::init();
   thread maps\mp\gametypes\_teams::init();
   thread maps\mp\gametypes\_weapons::init();
   thread maps\mp\gametypes\_scoreboard::init();
   thread maps\mp\gametypes\_killcam::init();
   thread maps\mp\gametypes\_shellshock::init();
   thread maps\mp\gametypes\_hud_teamscore::init();
   thread maps\mp\gametypes\_deathicons::init();
   thread maps\mp\gametypes\_damagefeedback::init();
   thread maps\mp\gametypes\_healthoverlay::init();
   thread maps\mp\gametypes\_friendicons::init();   
   thread maps\mp\gametypes\_spectating::init();
   thread maps\mp\gametypes\_grenadeindicators::init();
   thread maps\mp\gametypes\_landmines::init();
   thread maps\mp\gametypes\_quickmessages::init();
   thread maps\mp\gametypes\_weaponback::init();
   thread maps\mp\gametypes\_switch_scopezoom::init();
   thread extreme\_ex_varcache::postmapload();

   setClientNameMode("auto_change");

   spawnpointname = "mp_tdm_spawn";
   spawnpoints = getentarray(spawnpointname, "classname");

   if(!spawnpoints.size)
   {
      maps\mp\gametypes\_callbacksetup::AbortLevel();
      return;
   }

   for(i = 0; i < spawnpoints.size; i++)
      spawnpoints placeSpawnpoint();

   allowed[0] = "tdm";
   maps\mp\gametypes\_gameobjects::main(allowed);

   if(!isDefined(game["state"]))
      game["state"] = "playing";

   level.mapended = false;

   level.team["allies"] = 0;
   level.team["axis"] = 0;

   thread startGame();
   thread updateGametypeCvars();
   thread maps\mp\gametypes\_redirect::redirect_init();
   thread maps\mp\mbot\_mbot_tdm::init();  // MBot  

   // launch eXtreme+
   extreme\_ex_main::main();
}

dummy()
{
   waittillframeend;

   if(isdefined(self))
      level notify("connecting", self);
}

Callback_PlayerConnect()
{
   thread dummy();
   thread extreme\_ex_clientcontrol::explayerconnect();

   if( !level.ex_ranksystem)   self.statusicon = "hud_status_connecting";
   self waittill("begin");
   self.statusicon = "";

   level notify("connected", self);

   thread extreme\_ex_clientcontrol::explayerjoinedserver();

   lpselfnum = self getEntityNumber();
   lpGuid = self getGuid();
   logPrint("J;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");

   if(game["state"] == "intermission")
   {
      extreme\_ex_spawn::spawnIntermission();
      return;
   }

   level endon("intermission");

   scriptMainMenu = game["menu_ingame"];

   if(isDefined(self.pers["team"]) && self.pers["team"] != "spectator")
   {
      self setClientCvar("ui_allow_weaponchange", "1");

      if(self.pers["team"] == "allies")
         self.sessionteam = "allies";
      else
         self.sessionteam = "axis";

      if(isDefined(self.pers["weapon"]))
      {
         spawnPlayer();
      }
      else
      {
         extreme\_ex_spawn::spawnspectator();

         if(self.pers["team"] == "allies")
         {
            self openMenu(game["menu_weapon_allies"]);
            scriptMainMenu = game["menu_weapon_allies"];
         }
         else
         {
            self openMenu(game["menu_weapon_axis"]);
            scriptMainMenu = game["menu_weapon_axis"];
         }
      }
   }
   else
   {
      self setClientCvar("ui_allow_weaponchange", "0");

      if(!isDefined(self.pers["skipserverinfo"]))
      {
         self openMenu(game["menu_serverinfo"]);
         self.pers["skipserverinfo"] = true;
      }

      self.pers["team"] = "spectator";
      self.sessionteam = "spectator";

      extreme\_ex_spawn::spawnspectator();
   }

   self setClientCvar("g_scriptMainMenu", scriptMainMenu);
}

Callback_PlayerDisconnect()
{
   self extreme\_ex_clientcontrol::explayerdisconnect();
   
   if(isdefined(self.pers["team"]))
   {
      if(self.pers["team"] == "allies") setplayerteamrank(self, 0, 0);
      else if(self.pers["team"] == "axis") setplayerteamrank(self, 1, 0);
      else if(self.pers["team"] == "spectator") setplayerteamrank(self, 2, 0);
   }
   
   lpselfnum = self getEntityNumber();
   lpGuid = self getGuid();
   logPrint("Q;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");
}

Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
{
   if(self.sessionteam == "spectator" || self.ex_invulnerable) return;

   // long range hitloc modifications and messages
   if(level.ex_lrhitloc && isDefined(sMeansOfDeath) && sMeansOfDeath == "MOD_PROJECTILE")
   {
      aInfo = spawn("script_origin",(0,0,0));
      aInfo.sMeansOfDeath = sMeansOfDeath;
      aInfo.iDamage = iDamage;
      aInfo.sHitLoc = sHitLoc;
      self thread extreme\_ex_longrange_hitloc::main(eAttacker, sWeapon, vPoint, aInfo);
      sMeansOfDeath = aInfo.sMeansOfDeath;
      iDamage = aInfo.iDamage;
      sHitLoc = aInfo.sHitLoc;
      aInfo delete();
   }

   if(isDefined(sWeapon) && (
      sWeapon == "smoke_grenade_american_fire_mp" ||
      sWeapon == "smoke_grenade_russian_fire_mp" ||
      sWeapon == "smoke_grenade_british_fire_mp" ||
      sWeapon == "smoke_grenade_german_fire_mp" ||
      sWeapon == "smoke_grenade_american_gas_mp" ||
      sWeapon == "smoke_grenade_russian_gas_mp" ||
      sWeapon == "smoke_grenade_british_gas_mp" ||
      sWeapon == "smoke_grenade_german_gas_mp" ||
      sWeapon == "fire_mp" ||
      sWeapon == "gas_mp"))
   {
      if(sMeansOfDeath != "MOD_MELEE" && (
         sWeapon == "smoke_grenade_american_fire_mp" ||
         sWeapon == "smoke_grenade_russian_fire_mp" ||
         sWeapon == "smoke_grenade_british_fire_mp" ||
         sWeapon == "smoke_grenade_german_fire_mp" ||
         sWeapon == "fire_mp"))
      {
         if (!isDefined(vPoint))
            vPoint = self.origin + (0,0,11);

         if(isDefined(level.cocktail) && level.cocktail == vPoint)
            return;

         level.cocktail = vPoint;
         level thread extreme\_ex_firenades::MonitorCocktail(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.cocktail, vDir, sHitLoc, psOffsetTime);
         return;
      }
      else if(sMeansOfDeath != "MOD_MELEE" && (
         sWeapon == "smoke_grenade_american_gas_mp" ||
         sWeapon == "smoke_grenade_russian_gas_mp" ||
         sWeapon == "smoke_grenade_british_gas_mp" ||
         sWeapon == "smoke_grenade_german_gas_mp" ||
         sWeapon == "gas_mp"))
      {
         if (!isDefined(vPoint))
            vPoint = self.origin + (0,0,11);

         if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
            return;

         level.mustardgas = vPoint;
         level thread extreme\_ex_firenades::MonitorMustardGas(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
         return;
      }
   }

   friendly = undefined;

   // Don't do knockback if the damage direction was not specified
   if(!isDefined(vDir))
      iDFlags |= level.iDFLAGS_NO_KNOCKBACK;

   // check for completely getting out of the damage
   if(!(iDFlags & level.iDFLAGS_NO_PROTECTION))
   {
      if(isPlayer(eAttacker) && (self != eAttacker) && (self.pers["team"] == eAttacker.pers["team"]))
      {
         if(level.friendlyfire == "0")
         {
            return;
         }
         else if(level.friendlyfire == "1")
         {
            // Make sure at least one point of damage is done
            if(iDamage < 1)
               iDamage = 1;

            self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);

            // Shellshock/Rumble
            self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
            self playrumble("damage_heavy");
         }
         else if(level.friendlyfire == "2")
         {
            eAttacker.friendlydamage = true;

            iDamage = int(iDamage * .5);

            // Make sure at least one point of damage is done
            if(iDamage < 1)
               iDamage = 1;

            eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
            eAttacker.friendlydamage = undefined;

            friendly = true;
         }
         else if(level.friendlyfire == "3")
         {
            eAttacker.friendlydamage = true;

            iDamage = int(iDamage * .5);

            // Make sure at least one point of damage is done
            if(iDamage < 1)
               iDamage = 1;

            self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
            eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
            eAttacker.friendlydamage = undefined;

            // Shellshock/Rumble
            self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
            self playrumble("damage_heavy");

            friendly = true;
         }
      }
      else
      {
         // Make sure at least one point of damage is done
         if(iDamage < 1)
            iDamage = 1;

         self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);

         // Shellshock/Rumble
         self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
         self playrumble("damage_heavy");
      }

      if(isdefined(eAttacker) && eAttacker != self)
         eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
   }

   // Do debug print if it's enabled
   if(drm_getCvarInt("g_debugDamage"))
   {
      println("client:" + self getEntityNumber() + " health:" + self.health +
         " damage:" + iDamage + " hitLoc:" + sHitLoc);
   }

   if(self.sessionstate != "dead")
   {
      lpselfnum = self getEntityNumber();
      lpselfname = self.name;
      lpselfteam = self.pers["team"];
      lpselfGuid = self getGuid();
      lpattackerteam = "";

      if(isPlayer(eAttacker))
      {
         lpattacknum = eAttacker getEntityNumber();
         lpattackGuid = eAttacker getGuid();
         lpattackname = eAttacker.name;
         lpattackerteam = eAttacker.pers["team"];
      }
      else
      {
         lpattacknum = -1;
         lpattackGuid = "";
         lpattackname = "";
         lpattackerteam = "world";
      }

      if(isDefined(friendly))
      {
         lpattacknum = lpselfnum;
         lpattackname = lpselfname;
         lpattackGuid = lpselfGuid;
      }

      logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
   }
   self thread maps\mp\mbot\_mbot::PlayerDamage(eAttacker, iDamage, sMeansOfDeath); // Cepe7a
}

Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
{
   self endon("spawned");
   self notify("killed_player");

   if(self.sessionteam == "spectator")
      return;

   self thread extreme\_ex_main::explayerkilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc);

   // If the player was killed by a head shot, let players know it was a head shot kill
   if(sHitLoc == "head" && sMeansOfDeath != "MOD_MELEE")
      sMeansOfDeath = "MOD_HEAD_SHOT";

   // send out an obituary message to all clients about the kill
   self thread extreme\_ex_obituary::main(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc);

   maps\mp\mbot\_mbot::PlayerKilled(sMeansOfDeath); // MBot

   self maps\mp\gametypes\_weapons::dropWeapon();
   self maps\mp\gametypes\_weapons::dropOffhand();

   self.sessionstate = "dead";
   if( !level.ex_ranksystem) self.statusicon = "hud_status_dead";

   if(!isdefined(self.switching_teams))
      self.deaths++;

   lpselfnum = self getEntityNumber();
   lpselfname = self.name;
   lpselfguid = self getGuid();
   lpselfteam = self.pers["team"];
   lpattackerteam = "";

   attackerNum = -1;
   if(isPlayer(attacker))
   {
      if(attacker == self) // killed himself
      {
         doKillcam = false;

         // switching teams
         if(isdefined(self.switching_teams))
         {
            if((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies"))
            {
               players = maps\mp\gametypes\_teams::CountPlayers();
               players[self.leaving_team]--;
               players[self.joining_team]++;
                           
               if((players[self.joining_team] - players[self.leaving_team]) > 1)
                  attacker.score--;
            }
         }

         if(isdefined(attacker.friendlydamage))
            attacker iprintln(&"MP_FRIENDLY_FIRE_WILL_NOT");
      }
      else
      {
         attackerNum = attacker getEntityNumber();
         doKillcam = true;

         // Check if extra points should be given for bash or headshot
         reward_points = 0;
         if(isDefined(sMeansOfDeath))
         {
            if(sMeansOfDeath == "MOD_MELEE") reward_points = level.ex_reward_melee;
               else if(sMeansOfDeath == "MOD_HEAD_SHOT") reward_points = level.ex_reward_headshot;
         }

         points = 1 + reward_points;

         if(self.pers["team"] == attacker.pers["team"]) // killed by a friendly
         {
            if(level.ex_reward_teamkill) attacker.score -= points;
               else attacker.score--;
         }
         else
         {
            attacker.score += points;
            attacker.pers["bonus"] += reward_points;
            teamscore = getTeamScore(attacker.pers["team"]);
            teamscore += points;
            setTeamScore(attacker.pers["team"], teamscore);
            checkScoreLimit();
         }
      }

      lpattacknum = attacker getEntityNumber();
      lpattackguid = attacker getGuid();
      lpattackname = attacker.name;
      lpattackerteam = attacker.pers["team"];
   }
   else // If you weren't killed by a player, you were in the wrong place at the wrong time
   {
      doKillcam = false;

      self.score--;

      lpattacknum = -1;
      lpattackname = "";
      lpattackguid = "";
      lpattackerteam = "world";
   }

   level notify("update_teamscore_hud");

   logPrint("K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");

   // Stop thread if map ended on this death
   if(level.mapended)
      return;

   if(isdefined(self.switching_teams))
      self.ex_team_changed = true;

   self.switching_teams = undefined;
   self.joining_team = undefined;
   self.leaving_team = undefined;

   body = self cloneplayer(deathAnimDuration);
   thread maps\mp\gametypes\_deathicons::addDeathicon(body, self.clientid, self.pers["team"], 5);

   delay = 2;   // Delay the player becoming a spectator till after he's done dying
   wait delay;   // ?? Also required for Callback_PlayerKilled to complete before respawn/killcam can execute

   if(doKillcam && level.killcam)
      self maps\mp\gametypes\_killcam::killcam(attackerNum, delay, psOffsetTime, true);

   self thread respawn();
}

spawnPlayer()
{
   self endon("disconnect");
   self notify("spawned");
   self notify("end_respawn");

   resettimeout();

   // Stop shellshock and rumble
   self stopShellshock();
   self stoprumble("damage_heavy");

   self.sessionteam = self.pers["team"];
   self.sessionstate = "playing";
   self.spectatorclient = -1;
   self.archivetime = 0;
   self.psoffsettime = 0;
   self.statusicon = "";
   self.maxhealth = 100;
   self.health = self.maxhealth;
   self.friendlydamage = undefined;

   self extreme\_ex_main::exprespawn();
   
   spawnpointname = "mp_tdm_spawn";
   spawnpoints = getentarray(spawnpointname, "classname");
   spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(spawnpoints);

   if(isDefined(spawnpoint))
      self spawn(spawnpoint.origin, spawnpoint.angles);
   else
      maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");

   if(isdefined(self.isbot))
      self.spawnpoint = spawnpoint; // MBot

   if(!isDefined(self.pers["savedmodel"]))
      maps\mp\gametypes\_teams::model();
   else
      maps\mp\_utility::loadModel(self.pers["savedmodel"]);

   extreme\_ex_weapons::loadout();

   if(level.scorelimit > 0)
      self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1", level.scorelimit);
   else
      self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1_NOSCORE");
   
   waittillframeend;
   self extreme\_ex_main::expostspawn();
   self notify("spawned_player");

   self thread maps\mp\mbot\_mbot::spawnPlayer(); // MBot
}

respawn()
{
   if(!isDefined(self.pers["weapon"]))
      return;

   self endon("end_respawn");

   if(drm_getCvarInt("scr_forcerespawn") <= 0)
   {
      self thread waitRespawnButton();
      self waittill("respawn");
   }

   self thread spawnPlayer();
}

waitRespawnButton()
{
   self endon("disconnect");
   self endon("end_respawn");
   self endon("respawn");

   wait 0; // Required or the "respawn" notify could happen before it's waittill has begun

   self.respawntext = newClientHudElem(self);
   self.respawntext.horzAlign = "center_safearea";
   self.respawntext.vertAlign = "center_safearea";
   self.respawntext.alignX = "center";
   self.respawntext.alignY = "middle";
   self.respawntext.x = 0;
   self.respawntext.y = -50;
   self.respawntext.archived = false;
   self.respawntext.font = "default";
   self.respawntext.fontscale = 2;
   self.respawntext setText(&"PLATFORM_PRESS_TO_SPAWN");

   thread removeRespawnText();
   thread waitRemoveRespawnText("end_respawn");
   thread waitRemoveRespawnText("respawn");

   while(self useButtonPressed() != true)
      wait .05;

   self notify("remove_respawntext");

   self notify("respawn");
}

removeRespawnText()
{
   self waittill("remove_respawntext");

   if(isDefined(self.respawntext))
      self.respawntext destroy();
}

waitRemoveRespawnText(message)
{
   self endon("remove_respawntext");

   self waittill(message);
   self notify("remove_respawntext");
}

startGame()
{
   level.starttime = getTime();

   if(level.timelimit > 0)
   {
      extreme\_ex_gtcommon::createClock();
      level.clock setTimer(level.timelimit * 60);
   }

   for(;;)
   {
      checkTimeLimit();
      wait 1;
   }
}

endMap()
{
   alliedscore = getTeamScore("allies");
   axisscore = getTeamScore("axis");

   if(alliedscore == axisscore)
   {
      winningteam = "tie";
      losingteam = "tie";
      text = "MP_THE_GAME_IS_A_TIE";
   }
   else if(alliedscore > axisscore)
   {
      winningteam = "allies";
      losingteam = "axis";
      text = &"MP_ALLIES_WIN";
   }
   else
   {
      winningteam = "axis";
      losingteam = "allies";
      text = &"MP_AXIS_WIN";
   }

   winners = "";
   losers = "";

   if(winningteam == "allies")
      level.ex_resultsound = "MP_announcer_allies_win";
   else if(winningteam == "axis")
      level.ex_resultsound = "MP_announcer_axis_win";
   else
      level.ex_resultsound = "MP_announcer_round_draw";

   extreme\_ex_main::exendmap();

   game["state"] = "intermission";
   level notify("intermission");

   players = getentarray("player", "classname");
   for(i = 0; i < players.size; i++)
   {
      player = players;
      if((winningteam == "allies") || (winningteam == "axis"))
      {
         lpGuid = player getGuid();
         if((isDefined(player.pers["team"])) && (player.pers["team"] == winningteam))
               winners = (winners + ";" + lpGuid + ";" + player.name);
         else if((isDefined(player.pers["team"])) && (player.pers["team"] == losingteam))
               losers = (losers + ";" + lpGuid + ";" + player.name);
      }

      player closeMenu();
      player closeInGameMenu();
      player setClientCvar("cg_objectiveText", text);
      
      player extreme\_ex_spawn::spawnIntermission();
      
      if(level.ex_ranksystem)
      {
         statusicon = player thread extreme\_ex_ranksystem::get_Current_Rank();
            
         player.statusicon = statusicon;
      }
   }

   if((winningteam == "allies") || (winningteam == "axis"))
   {
      logPrint("W;" + winningteam + winners + "\n");
      logPrint("L;" + losingteam + losers + "\n");
   }

   // wait for end music to finish
   if(isdefined(level.ex_endmusic) && level.ex_endmusic == 1)
      level waittill("end_music_over");
   else wait 10;

   maps\mp\mbot\_mbot::endMap(); // MBot
}

checkTimeLimit()
{
   if(level.timelimit <= 0)
      return;

   timepassed = (getTime() - level.starttime) / 1000;
   timepassed = timepassed / 60.0;

   if(timepassed < level.timelimit)
      return;

   if(level.mapended)
      return;

   level.mapended = true;

   iprintln(&"MP_TIME_LIMIT_REACHED");
      
   level thread endMap();
}

checkScoreLimit()
{
   waittillframeend;

   if(level.scorelimit <= 0)
      return;

   if(getTeamScore("allies") < level.scorelimit && getTeamScore("axis") < level.scorelimit)
      return;

   if(level.mapended)
      return;
   level.mapended = true;

   iprintln(&"MP_SCORE_LIMIT_REACHED");
      
   level thread endMap();
}

updateGametypeCvars()
{
   for(;;)
   {
      timelimit = drm_getCvarFloat("scr_tdm_timelimit");
      if(level.timelimit != timelimit)
      {
         if(timelimit > 1440)
         {
            timelimit = 1440;
            setCvar("scr_tdm_timelimit", "1440");
         }

         level.timelimit = timelimit;
         setCvar("ui_tdm_timelimit", level.timelimit);
         level.starttime = getTime();

         if(level.timelimit > 0)
         {
            if(!isDefined(level.clock)) extreme\_ex_gtcommon::createClock();
            level.clock setTimer(level.timelimit * 60);
         }
         else
         {
            if(isDefined(level.clock))
               level.clock destroy();
         }

         checkTimeLimit();
      }

      scorelimit = drm_getCvarInt("scr_tdm_scorelimit");
      if(level.scorelimit != scorelimit)
      {
         level.scorelimit = scorelimit;
         setCvar("ui_tdm_scorelimit", level.scorelimit);
      }
      checkScoreLimit();

      wait 1;
   }
}




Offline PvtGomerPyle

  • Rank: Private
  • *
  • Posts: 577
Integrating MeatBot?
« Reply #3 on: September 15, 2008, 10:16:40 am »
The install instructions seem pretty straight forward. Did you combine the files in the mbot.iwd with the extreme 2.3 iwd???? That might be the problem.
Leave the extreme iwd unaltered and leave the mbot.iwd as a standalone and try it.

Offline Mwh65

  • Rank: Private
  • *
  • Posts: 13
    • http://www.cod4.agls.org.uk
Integrating MeatBot?
« Reply #4 on: September 15, 2008, 11:04:00 am »
That caused another "script compile error".
I figured out that the error disappears, when I remove the tdm.gsc from the mbot.iwd, but then I can't use the bots.

Offline PvtGomerPyle

  • Rank: Private
  • *
  • Posts: 577
Integrating MeatBot?
« Reply #5 on: September 15, 2008, 12:34:36 pm »
Well I guess the only thing to do is keep "experimenting"
I have 2.4 installed but don't have the time to try what you are trying.....
Good luck with it

Offline PatmanSan

  • Administrator
  • Rank: Private
  • *****
  • Posts: 2527
Re: Integrating MeatBot?
« Reply #6 on: April 16, 2009, 12:46:21 pm »
MeatBots integration has been completed. They will be available in the 2.5 release.

Offline Joker{eXtreme}

  • Rank: Private
  • *
  • Posts: 6108
    • http://www.mycallofduty.com
Re: Integrating MeatBot?
« Reply #7 on: April 16, 2009, 12:48:44 pm »
WOOHOO - Excellant work ;)