Author Topic: Custom SpeedKart Gamemode (Code Help!)  (Read 2821 times)

Hey!

Just make a quick custom SpeedKart gamemode. Everything is in place, Add-On's ready for start up. I start the gamemode, I'm floating on water. This is the code for the gamemode, I would GREATLY appreciate it if anyone can help me solve this issue. I have every single track that has been released on the forums. I need the tracks to rotate like normal SpeedKart, basically just load because nothing is loading.
Here is the code..
Quote
if($pref::Server::SpeedKart::RoundLimit $= "")
{
   $pref::Server::SpeedKart::RoundLimit = 8;
}

$SK::Initialized = false;

function SK_BuildTrackList()
{
   //
   %pattern = "Add-Ons/SpeedKart_Glacial_Run/save.bls";
   %pattern = "Add-Ons/SpeedKart_Lighthouse/save.bls";
   %pattern = "Add-Ons/SpeedKart_Red_Raceway/save.bls";
   %pattern = "Add-Ons/SpeedKart_Sand_Castle/save.bls";
   %pattern = "Add-Ons/SpeedKart_North_Pole/save.bls";
   %pattern = "Add-Ons/SpeedKart_GreenHills/save.bls";
   %pattern = "Add-Ons/SpeedKart_Descent/save.bls";
   %pattern = "Add-Ons/SpeedKart_Harbor/save.bls";
   %pattern = "Add-Ons/SpeedKart_PacTrax_Curvature/save.bls";
   %pattern = "Add-Ons/SpeedKart_Hydro_Plant/save.bls";
   %pattern = "Add-Ons/SpeedKart_Sierra_Island/save.bls";
   %pattern = "Add-Ons/SpeedKart_Volcano/save.bls";
  
   $SK::numTracks = 12;
  
   %file = findFirstFile(%pattern);
   while(%file !$= "Add-Ons/SpeedKart_Glacial_Run/save.bls")
   {
      $SK::Track[$SK::numTracks] = %file;
      $SK::numTracks++;

      %file = findNextFile(%pattern);
   }
}

function SK_DumpTrackList()
{
   echo("");
   if($SK::numTracks == 1)
      echo("1 track");
   else
      echo($SK::numTracks @ " tracks");
   for(%i = 0; %i < $SK::numTracks; %i++)
   {
      %displayName = $SK::Track[%i];
      %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
      %displayName = strReplace(%displayName, "/save.bls", "");
      %displayName = strReplace(%displayName, "_", " ");

      if(%i == $SK::CurrentTrack)
         echo(" >" @ %displayName);
      else
         echo("  " @ %displayName);
   }
   echo("");
}

function SK_NextTrack()
{
   $SK::CurrentTrack = mFloor($SK::CurrentTrack);
   $SK::CurrentTrack++;
   $SK::CurrentTrack = $SK::CurrentTrack % $SK::numTracks;

   $SK::ResetCount = 0;

   SK_LoadTrack_Phase1($SK::Track[$SK::CurrentTrack]);
}

function SK_LoadTrack_Phase1(%filename)
{
   //suspend minigame resets
   $SK::MapChange = 1;

   //put everyone in observer mode
   %mg = $DefaultMiniGame;
   if(!isObject(%mg))
   {
      error("ERROR: SK_LoadTrack( " @ %filename  @ " ) - default minigame does not exist");
      return;
   }
   for(%i = 0; %i < %mg.numMembers; %i++)
   {
      %client = %mg.member[%i];
      %player = %client.player;
      if(isObject(%player))
         %player.delete();

      %camera = %client.camera;
      %camera.setFlyMode();
      %camera.mode = "Observer";
      %client.setControlObject(%camera);
   }
  
   //clear all bricks
   // note: this function is deferred, so we'll have to set a callback to be triggered when it's done
   BrickGroup_888888.chaindelete callback = "SK_LoadTrack_Phase2(\"" @ %filename @ "\");";
   BrickGroup_888888.chaindelete all();
}

function SK_LoadTrack_Phase2(%filename)
{
   echo("Loading speedkart track " @ %filename);

   %displayName = %filename;
   %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
   %displayName = strReplace(%displayName, "/save.bls", "");
   %displayName = strReplace(%displayName, "_", " ");
  
   %loadMsg = "\c5Now loading \c6" @ %displayName;

   //read and display credits file, if it exists
   // limited to one line
   %creditsFilename = filePath(%fileName) @ "/credits.txt";
   if(isFile(%creditsFilename))
   {
      %file = new FileObject();
      %file.openforRead(%creditsFilename);

      %line = %file.readLine();
      %line = stripMLControlChars(%line);
      %loadMsg = %loadMsg @ "\c5, created by \c3" @ %line;

      %file.close();
      %file.delete();
   }

   messageAll('', %loadMsg);

   //load environment if it exists
   %envFile = filePath(%fileName) @ "/environment.txt";
   if(isFile(%envFile))
   {  
      //echo("parsing env file " @ %envFile);
      //usage: GameModeGuiServer::ParseGameModeFile(%filename, %append);
      //if %append == 0, all minigame variables will be cleared
      %res = GameModeGuiServer::ParseGameModeFile(%envFile, 1);

      EnvGuiServer::getIdxFromFilenames();
      EnvGuiServer::SetSimpleMode();

      if(!$EnvGuiServer::SimpleMode)    
      {
         EnvGuiServer::fillAdvancedVarsFromSimple();
         EnvGuiServer::SetAdvancedMode();
      }
   }
  
   //load save file
   schedule(10, 0, serverDirectSaveFileLoad, %fileName, 3, "", 2, 1);
}


