the great server lever
authorhgn <hgodden00@gmail.com>
Thu, 23 Nov 2023 15:59:34 +0000 (15:59 +0000)
committerhgn <hgodden00@gmail.com>
Thu, 23 Nov 2023 15:59:34 +0000 (15:59 +0000)
blender_export.py
ent_skateshop.c
ent_skateshop.h
entity.h
maps_src/dev_hub/main.mdl
network.c
network.h
skaterift.c

index d397cd793583ac38d90dd36a9ea5bd9fb2717c68..8b0bd104b88aef9a9ab0a9b747423b6a0810181d 100644 (file)
@@ -382,17 +382,24 @@ class ent_skateshop_worlds(Structure):
    _fields_ = [("id_display",c_uint32),
                ("id_info",c_uint32)]
 #}
+class ent_skateshop_server(Structure):
+#{
+   _fields_ = [("id_lever",c_uint32)]
+#}
 class ent_skateshop_anon_union(Union):
 #{
    _fields_ = [("boards",ent_skateshop_boards),
                ("character",ent_skateshop_characters),
-               ("worlds",ent_skateshop_worlds)]
+               ("worlds",ent_skateshop_worlds),
+               ("server",ent_skateshop_server)]
 #}
 class ent_skateshop(Structure):
 #{
    _fields_ = [("transform",mdl_transform), ("type",c_uint32),
                ("id_camera",c_uint32), 
                ("_anonymous_union",ent_skateshop_anon_union)]
+
+   sr_functions = { 0: 'trigger' }
 #}
 
 class ent_swspreview(Structure):
@@ -1889,6 +1896,10 @@ def sr_compile( collection ):
                worldshop.id_display = sr_entity_id( obj_data.mark_display )
                worldshop.id_info = sr_entity_id( obj_data.mark_info )
             #}
+            elif skateshop.type == 3:#{
+               server = skateshop._anonymous_union.server
+               server.id_lever = sr_entity_id( obj_data.mark_display )
+            #}
             skateshop.id_camera = sr_entity_id( obj_data.cam )
             compile_obj_transform( obj, skateshop.transform )
             sr_ent_push(skateshop)
@@ -3170,7 +3181,8 @@ class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup):
    tipo: bpy.props.EnumProperty( name='Type',
                                  items=[('0','boards',''),
                                         ('1','character',''),
-                                        ('2','world','')] )
+                                        ('2','world',''),
+                                        ('4','server','')] )
    mark_rack: bpy.props.PointerProperty( \
            type=bpy.types.Object, name="Board Rack", \
            poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
@@ -3179,7 +3191,8 @@ class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup):
            poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
    mark_info: bpy.props.PointerProperty( \
            type=bpy.types.Object, name="Selected Board Info", \
-           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+           poll=lambda self,obj: sr_filter_ent_type(obj,\
+           ['ent_marker','ent_prop']))
    cam: bpy.props.PointerProperty( \
            type=bpy.types.Object, name="Viewpoint", \
            poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
@@ -4513,6 +4526,11 @@ def cv_draw():#{
                display = None
                info = None
             #}
+            elif data.tipo == '4':#{
+               rack = None
+               display = None
+               info = None
+            #}
 
             if rack:
                cv_draw_ucube( rack.matrix_world, cc, rack_cu, rack_co )
index c10352d5ff0a53f33cfd4fea3161b1f15c4e032c..0084e19dd3829b4bdc44bff97cb8521a2689900f 100644 (file)
@@ -216,6 +216,17 @@ static u16 skateshop_selected_cache_id(void){
    else return 0;
 }
 
+static void skateshop_server_helper_update(void){
+   vg_str text;
+   vg_strnull( &text, global_skateshop.helper_toggle->text, 
+               sizeof(global_skateshop.helper_toggle->text) );
+
+   if( network_client.user_intent == k_server_intent_online )
+      vg_strcat( &text, "Disconnect" );
+   else
+      vg_strcat( &text, "Go Online" );
+}
+
 /*
  * VG event preupdate 
  */
@@ -241,8 +252,14 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
                                     mdl_entity_id_id(shop->boards.id_display) );
       v3_sub( display->transform.co, localplayer.rb.co, lookat );
    }
