diff --git a/credits.toml b/credits.toml index ab7da94..6369ab5 100644 --- a/credits.toml +++ b/credits.toml @@ -129,3 +129,9 @@ name = "Florian Karsten" [[people.credits]] credit = "Space Grotesk" link = "https://floriankarsten.github.io/space-grotesk/" + +[[people]] +name = "musdasch" +[[people.credits]] +credit = "Bullet Decal" +link = "https://opengameart.org/content/bullet-decal" diff --git a/godot/raw_assets/bullet_hole.png b/godot/raw_assets/bullet_hole.png new file mode 100644 index 0000000..e0f384f Binary files /dev/null and b/godot/raw_assets/bullet_hole.png differ diff --git a/godot/raw_assets/bullet_hole.png.import b/godot/raw_assets/bullet_hole.png.import new file mode 100644 index 0000000..8720927 --- /dev/null +++ b/godot/raw_assets/bullet_hole.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sxfd2davklia" +path="res://.godot/imported/bullet_hole.png-06c7bf2f1e5bc1dff2400b53427c9cfb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://raw_assets/bullet_hole.png" +dest_files=["res://.godot/imported/bullet_hole.png-06c7bf2f1e5bc1dff2400b53427c9cfb.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 diff --git a/godot/scenes/player/soldier_m.tscn b/godot/scenes/player/soldier_m.tscn index 48780fe..6d00e6d 100644 --- a/godot/scenes/player/soldier_m.tscn +++ b/godot/scenes/player/soldier_m.tscn @@ -1,9 +1,9 @@ [gd_scene format=3 uid="uid://bod6b3befmyt5"] -[ext_resource type="PackedScene" uid="uid://cw7duhhjebypt" path="res://scenes/player/raygun.tscn" id="1_a50o4"] +[ext_resource type="PackedScene" uid="uid://cw7duhhjebypt" path="res://scenes/weapons/raygun.tscn" id="1_a50o4"] [ext_resource type="PackedScene" uid="uid://ncxcmgdit2j1" path="res://mesh/soldier_m.tscn" id="1_sxefq"] -[ext_resource type="PackedScene" uid="uid://ci8r4lgijtalh" path="res://scenes/player/ball_weapon.tscn" id="2_jbny0"] -[ext_resource type="PackedScene" uid="uid://deyfeiqyi0wmj" path="res://scenes/player/shotgun.tscn" id="2_kknoo"] +[ext_resource type="PackedScene" uid="uid://ci8r4lgijtalh" path="res://scenes/weapons/ball_weapon.tscn" id="2_jbny0"] +[ext_resource type="PackedScene" uid="uid://deyfeiqyi0wmj" path="res://scenes/weapons/shotgun.tscn" id="2_kknoo"] [ext_resource type="Texture2D" uid="uid://cbvxh8xp8ilac" path="res://assets/Soldier.png" id="5_hjbn3"] [ext_resource type="Shader" uid="uid://canvckfs02odw" path="res://shaders/bubble_shader.tres" id="6_3lfhi"] diff --git a/godot/scenes/player/ball_weapon.tscn b/godot/scenes/weapons/ball_weapon.tscn similarity index 100% rename from godot/scenes/player/ball_weapon.tscn rename to godot/scenes/weapons/ball_weapon.tscn diff --git a/godot/scenes/weapons/bullet_hole_decal.tscn b/godot/scenes/weapons/bullet_hole_decal.tscn new file mode 100644 index 0000000..7bfb11b --- /dev/null +++ b/godot/scenes/weapons/bullet_hole_decal.tscn @@ -0,0 +1,9 @@ +[gd_scene format=3 uid="uid://b32uxedvawp73"] + +[ext_resource type="Texture2D" uid="uid://sxfd2davklia" path="res://raw_assets/bullet_hole.png" id="1_lf0rx"] + +[node name="bullet_hole_decal" type="Node3D" unique_id=18163478] + +[node name="decal" type="Decal" parent="." unique_id=1515351623] +size = Vector3(0.5, 0.5, 0.5) +texture_albedo = ExtResource("1_lf0rx") diff --git a/godot/scenes/player/raygun.tscn b/godot/scenes/weapons/raygun.tscn similarity index 83% rename from godot/scenes/player/raygun.tscn rename to godot/scenes/weapons/raygun.tscn index 7c6c349..b819601 100644 --- a/godot/scenes/player/raygun.tscn +++ b/godot/scenes/weapons/raygun.tscn @@ -1,13 +1,15 @@ [gd_scene format=3 uid="uid://cw7duhhjebypt"] [ext_resource type="PackedScene" uid="uid://cg81784ct8gf5" path="res://mesh/raygun.tscn" id="1_ckadf"] -[ext_resource type="PackedScene" uid="uid://ctslratcr8h6v" path="res://scenes/player/raygun_beam.tscn" id="1_m84jv"] +[ext_resource type="PackedScene" uid="uid://ctslratcr8h6v" path="res://scenes/weapons/raygun_beam.tscn" id="1_m84jv"] +[ext_resource type="PackedScene" uid="uid://b32uxedvawp73" path="res://scenes/weapons/bullet_hole_decal.tscn" id="2_vhn31"] [ext_resource type="AudioStream" uid="uid://bq553wxrelpdr" path="res://raw_assets/sfx/LaserWithRecoveryEditedCompressed.mp3" id="3_m84jv"] [node name="raygun" type="Raygun" unique_id=573018429 node_paths=PackedStringArray("sound_emitter", "bullet_source")] sound_emitter = NodePath("sound_emitter") bullet_prefab = ExtResource("1_m84jv") bullet_source = NodePath("bullet_source") +decal = ExtResource("2_vhn31") cooldown = 1.5 [node name="Raygun" parent="." unique_id=1928455392 instance=ExtResource("1_ckadf")] diff --git a/godot/scenes/player/raygun_beam.tscn b/godot/scenes/weapons/raygun_beam.tscn similarity index 100% rename from godot/scenes/player/raygun_beam.tscn rename to godot/scenes/weapons/raygun_beam.tscn diff --git a/godot/scenes/player/shotgun.tscn b/godot/scenes/weapons/shotgun.tscn similarity index 100% rename from godot/scenes/player/shotgun.tscn rename to godot/scenes/weapons/shotgun.tscn diff --git a/rust/src/net/util.rs b/rust/src/net/util.rs index 78f6df9..c05a3e6 100644 --- a/rust/src/net/util.rs +++ b/rust/src/net/util.rs @@ -44,11 +44,13 @@ pub fn cast_ray( && let Some(mut space) = world.get_direct_space_state() { let results = space.intersect_ray(&ray); - if let (Some(position), Some(collider)) = - (results.get("position"), results.get("collider")) + if let Some(position) = results.get("position") + && let Some(collider) = results.get("collider") + && let Some(normal) = results.get("normal") { Some(RaycastResult { position: Vector3::from_variant(&position), + normal: Vector3::from_variant(&normal), collider: Gd::from_variant(&collider), }) } else { @@ -95,7 +97,9 @@ pub fn shotgun_ray( results } +#[derive(Debug, Clone)] pub struct RaycastResult { pub position: Vector3, + pub normal: Vector3, pub collider: Gd, } diff --git a/rust/src/player/weapon.rs b/rust/src/player/weapon.rs index 8b8ac7e..12b23ab 100644 --- a/rust/src/player/weapon.rs +++ b/rust/src/player/weapon.rs @@ -45,6 +45,8 @@ pub struct Raygun { bullet_prefab: Option>, #[export] bullet_source: Option>, + #[export] + decal: Option>, #[export] cooldown: f64, @@ -80,7 +82,7 @@ impl Weapon for Raygun { emitter.play(); } - if let Some(source) = &self.bullet_source { + if let Some(source) = self.bullet_source.clone() { let target = cast_ray( from, to, @@ -88,6 +90,21 @@ impl Weapon for Raygun { &Array::from_iter(vec![player]), ); + let target_clone = target.clone(); + self.run_deferred(|s| { + if let Some(mut game) = Game::singleton() + && let Some(map) = &mut game.bind_mut().current_map + && let Some(target) = target_clone + && let Some(prefab) = &s.decal + { + let mut decal = prefab.instantiate_as::(); + map.add_child(&decal); + decal.set_global_position(target.position); + let quat = Quaternion::from_rotation_arc(Vector3::UP, target.normal); + decal.set_global_rotation(quat.get_euler()); + } + }); + let dir = (to - source.get_global_position()).normalized(); let beam_end = target .as_ref()