mirror of
https://gitlab.com/open-fpsz/open-fpsz.git
synced 2026-07-16 08:55:33 +00:00
✨ Inventory, Weapons and refactoring
This commit is contained in:
parent
fa3e1f8d22
commit
39a9200e58
74 changed files with 1812 additions and 3895 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue