From 06cc3006b3f5a57c96bc83ec8501706c7f9055c9 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sun, 9 Aug 2026 22:44:51 +0300 Subject: [PATCH] Add shield icon for friendly players --- godot/assets/shield.png | Bin 0 -> 3209 bytes godot/assets/shield.png.import | 42 +++++++++++++++ godot/raw_assets/shield.svg | 69 +++++++++++++++++++++++++ godot/raw_assets/shield.svg.import | 43 +++++++++++++++ godot/scenes/player/remote_player.tscn | 11 +++- rust/src/player/remote_player.rs | 15 ++++++ 6 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 godot/assets/shield.png create mode 100644 godot/assets/shield.png.import create mode 100644 godot/raw_assets/shield.svg create mode 100644 godot/raw_assets/shield.svg.import diff --git a/godot/assets/shield.png b/godot/assets/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..08964436d95a97f70ec67512de03c37539a8334e GIT binary patch literal 3209 zcmYjUX*e6`77ih5UxKmku~VV;y{d>ogxI$trrO5Z zma0}Us+Q2AjZm~vUEJQd^E~&tKhAf)=RMnd&UgNNh2EYn!UA#v002PP&Gj6Dqh~p? za0KvHrlXxLDBO)0M$jHbrj7f-1iHg9Y z4HJ{2t9NbW001Frw{woZnZ%vtnCrj#$rkK4#+qG_!D{G=XcN?Q)nsIVg7Ee>%Qqe z^vPh{B1j8D*4NDKZF6XQ+9T1#-GGZ1Dk~e8iN`HkO~c3nfoFqBeG?~^3gGEDUQF7Z za#yL&ygrBc+tCn&bKJ7PY;(wDadU*3cknx8zOQggFb?@=tSrK`wOu>{S&{)k@Wus= zKwJ>I?y)p&f7qCV8^1veFUIQQNp=j0oXYY>obAD33_oi@44#NUAioxrNEmZ45DZ4$ zycVicgSr01ad~6 z+BK;6XER*{LU~*41$&};x9r6|MHs9xf>X3X@xblFLM=H@j^nP#8A4tIhliD&lNV{mW@kd=Up_0m_chG*eIakw!FH}xj=f0+ilN}I( zHkYSvTnbS0%f!EQXh9wscY3z#mLg-sDcR?SytvK*4EOJtuE%nG330~_w%(6M z3i+GDJs1`9iQ`pMuU{YZ(w&adUZxmTQ__tv^4cxE#W@O<~MaEg~1!^qBls+ZOyK_kD>+6?ahB5c#) z#oW9}2QS+}!%6M+QAME=^0|reyQP9{`u4)BZf-jmI`607lI`r7Ytydvkpf4&T}_=W zSBDQI_d@@Ii^9~YTtw)q^7{~lH&Y^`&>qkF*jd|CgC&>d|2i}#UM`j~@oZ>v)1};? z>*#l42XBe+cFHG-T@8iRV}P9of~_jdwBa@X$fgs7Dw18GRPmO*SPMw!{r7ba5-pHv zYD*lLnJzmDFKkl`Q*Qp3u`{uE<`viZ<5X?DY|$gId6;`WN+Qt3=1`xydaLgXIM~|e zi8BYH;gv>sjx)4#Zvnn=wR}6ihIk5>Fj>kt{Pv4JI?@Rn^TfAB{B`5Q8lks{(2Hm z=RdNctXBi<9O{gQ82RXMbu;yEHk3L!KF`LtMN6$9=)2h0B@4!n)Dx-$y3XX@&s}yK z1pZbG=99;#RF#*DiRM5AFR;7OUoo(EdG* z;k#+cvTt#;b4vSWhP6nj39!@5-NyAB(=Siw%Tgid`jMh>(AGpne@UDP<@byo}T4>_F808r`+HLPBaUF8q z8M4kc4FuC&aH~Sw@|(T6>@ZaLdOX|vF;Px7jWIcDKy)%;MN>U5b3Gb!6QG!S#!1^? z7FI1jIyl0k!U!#|%Ev9R(60AsSqrO!r*Ky)sWcuZO58YZ8xKhwfM-cTyiwFL55*(F zz4YXz4R3O2Z-7aEWuK8wfX=<)d&-uHvbqS8%2~GOy8Xn9$B%R=heq+w1}e@9e_d=- zAMPatc59^hXdNy+_=7u-pYV4rGJ)q%vuK1pXrE@{sh@5DuO!iM+%&~ZlP>DZV_%H9 zr~bW_yWCg#35weIYKaW>;f)+!$Gi`X^zS+h(ZxDGfyja5to7q71rM+HdC&t2opb~( zWBl?R9En~@fISnTIcgQ4NWHz@ptbJ#!PJ%pBZYPs;|mAZd{BujMAnu=y~Vx<=XmB# z#ITuF8VTSfQJUozG7B;9z%{5ucV7fW}4{h^zA?~XaHt)7SJ2DDJyQa}U9iardQPD9c z{4t#3OL5?0IX>fQ8w#QuHvxaDrOW?N-$EKUEqWc;gQGi^^FFpr)QS8c1d97GjU3tB zyj_QhwpanEQirc#dvVPA&uOi~9p+VJX@8)f{6QL0l*ku%gKtREt;V8y-y!nMzhwPb z-a9#>ETNDhCwg5az>p`sHZtN0GlQD0tZAqpnBSszVC2Y(w=M}R4RWiO)W+W>{KEYP zsF%`?F1wdLuXOg=rl0>@L3T|7-wF@$=IJX1wT`I`rTDGaumb+`9ZtR0r;hBPL2F3* z=kdZ6)+*mpNs57!2}ZGb`4T-AZyMFk3vYC5mH5fksi!WfDYGLow~ML^Zlg;{2VDnx zNn|X9m8KXB$ZT+M1(X&8#`3=g^+=^8a(7%fH^P%nO$en$57hr!z$M ztkx-=%a~6Mc-g_z;vMSe?ck^a7Ar=tJ{Vcc;_TM}3qFBV@fX zN%dyCTpfR;_;#br4CDnms(`tiwVw5~cl7plJ=slY-wE>k+b$wz&O% zck;j>T6?@uO2kEMy1c3Yha}eE6MFgPLct4i>vwpFgj;5xM;*{9GAX6fe*FHil##J> z<~bIt$rED^=zh?V8upA4NPnuI2uE&zEK=LuLfjSdwXz0(Z#!(rUd9mL!^2fX-kx4+ zlSW67W-g0jL3`W;@pBZzWVA08jUs`fAXuBErXdM}r97>0;YyAWHu!n3Z$3`0 zH9)LX`a8H*Zn9rNB|pOppbRve7^s+ldXMb;Gg47}2lAl#!nNfs+^apy7!{$}z3bwC z2j*_QON-VCH`A6wWa zS^!qm*m!v%jbX@mOYh}>)Gm!89rRmwy-M?{3r63jEx5uh6kLcbvZ{&q*uG(8H_G~3 z_*9tIopL+(!H_%f;HoS%i9k88keIH!ADLN;im&==9W54-l|`D1aRfD2R)F6?JZrxX zzZrjKe@lGi{`Y)jjoGAw)Eha*xk#Vz(uMq0 + + + + + + + + + + + + + + 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) {