//some horrible /commands to change tracks and such
function serverCmdTrackList(%client)
{
   for(%i = 0; %i < $SK::numTracks; %i++)
   {
      %displayName = $SK::Track[%i];
      %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
      %displayName = strReplace(%displayName, "/save.bls", "");
      %displayName = strReplace(%displayName, "_", " ");

      if(%i == $SK::CurrentTrack)
         messageClient(%client, '', " >" @ %i @ ". \c6" @ %displayName);
      else
         messageClient(%client, '', "  " @ %i @ ". \c6" @ %displayName);
   }
}
function serverCmdSetTrack(%client, %i)
{
   if(!%client.isAdmin)
      return;

   if(mFloor(%i) !$= %i)
   {
      messageClient(%client, '', "Usage: /setTrack <number>");
      return;
   }

   if(%i < 0 || %i > $SK::numTracks)
   {
      messageClient(%client, '', "serverCmdSetTrack() - out of range index");
      return;
   }

   messageAll( 'MsgAdminForce', '\c3%1\c2 changed the track', %client.getPlayerName());
  
   $SK::CurrentTrack = %i - 1;
   SK_NextTrack();
}

function serverCmdNextTrack(%client, %i)
{
   if(!%client.isAdmin)
      return;

   messageAll( 'MsgAdminForce', '\c3%1\c2 changed the track', %client.getPlayerName());
  
   SK_NextTrack();
}

package GameModeSpeedKartPackage
{
   //this is called when save loading finishes
   function GameModeInitialResetCheck()
   {
      Parent::GameModeInitialResetCheck();

      //if there is no track list, attempt to create it
      if($SK::numTracks == 0)
         SK_BuildTrackList();
      
      //if tracklist is still empty, there are no tracks
      if($SK::numTracks == 0)
      {
         messageAll('', "\c5No SpeedKart tracks available!");
         return;
      }

      if($SK::Initialized)
         return;

      $SK::Initialized = true;
      $SK::CurrentTrack = -1;
            
      SK_NextTrack();
   }

   //when we're done loading a new track, reset the minigame
   function ServerLoadSaveFile_End()
   {
      Parent::ServerLoadSaveFile_End();

      //new track has loaded, reset minigame
      if($DefaultMiniGame.numMembers > 0) //don't bother if no one is here (this also prevents starting at round 2 on server creation)
         $DefaultMiniGame.scheduleReset(); //don't do it instantly, to give people a little bit of time to ghost
   }
  
   //vehicles should explode in water
   function VehicleData::onEnterLiquid(%data, %obj, %coverage, %type)
   {
      Parent::onEnterLiquid(%data, %obj, %coverage, %type);

      %obj.damage(%obj, %obj.getPosition(), 10000, $DamageType::Lava);
      %obj.finalExplosion();
   }

   //players should die in water
   function Armor::onEnterLiquid(%data, %obj, %coverage, %type)
   {
      Parent::onEnterLiquid(%data, %obj, %coverage, %type);
      %obj.hasShotOnce = true;
      %obj.invulnerable = false;
      %obj.damage(%obj, %obj.getPosition(), 10000, $DamageType::Lava);
   }

   //when vehicle spawns, it cannot move (event must enable it)
   //this solves the driving through the garage problem
   function WheeledVehicleData::onAdd(%data,%obj)
   {
      Parent::onAdd(%data, %obj);

      for(%i = 0; %i < %data.numWheels; %i++)
         %obj.setWheelPowered(%i, %on);
   }

   //also you cannot click-push a vehicle while it is in non-moving mode
   function vehicle::OnActivate(%vehicle, %activatingObj, %activatingClient, %pos, %vec)
   {
      //just check a wheel
      if(!%vehicle.getWheelPowered(2))
         return;

      Parent::OnActivate(%vehicle, %activatingObj, %activatingClient, %pos, %vec);
   }


   //if you kill yourself in a vehicle, kill the vehicle
   function serverCmdSelf Delete(%client)
   {
      %player = %client.player;
      if(!isObject(%player))
         return;
      
      %vehicle = %player.getObjectMount();

      //kill the vehicle we're in
      if(isObject(%vehicle))
      {
         //if wheels are not powered, we're probably at the start of the race, so don't allow Self Delete in a vehicle
         %poweredTime = getSimTime() - %vehicle.poweredTime;
         %doBuzzer = false;
         if(%vehicle.getClassName() $= "AIPlayer")
            %doBuzzer = true;
         else if(!%vehicle.getWheelPowered(2) || %poweredTime < 8000)
            %doBuzzer = true;

         if(%doBuzzer)
         {
            //spam protect the buzzer enough to prevent serious problems
            if(getSimTime() - %player.lastSelf DeleteBuzzerTime > 200)
            {
               %player.lastSelf DeleteBuzzerTime = getSimTime();
               serverPlay3d("Beep_No_Sound", %vehicle.getPosition());
            }
            return;
         }

         //if vehicle is on fire, do final explosion
         //otherwise kill vehicle
         if(%vehicle.getDamagePercent() >= 1.0)
            %vehicle.finalExplosion();
         else
         {
            %vehicle.damage(%vehicle, %vehicle.getPosition(), 10000, $DamageType::Default);        
            %player.burnPlayer(5);
         }
      }
      else
      {        
         //no vehicle, normal Self Delete
         Parent::ServerCmdSelf Delete(%client);
         return;
      }

   }
      
   //resume death animation after corpse is booted out of burning vehicle
   function Armor::onUnmount(%data, %obj, %slot)
   {
      Parent::onUnmount(%data, %obj, %slot);

      if(%obj.getDamagePercent() >= 1)
      {
         %obj.playthread(3, "death1");
      }
   }
  
   //if smoeone gets back into a garage after the game starts, we don't want them to be able to press a button and respawn someone's cart from under them
   function fxDTSBrick::setVehicle(%obj, %data, %client)
   {
      if(isObject(%obj.vehicle))
      {
         //vehicle exists, if it is far from spawn, don't do this event
         %vec = vectorSub(%obj.vehicle.getPosition(), %obj.getPosition());
         %dist = vectorLen(%vec);
         if(%dist > 10)
         {
            return;
         }
      }

      Parent::setVehicle(%obj, %data, %client);
   }
  
   //total hack: when a vehicle is turned on record the start-of-race time
   // other options would be to make another event or add in a time offset
   function fxDTSBrick::setVehiclePowered(%obj, %on, %client)
   {
      Parent::setVehiclePowered(%obj, %on, %client);

      if(%on)
      {
         if(isObject($DefaultMiniGame))
         {
            if($DefaultMiniGame.raceStartTime <= 0)
               $DefaultMiniGame.raceStartTime = getSimTime();
         }
      }
   }

   function MiniGameSO::Reset(%obj, %client)
   {
      //make sure this value is an number
      $pref::Server::SpeedKart::RoundLimit = mFloor($pref::Server::SpeedKart::RoundLimit);

      //handle our race time hack
      %obj.raceStartTime = 0;

      //count number of minigame resets, when we reach the limit, go to next track
      if(%obj.numMembers >= 0)
      {
         $SK::ResetCount++;
      }

      if($SK::ResetCount > $pref::Server::SpeedKart::RoundLimit)
      {
         $SK::ResetCount = 0;
         SK_NextTrack();
      }
      else
      {
         messageAll('', "\c5Beginning round " @ $SK::ResetCount @ " of " @ $pref::Server::SpeedKart::RoundLimit);
         Parent::Reset(%obj, %client);
      }
   }  
};
activatePackage(GameModeSpeedKartPackage);

