Inventory, Weapons and refactoring

This commit is contained in:
anyreso 2024-05-07 14:21:10 +00:00
parent fa3e1f8d22
commit 39a9200e58
74 changed files with 1812 additions and 3895 deletions

View file

@ -12,7 +12,7 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
class_name Projectile extends Node3D
class_name SpaceGunProjectile extends Node3D
@export_category("Parameters")
@export var EXPLOSION : PackedScene
@ -28,7 +28,6 @@ var velocity : Vector3 = Vector3.ZERO
var shooter : MatchParticipantComponent
func _ready() -> void:
assert(shooter)
var lifespan_timer : Timer = Timer.new()
lifespan_timer.wait_time = lifespan
lifespan_timer.one_shot = true
@ -45,12 +44,9 @@ func _ready() -> void:
func self_destruct() -> void:
explode(position)
func explode(spawn_location : Vector3) -> void:
var spawned_explosion : Node = EXPLOSION.instantiate()
spawned_explosion.position = spawn_location
spawned_explosion.shooter = shooter
game.add_child(spawned_explosion)
func explode(spawn_position : Vector3) -> void:
game.add_child(SpaceGunProjectileExplosion.new_explosion(spawn_position, shooter, EXPLOSION))
queue_free()
func _physics_process(delta : float) -> void:
@ -61,5 +57,18 @@ func _physics_process(delta : float) -> void:
var contact_point : Vector3 = shape_cast.collision_result[0].point
explode(contact_point)
## This method is a parameterized constructor for the [SpaceGunProjectile] scene of the [SpaceGun]
static func new_projectile(
origin : Marker3D,
inherited_velocity : Vector3,
_shooter : MatchParticipantComponent,
scene : PackedScene
) -> SpaceGunProjectile:
var projectile : SpaceGunProjectile = scene.instantiate()
projectile.shooter = _shooter
projectile.transform = origin.global_transform
projectile.velocity = origin.global_basis.z.normalized() * projectile.speed + inherited_velocity
return projectile
func _enable_trail() -> void:
projectile_trail._trail_enabled = true

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=8 format=3 uid="uid://dn1tcakam5egs"]
[ext_resource type="Script" path="res://entities/weapons/space_gun/projectile.gd" id="1_4j1dp"]
[ext_resource type="PackedScene" uid="uid://8atq41j7wd55" path="res://entities/weapons/space_gun/projectile_explosion.tscn" id="2_llml6"]
[ext_resource type="PackedScene" path="res://entities/weapons/space_gun/projectile_explosion.tscn" id="2_llml6"]
[ext_resource type="Script" path="res://addons/smoothing/smoothing.gd" id="3_dmi64"]
[ext_resource type="Script" path="res://entities/weapons/space_gun/projectile_trail.gd" id="3_ygqbh"]

View file

