Switch Missions via Script
by Phoenix Online Studios · in Torque Game Engine · 08/16/2005 (11:21 am) · 11 replies
I'm trying to switch missions in-game via TorqueScript, but for some reason this function only works when I type it in the console. When I try to call it in script, the engine crashes. I am not destroying or recreating the server connection.
To call this, I would have: switchMissions("mission.mis");
Does anyone know why it crashes the engine when called in script, but it works fine when typing it in the console?
To call this, I would have: switchMissions("mission.mis");
// Input: %misFile = *.mis file (i.e. "stronghold.mis");
function switchMissions(%misFile)
{
%curMission = $Server::MissionFile;
%misPath = "<mod>/data/missions/" @ %misFile;
//dissallow mission switching before server is created
if (%curMission $= "") {
echo("Error: You haven't loaded a mission yet.");
return false;
}
//trying to switch to the mission you're already in??
else if (%curMission $= %misPath) {
echo("Error: cannot switch to a mission you are already in: " @ %misFile);
return false;
}
//check if mission file exists
%file = new FileObject();
if (!%file.openForRead(%misPath)) {
%file.delete();
echo("Error: Mission file does not exist: " @ %misPath);
return false;
}
//all is good, let's switch!
else {
%file.delete();
//exit current mission
exitMission();
//initialize next mission
initMission(%misPath);
echo("Mission switch successful! You are now in: " @ %misPath);
return true;
}
}
function exitMission() {
// Clear misc script stuff
HudMessageVector.clear();
// Terminate all playing sounds
alxStopAll();
if (isObject(MusicPlayer))
MusicPlayer.stop();
//Torque FPS Crap
LagIcon.setVisible(false);
PlayerListGui.clear();
clientCmdclearBottomPrint();
clientCmdClearCenterPrint();
//Show Loading screen
Canvas.setContent(LoadingGui);
// Dump anything we're not using
clearTextureHolds();
purgeResources();
}
function initMission(%misPath) {
%mission = %misPath;
// used in game.cs to load the appropriate player script
$playerCSFile = $playerFiles[$currentDTS];
loadMission(%mission, false);
}Does anyone know why it crashes the engine when called in script, but it works fine when typing it in the console?
#2
The script that contains the above code is located in "/server/scripts/switchMissions.cs". It is being exec()'d in "/server/init.cs".
Do I need to use commandToServer when the script calling switchMissions() is already on the server side?
08/16/2005 (12:50 pm)
You're correct that our game is a single-player game with both the server and client residing on the same computer.The script that contains the above code is located in "
Do I need to use commandToServer when the script calling switchMissions() is already on the server side?
#3
Scripts don't run in explicitly server or client space. It's just that some things aren't going to exist when you're running in a dedicated client or dedicated server configuration, and if you try to use them in that case things will break.
Do you get a particular crash (ie, in a particular subroutine or area of the engine)? Understanding the nature of the crash will point you to finding the right way to implement the desired feature.
08/16/2005 (1:33 pm)
You might consider using the code /code tags (add square brackets). Makes code MUCH easier to read.Scripts don't run in explicitly server or client space. It's just that some things aren't going to exist when you're running in a dedicated client or dedicated server configuration, and if you try to use them in that case things will break.
Do you get a particular crash (ie, in a particular subroutine or area of the engine)? Understanding the nature of the crash will point you to finding the right way to implement the desired feature.
#4
schedule(0,0,switchMission,"mission.mis");
08/16/2005 (1:44 pm)
If you are calling switchMission("mission.mis"); from within a script... I would recommend that you try to use a schedule call instead.schedule(0,0,switchMission,"mission.mis");
#5
The engine gets extremely slow and then the crash is just like any other WinXP crash and says:
".exe has encountered a problem and needs to close. We are sorry for the inconvenience.
If you were in the middle of something, the information you were working on might be lost.
Please tell Microsoft about this problem.
etc"
Debug Send Error Report Don't Send
Here's what the console.log says:
*** ENDING MISSION
*** LOADING MISSION:/data/missions/IoC_Island.mis
*** Stage 1 load
*** Stage 2 load
Executing/data/missions/IoC_Island.mis.
*** Mission loaded
*** Sending mission load to client:/data/missions/IoC_Island.mis
Mission switch successful! You are now in:/data/missions/IoC_Island.mis
But, the mission does not end and the new mission does not load, despite what the console.log says.
08/16/2005 (1:48 pm)
Sorry, I've edited the first post to use code tags now. :)The engine gets extremely slow and then the crash is just like any other WinXP crash and says:
"
If you were in the middle of something, the information you were working on might be lost.
Please tell Microsoft about this problem.
etc"
Debug Send Error Report Don't Send
Here's what the console.log says:
*** ENDING MISSION
*** LOADING MISSION:
*** Stage 1 load
*** Stage 2 load
Executing
*** Mission loaded
*** Sending mission load to client:
Mission switch successful! You are now in:
But, the mission does not end and the new mission does not load, despite what the console.log says.
#7
08/17/2005 (10:02 am)
TGE is single threaded... using the schedule forces Torque to wait until all other commands are finished and the engine isn't in the middle of any functions before calling the switchMission function.
#8
04/21/2009 (12:41 pm)
Espero poder aplicar el script, muchas gracias
#9
And so is Torque 3D MIT version 3.51 so I had to implement this idea(before that everything would crash). Now everything works like a charm :O)
Thanks for reminding us that e are using a single threaded engine. It all make sense when that fact is made clear.
07/18/2015 (6:21 pm)
Quote:TGE is single threaded... using the schedule forces Torque to wait until all other commands are finished and the engine isn't in the middle of any functions before calling the switchMission function.
And so is Torque 3D MIT version 3.51 so I had to implement this idea(before that everything would crash). Now everything works like a charm :O)
Thanks for reminding us that e are using a single threaded engine. It all make sense when that fact is made clear.
#10
Edit: And I just realized this is in the TGE forum...
07/18/2015 (11:01 pm)
An example of how to do this has been in the docs since 1.2 - In the Mission Triggers tutorial (http://www.garagegames.com/products/torque-3d/documentation at Scripting > Advanced > Mission Triggers). It shows how to switch missions in a trigger onEnterTrigger() callback - and it cheats by using the already tried-and-true CycleGame() function.Edit: And I just realized this is in the TGE forum...
#11
yes that is true but I have not been in need of connecting any missions so far in T3D and when I had to(the games story line :O) ) I simply just thought out a script from the codes I have seen and read about here and their. I smacked in the script I thought would work and saw a crash and went like O_o eh! o_O what!
I then did a few searches and found this awesome resource and laughed a little as it all make sense after all.
Once again a proof that these GG forums with old resources hold some real good infomation... even though it is a TGE forum... :O)
07/22/2015 (5:33 pm)
@Ranftyes that is true but I have not been in need of connecting any missions so far in T3D and when I had to(the games story line :O) ) I simply just thought out a script from the codes I have seen and read about here and their. I smacked in the script I thought would work and saw a crash and went like O_o eh! o_O what!
I then did a few searches and found this awesome resource and laughed a little as it all make sense after all.
Once again a proof that these GG forums with old resources hold some real good infomation... even though it is a TGE forum... :O)
Torque 3D Owner Tony Richards
Where is the script located that's switching the mission? Is it in the GUI script or something that's called from the GUI script, or is it in a script that's located in the server directory?
Although it might work sometimes, you should never cross the client/server script boundary... everything that resides in the server script directory should not call anything that resides in the client directory and vice versa. If you need to do this, look at how commandToServer and commandToClient work.
Just a thought, but I think that might be what's causing your problem.