// more time to fly out of a burning car
$CorpseTimeoutValue = 7000;

//special event to explode vehicles that are left in the garage
registerOutputEvent("fxDTSBrick", "explodeNearVehicle", "");
function fxDTSBrick::explodeNearVehicle(%obj)
{
   %vehicle = %obj.vehicle;
   if(!isObject(%vehicle))
      return;

   %delta = vectorSub(%vehicle.getPosition(), %obj.getPosition());
   //echo("len = " @ vectorLen(%delta));
   if(vectorLen(%delta) < 5) //7.5)
      %vehicle.finalExplosion(); //damage(%vehicle, %vehicle.getPosition(), 10000, $DamageType::Default);
}


//special event to win the race, displays race time
registerOutputEvent("GameConnection", "winRace", "");
function GameConnection::winRace(%client)
{
   %mg = %client.miniGame;

   if(!isObject(%mg))
      %mg = $DefaultMiniGame;

   if(!isObject(%mg))
      return;

   //if race start time is not available, use time since last reset
   %startTime = %mg.raceStartTime;
   if(%startTime <= 0)
      %startTime = %mg.lastResetTime;

   %elapsedTime = getSimTime() - %startTime;
   %elapsedTime = mFloor(%elapsedTime / 1000);
  
   %mg.chatMessageAll(0,  "\c3" @ %client.getPlayerName() @ " \c5WON THE RACE IN \c6" @ getTimeString(%elapsedTime) @ "\c3!");
   %mg.scheduleReset(7000);
}  

Heres the gamemode .txt
Quote
//Default stuff...
ADDON Brick_Arch
ADDON Brick_Large_Cubes

ADDON Support_Player_Persistence
ADDON Brick_Treasure_Chest

ADDON Brick_V15
ADDON Emote_Alarm
ADDON Emote_Confusion
ADDON Emote_Hate
ADDON Emote_Love
ADDON Light_Animated
ADDON Light_Basic
ADDON Particle_Basic
ADDON Particle_FX_Cans
ADDON Particle_Player
ADDON Particle_Tools
ADDON Particle_Grass
ADDON Player_No_Jet
ADDON Print_1x2f_Default
ADDON Print_2x2f_Default
ADDON Print_2x2r_Default
ADDON Print_Letters_Default
ADDON Sound_Beeps
ADDON Sound_Phone
ADDON Sound_Synth4
ADDON Script_AdvanceLight
ADDON Server_SloMoDeath
ADDON Script_VehicleStereo

ADDON Vehicle_Pirate_Cannon
ADDON Vehicle_Tank
ADDON Weapon_Rocket_Launcher
ADDON Projectile_GravityRocket
ADDON Vehicle_Jeep
ADDON Vehicle_Horse
ADDON Vehicle_Rowboat
ADDON Weapon_Bow
ADDON Weapon_Spear
ADDON Weapon_Sword

ADDON Support_Doors
ADDON Brick_Doors

ADDON Brick_Halloween
ADDON Brick_Teledoor
ADDON Brick_Christmas_Tree


//Kart racing stuff...
ADDON Brick_ModTer_BasicPack
ADDON Brick_ModTer_InvertedPack
ADDON Print_ModTer_Default
ADDON GameMode_SpeedKart
ADDON Server_VehicleGore
ADDON Event_Camera_Control
ADDON Vehicle_Speedkart
ADDON SpeedKart_Glacial_Run
ADDON SpeedKart_Lighthouse
ADDON Speedkart_Red_Raceway
ADDON SpeedKart_Sand_Castle
ADDON SpeedKart_North_Pole
ADDON SpeedKart_GreenHills
ADDON SpeedKart_Descent
ADDON SpeedKart_Harbor
ADDON SpeedKart_PacTrax_Curvature
ADDON SpeedKart_Frozer
ADDON SpeedKart_Hydro_Plant
ADDON SpeedKart_Sierra_Island
ADDON SpeedKart_Volcano


//bots
ADDON Bot_Hole
ADDON Bot_Blockhead
ADDON Bot_Horse
ADDON Bot_Shark
ADDON Bot_Zombie

//for bandito
ADDON Weapon_Gun
ADDON Weapon_Guns_Akimbo

MUSIC Rainbow_MK64
MUSIC Mountain_MK64
MUSIC Jungle_MK64
MUSIC Highway_MK64
MUSIC Desert_MK64
MUSIC Beach_MK64
MUSIC Circut_MK64
MUSIC Snow_MK64