@ -12,16 +12,27 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
extends Node3D
class_name SpaceGunProjectileExplosion extends Node3D
var shooter : MatchParticipantComponent
@export var explosive_damage : ExplosiveDamageComponent
@onready var fire : GPUParticles3D = $Fire
@onready var explosive_damage : ExplosiveDamageComponent = $ExplosiveDamageComponent
var explosion_effect_pending : bool = false
var shooter : MatchParticipantComponent:
set(value):
shooter = value
assert(explosive_damage)
explosive_damage.damage_dealer = value
func _ready() -> void:
assert(shooter)
explosive_damage.damage_dealer = shooter
fire.emitting = true
fire.finished.connect(func() -> void: queue_free())
## This method is a parameterized constructor for the [SpaceGunProjectileExplosion] scene of the [SpaceGunProjectile]
static func new_explosion(spawn_position : Vector3, _shooter : MatchParticipantComponent, scene : PackedScene) -> SpaceGunProjectileExplosion:
var explosion : SpaceGunProjectileExplosion = scene.instantiate()
explosion.shooter = _shooter
explosion.position = spawn_position
return explosion

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=9 format=3 uid="uid://8atq41j7wd55"]
[gd_scene load_steps=8 format=3 uid="uid://8atq41j7wd55"]
[ext_resource type="Script" path="res://entities/weapons/space_gun/projectile_explosion.gd" id="1_fp5td"]
[ext_resource type="Script" path="res://entities/components/explosive_damage_component.gd" id="2_28ymv"]
[ext_resource type="PackedScene" uid="uid://qb5sf7awdeui" path="res://entities/components/explosive_damage.tscn" id="2_js0ht"]
[sub_resource type="Curve" id="Curve_rg204"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
@ -25,12 +25,9 @@ emission_energy_multiplier = 4.0
[sub_resource type="SphereMesh" id="SphereMesh_k3pnh"]
material = SubResource("StandardMaterial3D_wpu51")
[sub_resource type="SphereShape3D" id="SphereShape3D_nj68w"]
margin = 0.05
radius = 5.0
[node name="ProjectileExplosion" type="Node3D"]
[node name="ProjectileExplosion" type="Node3D" node_paths=PackedStringArray("explosive_damage")]
script = ExtResource("1_fp5td")
explosive_damage = NodePath("ExplosiveDamage")
[node name="Fire" type="GPUParticles3D" parent="."]
emitting = false
@ -42,8 +39,6 @@ fixed_fps = 60
process_material = SubResource("ParticleProcessMaterial_3mf41")
draw_pass_1 = SubResource("SphereMesh_k3pnh")
[node name="ExplosiveDamageComponent" type="Area3D" parent="."]
script = ExtResource("2_28ymv")
[node name="ExplosiveDamage" parent="." instance=ExtResource("2_js0ht")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="ExplosiveDamageComponent"]
shape = SubResource("SphereShape3D_nj68w")
[editable path="ExplosiveDamage"]

View file

@ -12,45 +12,40 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
extends Node3D
class_name SpaceGun
class_name SpaceGun extends Node3D
@export var PROJECTILE : PackedScene
@export var holder : MatchParticipantComponent
@onready var nozzle : Node3D = $Nozzle
@onready var inventory : Node3D = get_parent()
@export var fire_rate : float = 1. # seconds
@export var reload_time : float = 1. # seconds
@export var anim_player : AnimationPlayer
enum WeaponState { WEAPON_READY, WEAPON_RELOADING }
var weapon_state : WeaponState = WeaponState.WEAPON_READY
const inheritance : float = .5 # ratio
const reload_time : float = 1. # seconds
var state : WeaponState = WeaponState.WEAPON_READY
func can_fire() -> bool:
return weapon_state == WeaponState.WEAPON_READY
return state == WeaponState.WEAPON_READY
func fire_primary() -> void:
func trigger() -> void:
# check permission
if not can_fire():
return
# init projectile
var projectile : Node = PROJECTILE.instantiate()
# configure projectile
projectile.shooter = holder
projectile.transform = nozzle.global_transform
projectile.velocity = nozzle.global_basis.z.normalized() * projectile.speed
var inheritance_factor : float = clamp(inheritance, 0., 1.)
projectile.velocity += (inventory.owner.linear_velocity * inheritance_factor)
# play the fire animation
$Mesh/AnimationPlayer.play("fire")
# add projectile as sibling of the owner
inventory.owner.add_sibling(projectile)
anim_player.play("fire")
var projectile : Node3D = $ProjectileSpawner.new_projectile(
SpaceGunProjectile,
owner.linear_velocity,
owner.match_participant_component
)
# add to owner of player for now
GameManager.mode.add_child(projectile)
# ensure projectile does not collide with owner
var collider : ShapeCast3D = projectile.shape_cast
collider.add_exception(inventory.owner)
collider.add_exception(owner)
# update states
weapon_state = WeaponState.WEAPON_RELOADING
state = WeaponState.WEAPON_RELOADING
await get_tree().create_timer(reload_time).timeout
weapon_state = WeaponState.WEAPON_READY
state = WeaponState.WEAPON_READY
func _on_visibility_changed() -> void:
if self.visible:
anim_player.play("equip")
#self.sounds.play("equip")

View file

@ -1,16 +1,23 @@
[gd_scene load_steps=4 format=3 uid="uid://c8co0qa2omjmh"]
[gd_scene load_steps=5 format=3 uid="uid://c8co0qa2omjmh"]
[ext_resource type="Script" path="res://entities/weapons/space_gun/space_gun.gd" id="1_6sm4s"]
[ext_resource type="PackedScene" uid="uid://dn1tcakam5egs" path="res://entities/weapons/space_gun/projectile.tscn" id="2_wvneg"]
[ext_resource type="PackedScene" uid="uid://bjcn37ops3bro" path="res://entities/weapons/space_gun/assets/disclauncher.glb" id="3_5k2xm"]
[ext_resource type="Script" path="res://entities/components/projectile_spawner.gd" id="3_ihk6g"]
[node name="SpaceGun" type="Node3D"]
[node name="SpaceGun" type="Node3D" node_paths=PackedStringArray("anim_player")]
script = ExtResource("1_6sm4s")
anim_player = NodePath("Mesh/AnimationPlayer")
[node name="ProjectileSpawner" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.27)
script = ExtResource("3_ihk6g")
PROJECTILE = ExtResource("2_wvneg")
[node name="Mesh" parent="." instance=ExtResource("3_5k2xm")]
[node name="Skeleton3D" parent="Mesh/Armature" index="0"]
bones/0/rotation = Quaternion(0.707107, -5.33851e-08, -5.33851e-08, 0.707107)
bones/0/scale = Vector3(1, 1, 1)
bones/1/rotation = Quaternion(-0.707107, 5.33851e-08, 5.33851e-08, 0.707107)
bones/1/scale = Vector3(1, 1, 1)
@ -20,15 +27,17 @@ bones/3/rotation = Quaternion(-0.707107, 5.33851e-08, 5.33851e-08, 0.707107)
bones/3/scale = Vector3(1, 1, 1)
[node name="grip" parent="Mesh/Armature/Skeleton3D" index="0"]
transform = Transform3D(1, -4.26326e-14, -2.13163e-14, 2.84217e-14, 1, -3.57628e-07, 3.2684e-14, 3.57628e-07, 1, -1.42109e-14, -2.98023e-07, 2.38419e-07)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.84217e-14, 1.19209e-07, 2.38419e-07)
[node name="main" parent="Mesh/Armature/Skeleton3D" index="1"]
transform = Transform3D(1, -4.26326e-14, -2.13163e-14, 2.84217e-14, 1, -3.57628e-07, 3.2684e-14, 3.57628e-07, 1, -1.42109e-14, -2.98023e-07, 2.38419e-07)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.84217e-14, 1.19209e-07, 2.38419e-07)
[node name="sides" parent="Mesh/Armature/Skeleton3D" index="2"]
transform = Transform3D(1, -4.26326e-14, -2.13163e-14, 2.84217e-14, 1, -3.57628e-07, 3.2684e-14, 3.57628e-07, 1, -1.42109e-14, -2.98023e-07, 2.38419e-07)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.84217e-14, 1.19209e-07, 2.38419e-07)
[node name="Nozzle" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.27)
[node name="AnimationPlayer" parent="Mesh" index="1"]
autoplay = "idle"
[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"]
[editable path="Mesh"]