Add decals to shotgun as well

This commit is contained in:
Sofia 2026-08-04 22:02:11 +03:00
parent c65c3b0ac4
commit 050e4b6021
2 changed files with 44 additions and 16 deletions

View File

@ -1,5 +1,6 @@
[gd_scene format=3 uid="uid://deyfeiqyi0wmj"] [gd_scene format=3 uid="uid://deyfeiqyi0wmj"]
[ext_resource type="PackedScene" uid="uid://b32uxedvawp73" path="res://scenes/weapons/bullet_hole_decal.tscn" id="1_278ir"]
[ext_resource type="AudioStream" uid="uid://bcclq2sv7k0x3" path="res://raw_assets/sfx/gun_sounds/shotgun_compressed.mp3" id="1_pyt38"] [ext_resource type="AudioStream" uid="uid://bcclq2sv7k0x3" path="res://raw_assets/sfx/gun_sounds/shotgun_compressed.mp3" id="1_pyt38"]
[ext_resource type="PackedScene" uid="uid://b8nwd3323kwlc" path="res://mesh/shotgun.tscn" id="3_0xpw2"] [ext_resource type="PackedScene" uid="uid://b8nwd3323kwlc" path="res://mesh/shotgun.tscn" id="3_0xpw2"]
@ -53,6 +54,7 @@ curve = SubResource("Curve_yli5f")
sound_emitter = NodePath("sound_emitter") sound_emitter = NodePath("sound_emitter")
vfx = NodePath("gpu_particles_3d") vfx = NodePath("gpu_particles_3d")
cooldown = 1.0 cooldown = 1.0
decal = ExtResource("1_278ir")
[node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=1572422640] [node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=1572422640]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0)

View File

@ -1,14 +1,14 @@
use std::{collections::HashSet, f32::consts::PI}; use std::{collections::HashSet, f32::consts::PI};
use godot::{ use godot::{
classes::{AudioStreamPlayer3D, GpuParticles3D}, classes::{AudioStreamPlayer3D, GpuParticles3D, RandomNumberGenerator},
prelude::*, prelude::*,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{ use crate::{
game::Game, game::Game,
net::util::{cast_ray, shotgun_ray}, net::util::{RaycastResult, cast_ray, shotgun_ray},
player::{DamageSource, shootable::Shootable}, player::{DamageSource, shootable::Shootable},
replay::StandaloneReplayManager, replay::StandaloneReplayManager,
}; };
@ -92,16 +92,8 @@ impl Weapon for Raygun {
let target_clone = target.clone(); let target_clone = target.clone();
self.run_deferred(|s| { self.run_deferred(|s| {
if let Some(mut game) = Game::singleton() if let Some(target) = target_clone {
&& let Some(map) = &mut game.bind_mut().current_map add_decal(&target, s.decal.clone());
&& let Some(target) = target_clone
&& let Some(prefab) = &s.decal
{
let mut decal = prefab.instantiate_as::<Node3D>();
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());
} }
}); });
@ -177,8 +169,13 @@ pub struct Shotgun {
#[export] #[export]
cooldown: f64, cooldown: f64,
#[export]
decal: Option<Gd<PackedScene>>,
cooldown_remaining: f64, cooldown_remaining: f64,
rng: Gd<RandomNumberGenerator>,
base: Base<Node3D>, base: Base<Node3D>,
} }
@ -212,8 +209,7 @@ impl Weapon for Shotgun {
} }
let mut colliders = HashSet::new(); let mut colliders = HashSet::new();
let results = shotgun_ray(
for result in shotgun_ray(
from, from,
to, to,
up, up,
@ -222,8 +218,25 @@ impl Weapon for Shotgun {
10, 10,
PI / 2., PI / 2.,
10., 10.,
) { );
colliders.insert(result.collider); let mut bullet_decal_results = Vec::new();
for _ in 0..10 {
if let Some(result) = results
.get(self.rng.randi_range(0, results.len() as i32 - 1) as usize)
.cloned()
{
bullet_decal_results.push(result);
}
}
for result in bullet_decal_results {
self.run_deferred(move |s| {
add_decal(&result, s.decal.clone());
});
}
for result in &results {
colliders.insert(result.collider.clone());
} }
if deal_damage { if deal_damage {
@ -339,3 +352,16 @@ impl Weapon for BallWeapon {
fn set_remaining_cd(&mut self, _: f64) {} fn set_remaining_cd(&mut self, _: f64) {}
} }
fn add_decal(result: &RaycastResult, prefab: Option<Gd<PackedScene>>) {
if let Some(mut game) = Game::singleton()
&& let Some(map) = &mut game.bind_mut().current_map
&& let Some(prefab) = prefab
{
let mut decal = prefab.instantiate_as::<Node3D>();
map.add_child(&decal);
decal.set_global_position(result.position);
let quat = Quaternion::from_rotation_arc(Vector3::UP, result.normal);
decal.set_global_rotation(quat.get_euler());
}
}