From dd7d6eb0702cd9a0c97ab6da9ec577af0b797b88 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 23 Nov 2023 15:59:34 +0000 Subject: [PATCH] the great server lever --- blender_export.py | 24 ++++++++++-- ent_skateshop.c | 80 ++++++++++++++++++++++++++++---------- ent_skateshop.h | 7 +++- entity.h | 13 +++++-- maps_src/dev_hub/main.mdl | Bin 399600 -> 409856 bytes network.c | 7 ++++ network.h | 11 +++++- skaterift.c | 1 + 8 files changed, 115 insertions(+), 28 deletions(-) diff --git a/blender_export.py b/blender_export.py index d397cd7..8b0bd10 100644 --- a/blender_export.py +++ b/blender_export.py @@ -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 ) diff --git a/ent_skateshop.c b/ent_skateshop.c index c10352d..0084e19 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -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; ient_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(); + } } } diff --git a/ent_skateshop.h b/ent_skateshop.h index 5e9a0a8..d39e3d9 100644 --- a/ent_skateshop.h +++ b/ent_skateshop.h @@ -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; diff --git a/entity.h b/entity.h index c3b6694..c39d224 100644 --- 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; }; }; diff --git a/maps_src/dev_hub/main.mdl b/maps_src/dev_hub/main.mdl index 49a245ef1d089420f80ceae1fd7c19a9e863f6b3..ba17643b7fd3e1b786a84c5e605c2063be7a7571 100644 GIT binary patch delta 2514 zcmZ`(4Qx|Y6u!6ZW9`~?Ti3O(T^Su6+GK+a#?N4L9SaGtKr9iXLj&Ue0Z z&)>cGO&k{!dtAxFnd^0oamH9nYdkD9w4kJnGJ!E`$8x8TFft}~yy%?SYhf%M$qJm2 zx~9#MP-}fW9BLx_dmSBly0XlUV{Tf%buTN+RNO8^vR-Q4+(yP^i6f?R#V8Zk5(~9S zGQ(JJCggK>!53&^Ko!N3O&W23%PY|s;v-p%>ES8v6jo)U6&&TF*T&ckq`Fn}?a`)f zk$MC;j1I;G;5ujiI7(P8({hT0rEps`-c*OWpc4*pcfMa_%#2V=EfR`1YI$e5!L4&I z%gR$K!)_?4wY9|J_1nYsZH#%5qk$R9Eec6t>{2*N)p_$k(zyjPxdR6=o#aYA+fks@ zN&O5WxQq+=IhMAv5(#~YUfn?h3kywU|F?BrJcVh&>lJM9p|?hzTA$^^8t)KTgIdMaCd#^PBKAWuhB0W|W$!SJa6CSd9n|Sms8d9g#^zSKuo| zbl~Lh9{hudT0_VKOVdhCLVsj$T^S0cFO4`Gp96 zKqWRDM`Bq1$lpZZLhYt1)CH)TCd|i;c7MR{Mqm0~$_Gb=9=^BaTPZrJE};RcYD}|D z>oF_3HKnl4uvh-*63>`D?9ilJJ%4fUR zR?(L#+km!I*-qeQpQ+Wu*lk3EFc;C5e8#>;n_Ez8_N6~DOF<2pu)#drbX$eLLOYTt zyb9Tv1t-k2;ktQ(AA$3ha()Y2w7`}?FY+*=b3IBmP+)Sy2N^D20lPEGg^j4^Xj%m0 z85ZF?L}@ZAv=-Z%5Cw-hODT;cGNRVwaB^=CM!C!^{l1CmMq$ZLrwq&QJm*kLc` z96q*}a~<5YmwWVRATT4I7hOokK3OhS--(|H)VT%ua$E4V%Xf)Ln6Ub}4P2R}OLC^E zDSDjws$Xqf9T0Bv5xPZFld<-lLM56fZeHFEPuu4}GRMzzVV&IvKceK2CBNOzoh12B zJ?X2yVKrBsJI6=P{Cg-cf9Bo5{qx1>k+F5}SI{@H&owsyJZEbp*2gK}|J? z&VB<`CBNb^Y%mQDZ`z6+_f@20PWh4(BkEwpb_q&y{d^Q^bBl0om)GO+`jfnx9Hd_) zuOVCu;h?;JiE9P?>?ks>!k0x+Kl;YWx#8q_aaJuJityg>y?1luJQY(emgW>$hg^%RVfk?hoqVxMN80?6o8gp4|+ zc@#euDOLh%LZ?(D$cF_5ux~8gJe=-pmKb zn{~Z~_GvGhZWNBhFx(bB(}|%;VwX!MDz$&XB(Wxym~!QDc`Ot|`(wZ@v5*v#zYwsy zQWQh5LQ!a2hM?6Y=cz?S=kyw|Q|O%X)CkN|CA4(ZsE;Kcay9vv({2fAzh U@9K^FDth!d4TBXu!oaTo05$x8Gynhq delta 1266 zcmY*ZUuaup6hGg+xm|9S|4nz3+qK=6GJ=gzY{9KnbU2hkAG!x&868`?#&Sn;b4^MU zAC&4C^+BQGC@SosWmR-j$!s)zsDF`dh#LwM1OCBB2R>Aopbu{TzMH!T4}2%z@BDuE zeCM3+Bg-$PcCI8>hX;--M1qK_ixtaWsAAW(j7Ah{95J**exkm{Nn@b1nA{ zqykKPTzT$n;mo47Bn9;ZIDS+Z%4i?o6{eOnhT6?5WxvYR>ReO;|pol0TJ zD%5ZqIB8KVIitL7VN6z8w%19rt(cmWOz^9UF}Rgh>Fhpa_r#VxZ=LaqJpDF*rM$CQ zSH}f^;XB%Uv6`bNkJF_KJ?HK|Q(q{SYs9K{n=?HbU4AcHeVKDTV><559o+`M4z$bT zTKqi_uF_S0&7oamy6&Ohc?w8gt;`bS^FX+3H_KlB5-8+x4*v^;yK$AveAqw6qyB{N z5{#GqEzLxRpSYl>19LJT>@S7$p+RoyJ~wm|0)#%(59p&9pnOaHd|OZJMW7y_$G9($ z)+<0QpeOhU&_SFpm781wngg0anjiVCKsxY|tOj;jljnqFPcpO(!DapvavOKyM=_uB z!0xoZWD;F~M&&7>ct4RWd5YJ8vU`dC09xT2K*>R(t5CN1AD~}7^e`U_rUM&8U2ZGF zF9Z*C+g}Urh&Qty(1&;=oD$RgVt7&^%piOsJ_}~% zb3v8u-Hi1Q<<2$hE6uuSH|xsUaQnM;Wo`BoL*0J5 cJzY{WPqlp?tB*%kX0NGOzV_@jZR5HB0G@&$^8f$< diff --git a/network.c b/network.c index 9238901..8833d19 100644 --- 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; diff --git a/network.h b/network.h index b643a1b..f57bfe5 100644 --- 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 ); diff --git a/skaterift.c b/skaterift.c index 2bc0e4c..14af6a7 100644 --- a/skaterift.c +++ b/skaterift.c @@ -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 ); -- 2.25.1