//environment
$EnvGuiServer::SimpleMode 0
$EnvGuiServer::SkyFile Add-Ons/Sky_Skylands/Skylands.dml
$EnvGuiServer::WaterFile Add-Ons/Water_Brick/brick.water
$EnvGuiServer::GroundFile Add-Ons/Ground_Plate/plate.ground
$EnvGuiServer::SunFlareTopTexture base/lighting/flare2.png
$EnvGuiServer::SunFlareBottomTexture base/lighting/corona2.png
$EnvGuiServer::DayOffset 0
$EnvGuiServer::DayLength 300
$EnvGuiServer::DayCycleEnabled 0
$EnvGuiServer::DayCycle Add-Ons/DayCycle_Default/default.daycycle
$EnvGuiServer::Sunational socialistmuth 238
$EnvGuiServer::SunElevation 21
$EnvGuiServer::DirectLightColor 1.000000 0.915888 0.836449 1.000000
$EnvGuiServer::AmbientLightColor 0.612150 0.592126 0.592126 1.000000
$EnvGuiServer::ShadowColor 0.000000 0.498211 0.579439 1.000000
$EnvGuiServer::SunFlareColor 0.200000 0.200000 0.200000 1.000000
$EnvGuiServer::SunFlareSize 2.25641
$EnvGuiServer::VisibleDistance 753.744
$EnvGuiServer::FogDistance 471.795
$EnvGuiServer::FogHeight
$EnvGuiServer::FogColor 0.771028 0.826666 1.000000 1.000000
$EnvGuiServer::WaterColor 0.172897 0.630841 1.000000 0.827103
$EnvGuiServer::WaterHeight 5
$EnvGuiServer::UnderWaterColor 140 178 255 134
$EnvGuiServer::SkyColor 1.000000 1.000000 0.785047 1.000000
$EnvGuiServer::WaterScrollX 0
$EnvGuiServer::WaterScrollY 0
$EnvGuiServer::GroundColor 1.000000 0.816578 0.607477 1.000000
$EnvGuiServer::GroundScrollX 0
$EnvGuiServer::GroundScrollY 0
$EnvGuiServer::VignetteMultiply 0
$EnvGuiServer::VignetteColor 0.000000 0.000000 0.000000 0.392157



//minigame rules
$MiniGame::Enabled 1
$MiniGame::GameColor 0
$MiniGame::InviteOnly 0
$MiniGame::IncludeAllPlayersBricks 1
$MiniGame::PlayersUseOwnBricks 0

$MiniGame::Points_BreakBrick 0
$MiniGame::Points_PlantBrick 0
$MiniGame::Points_KillPlayer 1
$MiniGame::Points_KillBot 0
$MiniGame::Points_KillSelf   -1
$MiniGame::Points_Die 0
   
$MiniGame::RespawnTime -1
$MiniGame::VehicleRespawnTime -1
$MiniGame::BrickRespawnTime 60
$MiniGame::BotRespawnTime 5

$MiniGame::UseSpawnBricks 1
$MiniGame::FallingDamage 1
$MiniGame::WeaponDamage 1
$MiniGame::SelfDamage 1
$MiniGame::VehicleDamage 1
$MiniGame::BrickDamage 1
$MiniGame::BotDamage 1
$MiniGame::EnableWand 0
$MiniGame::EnableBuilding 0
$MiniGame::EnablePainting 0

$MiniGame::PlayerDataBlockName No-Jet Player

$MiniGame::StartEquipName0 0
$MiniGame::StartEquipName1 0
$MiniGame::StartEquipName2 0
$MiniGame::StartEquipName3 0
$MiniGame::StartEquipName4 0

$MiniGame::TimeLimit 240




$Server::Quota::Schedules 9999
$Server::Quota::Misc 999
$Server::Quota::Projectile 999
$Server::Quota::Item 999
$Server::Quota::Environment 9999
$Server::Quota::Player 100
$Server::Quota::Vehicle 50
$Server::MaxPhysVehicles_Total 20
« Last Edit: September 29, 2014, 05:30:33 AM by Yoke »

Solution: Re-download the SpeedKart Gamemode then don't forget with the code.

Solution: Re-download the SpeedKart Gamemode then don't forget with the code.
That's not a solution. But I do appreciate your 0% effort.

That's not a solution. But I do appreciate your 0% effort.
That is a solution because some idiot has forgeted over the code by altering %pattern and trying to manually define all the speedkart tracks within a function that automagically does it all for you. So whoever messed with your Speedkart files there really forgeted up. Solution: Re-download the gamemode and then don't forget with the files.

That is a solution because some idiot has forgeted over the code by altering %pattern and trying to manually define all the speedkart tracks within a function that automagically does it all for you. So whoever messed with your Speedkart files there really forgeted up. Solution: Re-download the gamemode and then don't forget with the files.
No one screwed up the file, I was attempting to make a custom SpeedKart gamemode. I have all the files necessary. I'm not sure how to put it together, that's all. Yes, I do have the original file with the original code. But the purpose of this topic was to see if anyone could help me fix the code wherever the errors may lie. I'm new to coding, yet you cannot learn if you do not try. But I do understand what you're trying to point out.
« Last Edit: September 29, 2014, 12:36:46 PM by Yoke »

Quote
if($pref::Server::SpeedKart::RoundLimit $= "")
{
   $pref::Server::SpeedKart::RoundLimit = 8;
}

$SK::Initialized = false;


function SK_ResetSelf DeleteGambling()
{
   //scramble the Self Delete prevention timer, so people can't game it with client scripts
   $SK::Self DeleteBufferTime = 6000 + getRandom() * 4000;
   //clear Self Delete gambling winner
   $SK::LastSelf Deleter = 0;

   if(isEventPending($SK::Self DeleteGamblingEvent))
      cancel($SK::Self DeleteGamblingEvent);
   $SK::Self DeleteGamblingEvent = 0;
}

function SK_BuildTrackList()
{
   //
   %pattern = "Add-Ons/SpeedKart_*/save.bls";
   
   $SK::numTracks = 0;
   
   %file = findFirstFile(%pattern);
   while(%file !$= "")
   {
      $SK::Track[$SK::numTracks] = %file;
      $SK::numTracks++;

      %file = findNextFile(%pattern);
   }
}

