diff --git a/godot/assets/shield.png b/godot/assets/shield.png new file mode 100644 index 0000000..0896443 Binary files /dev/null and b/godot/assets/shield.png differ diff --git a/godot/assets/shield.png.import b/godot/assets/shield.png.import new file mode 100644 index 0000000..77cfe63 --- /dev/null +++ b/godot/assets/shield.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsniorq6w5yif" +path.s3tc="res://.godot/imported/shield.png-46d74908b0ac118b50397d7021ae31f8.s3tc.ctex" +path.etc2="res://.godot/imported/shield.png-46d74908b0ac118b50397d7021ae31f8.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/shield.png" +dest_files=["res://.godot/imported/shield.png-46d74908b0ac118b50397d7021ae31f8.s3tc.ctex", "res://.godot/imported/shield.png-46d74908b0ac118b50397d7021ae31f8.etc2.ctex"] + +[params] + +compress/mode=2 +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/godot/raw_assets/shield.svg b/godot/raw_assets/shield.svg new file mode 100644 index 0000000..80e8d03 --- /dev/null +++ b/godot/raw_assets/shield.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + diff --git a/godot/raw_assets/shield.svg.import b/godot/raw_assets/shield.svg.import new file mode 100644 index 0000000..d61b2d9 --- /dev/null +++ b/godot/raw_assets/shield.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqt6nwl0qssxx" +path="res://.godot/imported/shield.svg-6ff2b0db9fbbf7869e9c39b74eb33ede.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://raw_assets/shield.svg" +dest_files=["res://.godot/imported/shield.svg-6ff2b0db9fbbf7869e9c39b74eb33ede.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=false +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=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index c9e2e0b..eea0ad8 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -7,6 +7,7 @@ [ext_resource type="FontFile" uid="uid://hptdnjg4ec58" path="res://font/static/SpaceGrotesk-Medium.ttf" id="4_7rax4"] [ext_resource type="AudioStream" uid="uid://uq0o8gkpqhfa" path="res://raw_assets/sfx/ball/zapsplat_foley_stick_swing_air_whoosh_very_fast_hard_003_110413.mp3" id="4_qn18y"] [ext_resource type="PackedScene" uid="uid://bnha3gon4700q" path="res://scenes/map/arrow.tscn" id="5_qn18y"] +[ext_resource type="Texture2D" uid="uid://bsniorq6w5yif" path="res://assets/shield.png" id="8_f0y0w"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] @@ -40,7 +41,7 @@ curve = SubResource("Curve_qn18y") [sub_resource type="ViewportTexture" id="ViewportTexture_rmxnb"] viewport_path = NodePath("double_health_bar_sprite/health_bar_viewport") -[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "double_health_bar", "health_bar_sprite", "double_health_bar_sprite", "ball_pickup_sfx", "ball_throw_sfx", "arrow")] +[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "double_health_bar", "health_bar_sprite", "double_health_bar_sprite", "ball_pickup_sfx", "ball_throw_sfx", "arrow", "shield_sprite")] move_speed = 7.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d") @@ -58,6 +59,7 @@ ball_pickup_sfx = NodePath("ball_pickup_sfx") ball_throw_sfx = NodePath("ball_throw_sfx") arrow = NodePath("arrow") telefrag_area_prefab = ExtResource("1_8dfyr") +shield_sprite = NodePath("shield_icon") telegrenade_cd = 10.0 collision_layer = 2 collision_mask = 100 @@ -151,3 +153,10 @@ bus = &"SFX" [node name="arrow" parent="." unique_id=1231591993 instance=ExtResource("5_qn18y")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6812112, 0) + +[node name="shield_icon" type="Sprite3D" parent="." unique_id=1425349947] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5157857, 0) +visible = false +pixel_size = 0.001 +billboard = 1 +texture = ExtResource("8_f0y0w") diff --git a/rust/src/player/remote_player.rs b/rust/src/player/remote_player.rs index cea2b64..1f27401 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -59,6 +59,8 @@ pub struct RemotePlayer { arrow: Option>, #[export] telefrag_area_prefab: Option>, + #[export] + shield_sprite: Option>, pub player_id: Option, pub player_name: String, @@ -421,6 +423,19 @@ impl ICharacterBody3D for RemotePlayer { } self.buffs.clone().update_effects(self); + + self.run_deferred(|s| { + if let Some(game) = Game::singleton() + && let Some(self_player) = game.bind().find_player(game.bind().self_id.unwrap_or(0)) + && let Some(remote_player) = game.bind().find_player(s.player_id.unwrap_or(0)) + && self_player.data.team == remote_player.data.team + && let Some(sprite) = &mut s.shield_sprite + && let Some(team) = game.bind().get_team(remote_player.data.team) + { + sprite.set_visible(true); + sprite.set_modulate(team.bind().color()); + } + }); } fn process(&mut self, delta: f64) {