From 12b6a5e7ae10083a1e9e1e721cb40740040da43a Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Wed, 11 Feb 2026 03:23:40 +1100 Subject: [PATCH] first lobby draft made, you can move a charcter around --- DoeEyedGirl/mat_doe_eyed_girl.tres | 12 +++ DoeEyedGirl/mdl_doe_eyed_girl.glb | Bin 0 -> 90960 bytes DoeEyedGirl/mdl_doe_eyed_girl.glb.import | 50 +++++++++++ DoeEyedGirl/scn_doe_eyed_girl.tscn | 8 ++ DoeEyedGirl/tex_doe_eyed_girl.png | Bin 0 -> 1453 bytes DoeEyedGirl/tex_doe_eyed_girl.png.import | 40 +++++++++ Levels/Level1/testwave.tres | 25 ++++++ PCs/hero.gd | 7 +- PCs/hero.tscn | 60 +++++++------ Scenes/Menus/multiplayer_lobby.tscn | 78 ++++++++--------- Scenes/Menus/server_form.tscn | 1 - Scripts/Resources/feature.gd | 2 + Scripts/game.gd | 2 + Scripts/lobby.gd | 2 + Scripts/multiplayer_lobby.gd | 94 ++++++++++++++++----- Scripts/scoreboard.gd | 47 ----------- Scripts/scoreboard.gd.uid | 1 - Scripts/scoreboard_entry.gd | 28 ------ Scripts/scoreboard_entry.gd.uid | 1 - Scripts/singleplayer_lobby.gd | 1 - Towers/tower.gd | 2 +- UI/Menus/MainMenu/main_menu.gd | 24 +++++- UI/Menus/MainMenu/main_menu.tscn | 6 ++ UI/Menus/OptionsMenu/gameplay_options.tscn | 1 + UI/scoreboard.tscn | 31 ------- UI/scoreboard_entry.tscn | 35 -------- main.gd | 2 + network_puppeteer.gd | 25 ++++++ network_puppeteer.gd.uid | 1 + 29 files changed, 348 insertions(+), 238 deletions(-) create mode 100644 DoeEyedGirl/mat_doe_eyed_girl.tres create mode 100644 DoeEyedGirl/mdl_doe_eyed_girl.glb create mode 100644 DoeEyedGirl/mdl_doe_eyed_girl.glb.import create mode 100644 DoeEyedGirl/scn_doe_eyed_girl.tscn create mode 100644 DoeEyedGirl/tex_doe_eyed_girl.png create mode 100644 DoeEyedGirl/tex_doe_eyed_girl.png.import create mode 100644 Levels/Level1/testwave.tres delete mode 100644 Scripts/scoreboard.gd delete mode 100644 Scripts/scoreboard.gd.uid delete mode 100644 Scripts/scoreboard_entry.gd delete mode 100644 Scripts/scoreboard_entry.gd.uid delete mode 100644 UI/scoreboard.tscn delete mode 100644 UI/scoreboard_entry.tscn create mode 100644 network_puppeteer.gd create mode 100644 network_puppeteer.gd.uid diff --git a/DoeEyedGirl/mat_doe_eyed_girl.tres b/DoeEyedGirl/mat_doe_eyed_girl.tres new file mode 100644 index 0000000..80ccfc6 --- /dev/null +++ b/DoeEyedGirl/mat_doe_eyed_girl.tres @@ -0,0 +1,12 @@ +[gd_resource type="ShaderMaterial" format=3 uid="uid://8uj5v7wo0nu2"] + +[ext_resource type="Shader" uid="uid://dq04j2s5foo2f" path="res://Shaders/mightyduke_ps1.gdshader" id="1_1kksn"] +[ext_resource type="Texture2D" uid="uid://bvx0xurv0nwtq" path="res://DoeEyedGirl/tex_doe_eyed_girl.png" id="2_3bssb"] + +[resource] +render_priority = 0 +shader = ExtResource("1_1kksn") +shader_parameter/albedo = ExtResource("2_3bssb") +shader_parameter/jitter_z_coordinate = true +shader_parameter/jitter_depth_independent = true +shader_parameter/alpha_scissor = 1.0 diff --git a/DoeEyedGirl/mdl_doe_eyed_girl.glb b/DoeEyedGirl/mdl_doe_eyed_girl.glb new file mode 100644 index 0000000000000000000000000000000000000000..18e103d44060ac482788217141502333e2efd36a GIT binary patch literal 90960 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≦Y#Y2y*=;U8K7o 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 literal 0 HcmV?d00001 diff --git a/DoeEyedGirl/mdl_doe_eyed_girl.glb.import b/DoeEyedGirl/mdl_doe_eyed_girl.glb.import new file mode 100644 index 0000000..4cab14f --- /dev/null +++ b/DoeEyedGirl/mdl_doe_eyed_girl.glb.import @@ -0,0 +1,50 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bha5gaovnfrxp" +path="res://.godot/imported/mdl_doe_eyed_girl.glb-8bafc3618b178d883864369deb9e3ea1.scn" + +[deps] + +source_file="res://DoeEyedGirl/mdl_doe_eyed_girl.glb" +dest_files=["res://.godot/imported/mdl_doe_eyed_girl.glb-8bafc3618b178d883864369deb9e3ea1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=false +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={ +"materials": { +"Material.027": { +"use_external/enabled": true, +"use_external/fallback_path": "res://DoeEyedGirl/mat_doe_eyed_girl.tres", +"use_external/path": "uid://8uj5v7wo0nu2" +} +} +} +gltf/naming_version=2 +gltf/embedded_image_handling=1 diff --git a/DoeEyedGirl/scn_doe_eyed_girl.tscn b/DoeEyedGirl/scn_doe_eyed_girl.tscn new file mode 100644 index 0000000..b7be708 --- /dev/null +++ b/DoeEyedGirl/scn_doe_eyed_girl.tscn @@ -0,0 +1,8 @@ +[gd_scene format=3 uid="uid://djx385r2csro4"] + +[ext_resource type="PackedScene" uid="uid://bha5gaovnfrxp" path="res://DoeEyedGirl/mdl_doe_eyed_girl.glb" id="1_gun1t"] + +[node name="Node3D" type="Node3D" unique_id=1269374108] + +[node name="doe_girl" parent="." unique_id=1532649165 instance=ExtResource("1_gun1t")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0818636, 0) diff --git a/DoeEyedGirl/tex_doe_eyed_girl.png b/DoeEyedGirl/tex_doe_eyed_girl.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7ae6677d1c9797cf13b8fc515d23f86a3bc334 GIT binary patch literal 1453 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+7>k44ofy`glX=O&z?$yq z;uumf=j~kEY*9y%w)3KnZ-P6OmKa7wbZT_$70X)O>&tcUn3E%SbTq5<#!VY89P`Tk zBCnB@I5f{n5M2lCi-1!1Ho{FLOq@A3P3ij8hr=*2>-A{XhA6^}%T` z8YL5+1%OOu5N~W_)MR*FZ})&@L-YB2_A(ZX9&s86&NK=ih~s|1Hu0f@F3ZlG{G3y- zE-EW2efo8CuiyKpKOV|oV6v(DxAA-R@)L5mrDqpCx^i;waZ@k$aHg7^{G75XnW}r= zZ>^i3&%QrwfgkVhpKp6R{>N-L>nB=f9S&`CVLdu)O}+zPua-){MiVhs3u`dCFf_zQ=m6dE6TX|U&S$9bK+T87&xtn$IUJXEbGdar<+pyar>^ku_?EVfyP4;uE(+h$l=PE z-Wj#|K!~jk+Y$ydjn|A@S?;i|W7)Fw_tdRlU!8LBb>w55&$x_l&+W;z+k@`k-m1HS z>Bq8WrPD!ItoT+iMlibkW8GCMxZ=>H0PPJ-GZ^0I?fufn?I9Dv81ts#HhZUsga_lD z18vjVG#w>87;}6YZl7W}&RDpBaG{N_-gcl*e3j(r>}7|d=l$tLv(yDVV!u(jQD zt=p}nQM@DL;2VxdZ4>@Ea0@gG9cdIju%vYN_t}h!-&vL|PLn#(@SWL=d4f$q!_37| z4AWXIE-<~RtG&3(dB)=ZB@0+N0w=SW&evGw)UY?3(IWbYw|Btpl@D@P2sorz{!o2g zAN?SEuZPGVD+iqm+S#us%W-FL*PK0&-Vji*{0!5+xOnRiOgnaz+HYsk6i<|}&VBCE z%ka*yA!vG^E9V}^R)*Zg^~EbHPR(S9`rvxtUvdY3JpcCQ{a;@>O?%Jf`&xjtVLoe% z#NvOq71-{$x^m7)nic-L$uB;H!@z9c1LZYejs~bZymO5AYG{u+ync&|)^Ub~r;n8+ zb{&`^=f2`JgHk11eKKqPD${=CmF8zuo=)e4qo-9TSj-JI)3_|TpXJkax z+jjiOvQ6haz2Ypxo)90YELMYn7K6^K=FV1_n=8 KKbLh*2~7Z>nt&w$ literal 0 HcmV?d00001 diff --git a/DoeEyedGirl/tex_doe_eyed_girl.png.import b/DoeEyedGirl/tex_doe_eyed_girl.png.import new file mode 100644 index 0000000..409f89a --- /dev/null +++ b/DoeEyedGirl/tex_doe_eyed_girl.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvx0xurv0nwtq" +path="res://.godot/imported/tex_doe_eyed_girl.png-871861c38bf502af4839c079b6bb1308.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://DoeEyedGirl/tex_doe_eyed_girl.png" +dest_files=["res://.godot/imported/tex_doe_eyed_girl.png-871861c38bf502af4839c079b6bb1308.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Levels/Level1/testwave.tres b/Levels/Level1/testwave.tres new file mode 100644 index 0000000..1759555 --- /dev/null +++ b/Levels/Level1/testwave.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://bkcmdtfrhq43v"] + +[ext_resource type="Script" uid="uid://3grc2j4bjrnw" path="res://enemy_group.gd" id="1_bojkk"] +[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_a2eo6"] +[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_ptt5n"] + +[sub_resource type="Resource" id="Resource_crjd6"] +script = ExtResource("1_bojkk") +enemy = ExtResource("2_a2eo6") +count = 40 +metadata/_custom_type_script = "uid://3grc2j4bjrnw" + +[sub_resource type="Resource" id="Resource_llpiq"] +script = ExtResource("1_bojkk") +enemy = ExtResource("2_a2eo6") +count = 20 +metadata/_custom_type_script = "uid://3grc2j4bjrnw" + +[resource] +script = ExtResource("2_ptt5n") +enemy_groups = Dictionary[ExtResource("1_bojkk"), int]({ +SubResource("Resource_crjd6"): 0, +SubResource("Resource_llpiq"): 0 +}) +metadata/_custom_type_script = "uid://bp6q371iypd06" diff --git a/PCs/hero.gd b/PCs/hero.gd index 563eccb..bda6673 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -14,7 +14,7 @@ signal placed_tower(tower: Tower) @export var right_hand: Node3D @export var edit_tool: PathEditTool @export var carding_tool: CardPlacingTool -@export var sprite: EightDirectionSprite3D +@export var model: Node3D @export var interaction_raycast: RayCast3D @export var draw_pile: Inventory @export var hand: Inventory @@ -117,7 +117,7 @@ func _ready() -> void: if is_multiplayer_authority(): ears.make_current() camera.make_current() - sprite.queue_free() + model.queue_free() player_name_tag.queue_free() for card: Card in hero_class.deck: if game_manager and game_manager.card_gameplay: @@ -128,6 +128,7 @@ func _ready() -> void: camera.set_visible(false) gun_camera.set_visible(false) hud.set_visible(false) + $PostFx.visible = false for state: HeroState in editing_states: state.state_changed.connect(update_state) @@ -137,7 +138,7 @@ func _ready() -> void: if weapons[equipped_weapon] != null: weapons[equipped_weapon].set_raycast_origin(camera) - sprite.texture.atlas = hero_class.texture + #TODO: ADD A LINE HERE THAT SETS THE MODEL MESH BASED ON THE PLAYERS CLASS Input.mouse_mode = Input.MOUSE_MODE_CAPTURED diff --git a/PCs/hero.tscn b/PCs/hero.tscn index df4442c..04c4d2f 100644 --- a/PCs/hero.tscn +++ b/PCs/hero.tscn @@ -2,7 +2,6 @@ [ext_resource type="Script" uid="uid://1fqpoegbdm6n" path="res://PCs/hero.gd" id="1_pihpe"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="2_dbyo0"] -[ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="2_ib0t5"] [ext_resource type="PackedScene" uid="uid://ct6gic4shy5qw" path="res://wave_viewer.tscn" id="2_o55s8"] [ext_resource type="PackedScene" uid="uid://buvgdem68wtev" path="res://UI/Menus/PauseMenu/pause_menu.tscn" id="3_avnsx"] [ext_resource type="PackedScene" uid="uid://n8ab1cy7ordc" path="res://card_model/3d_card.tscn" id="4_2mqvj"] @@ -10,7 +9,6 @@ [ext_resource type="PackedScene" uid="uid://gdd1xupf4oxx" path="res://UI/CardSelectionBox/card_selection_box.tscn" id="5_h82f6"] [ext_resource type="PackedScene" uid="uid://dqt1ggtkpkuhs" path="res://PCs/PathEditTool/path_edit_tool.tscn" id="5_jlxb3"] [ext_resource type="Script" uid="uid://do24iuot0j7d7" path="res://Scripts/inventory.gd" id="6_cf5ap"] -[ext_resource type="Texture2D" uid="uid://cjqxkraykhxxk" path="res://Classes/Engineer/red.png" id="6_yyp8i"] [ext_resource type="Script" uid="uid://3wvxl8jo4uis" path="res://PCs/weapon_movement.gd" id="7_14ugt"] [ext_resource type="PackedScene" uid="uid://bj2q72ch8nkek" path="res://card_placing_tool.tscn" id="8_7d213"] [ext_resource type="Script" uid="uid://b6kjrl7ae1mi0" path="res://PCs/hud.gd" id="8_yl6ka"] @@ -23,6 +21,7 @@ [ext_resource type="Script" uid="uid://dkhl8u8p6gmlu" path="res://PCs/spring.gd" id="15_0ehim"] [ext_resource type="Texture2D" uid="uid://c60fh34ttgcvh" path="res://Assets/Textures/minimap_player.png" id="15_nhlam"] [ext_resource type="Texture2D" uid="uid://chhmkmlfrobhu" path="res://Enemies/Driftling/icon_driftling.png" id="15_q3yot"] +[ext_resource type="PackedScene" uid="uid://djx385r2csro4" path="res://DoeEyedGirl/scn_doe_eyed_girl.tscn" id="16_0ehim"] [ext_resource type="Texture2D" uid="uid://cqnapc8cscl7i" path="res://Assets/Textures/border.png" id="16_x1xjr"] [ext_resource type="PackedScene" uid="uid://chnj376d3lcjd" path="res://UI/pickup_notification.tscn" id="17_oyeww"] [ext_resource type="Script" uid="uid://b5wle8f6rv3e7" path="res://PCs/player_movement.gd" id="20_cfhw8"] @@ -78,6 +77,7 @@ [ext_resource type="AudioStream" uid="uid://hyyngwod6wke" path="res://Audio/MGWSoundDesign/DirtRoad_Mono_04.wav" id="70_sewk0"] [ext_resource type="AudioStream" uid="uid://b2p1egvjy6w1b" path="res://Audio/MGWSoundDesign/PavementTiles_Mono_05.wav" id="71_dx4x6"] [ext_resource type="AudioStream" uid="uid://dbpecjrivtwav" path="res://Audio/MGWSoundDesign/DirtRoad_Mono_05.wav" id="71_n0bvw"] +[ext_resource type="Script" uid="uid://dbyaxum1l8dn4" path="res://network_puppeteer.gd" id="78_vkt85"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_o55s8"] animation = &"read" @@ -138,11 +138,6 @@ height = 1.8 background_mode = 1 background_color = Color(0.282353, 0.615686, 0.278431, 1) -[sub_resource type="AtlasTexture" id="AtlasTexture_vkt85"] -resource_local_to_scene = true -atlas = ExtResource("6_yyp8i") -region = Rect2(0, 0, 96, 96) - [sub_resource type="ViewportTexture" id="ViewportTexture_m3ots"] viewport_path = NodePath("NametagViewport") @@ -158,14 +153,6 @@ viewport_path = NodePath("MiniMapViewport") [sub_resource type="ViewportTexture" id="ViewportTexture_w13oc"] viewport_path = NodePath("CoinViewport") -[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_tsiqi"] -properties/0/path = NodePath(".:position") -properties/0/spawn = true -properties/0/replication_mode = 2 -properties/1/path = NodePath(".:rotation") -properties/1/spawn = true -properties/1/replication_mode = 2 - [sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_wyb7c"] streams_count = 4 stream_0/stream = ExtResource("24_8ch4w") @@ -232,7 +219,7 @@ stream_2/stream = ExtResource("69_c5gvc") stream_3/stream = ExtResource("70_sewk0") stream_4/stream = ExtResource("71_n0bvw") -[node name="Hero" type="CharacterBody3D" unique_id=1918171232 node_paths=PackedStringArray("subviewport1", "camera", "gun_camera", "left_hand", "right_hand", "edit_tool", "carding_tool", "sprite", "interaction_raycast", "draw_pile", "hand", "discard_pile", "hud", "movement", "player_name_tag", "weapon_swap_timer", "editing_states", "fighting_state", "default_state", "ears", "place_card_audio", "swap_card_audio", "ready_audio", "unready_audio", "fullpower_audio", "zeropower_audio", "swap_off_audio", "swap_on_audio", "anim_tree", "anim_tree2", "weapon_pivot", "cassette", "left_hand_model", "gauntlet_model")] +[node name="Hero" type="CharacterBody3D" unique_id=1918171232 node_paths=PackedStringArray("subviewport1", "camera", "gun_camera", "left_hand", "right_hand", "edit_tool", "carding_tool", "model", "interaction_raycast", "draw_pile", "hand", "discard_pile", "hud", "movement", "player_name_tag", "weapon_swap_timer", "editing_states", "fighting_state", "default_state", "ears", "place_card_audio", "swap_card_audio", "ready_audio", "unready_audio", "fullpower_audio", "zeropower_audio", "swap_off_audio", "swap_on_audio", "anim_tree", "anim_tree2", "weapon_pivot", "cassette", "left_hand_model", "gauntlet_model")] collision_layer = 2 collision_mask = 37 script = ExtResource("1_pihpe") @@ -245,7 +232,7 @@ left_hand = NodePath("FirstPersonViewport/Head2/ViewMovement/RightHand/card_hand right_hand = NodePath("FirstPersonViewport/Head2/ViewMovement/RightHand") edit_tool = NodePath("SubViewport/Head/EditTool") carding_tool = NodePath("SubViewport/Head/CardPlacingTool") -sprite = NodePath("EightDirectionSprite") +model = NodePath("Model") interaction_raycast = NodePath("SubViewport/Head/RayCast3D") draw_pile = NodePath("DrawPile") hand = NodePath("Hand") @@ -422,6 +409,24 @@ collision_mask = 24 [node name="CardPlacingTool" parent="SubViewport/Head" unique_id=1227455090 node_paths=PackedStringArray("hero") instance=ExtResource("8_7d213")] hero = NodePath("../../..") +[node name="Model" parent="." unique_id=1269374108 instance=ExtResource("16_0ehim")] + +[node name="Skeleton3D" parent="Model/doe_girl/Armature" parent_id_path=PackedInt32Array(1269374108, 1532649165, 851796479) index="0" unique_id=24687068] +bones/4/rotation = Quaternion(0.332303, -0.18204916, -0.5890503, 0.71375954) +bones/5/rotation = Quaternion(-0.906193, -0.05188831, 0.023806162, 0.41899294) +bones/7/rotation = Quaternion(-0.007778301, -0.004357032, -0.48717895, 0.8732566) +bones/9/rotation = Quaternion(0.103601396, 0.0787555, -0.60002625, 0.78932434) +bones/10/rotation = Quaternion(-0.35265866, -0.18703236, -0.4295865, 0.8100038) +bones/11/rotation = Quaternion(-0.020328829, -0.007425959, -0.34303707, 0.9390725) +bones/14/rotation = Quaternion(-0.39763534, -0.26168856, 0.626134, 0.61754483) +bones/15/rotation = Quaternion(-0.2017903, 0.01537974, -0.038131464, 0.97856534) +bones/16/rotation = Quaternion(-0.0048455084, 0.0038656965, 0.59440565, 0.8041415) +bones/18/rotation = Quaternion(-0.22720158, 0.019839184, 0.4623247, 0.856879) +bones/23/rotation = Quaternion(-0.045133278, -0.11772485, 0.9614003, -0.24456768) + +[node name="AnimationPlayer" parent="Model/doe_girl" parent_id_path=PackedInt32Array(1269374108, 1532649165) index="1" unique_id=478945409] +autoplay = &"HoldGun" + [node name="AudioListener3D" type="AudioListener3D" parent="." unique_id=1396328287] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) @@ -470,7 +475,7 @@ anchor = NodePath("../..") [node name="NametagViewport" type="SubViewport" parent="." unique_id=1829906785] transparent_bg = true -size = Vector2i(1000, 40) +size = Vector2i(166, 21) render_target_update_mode = 4 [node name="Label" type="Label" parent="NametagViewport" unique_id=1265368101] @@ -484,10 +489,6 @@ text = "xXx_TransgenderHyena_xXx" horizontal_alignment = 1 vertical_alignment = 1 -[node name="EightDirectionSprite" parent="." unique_id=438977751 instance=ExtResource("2_ib0t5")] -transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0.915529, 0) -texture = SubResource("AtlasTexture_vkt85") - [node name="MinimapIcon" type="Sprite3D" parent="." unique_id=1797025603] transform = Transform3D(4, 0, 0, 0, 0.0698095, 3.99939, 0, -3.99939, 0.0698095, 0, 2.86288, 0) layers = 4 @@ -498,10 +499,11 @@ texture = ExtResource("15_nhlam") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) layers = 5 sorting_offset = 500.0 -pixel_size = 0.002 +pixel_size = 0.005 billboard = 1 no_depth_test = true fixed_size = true +texture_filter = 2 texture = SubResource("ViewportTexture_m3ots") [node name="Hand" type="Node" parent="." unique_id=326433039] @@ -1002,9 +1004,6 @@ expand_icon = true wait_time = 0.4 one_shot = true -[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=1897693906] -replication_config = SubResource("SceneReplicationConfig_tsiqi") - [node name="PlaceCardAudio" type="AudioStreamPlayer" parent="." unique_id=1230517992] stream = SubResource("AudioStreamRandomizer_wyb7c") volume_db = -9.936 @@ -1125,9 +1124,18 @@ bus = &"SFX" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.43043494, 0) target_position = Vector3(0, -11.465, 0) +[node name="NetworkPuppeteer" type="Node" parent="." unique_id=1492136381 node_paths=PackedStringArray("player", "player_movement", "skeleton")] +script = ExtResource("78_vkt85") +player = NodePath("..") +player_movement = NodePath("../PlayerMovement") +skeleton = NodePath("../Model/doe_girl/Armature/Skeleton3D") +metadata/_custom_type_script = "uid://dbyaxum1l8dn4" + [connection signal="timeout" from="WeaponSwapTimer" to="." method="_on_timer_timeout"] [editable path="FirstPersonViewport/Head2/ViewMovement/RightHand/gauntlet"] [editable path="FirstPersonViewport/Head2/ViewMovement/RightHand/card_hand"] [editable path="FirstPersonViewport/Head2/ViewMovement/RightHand/card_hand/Empty_001/cassette"] +[editable path="Model"] +[editable path="Model/doe_girl"] [editable path="CoinViewport/Coin"] diff --git a/Scenes/Menus/multiplayer_lobby.tscn b/Scenes/Menus/multiplayer_lobby.tscn index f1c37fd..f5ef2cb 100644 --- a/Scenes/Menus/multiplayer_lobby.tscn +++ b/Scenes/Menus/multiplayer_lobby.tscn @@ -1,7 +1,6 @@ [gd_scene format=3 uid="uid://cwvprrvk4l2k0"] [ext_resource type="Script" uid="uid://cvm4lyhx1uh0w" path="res://Scripts/multiplayer_lobby.gd" id="2_nb860"] -[ext_resource type="PackedScene" uid="uid://dpt3kpixawyby" path="res://UI/scoreboard.tscn" id="3_f6bia"] [ext_resource type="PackedScene" uid="uid://bvfit0sy2tnw4" path="res://Scenes/Menus/server_form.tscn" id="5_bqbwv"] [ext_resource type="PackedScene" uid="uid://ddmg342ff2qaq" path="res://UI/chatbox.tscn" id="6_wtqwd"] [ext_resource type="AudioStream" uid="uid://cp6ph4ra7u5rk" path="res://UI/drop_003.ogg" id="7_6mhre"] @@ -12,19 +11,21 @@ random_pitch = 1.1 streams_count = 1 stream_0/stream = ExtResource("7_6mhre") -[node name="multiplayer_lobby" type="Control" unique_id=473106326 node_paths=PackedStringArray("server_form", "chatbox", "audio_player")] +[node name="multiplayer_lobby" type="Control" unique_id=473106326 node_paths=PackedStringArray("server_form", "audio_player")] layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 script = ExtResource("2_nb860") server_form = NodePath("ServerForm") character_select_screen = ExtResource("7_kawp7") -chatbox = NodePath("Chatbox") audio_player = NodePath("AudioStreamPlayer") +chatbox_scene = ExtResource("6_wtqwd") [node name="ServerForm" parent="." unique_id=1466097634 instance=ExtResource("5_bqbwv")] layout_mode = 1 @@ -33,44 +34,39 @@ offset_top = -112.0 offset_right = 151.0 offset_bottom = 112.0 -[node name="Scoreboard" parent="." unique_id=1465394887 instance=ExtResource("3_f6bia")] -visible = false -layout_mode = 1 -anchors_preset = -1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -472.0 -offset_right = -50.0 -grow_horizontal = 0 - -[node name="ReadyButton" type="Button" parent="." unique_id=7189097] -visible = false -layout_mode = 1 -anchors_preset = -1 -anchor_left = 1.0 -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -offset_left = -81.0 -offset_top = 311.0 -offset_right = -240.0 -offset_bottom = 19.0 -grow_horizontal = 0 -grow_vertical = 2 -text = "Ready" - -[node name="Chatbox" parent="." unique_id=1790554118 instance=ExtResource("6_wtqwd")] -layout_mode = 1 - [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=1774735888] stream = SubResource("AudioStreamRandomizer_cwnde") bus = &"SFX" -[connection signal="player_connected" from="." to="Scoreboard" method="add_player"] -[connection signal="player_disconnected" from="." to="Scoreboard" method="remove_player"] +[node name="PanelContainer" type="PanelContainer" parent="." unique_id=1897046379] +visible = false +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -6.0 +offset_top = -6.0 +offset_right = 6.0 +offset_bottom = 6.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer" unique_id=2052048593] +layout_mode = 2 + +[node name="FormTitle" type="Label" parent="PanelContainer/VBoxContainer" unique_id=626539239] +layout_mode = 2 +text = "TITLE_PLAYER_LOBBY" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ReadyButton" type="Button" parent="PanelContainer/VBoxContainer" unique_id=7189097] +layout_mode = 2 +text = "Ready" + [connection signal="connect_button_pressed" from="ServerForm" to="." method="connect_to_server"] -[connection signal="connect_button_pressed" from="ServerForm" to="ServerForm" method="set_visible" binds= [false]] [connection signal="host_button_pressed" from="ServerForm" to="." method="create_server"] -[connection signal="host_button_pressed" from="ServerForm" to="ServerForm" method="set_visible" binds= [false]] -[connection signal="mouse_entered" from="ReadyButton" to="." method="_on_button_mouse_entered"] -[connection signal="pressed" from="ReadyButton" to="." method="ready_player"] +[connection signal="mouse_entered" from="PanelContainer/VBoxContainer/ReadyButton" to="." method="_on_button_mouse_entered"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/ReadyButton" to="." method="ready_player"] diff --git a/Scenes/Menus/server_form.tscn b/Scenes/Menus/server_form.tscn index 91d5bd3..485cd47 100644 --- a/Scenes/Menus/server_form.tscn +++ b/Scenes/Menus/server_form.tscn @@ -9,7 +9,6 @@ streams_count = 1 stream_0/stream = ExtResource("2_hirre") [node name="ServerForm" type="PanelContainer" unique_id=1145091654 node_paths=PackedStringArray("ip_entry", "port_entry", "host_button", "join_button", "ip_field", "port_field", "players_field", "start_button")] -custom_minimum_size = Vector2(500, 0) anchors_preset = 8 anchor_left = 0.5 anchor_top = 0.5 diff --git a/Scripts/Resources/feature.gd b/Scripts/Resources/feature.gd index 9823261..812582c 100644 --- a/Scripts/Resources/feature.gd +++ b/Scripts/Resources/feature.gd @@ -7,9 +7,11 @@ extends Resource @export var strength: float +@warning_ignore("unused_parameter") func attach_to_tower(tower_stats: CardText) -> void: pass +@warning_ignore("unused_parameter") func attach_to_weapon(weapon_stats: CardText) -> void: pass diff --git a/Scripts/game.gd b/Scripts/game.gd index 823f93f..db3e5d6 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -278,6 +278,8 @@ func end_wave() -> void: Data.save_data.check_high_score(level_config.display_title, wave, starting_endless) for peer_id: int in connected_players_nodes: var player: Hero = connected_players_nodes[peer_id] as Hero + if player.hud.enemy_count < 0: + print(level_config.waves[wave - 2]) player.hud.set_wave_count(wave) player.currency += ceili(pot / connected_players_nodes.size()) player.currency += level_config.waves[wave - 2].bonus_cash diff --git a/Scripts/lobby.gd b/Scripts/lobby.gd index a26440d..ae8e0a4 100644 --- a/Scripts/lobby.gd +++ b/Scripts/lobby.gd @@ -12,11 +12,13 @@ var loadout_editor: CharacterSelect = null var connected_players_profiles: Dictionary = {} var enet_peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new() + func setup_the_ui() -> void: chatbox = chatbox_scene.instantiate() game_manager.UILayer.add_child(chatbox) chatbox.set_visible(true) chatbox.game_manager = game_manager + game_manager.chatbox = chatbox chatbox.anchor_bottom = 0.98 chatbox.anchor_left = 0.02 chatbox.anchor_top = 0.7 diff --git a/Scripts/multiplayer_lobby.gd b/Scripts/multiplayer_lobby.gd index 3f6671d..36449cd 100644 --- a/Scripts/multiplayer_lobby.gd +++ b/Scripts/multiplayer_lobby.gd @@ -7,6 +7,9 @@ signal disconnected_from_server @export var server_form: ServerForm +var player_ready_boxes: Dictionary[PlayerProfile, CheckBox] +var player_character_selected_states: Dictionary[PlayerProfile, bool] + var alert_popup_scene: PackedScene = preload("res://Scenes/Menus/alert_popup.tscn") @@ -30,7 +33,10 @@ func _on_player_disconnected(peer_id: int) -> void: func _on_connection_succeeded() -> void: - setup_game(multiplayer.get_unique_id()) + #setup_game(multiplayer.get_unique_id()) + connected_players_profiles[multiplayer.get_unique_id()] = Data.player_profile + add_player_entry(Data.player_profile) + $PanelContainer.visible = true func _on_connection_failed() -> void: @@ -48,22 +54,21 @@ func _on_server_disconnected() -> void: func create_server() -> void: enet_peer.create_server(server_form.port, server_form.max_players) multiplayer.multiplayer_peer = enet_peer - setup_game(1) + add_player_entry(Data.player_profile) + connected_players_profiles[1] = Data.player_profile + $PanelContainer.visible = true + #setup_game(1) -func setup_game(peer_id: int) -> void: +func setup_game() -> void: loadout_editor = character_select_screen.instantiate() as CharacterSelect add_child(loadout_editor) - player_disconnected.connect(game_manager.remove_player) - #scoreboard.all_players_ready.connect(start_game) - game_manager.chatbox = chatbox + loadout_editor.hero_confirmed.connect(select_class) chatbox.username = Data.player_profile.display_name Data.player_profile.display_name_changed.connect(chatbox.change_username) - loadout_editor.hero_selected.connect(Data.player_profile.set_preferred_class) - loadout_editor.hero_selected.connect(edit_player_profile) - connected_players_profiles[peer_id] = Data.player_profile - player_connected.emit(peer_id, Data.player_profile) - setup_the_ui() + #loadout_editor.hero_selected.connect(Data.player_profile.set_preferred_class) + #loadout_editor.hero_selected.connect(edit_player_profile) + #player_connected.emit(peer_id, Data.player_profile) func connect_to_server() -> void: @@ -71,17 +76,70 @@ func connect_to_server() -> void: multiplayer.multiplayer_peer = enet_peer -func ready_player() -> void: - pass - #var peer_id: int = multiplayer.get_unique_id() - #networked_ready_player.rpc(peer_id) +@rpc("any_peer", "reliable") +func networked_ready_player(peer_id: int) -> void: + player_ready_boxes[connected_players_profiles[peer_id]].button_pressed = true + var start_game: bool = true + for box: CheckBox in player_ready_boxes.values(): + if !box.button_pressed: + start_game = false + if start_game: + setup_game() + + +func ready_player(peer_id: int = multiplayer.get_unique_id()) -> void: + networked_ready_player.rpc(peer_id) + $PanelContainer/VBoxContainer/ReadyButton.visible = false + player_ready_boxes[connected_players_profiles[peer_id]].button_pressed = true + var start_game: bool = true + for box: CheckBox in player_ready_boxes.values(): + if !box.button_pressed: + start_game = false + if start_game: + setup_game() + + +@rpc("any_peer", "reliable") +func networked_select_class(peer_id: int) -> void: + player_character_selected_states[connected_players_profiles[peer_id]] = true + var start_game: bool = true + for state: bool in player_character_selected_states.values(): + if !state: + start_game = false + if start_game: + start_game() + + +func select_class(peer_id: int = multiplayer.get_unique_id()) -> void: + networked_select_class.rpc(peer_id) + player_character_selected_states[connected_players_profiles[peer_id]] = true + var start_game: bool = true + for state: bool in player_character_selected_states.values(): + if !state: + start_game = false + if start_game: + start_game() func start_game() -> void: enet_peer.refuse_new_connections = true + visible = false super.start_game() +func add_player_entry(profile: PlayerProfile) -> void: + print("added player: " + str(profile.display_name)) + var entry: HBoxContainer = HBoxContainer.new() + var label: Label = Label.new() + var check: CheckBox = CheckBox.new() + check.mouse_filter = Control.MOUSE_FILTER_IGNORE + label.text = profile.display_name + entry.add_child(label) + entry.add_child(check) + $PanelContainer/VBoxContainer.add_child(entry) + player_ready_boxes[profile] = check + + #TODO: what the fuck is this doing lol func edit_player_profile(_argument: int) -> void: var profile_dict: Dictionary = Data.player_profile.to_dict() @@ -102,8 +160,4 @@ func add_player(new_player_profile_dict: Dictionary) -> void: chatbox.append_message("SERVER", Color.TOMATO, new_player_profile.display_name + " has connected!") connected_players_profiles[new_player_peer_id] = new_player_profile player_connected.emit(new_player_peer_id, new_player_profile) - - -#@rpc("any_peer", "reliable", "call_local") -#func networked_ready_player(peer_id: int) -> void: - #scoreboard.set_player_ready_state(peer_id, true) + add_player_entry(new_player_profile) diff --git a/Scripts/scoreboard.gd b/Scripts/scoreboard.gd deleted file mode 100644 index 6b43423..0000000 --- a/Scripts/scoreboard.gd +++ /dev/null @@ -1,47 +0,0 @@ -class_name Scoreboard -extends PanelContainer - -signal all_players_ready() - -var entry_scene: PackedScene = preload("res://UI/scoreboard_entry.tscn") -var entries: Dictionary = {} - - -func _ready() -> void: - $VBoxContainer/DummyEntry1.queue_free() - $VBoxContainer/DummyEntry2.queue_free() - $VBoxContainer/DummyEntry3.queue_free() - - -func get_player_entry(peer_id: int) -> ScoreboardEntry: - return entries[peer_id] - - -func set_player_ready_state(peer_id: int, state: bool) -> void: - entries[peer_id].set_ready_state(state) - for id: int in entries: - if !entries[id].get_ready_state(): - return - all_players_ready.emit() - unready_all_players() - - -func unready_all_players() -> void: - for peer_id: int in entries: - entries[peer_id].set_ready_state(false) - - -func add_player(peer_id: int, player_profile: PlayerProfile) -> void: - var entry: ScoreboardEntry = entry_scene.instantiate() as ScoreboardEntry - entry.name = str(peer_id) - entry.set_display_name("", player_profile.get_display_name()) - entry.set_character(0, player_profile.get_preferred_class()) - player_profile.display_name_changed.connect(entry.set_display_name) - player_profile.preferred_class_changed.connect(entry.set_character) - entries[peer_id] = entry - $VBoxContainer.add_child(entry) - - -func remove_player(peer_id: int) -> void: - entries[peer_id].queue_free() - entries.erase(peer_id) diff --git a/Scripts/scoreboard.gd.uid b/Scripts/scoreboard.gd.uid deleted file mode 100644 index 059cda6..0000000 --- a/Scripts/scoreboard.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://k0jvsnqw4766 diff --git a/Scripts/scoreboard_entry.gd b/Scripts/scoreboard_entry.gd deleted file mode 100644 index 45033bd..0000000 --- a/Scripts/scoreboard_entry.gd +++ /dev/null @@ -1,28 +0,0 @@ -class_name ScoreboardEntry -extends HBoxContainer - -var display_name: String -var character: int -var ready_state: bool - - -func set_display_name(_old_name: String, new_name: String) -> void: - display_name = new_name - $DisplayName.text = new_name -func get_display_name() -> String: - return display_name - -func set_character(_old_class: int, new_class: int) -> void: - character = new_class - $CharacterName.text = Data.characters[new_class].hero_name -func get_character() -> int: - return character - -func set_ready_state(state: bool) -> void: - ready_state = state - if state: - $TextureRect.texture.region = Rect2(32, 0, 32, 32) - else: - $TextureRect.texture.region = Rect2(0, 0, 32, 32) -func get_ready_state() -> bool: - return ready_state diff --git a/Scripts/scoreboard_entry.gd.uid b/Scripts/scoreboard_entry.gd.uid deleted file mode 100644 index 9cbd7ce..0000000 --- a/Scripts/scoreboard_entry.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bmcym1lkp0j8f diff --git a/Scripts/singleplayer_lobby.gd b/Scripts/singleplayer_lobby.gd index 97e951d..9cc9658 100644 --- a/Scripts/singleplayer_lobby.gd +++ b/Scripts/singleplayer_lobby.gd @@ -12,7 +12,6 @@ func setup_game() -> void: loadout_editor = character_select_screen.instantiate() as CharacterSelect loadout_editor.hero_confirmed.connect(start_game) add_child(loadout_editor) - game_manager.chatbox = chatbox chatbox.username = Data.player_profile.display_name Data.player_profile.display_name_changed.connect(chatbox.change_username) loadout_editor.hero_selected.connect(Data.player_profile.set_preferred_class) diff --git a/Towers/tower.gd b/Towers/tower.gd index 5217cae..00cbde6 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -71,7 +71,7 @@ func aim() -> void: pitch_model.rotation.x = 0.0 -func shoot(count: int) -> void: +func shoot(_count: int) -> void: if target_finder.targets.size() > 0 and affector: affector.apply_effect(effect, target_finder.targets) animator.play("shoot") diff --git a/UI/Menus/MainMenu/main_menu.gd b/UI/Menus/MainMenu/main_menu.gd index f66d34e..f63edc5 100644 --- a/UI/Menus/MainMenu/main_menu.gd +++ b/UI/Menus/MainMenu/main_menu.gd @@ -89,6 +89,7 @@ func start_game() -> void: if !gamemode.multiplayer: singleplayer_game_requested.emit() else: + level_selected($PanelContainer.levels[0], 0) multiplayer_game_requested.emit() @@ -97,9 +98,28 @@ func _on_play_button_pressed() -> void: open_game_menu() + +#TODO: Clearn this part up +#TODO: new lobby system >> + +#var lobby_panel: PanelContainer func _on_multiplayer_button_pressed() -> void: gamemode.multiplayer = true - open_game_menu() + start_game() + #if !lobby_panel: + #lobby_panel = PanelContainer.new() + #add_child(lobby_panel) + #lobby_panel.visible = true + #lobby_panel.anchor_top = 0.1 + #lobby_panel.anchor_left = 0.3 + #lobby_panel.anchor_right = 0.7 + #lobby_panel.anchor_bottom = 0.9 + #gamemode.multiplayer = true + #open_game_menu() + + + + func open_game_menu() -> void: @@ -140,7 +160,7 @@ func level_selected(level: LevelConfig, side: int) -> void: level.allowed_cards = level.hero_class.deck level.waves = [] game.level_config = level - start_game() + #start_game() func _on_standard_button_pressed() -> void: diff --git a/UI/Menus/MainMenu/main_menu.tscn b/UI/Menus/MainMenu/main_menu.tscn index d38c5bc..11a43be 100644 --- a/UI/Menus/MainMenu/main_menu.tscn +++ b/UI/Menus/MainMenu/main_menu.tscn @@ -81,6 +81,10 @@ alignment = 2 layout_mode = 2 text = "BUTTON_PLAY" +[node name="MulitplayerButton" type="Button" parent="MainControls" unique_id=1241426994] +layout_mode = 2 +text = "BUTTON_MULTIPLAYER" + [node name="ModsButton" type="Button" parent="MainControls" unique_id=868836389] layout_mode = 2 text = "BUTTON_MODS" @@ -481,6 +485,8 @@ vertical_alignment = 1 [connection signal="mouse_entered" from="MainControls/PlayButton" to="." method="_on_button_mouse_entered"] [connection signal="pressed" from="MainControls/PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="mouse_entered" from="MainControls/MulitplayerButton" to="." method="_on_button_mouse_entered"] +[connection signal="pressed" from="MainControls/MulitplayerButton" to="." method="_on_multiplayer_button_pressed"] [connection signal="mouse_entered" from="MainControls/ModsButton" to="." method="_on_button_mouse_entered"] [connection signal="pressed" from="MainControls/ModsButton" to="." method="_on_mods_button_pressed"] [connection signal="pressed" from="MainControls/StatsButton" to="." method="_on_stats_button_pressed"] diff --git a/UI/Menus/OptionsMenu/gameplay_options.tscn b/UI/Menus/OptionsMenu/gameplay_options.tscn index 7570ca9..e5290b8 100644 --- a/UI/Menus/OptionsMenu/gameplay_options.tscn +++ b/UI/Menus/OptionsMenu/gameplay_options.tscn @@ -203,6 +203,7 @@ size_flags_horizontal = 3 [node name="CheckButton" type="CheckButton" parent="AlwaysShowShield/CenterContainer" unique_id=263220323] layout_mode = 2 +flat = true [connection signal="item_selected" from="Resolution/HBoxContainer/OptionButton" to="." method="_on_option_button_item_selected"] [connection signal="value_changed" from="MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"] diff --git a/UI/scoreboard.tscn b/UI/scoreboard.tscn deleted file mode 100644 index 1d98a41..0000000 --- a/UI/scoreboard.tscn +++ /dev/null @@ -1,31 +0,0 @@ -[gd_scene format=3 uid="uid://dpt3kpixawyby"] - -[ext_resource type="Script" uid="uid://k0jvsnqw4766" path="res://Scripts/scoreboard.gd" id="1_b5vdp"] -[ext_resource type="PackedScene" uid="uid://bhri8mqjbme2t" path="res://UI/scoreboard_entry.tscn" id="2_uer0b"] - -[node name="Scoreboard" type="PanelContainer" unique_id=1183254729] -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -157.5 -offset_top = -125.0 -offset_right = 157.5 -offset_bottom = 125.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_b5vdp") - -[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=1349293636] -layout_mode = 2 -alignment = 1 - -[node name="DummyEntry1" parent="VBoxContainer" unique_id=556447686 instance=ExtResource("2_uer0b")] -layout_mode = 2 - -[node name="DummyEntry2" parent="VBoxContainer" unique_id=1104539259 instance=ExtResource("2_uer0b")] -layout_mode = 2 - -[node name="DummyEntry3" parent="VBoxContainer" unique_id=1741907975 instance=ExtResource("2_uer0b")] -layout_mode = 2 diff --git a/UI/scoreboard_entry.tscn b/UI/scoreboard_entry.tscn deleted file mode 100644 index 49ae549..0000000 --- a/UI/scoreboard_entry.tscn +++ /dev/null @@ -1,35 +0,0 @@ -[gd_scene format=3 uid="uid://bhri8mqjbme2t"] - -[ext_resource type="Script" uid="uid://bmcym1lkp0j8f" path="res://Scripts/scoreboard_entry.gd" id="1_5xryr"] -[ext_resource type="Texture2D" uid="uid://m4ehy5bahsup" path="res://Assets/Textures/ready.png" id="2_yxtr2"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_qhkn8"] -resource_local_to_scene = true -atlas = ExtResource("2_yxtr2") -region = Rect2(0, 0, 32, 32) - -[node name="PlayerListEntry" type="HBoxContainer" unique_id=1099716284] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_5xryr") - -[node name="DisplayName" type="Label" parent="." unique_id=651150806] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Dummy Player" -horizontal_alignment = 1 - -[node name="CharacterName" type="Label" parent="." unique_id=1148611618] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Character" -horizontal_alignment = 1 - -[node name="TextureRect" type="TextureRect" parent="." unique_id=33110875] -layout_mode = 2 -size_flags_horizontal = 8 -texture = SubResource("AtlasTexture_qhkn8") -stretch_mode = 3 diff --git a/main.gd b/main.gd index a90c687..78e8e4b 100644 --- a/main.gd +++ b/main.gd @@ -67,6 +67,8 @@ func load_multiplayer() -> void: await loaded_scene var multi_player_lobby: MultiplayerLobby = scene.get_child(0) as MultiplayerLobby multi_player_lobby.game_manager = game_manager + multi_player_lobby.setup_the_ui() + multi_player_lobby.player_disconnected.connect(game_manager.remove_player) func load_scene(scene_path: String) -> void: diff --git a/network_puppeteer.gd b/network_puppeteer.gd new file mode 100644 index 0000000..2411376 --- /dev/null +++ b/network_puppeteer.gd @@ -0,0 +1,25 @@ +class_name NetworkPuppeteer extends Node + +@export var player: CharacterBody3D +@export var player_movement: PlayerMovement +@export var skeleton: Skeleton3D + + +func _process(delta: float) -> void: + if is_multiplayer_authority(): + set_position.rpc(player.global_position) + set_rotation.rpc(player_movement.head_angle, player.rotation.y) + + +@rpc("unreliable", "call_remote") +func set_position(position: Vector3) -> void: + player.global_position = position + + +@rpc("unreliable", "call_remote") +func set_rotation(x: float, y: float) -> void: + player_movement.head_angle = x + player.rotation.y = y + var bone: int = skeleton.find_bone("Head") + var pos: Quaternion = skeleton.get_bone_pose_rotation(bone) + skeleton.set_bone_pose_rotation(bone, Quaternion.from_euler(Vector3(x, 0, 0))) diff --git a/network_puppeteer.gd.uid b/network_puppeteer.gd.uid new file mode 100644 index 0000000..b4cc63b --- /dev/null +++ b/network_puppeteer.gd.uid @@ -0,0 +1 @@ +uid://dbyaxum1l8dn4