function SK_DumpTrackList()
{
   echo("");
   if($SK::numTracks == 1)
      echo("1 track");
   else
      echo($SK::numTracks @ " tracks");
   for(%i = 0; %i < $SK::numTracks; %i++)
   {
      %displayName = $SK::Track[%i];
      %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
      %displayName = strReplace(%displayName, "/save.bls", "");
      %displayName = strReplace(%displayName, "_", " ");

      if(%i == $SK::CurrentTrack)
         echo(" >" @ %displayName);
      else
         echo("  " @ %displayName);
   }
   echo("");
}

function SK_NextTrack()
{
   $SK::CurrentTrack = mFloor($SK::CurrentTrack);
   $SK::CurrentTrack++;
   $SK::CurrentTrack = $SK::CurrentTrack % $SK::numTracks;

   $SK::ResetCount = 0;

   SK_LoadTrack_Phase1($SK::Track[$SK::CurrentTrack]);
}

function SK_LoadTrack_Phase1(%filename)
{
   //suspend minigame resets
   $SK::MapChange = 1;

   //put everyone in observer mode
   %mg = $DefaultMiniGame;
   if(!isObject(%mg))
   {
      error("ERROR: SK_LoadTrack( " @ %filename  @ " ) - default minigame does not exist");
      return;
   }
   for(%i = 0; %i < %mg.numMembers; %i++)
   {
      %client = %mg.member[%i];
      %player = %client.player;
      if(isObject(%player))
         %player.delete();

      %camera = %client.camera;
      %camera.setFlyMode();
      %camera.mode = "Observer";
      %client.setControlObject(%camera);
   }
   
   //clear all bricks
   // note: this function is deferred, so we'll have to set a callback to be triggered when it's done
   BrickGroup_888888.chaindelete callback = "SK_LoadTrack_Phase2(\"" @ %filename @ "\");";
   BrickGroup_888888.chaindelete all();
}

function SK_LoadTrack_Phase2(%filename)
{
   echo("Loading speedkart track " @ %filename);

   %displayName = %filename;
   %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
   %displayName = strReplace(%displayName, "/save.bls", "");
   %displayName = strReplace(%displayName, "_", " ");
   
   %loadMsg = "\c5Now loading \c6" @ %displayName;

   //read and display credits file, if it exists
   // limited to one line
   %creditsFilename = filePath(%fileName) @ "/credits.txt";
   if(isFile(%creditsFilename))
   {
      %file = new FileObject();
      %file.openforRead(%creditsFilename);

      %line = %file.readLine();
      %line = stripMLControlChars(%line);
      %loadMsg = %loadMsg @ "\c5, created by \c3" @ %line;

      %file.close();
      %file.delete();
   }

   messageAll('', %loadMsg);

   //load environment if it exists
   %envFile = filePath(%fileName) @ "/environment.txt";
   if(isFile(%envFile))
   { 
      //echo("parsing env file " @ %envFile);
      //usage: GameModeGuiServer::ParseGameModeFile(%filename, %append);
      //if %append == 0, all minigame variables will be cleared
      %res = GameModeGuiServer::ParseGameModeFile(%envFile, 1);

      EnvGuiServer::getIdxFromFilenames();
      EnvGuiServer::SetSimpleMode();

      if(!$EnvGuiServer::SimpleMode)     
      {
         EnvGuiServer::fillAdvancedVarsFromSimple();
         EnvGuiServer::SetAdvancedMode();
      }
   }
   
   //load save file
   schedule(10, 0, serverDirectSaveFileLoad, %fileName, 3, "", 2, 1);
}


//some horrible /commands to change tracks and such
function serverCmdTrackList(%client)
{
   for(%i = 0; %i < $SK::numTracks; %i++)
   {
      %displayName = $SK::Track[%i];
      %displayName = strReplace(%displayName, "Add-Ons/SpeedKart_", "");
      %displayName = strReplace(%displayName, "/save.bls", "");
      %displayName = strReplace(%displayName, "_", " ");

      if(%i == $SK::CurrentTrack)
         messageClient(%client, '', " >" @ %i @ ". \c6" @ %displayName);
      else
         messageClient(%client, '', "  " @ %i @ ". \c6" @ %displayName);
   }
}
function serverCmdSetTrack(%client, %i)
{
   if(!%client.isAdmin)
      return;

   if(mFloor(%i) !$= %i)
   {
      messageClient(%client, '', "Usage: /setTrack <number>");
      return;
   }

   if(%i < 0 || %i > $SK::numTracks)
   {
      messageClient(%client, '', "serverCmdSetTrack() - out of range index");
      return;
   }

   messageAll( 'MsgAdminForce', '\c3%1\c2 changed the track', %client.getPlayerName());
   
   $SK::CurrentTrack = %i - 1;
   SK_NextTrack();
}

function serverCmdNextTrack(%client, %i)
{
   if(!%client.isAdmin)
      return;

   messageAll( 'MsgAdminForce', '\c3%1\c2 changed the track', %client.getPlayerName());
   
   SK_NextTrack();
}