-   else if( shop->type == k_skateshop_type_charshop )
+   else if( shop->type == k_skateshop_type_charshop ){
       v3_sub( ref->transform.co, localplayer.rb.co, lookat );
+   }
+   else if( shop->type == k_skateshop_type_server ){
+      ent_prop *prop = mdl_arritm( &world->ent_prop,
+            mdl_entity_id_id(shop->server.id_lever) );
+      v3_sub( prop->transform.co, localplayer.rb.co, lookat );
+   }
    else
       vg_fatal_error( "Unknown store (%u)\n", shop->type );
 
@@ -392,6 +409,21 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
          }
       }
    }
+   else if( shop->type == k_skateshop_type_server ){
+      f64 delta = vg.time - network_client.last_intent_change;
+
+      if( delta > 5.0 ){
+         global_skateshop.helper_pick->greyed = 0;
+         if( button_down( k_srbind_maccept ) ){
+            network_client.user_intent = !network_client.user_intent;
+            network_client.last_intent_change = vg.time_real;
+            skateshop_server_helper_update();
+         }
+      }
+      else {
+         global_skateshop.helper_pick->greyed = 1;
+      }
+   }
    else{
       vg_fatal_error( "Unknown store (%u)\n", shop->type );
    }
@@ -406,6 +438,25 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
    }
 }
 
