('ent_swspreview', 'Workshop Preview', '', 14 ),
('ent_menuitem', 'Menu Item', '', 15 ),
('ent_worldinfo', 'World Info', '', 16 ),
+ ('ent_ccmd', 'CCmd', '', 17 )
]
def get_entity_enum_id( alias ):
("timezone",c_float)]
#}
+class ent_ccmd(Structure):
+#{
+ _fields_ = [("pstr_command",c_uint32)]
+#}
+
def obj_ent_type( obj ):
#{
if obj.type == 'ARMATURE': return 'mdl_armature'
worldinfo.timezone = obj_data.timezone
sr_ent_push( worldinfo )
#}
+ elif ent_type == 'ent_ccmd':#{
+ ccmd = ent_ccmd()
+ obj_data = obj.SR_data.ent_ccmd[0]
+ ccmd.pstr_command = sr_compile_string( obj_data.command )
+ sr_ent_push( ccmd )
+ #}
#}
#}
target: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Target", \
poll=lambda self,obj: sr_filter_ent_type(obj,\
- ['ent_audio','ent_skateshop']))
+ ['ent_audio','ent_skateshop','ent_ccmd']))
@staticmethod
def sr_inspector( layout, data ):
timezone: bpy.props.FloatProperty(name="Timezone(hrs) (UTC0 +hrs)")
#}
+class SR_OBJECT_ENT_CCMD(bpy.types.PropertyGroup):
+#{
+ command: bpy.props.StringProperty(name="Command Line")
+#}
+
class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
#{
ent_gate: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GATE)
bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORKSHOP_PREVIEW)
ent_menuitem: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MENU_ITEM)
ent_worldinfo: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORLD_INFO)
+ ent_ccmd: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CCMD)
ent_type: bpy.props.EnumProperty(
name="Type",
SR_UL_FONT_VARIANT_LIST,SR_UL_FONT_GLYPH_LIST,\
SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,SR_OBJECT_ENT_SKATESHOP,\
SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\
- SR_OBJECT_ENT_WORLD_INFO,\
+ SR_OBJECT_ENT_WORLD_INFO,SR_OBJECT_ENT_CCMD,\
\
SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES,
SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \
ent_audio_call( world, call );
} else if( type == k_ent_skateshop ){
ent_skateshop_call( world, call );
+ } else if( type == k_ent_ccmd ){
+ ent_ccmd_call( world, call );
}
}
typedef struct ent_camera ent_camera;
typedef struct ent_swspreview ent_swspreview;
typedef struct ent_worldinfo ent_worldinfo;
+typedef struct ent_ccmd ent_ccmd;
enum entity_alias{
k_ent_none = 0,
k_ent_camera = 13,
k_ent_swspreview = 14,
k_ent_menuitem = 15,
- k_ent_worldinfo = 16
+ k_ent_worldinfo = 16,
+ k_ent_ccmd = 17
};
-static u32 mdl_entity_id_type( u32 entity_id )
-{
+static u32 mdl_entity_id_type( u32 entity_id ){
return (entity_id & 0xffff0000) >> 16;
}
-static u32 mdl_entity_id_id( u32 entity_id )
-{
+static u32 mdl_entity_id_id( u32 entity_id ){
return entity_id & 0x0000ffff;
}
-static u32 mdl_entity_id( u32 type, u32 index )
-{
+static u32 mdl_entity_id( u32 type, u32 index ){
return (type & 0xfffff)<<16 | (index & 0xfffff);
}
indice_count;
};
+struct ent_ccmd{
+ u32 pstr_command;
+};
typedef struct ent_call ent_call;
struct ent_call{
vg_low( "Inserting record into database for track %hu\n",record->trackid );
- if( record->trackid >= vg_list_size(sys->dbheader.tracks) )
- {
+ if( record->trackid >= vg_list_size(sys->dbheader.tracks) ){
vg_error( "TrackID out of range (%hu>=%d)\n", record->trackid,
vg_list_size(sys->dbheader.tracks) );
table->root_playerid,
record );
- if( existing != AATREE_PTR_NIL )
- {
+ if( existing != AATREE_PTR_NIL ){
highscore_record *crecord = aatree_get_data( &sys->aainfo_playerid,
existing );
setscore->inetmsg_id = k_inetmsg_set_score;
int count = 0;
- for( u32 i=0; i<vg_list_size(track_infos); i++ )
- {
- if( track_infos[i].push )
- {
+ for( u32 i=0; i<vg_list_size(track_infos); i++ ){
+ if( track_infos[i].push ){
track_infos[i].push = 0;
highscore_record *user_record = highscore_find_user_record( 0, i );
- if( !user_record )
- {
+ if( !user_record ){
vg_error( "No score set but tried to upload for track %u\n", i );
continue;
}
}
}
- if( count == 0 )
- return;
-
+ if( count == 0 ) return;
u32 send_size = sizeof(netmsg_set_score) +
count*sizeof(struct netmsg_score_record);
setscore->record_count = count;
}
-VG_STATIC int steam_list_achievements( int argc, char const *argv[] )
-{
+VG_STATIC void steam_print_all_achievements(void){
vg_info( "Achievements: \n" );
if( steam_ready && steam_stats_ready ){
else{
vg_warn( " Steam is not initialized, no results\n" );
}
-
- return 0;
}
-VG_STATIC int steam_clear_all_achievements( int argc, char const *argv[] )
+VG_STATIC int steam_achievement_ccmd( int argc, char const *argv[] )
{
- if( steam_ready && steam_stats_ready ){
- for( int i=0; i<vg_list_size(steam_achievement_names); i++ ){
- steam_clear_achievement( steam_achievement_names[i] );
+ if( !(steam_ready && steam_stats_ready) ) return 1;
+
+ if( argc == 1 ){
+ if( !strcmp( argv[0], "list" ) ){
+ steam_print_all_achievements();
+ return 0;
+ }
+ else if( !strcmp( argv[0], "clearall" )){
+ for( int i=0; i<vg_list_size(steam_achievement_names); i++ )
+ steam_clear_achievement( steam_achievement_names[i] );
+
+ steam_store_achievements();
}
-
- steam_store_achievements();
- }
- else{
- vg_warn( "steam is not initialized, cannot clear\n" );
}
- return 0;
-}
-
-VG_STATIC int steam_set_achievemnt_test( int argc, char const *argv[] )
-{
- if( argc < 2 )
- return 0;
-
- if( strcmp( argv[0], "monkey_island" ) )
- return 0;
-
- steam_set_achievement( argv[1] );
- steam_store_achievements();
+ if( argc == 2 ){
+ if( !strcmp( argv[0], "set" ) ){
+ steam_set_achievement( argv[1] );
+ steam_store_achievements();
+ return 0;
+ }
+ else if( strcmp( argv[0], "clear" ) ){
+ steam_clear_achievement( argv[1] );
+ steam_store_achievements();
+ return 0;
+ }
+ }
- return 0;
+ return 1;
}
VG_STATIC void steam_on_recieve_current_stats( CallbackMsg_t *msg )
vg_warn( "No Steam Logon: Cannot request stats\n" );
- vg_console_reg_cmd( "ach_list", steam_list_achievements, NULL );
- vg_console_reg_cmd( "ach_clear_all", steam_clear_all_achievements, NULL );
- vg_console_reg_cmd( "ach_set", steam_set_achievemnt_test, NULL );
+ vg_console_reg_cmd( "ach", steam_achievement_ccmd, NULL );
#endif
ent_skateshop,
ent_marker,
ent_camera,
- ent_swspreview;
+ ent_swspreview,
+ ent_ccmd;
ent_gate *rendering_gate;
}
}
-VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
-{
+VG_STATIC void ent_audio_call( world_instance *world, ent_call *call ){
if( world->status == k_world_status_unloading ){
vg_warn( "cannot modify audio while unloading world\n" );
return;
}
}
+
+VG_STATIC void ent_ccmd_call( world_instance *world, ent_call *call ){
+ if( call->function == k_ent_function_trigger ){
+ u32 index = mdl_entity_id_id( call->id );
+ ent_ccmd *ccmd = mdl_arritm( &world->ent_ccmd, index );
+ vg_execute_console_input( mdl_pstr(&world->meta, ccmd->pstr_command) );
+ }
+}
+
#endif /* WORLD_ENTITY_C */
VG_STATIC void ent_volume_call( world_instance *world, ent_call *call );
VG_STATIC void ent_audio_call( world_instance *world, ent_call *call );
+VG_STATIC void ent_ccmd_call( world_instance *world, ent_call *call );
#endif /* WORLD_ENTITY_H */
vg_async_item *call = scene_alloc_async( &world->scene_no_collide,
&world->mesh_no_collide,
- 200000, 500000 );
+ 250000, 500000 );
for( u32 i=0; i<world->surface_count; i++ ){
struct world_surface *surf = &world->surfaces[ i ];
mdl_load_array( meta, &world->ent_marker, "ent_marker", heap );
mdl_load_array( meta, &world->ent_skateshop, "ent_skateshop", heap );
mdl_load_array( meta, &world->ent_swspreview,"ent_swspreview", heap );
+ mdl_load_array( meta, &world->ent_ccmd, "ent_ccmd", heap );
mdl_array_ptr infos;
mdl_load_array( meta, &infos, "ent_worldinfo", vg_mem.scratch );
#include "font.h"
#include "pointcloud.h"
#include "gui.h"
+#include "steam.h"
#include "shaders/scene_route.h"
#include "shaders/routeui.h"
ti->push = 1;
if( ti->achievement_id ){
-#if 0
steam_set_achievement( ti->achievement_id );
steam_store_achievements();
-#endif
}
}
else{