package GameModeSpeedKartPackage
{
   //this is called when save loading finishes
   function GameModeInitialResetCheck()
   {
      Parent::GameModeInitialResetCheck();

      //if there is no track list, attempt to create it
      if($SK::numTracks == 0)
         SK_BuildTrackList();
     
      //if tracklist is still empty, there are no tracks
      if($SK::numTracks == 0)
      {
         messageAll('', "\c5No SpeedKart tracks available!");
         return;
      }

      if($SK::Initialized)
         return;

      $SK::Initialized = true;
      $SK::CurrentTrack = -1;
           
      SK_NextTrack();
   }

   //when we're done loading a new track, reset the minigame
   function ServerLoadSaveFile_End()
   {
      Parent::ServerLoadSaveFile_End();

      //new track has loaded, reset minigame
      if($DefaultMiniGame.numMembers > 0) //don't bother if no one is here (this also prevents starting at round 2 on server creation)
         $DefaultMiniGame.scheduleReset(); //don't do it instantly, to give people a little bit of time to ghost

      SK_ResetSelf DeleteGambling();
   }
   
   //vehicles should explode in water
   function VehicleData::onEnterLiquid(%data, %obj, %coverage, %type)
   {
      Parent::onEnterLiquid(%data, %obj, %coverage, %type);

      %obj.damage(%obj, %obj.getPosition(), 10000, $DamageType::Lava);
      %obj.finalExplosion();
   }

   //players should die in water
   function Armor::onEnterLiquid(%data, %obj, %coverage, %type)
   {
      Parent::onEnterLiquid(%data, %obj, %coverage, %type);
      %obj.hasShotOnce = true;
      %obj.invulnerable = false;
      %obj.damage(%obj, %obj.getPosition(), 10000, $DamageType::Lava);
   }

   //when vehicle spawns, it cannot move (event must enable it)
   //this solves the driving through the garage problem
   function WheeledVehicleData::onAdd(%data,%obj)
   {
      Parent::onAdd(%data, %obj);

      for(%i = 0; %i < %data.numWheels; %i++)
         %obj.setWheelPowered(%i, %on);
   }

   //also you cannot click-push a vehicle while it is in non-moving mode
   function vehicle::OnActivate(%vehicle, %activatingObj, %activatingClient, %pos, %vec)
   {
      //just check a wheel
      if(!%vehicle.getWheelPowered(2))
         return;

      Parent::OnActivate(%vehicle, %activatingObj, %activatingClient, %pos, %vec);
   }

   function SK_Self DeleteGamblingCheck()
   {
      //check for duplicate schedules
      if(isEventPending($SK::Self DeleteGambleEvent)) 
         cancel($SK::Self DeleteGambleEvent);
      $SK::Self DeleteGambleEvent = 0;

      if(!isObject($SK::LastSelf Deleter))
         return;

      if($SK::LastSelf Deleter.getClassName() !$= "GameConnection")
         return;
     
      %player = $SK::LastSelf Deleter.player;
      if(!isObject(%player))
         return;

      //last Self Deleter is valid, give them a win emote
      %player.emote(winStarProjectile, 1);
      %player.playAudio(0, rewardSound);
   }

   //if you kill yourself in a vehicle, kill the vehicle
   function serverCmdSelf Delete(%client)
   {
      %player = %client.player;
      if(!isObject(%player))
         return;
     
      %vehicle = %player.getObjectMount();

      //kill the vehicle we're in
      if(isObject(%vehicle))
      {
         //if wheels are not powered, we're probably at the start of the race, so don't allow Self Delete in a vehicle
         %elapsedTime = getSimTime() - %vehicle.poweredTime;
         %doBuzzer = false;
         if(%vehicle.getClassName() $= "AIPlayer")
            %doBuzzer = true;
         else if(!%vehicle.getWheelPowered(2) || %elapsedTime <  $SK::Self DeleteBufferTime )
            %doBuzzer = true;

         if(%doBuzzer)
         {
            //if it isn't running already, start the Self Delete gambling check
            //we don't have a "start race" function, so we're shoe-horning it in here
            if(!isEventPending($SK::Self DeleteGamblingEvent) && (%vehicle.poweredTime > 0))
            { 
               //10 seconds is maximum time of Self Delete prevention
               if(%elapsedTime < $SK::Self DeleteBufferTime)
               {
                  $SK::Self DeleteGamblingEvent = schedule(11000 - %elapsedTime, 0, SK_Self DeleteGamblingCheck);
               }
            }
           
            //remember last person to hit the Self Delete buzzer
            $SK::LastSelf Deleter = %client;

            //spam protect the buzzer enough to prevent serious problems
            if(getSimTime() - %player.lastSelf DeleteBuzzerTime > 200)
            {
               %player.lastSelf DeleteBuzzerTime = getSimTime();
               %player.playAudio(0, "Beep_No_Sound");
            }
            return;
         }

         //special reward for Self Delete gambling winner
         if($SK::LastSelf Deleter == %client && !isEventPending($SK::Self DeleteGamblingEvent))
         {
            %player.playAudio(0, SK_gwScream);
            $SK::LastSelf Deleter = 0;
            return;
         }

         //if vehicle is on fire, do final explosion
         //otherwise kill vehicle
         if(%vehicle.getDamagePercent() >= 1.0)
            %vehicle.finalExplosion();
         else
         {
            %vehicle.damage(%vehicle, %vehicle.getPosition(), 10000, $DamageType::Default);       
            %player.burnPlayer(5);
         }
      }
      else
      {         
         //no vehicle, normal Self Delete

         //special reward for Self Delete gambling winner
         if($SK::LastSelf Deleter == %client && !isEventPending($SK::Self DeleteGamblingEvent))
         {
            %player.playAudio(0, SK_gwScream);
            $SK::LastSelf Deleter = 0;
            return;
         }

         Parent::ServerCmdSelf Delete(%client);
         return;
      }

   }
     
   //resume death animation after corpse is booted out of burning vehicle
   function Armor::onUnmount(%data, %obj, %slot)
   {
      Parent::onUnmount(%data, %obj, %slot);

      if(%obj.getDamagePercent() >= 1)
      {
         %obj.playthread(3, "death1");
      }
   }
   
   //if smoeone gets back into a garage after the game starts, we don't want them to be able to press a button and respawn someone's cart from under them
   function fxDTSBrick::setVehicle(%obj, %data, %client)
   {
      if(isObject(%obj.vehicle))
      {
         //vehicle exists, if it is far from spawn, don't do this event
         %vec = vectorSub(%obj.vehicle.getPosition(), %obj.getPosition());
         %dist = vectorLen(%vec);
         if(%dist > 10)
         {
            return;
         }
      }

      Parent::setVehicle(%obj, %data, %client);
   }
   
   //total hack: when a vehicle is turned on record the start-of-race time
   // other options would be to make another event or add in a time offset
   function fxDTSBrick::setVehiclePowered(%obj, %on, %client)
   {
      Parent::setVehiclePowered(%obj, %on, %client);

      if(%on)
      {
         if(isObject($DefaultMiniGame))
         {
            if($DefaultMiniGame.raceStartTime <= 0)
               $DefaultMiniGame.raceStartTime = getSimTime();
         }
      }
   }

   function MiniGameSO::Reset(%obj, %client)
   {
      //make sure this value is an number
      $pref::Server::SpeedKart::RoundLimit = mFloor($pref::Server::SpeedKart::RoundLimit);

      //handle our race time hack
      %obj.raceStartTime = 0;

      //count number of minigame resets, when we reach the limit, go to next track
      if(%obj.numMembers >= 0)
      {
         $SK::ResetCount++;
      }

      if($SK::ResetCount > $pref::Server::SpeedKart::RoundLimit)
      {
         $SK::ResetCount = 0;
         SK_NextTrack();
      }
      else
      {
         messageAll('', "\c5Beginning round " @ $SK::ResetCount @ " of " @ $pref::Server::SpeedKart::RoundLimit);
         Parent::Reset(%obj, %client);
      }

      SK_ResetSelf DeleteGambling();
   } 
};