+static void skateshop_world_preupdate( world_instance *world ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_skateshop); i++ ){
+      ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, i );
+
+      if( shop->type == k_skateshop_type_server ){
+         f32 a = network_client.user_intent;
+
+         vg_slewf( &network_client.fintent, a, vg.time_frame_delta );
+         a = (vg_smoothstepf( network_client.fintent ) - 0.5f) * (VG_PIf/2.0f);
+
+         ent_prop *lever = mdl_arritm( &world->ent_prop,
+               mdl_entity_id_id(shop->server.id_lever) );
+
+         /* we need parent transforms now? */
+         q_axis_angle( lever->transform.q, (v3f){0,0,1}, a );
+      }
+   }
+}
+
 static void skateshop_render_boardshop( ent_skateshop *shop ){
    world_instance *world = world_current_instance();
    u32 slot_count = vg_list_size(global_skateshop.shop_view_slots);
@@ -467,11 +518,6 @@ fade_out:;
    mdl_transform_m4x3( &mark_info->transform, mtext );
    mdl_transform_m4x3( &mark_rack->transform, mrack );
 
-#if 0
-   const char *text_title = "Fish - Title";
-   const char *text_author = "by Shaniqua";
-#endif
-
    m4x3f mlocal, mmdl;
    m4x3_identity( mlocal );
 
@@ -647,20 +693,6 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){
    mlocal[3][1] = -scale1*0.3f;
    m4x3_mul( mtext, mlocal, mtextmdl );
    font3d_simple_draw( 0, bufsubtext, &skaterift.cam, mtextmdl );
-
-#if 0
-   /* pointcloud */
-   m4x3f mmdl;
-   mdl_transform_m4x3( &mark_display->transform, mmdl );
-   m4x3_rotate_y( mmdl, vg.time * 0.2 );
-
-   glEnable(GL_BLEND);
-   glBlendFunc(GL_ONE, GL_ONE);
-   glDisable(GL_DEPTH_TEST);
-   pointcloud_render( world, &skaterift.cam, mmdl );
-   glDisable(GL_BLEND);
-   glEnable(GL_DEPTH_TEST);
-#endif
 }
 
 /*
@@ -673,6 +705,8 @@ static void skateshop_render( ent_skateshop *shop ){
       skateshop_render_charshop( shop );
    else if( shop->type == k_skateshop_type_worldshop )
       skateshop_render_worldshop( shop );
+   else if( shop->type == k_skateshop_type_server ){
+   }
    else
       vg_fatal_error( "Unknown store (%u)\n", shop->type );
 }
@@ -725,6 +759,12 @@ static void ent_skateshop_call( world_instance *world, ent_call *call ){
          ent_skateshop_helpers_pickable( "open rift" );
          skateshop_op_world_scan();
       }
+      else if( shop->type == k_skateshop_type_server ){
+         vg_str text;
+         global_skateshop.helper_pick = gui_new_helper(
+                     input_button_list[k_srbind_maccept], &text);
+         skateshop_server_helper_update();
+      }
    }
 }
 
index 5e9a0a86cf25c2857349d6b75ab4a5d7a35941f7..d39e3d94dbb66bb2cf49cbc67a180efe9f80a720 100644 (file)
@@ -33,7 +33,12 @@ struct{
    }
    render;
 
-   struct gui_helper *helper_pick, *helper_browse;
+   union {
+      struct gui_helper *helper_pick, *helper_toggle;
+   };
+
+   struct gui_helper *helper_browse;
+
 
    addon_reg *reg_preview, *reg_loaded_preview;
    GLuint tex_preview, tex_preview_err;
index c3b6694b23c3a3ef329306ea1e0c2799ca2ca5d8..c39d22400bff0d2c710967f0259f3bef64bd1b20 100644 (file)
--- a/entity.h
+++ b/entity.h
@@ -247,9 +247,11 @@ struct ent_marker{
 };
 
 enum skateshop_type{
-   k_skateshop_type_boardshop,
-   k_skateshop_type_charshop,
-   k_skateshop_type_worldshop,
+   k_skateshop_type_boardshop = 0,
+   k_skateshop_type_charshop = 1,
+   k_skateshop_type_worldshop = 2,
+   k_skateshop_type_DELETED = 3,
+   k_skateshop_type_server = 4
 };
 
 struct ent_skateshop{
@@ -275,6 +277,11 @@ struct ent_skateshop{
              id_info;
       }
       worlds;
+
+      struct{
+         u32 id_lever;
+      }
+      server;
    };
 };
 
index 49a245ef1d089420f80ceae1fd7c19a9e863f6b3..ba17643b7fd3e1b786a84c5e605c2063be7a7571 100644 (file)
Binary files a/maps_src/dev_hub/main.mdl and b/maps_src/dev_hub/main.mdl differ
index 92389016c49a7a5240e03ff0794bc674ac6bfd05..8833d19caf704b5d8cdc9585a60d374aee8c58ce 100644 (file)
--- a/network.c
+++ b/network.c
@@ -445,6 +445,13 @@ static void network_update(void){
 
    ESteamNetworkingConnectionState state = network_client.state;
 
+   if( network_client.user_intent == k_server_intent_offline ){
+      if( state != k_ESteamNetworkingConnectionState_None )
+         network_disconnect();
+
+      return;
+   }
+
    if( state == k_ESteamNetworkingConnectionState_Connected ){
       poll_remote_connection();
       f64 frame_delta = vg.time_real - network_client.last_frame;
index b643a1b7da9f96641972d352417c3569d3ba2577..f57bfe54b6525fb48410c5d2c19973b7f085e351 100644 (file)
--- a/network.h
+++ b/network.h
@@ -63,11 +63,20 @@ struct {
    vg_pool request_pool;
 
    char server_adress[64];
+
+   enum server_intent {
+      k_server_intent_offline,
+      k_server_intent_online
+   }
+   user_intent;
+   f64 last_intent_change;
+   f32 fintent; /* yeah this shit really shouldnt be here but oh well */
 }
 static network_client = {
    .auth_mode = eServerModeAuthentication,
    .state = k_ESteamNetworkingConnectionState_None,
-   .server_adress = "46.101.34.155"
+   .server_adress = "46.101.34.155",
+   .last_intent_change = -99999.9
 };
 
 static int packet_minsize( SteamNetworkingMessage_t *msg, u32 size );
index 2bc0e4c7f1384cd7011aee2b4f3a2cedf1dd3349..14af6a7ca585f6d44d5a4f32f442880dcb47660c 100644 (file)
@@ -286,6 +286,7 @@ static void vg_pre_update(void){
    world_entity_focus_preupdate();
    skaterift_replay_pre_update();
    remote_sfx_pre_update();
+   skateshop_world_preupdate( world_current_instance() );
 
    world_update( world_current_instance(), localplayer.rb.co );
    audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co );