2012-09-19 15:15:01 +00:00
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
# include "console/console.h"
2014-11-04 03:42:51 +00:00
# include "console/engineAPI.h"
2012-09-19 15:15:01 +00:00
# include "console/sim.h"
# include "console/simEvents.h"
# include "console/simObject.h"
# include "console/simSet.h"
# include "core/module.h"
MODULE_BEGIN ( Sim )
// Note: tho the SceneGraphs are created after the Manager, delete them after, rather
// than before to make sure that all the objects are removed from the graph.
MODULE_INIT_AFTER ( GFX )
MODULE_SHUTDOWN_BEFORE ( GFX )
MODULE_INIT
{
Sim : : init ( ) ;
}
MODULE_SHUTDOWN
{
Sim : : shutdown ( ) ;
}
MODULE_END ;
namespace Sim
{
// Don't forget to InstantiateNamed* in simManager.cc - DMM
ImplementNamedSet ( ActiveActionMapSet )
ImplementNamedSet ( GhostAlwaysSet )
ImplementNamedSet ( WayPointSet )
ImplementNamedSet ( fxReplicatorSet )
ImplementNamedSet ( fxFoliageSet )
ImplementNamedSet ( BehaviorSet )
ImplementNamedSet ( MaterialSet )
ImplementNamedSet ( SFXSourceSet )
ImplementNamedSet ( SFXDescriptionSet )
ImplementNamedSet ( SFXTrackSet )
ImplementNamedSet ( SFXEnvironmentSet )
ImplementNamedSet ( SFXStateSet )
ImplementNamedSet ( SFXAmbienceSet )
ImplementNamedSet ( TerrainMaterialSet )
ImplementNamedSet ( DataBlockSet ) ;
ImplementNamedGroup ( ActionMapGroup )
ImplementNamedGroup ( ClientGroup )
ImplementNamedGroup ( GuiGroup )
ImplementNamedGroup ( GuiDataGroup )
ImplementNamedGroup ( TCPGroup )
ImplementNamedGroup ( SFXParameterGroup ) ;
//groups created on the client
ImplementNamedGroup ( ClientConnectionGroup )
ImplementNamedSet ( sgMissionLightingFilterSet )
}
//-----------------------------------------------------------------------------
// Console Functions
//-----------------------------------------------------------------------------
ConsoleFunctionGroupBegin ( SimFunctions , " Functions relating to Sim. " ) ;
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( nameToID , S32 , ( const char * objectName ) , , " nameToID(object) " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
SimObject * obj = Sim : : findObject ( objectName ) ;
2012-09-19 15:15:01 +00:00
if ( obj )
return obj - > getId ( ) ;
else
return - 1 ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( isObject , bool , ( const char * objectName ) , , " isObject(object) " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
if ( ! dStrcmp ( objectName , " 0 " ) | | ! dStrcmp ( objectName , " " ) )
2012-09-19 15:15:01 +00:00
return false ;
else
2014-11-04 03:42:51 +00:00
return ( Sim : : findObject ( objectName ) ! = NULL ) ;
2012-09-19 15:15:01 +00:00
}
ConsoleDocFragment _spawnObject1 (
" @brief Global function used for spawning any type of object. \n \n "
" Note: This is separate from SpawnSphere::spawnObject(). This function is not called off any "
" other class and uses different parameters than the SpawnSphere's function. In the source, "
" SpawnSphere::spawnObject() actually calls this function and passes its properties "
" (spawnClass, spawnDatablock, etc). \n \n "
" @param class Mandatory field specifying the object class, such as Player or TSStatic. \n \n "
" @param datablock Field specifying the object's datablock, optional for objects such as TSStatic, mandatory for game objects like Player. \n \n "
" @param name Optional field specifying a name for this instance of the object. \n \n "
" @param properties Optional set of parameters applied to the spawn object during creation. \n \n "
" @param script Optional command(s) to execute when spawning an object. \n \n "
" @tsexample \n "
" // Set the parameters for the spawn function \n "
" %objectClass = \" Player \" ; \n "
" %objectDatablock = \" DefaultPlayerData \" ; \n "
" %objectName = \" PlayerName \" ; \n "
" %additionalProperties = \" health = \\ \" 0 \\ \" ; \" ; // Note the escape sequence \\ in front of quotes \n "
" %spawnScript = \" echo( \\ \" Player Spawned \\ \" ); \" // Note the escape sequence \\ in front of quotes \n "
" // Spawn with the engine's Sim::spawnObject() function \n "
" %player = spawnObject(%objectClass, %objectDatablock, %objectName, %additionalProperties, %spawnScript); \n "
" @endtsexample \n \n "
" @ingroup Game " ,
NULL ,
" bool spawnObject(class [, dataBlock, name, properties, script]); "
) ;
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( spawnObject , S32 , ( const char * spawnClass
2014-11-04 03:42:51 +00:00
, const char * spawnDataBlock
, const char * spawnName
, const char * spawnProperties
, const char * spawnScript
2014-12-23 07:20:47 +00:00
) , ( " " , " " , " " , " " ) , " spawnObject(class [, dataBlock, name, properties, script]) "
2017-01-12 04:34:46 +00:00
" @hide " )
2012-09-19 15:15:01 +00:00
{
SimObject * spawnObject = Sim : : spawnObject ( spawnClass , spawnDataBlock , spawnName , spawnProperties , spawnScript ) ;
if ( spawnObject )
return spawnObject - > getId ( ) ;
else
return - 1 ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( cancel , void , ( S32 eventId ) , , " cancel(eventId) " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
Sim : : cancelEvent ( eventId ) ;
2012-09-19 15:15:01 +00:00
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( cancelAll , void , ( const char * objectId ) , , " cancelAll(objectId): cancel pending events on the specified object. Events will be automatically cancelled if object is deleted. " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
Sim : : cancelPendingEvents ( Sim : : findObject ( objectId ) ) ;
2012-09-19 15:15:01 +00:00
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( isEventPending , bool , ( S32 scheduleId ) , , " isEventPending(%scheduleId); " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
return Sim : : isEventPending ( scheduleId ) ;
2012-09-19 15:15:01 +00:00
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( getEventTimeLeft , S32 , ( S32 scheduleId ) , , " getEventTimeLeft(scheduleId) Get the time left in ms until this event will trigger. " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
return Sim : : getEventTimeLeft ( scheduleId ) ;
2012-09-19 15:15:01 +00:00
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( getScheduleDuration , S32 , ( S32 scheduleId ) , , " getScheduleDuration(%scheduleId); " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
S32 ret = Sim : : getScheduleDuration ( scheduleId ) ;
2012-09-19 15:15:01 +00:00
return ret ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( getTimeSinceStart , S32 , ( S32 scheduleId ) , , " getTimeSinceStart(%scheduleId); " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
S32 ret = Sim : : getTimeSinceStart ( scheduleId ) ;
2012-09-19 15:15:01 +00:00
return ret ;
}
ConsoleFunction ( schedule , S32 , 4 , 0 , " schedule(time, refobject|0, command, <arg1...argN>) " )
{
U32 timeDelta = U32 ( dAtof ( argv [ 1 ] ) ) ;
SimObject * refObject = Sim : : findObject ( argv [ 2 ] ) ;
if ( ! refObject )
{
if ( argv [ 2 ] [ 0 ] ! = ' 0 ' )
return 0 ;
refObject = Sim : : getRootGroup ( ) ;
}
SimConsoleEvent * evt = new SimConsoleEvent ( argc - 3 , argv + 3 , false ) ;
S32 ret = Sim : : postEvent ( refObject , evt , Sim : : getCurrentTime ( ) + timeDelta ) ;
// #ifdef DEBUG
// Con::printf("ref %s schedule(%s) = %d", argv[2], argv[3], ret);
// Con::executef( "backtrace");
// #endif
return ret ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( getUniqueName , const char * , ( const char * baseName ) , ,
2017-01-12 04:34:46 +00:00
" ( String baseName ) \n "
" @brief Returns a unique unused SimObject name based on a given base name. \n \n "
" @baseName Name to conver to a unique string if another instance exists \n "
" @note Currently only used by editors \n "
" @ingroup Editors \n "
" @internal " )
2012-09-19 15:15:01 +00:00
{
2014-11-04 03:42:51 +00:00
String outName = Sim : : getUniqueName ( baseName ) ;
2012-09-19 15:15:01 +00:00
if ( outName . isEmpty ( ) )
return NULL ;
char * buffer = Con : : getReturnBuffer ( outName . size ( ) ) ;
2018-03-06 06:59:05 +00:00
dStrcpy ( buffer , outName , outName . size ( ) ) ;
2012-09-19 15:15:01 +00:00
return buffer ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( getUniqueInternalName , const char * , ( const char * baseName , const char * setString , bool searchChildren ) , ,
2012-09-19 15:15:01 +00:00
" ( String baseName, SimSet set, bool searchChildren ) \n "
" @brief Returns a unique unused internal name within the SimSet/Group based on a given base name. \n \n "
" @note Currently only used by editors \n "
" @ingroup Editors \n "
" @internal " )
{
SimSet * set ;
2014-11-04 03:42:51 +00:00
if ( ! Sim : : findObject ( setString , set ) )
2012-09-19 15:15:01 +00:00
{
Con : : errorf ( " getUniqueInternalName() - invalid parameter for SimSet. " ) ;
return NULL ;
}
2014-11-04 03:42:51 +00:00
String outName = Sim : : getUniqueInternalName ( baseName , set , searchChildren ) ;
2012-09-19 15:15:01 +00:00
if ( outName . isEmpty ( ) )
return NULL ;
char * buffer = Con : : getReturnBuffer ( outName . size ( ) ) ;
2018-03-06 06:59:05 +00:00
dStrcpy ( buffer , outName , outName . size ( ) ) ;
2012-09-19 15:15:01 +00:00
return buffer ;
}
2018-04-17 14:33:56 +00:00
DefineEngineFunction ( isValidObjectName , bool , ( const char * name ) , , " ( string name ) "
2017-01-12 04:34:46 +00:00
" @brief Return true if the given name makes for a valid object name. \n \n "
" @param name Name of object \n "
" @return True if name is allowed, false if denied (usually because it starts with a number, _, or invalid character "
" @ingroup Console " )
2012-09-19 15:15:01 +00:00
{
return Sim : : isValidObjectName ( name ) ;
}
ConsoleFunctionGroupEnd ( SimFunctions ) ;