if($GameModeArg $= "Add-Ons/GameMode_SpeedKart/gamemode.txt")
   activatePackage(GameModeSpeedKartPackage);

// more time to fly out of a burning car
$CorpseTimeoutValue = 7000;

//special event to explode vehicles that are left in the garage
registerOutputEvent("fxDTSBrick", "explodeNearVehicle", "");
function fxDTSBrick::explodeNearVehicle(%obj)
{
   %vehicle = %obj.vehicle;
   if(!isObject(%vehicle))
      return;

   %delta = vectorSub(%vehicle.getPosition(), %obj.getPosition());
   //echo("len = " @ vectorLen(%delta));
   if(vectorLen(%delta) < 5) //7.5)
      %vehicle.finalExplosion(); //damage(%vehicle, %vehicle.getPosition(), 10000, $DamageType::Default);
}


//special event to win the race, displays race time
registerOutputEvent("GameConnection", "winRace", "");
function GameConnection::winRace(%client)
{
   %mg = %client.miniGame;

   if(!isObject(%mg))
      %mg = $DefaultMiniGame;

   if(!isObject(%mg))
      return;

   //if race start time is not available, use time since last reset
   %startTime = %mg.raceStartTime;
   if(%startTime <= 0)
      %startTime = %mg.lastResetTime;

   %elapsedTime = getSimTime() - %startTime;
   %elapsedTime = mFloor(%elapsedTime / 1000);
   
   %mg.chatMessageAll(0,  "\c3" @ %client.getPlayerName() @ " \c5WON THE RACE IN \c6" @ getTimeString(%elapsedTime) @ "\c3!");
   %mg.scheduleReset(7000);

   //do achievements
   if(%client.isLocal())
   {
      //if this is a local client, give stuffty achievement
      steamGetAchievement("ACH_SPEEDKART_PROBABLY_CHEATE D", "speedKartAchievement");     
   }
   else
   {
      //remote client, send them an achievement message
      if(clientGroup.getCount() > 1)
      {
         commandToClient(%client, 'GetAchievement', "ACH_SPEEDKART_WIN");
      }
   }



//highly important sound effect
datablock AudioProfile(SK_gwScream)
{
   filename    = "./gw_scream.wav";
   description = AudioDefault3d;
   preload = true;
};


//load the actual karts
// these are a feature locked version of the karts from a while ago
exec("./karts/speedKart.cs");


This is the original code.

I was attempting to make a custom SpeedKart gamemode
Then don't mess with any of the .cs files. Just play with the gamemode.txt and you'll do fine.

Then don't mess with any of the .cs files. Just play with the gamemode.txt and you'll do fine.
Oh, so with the gamemode file. I forgot his name, but he released a Vehicle_SpeedKart a more updated version of the kart's alone. Now with the gamemode file, what do I need to change in order for everything to work? It allows me to run the gamemode, but when it starts it's a blank slate with water and the water wont kill you. One moment, I'll show you the updated gamemode txt.

Quote
//Default stuff...
ADDON Brick_Arch
ADDON Brick_Large_Cubes

ADDON Support_Player_Persistence
ADDON Brick_Treasure_Chest

ADDON Brick_V15
ADDON Emote_Alarm
ADDON Emote_Confusion
ADDON Emote_Hate
ADDON Emote_Love
ADDON Light_Animated
ADDON Light_Basic
ADDON Particle_Basic
ADDON Particle_FX_Cans
ADDON Particle_Player
ADDON Particle_Tools
ADDON Particle_Grass
ADDON Player_No_Jet
ADDON Print_1x2f_Default
ADDON Print_2x2f_Default
ADDON Print_2x2r_Default
ADDON Print_Letters_Default
ADDON Sound_Beeps
ADDON Sound_Phone
ADDON Sound_Synth4
ADDON Script_AdvanceLight
ADDON Server_SlowMoDeath
ADDON Script_VehicleStereo


ADDON Vehicle_Pirate_Cannon
ADDON Vehicle_Tank
ADDON Weapon_Rocket_Launcher
ADDON Projectile_GravityRocket
ADDON Vehicle_Jeep
ADDON Vehicle_Horse
ADDON Vehicle_Rowboat
ADDON Weapon_Bow
ADDON Weapon_Spear
ADDON Weapon_Sword

ADDON Support_Doors
ADDON Brick_Doors

ADDON Brick_Halloween
ADDON Brick_Teledoor
ADDON Brick_Christmas_Tree


//Kart racing stuff...
ADDON Brick_ModTer_BasicPack
ADDON Brick_ModTer_InvertedPack
ADDON Print_ModTer_Default
ADDON GameMode_SpeedKart
ADDON Server_VehicleGore
ADDON Event_Camera_Control
ADDON Vehicle_Speedkart


//bots
ADDON Bot_Hole
ADDON Bot_Blockhead
ADDON Bot_Horse
ADDON Bot_Shark
ADDON Bot_Zombie

//for bandito
ADDON Weapon_Gun
ADDON Weapon_Guns_Akimbo

MUSIC Rainbow_MK64
MUSIC Mountain_MK64
MUSIC Jungle_MK64
MUSIC Highway_MK64
MUSIC Desert_MK64
MUSIC Beach_MK64
MUSIC Circut_MK64
MUSIC Snow_MK64

//environment
$EnvGuiServer::SimpleMode 0
$EnvGuiServer::SkyFile Add-Ons/Sky_Skylands/Skylands.dml
$EnvGuiServer::WaterFile Add-Ons/Water_Brick/brick.water
$EnvGuiServer::GroundFile Add-Ons/Ground_Plate/plate.ground
$EnvGuiServer::SunFlareTopTexture base/lighting/flare2.png
$EnvGuiServer::SunFlareBottomTexture base/lighting/corona2.png
$EnvGuiServer::DayOffset 0
$EnvGuiServer::DayLength 300
$EnvGuiServer::DayCycleEnabled 0
$EnvGuiServer::DayCycle Add-Ons/DayCycle_Default/default.daycycle
$EnvGuiServer::Sunational socialistmuth 238
$EnvGuiServer::SunElevation 21
$EnvGuiServer::DirectLightColor 1.000000 0.915888 0.836449 1.000000
$EnvGuiServer::AmbientLightColor 0.612150 0.592126 0.592126 1.000000
$EnvGuiServer::ShadowColor 0.000000 0.498211 0.579439 1.000000
$EnvGuiServer::SunFlareColor 0.200000 0.200000 0.200000 1.000000
$EnvGuiServer::SunFlareSize 2.25641
$EnvGuiServer::VisibleDistance 753.744
$EnvGuiServer::FogDistance 471.795
$EnvGuiServer::FogHeight
$EnvGuiServer::FogColor 0.771028 0.826666 1.000000 1.000000
$EnvGuiServer::WaterColor 0.172897 0.630841 1.000000 0.827103
$EnvGuiServer::WaterHeight 5
$EnvGuiServer::UnderWaterColor 140 178 255 134
$EnvGuiServer::SkyColor 1.000000 1.000000 0.785047 1.000000
$EnvGuiServer::WaterScrollX 0
$EnvGuiServer::WaterScrollY 0
$EnvGuiServer::GroundColor 1.000000 0.816578 0.607477 1.000000
$EnvGuiServer::GroundScrollX 0
$EnvGuiServer::GroundScrollY 0
$EnvGuiServer::VignetteMultiply 0
$EnvGuiServer::VignetteColor 0.000000 0.000000 0.000000 0.392157



//minigame rules
$MiniGame::Enabled 1
$MiniGame::GameColor 0
$MiniGame::InviteOnly 0
$MiniGame::IncludeAllPlayersBricks 1
$MiniGame::PlayersUseOwnBricks 0

$MiniGame::Points_BreakBrick 0
$MiniGame::Points_PlantBrick 0
$MiniGame::Points_KillPlayer 1
$MiniGame::Points_KillBot 0
$MiniGame::Points_KillSelf   -1
$MiniGame::Points_Die 0
  
$MiniGame::RespawnTime -1
$MiniGame::VehicleRespawnTime -1
$MiniGame::BrickRespawnTime 60
$MiniGame::BotRespawnTime 5

$MiniGame::UseSpawnBricks 1
$MiniGame::FallingDamage 1
$MiniGame::WeaponDamage 1
$MiniGame::SelfDamage 1
$MiniGame::VehicleDamage 1
$MiniGame::BrickDamage 1
$MiniGame::BotDamage 1
$MiniGame::EnableWand 0
$MiniGame::EnableBuilding 0
$MiniGame::EnablePainting 0

$MiniGame::PlayerDataBlockName No-Jet Player

$MiniGame::StartEquipName0 0
$MiniGame::StartEquipName1 0
$MiniGame::StartEquipName2 0
$MiniGame::StartEquipName3 0
$MiniGame::StartEquipName4 0

$MiniGame::TimeLimit 240




$Server::Quota::Schedules 9999
$Server::Quota::Misc 999
$Server::Quota::Projectile 999
$Server::Quota::Item 999
$Server::Quota::Environment 9999
$Server::Quota::Player 100
$Server::Quota::Vehicle 50
$Server::MaxPhysVehicles_Total 20
I reverted the .cs back to the original.

You say you're making a custom gamemode, but you never say what you're trying to do.

You say you're making a custom gamemode, but you never say what you're trying to do.
What I'm trying to do;
Add in Vehicle_SpeedKart (The updated version of the SpeedKarts)
and have every SpeedKart Track in rotation. (I have all the track files)
Every other script/mod I have enabled on the .txt is taken care of. I just need those main things to co-exist.
I'm not sure if I did it right.
« Last Edit: September 29, 2014, 01:17:22 PM by Yoke »


SpeedKart tracks are automatically loaded without you having to modify anything.

Code: [Select]
function SK_BuildTrackList()
{
   //
   %pattern = "Add-Ons/SpeedKart_*/save.bls";
  
   $SK::numTracks = 0;
  
   %file = findFirstFile(%pattern);
   while(%file !$= "")
   {
      $SK::Track[$SK::numTracks] = %file;
      $SK::numTracks++;

      %file = findNextFile(%pattern);
   }
}

This code literally finds all of the files that fit the pattern ( * is called a wildcard character and any text at all can go there ) and loads all of those tracks. You do not need to change anything.



As far as Vehicle_SpeedKart goes, I'm pretty sure you're actually not supposed to replace that. In the code, this is the code to load the kart vehicles:

Code: [Select]
//load the actual karts
// these are a feature locked version of the karts from a while ago
exec("./karts/speedKart.cs");

The two comments serve as a warning that newer (updated) karts may not work. However, if you still want to try, you can delete all 3 of those lines inside the server.cs file. Then all you should have to do is add a line into gamemode.txt that says:

ADDON Vehicle_SpeedKarts

-blah-

Code: [Select]
//load the actual karts
// these are a feature locked version of the karts from a while ago
exec("./karts/speedKart.cs");

The Gamemode_SpeedkartUpdated that was released awhile back did cut out that code and uses the vehicle add-on, seems to work just fine as well.

I personally would cut it just because you're defining the same (and probably extra) datablocks twice. You're running two versions of it at once, just because it 'technically' works doesn't mean it's ideal.