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) {