Further work on Rockets
parent
1f8bb1858b
commit
dd924f53de
|
@ -1,8 +1,18 @@
|
||||||
extends Node3D
|
extends Node3D
|
||||||
|
|
||||||
@export var hit_effect_scene : PackedScene
|
@export var hit_effect_scene : PackedScene
|
||||||
|
|
||||||
@export var speed : float
|
@export var speed : float
|
||||||
|
@export var damage : int
|
||||||
|
|
||||||
|
var source_position : Vector3
|
||||||
|
|
||||||
|
var noise = OpenSimplexNoise.new()
|
||||||
|
var time := 0.0
|
||||||
|
|
||||||
|
@onready var halo = $OmniLight3D/Halo
|
||||||
|
@onready var halo_transform = halo.global_transform
|
||||||
|
|
||||||
|
var ray_previously : bool
|
||||||
|
|
||||||
# Declare member variables here. Examples:
|
# Declare member variables here. Examples:
|
||||||
# var a = 2
|
# var a = 2
|
||||||
|
@ -11,7 +21,12 @@ extends Node3D
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
$OmniLight3D/Smoke.emitting = true
|
#$OmniLight3D/Smoke.emitting = true
|
||||||
|
|
||||||
|
noise.octaves = 2
|
||||||
|
noise.persistence = 0.8
|
||||||
|
noise.period = 16
|
||||||
|
noise.seed = randi()
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
#constant_linear_velocity = Vector3(1, 0, 0)
|
#constant_linear_velocity = Vector3(1, 0, 0)
|
||||||
|
@ -20,17 +35,56 @@ func _physics_process(delta):
|
||||||
# move_and_collide(global_transform.basis.x * Vector3.FORWARD * speed)
|
# move_and_collide(global_transform.basis.x * Vector3.FORWARD * speed)
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
#func _process(delta):
|
func _process(delta):
|
||||||
# pass
|
time += delta
|
||||||
|
|
||||||
func hit():
|
var flicker = sin(time * 225) + sin(time * 240) / 2 + sin(time * 295) / 3
|
||||||
var hit_effect = hit_effect_scene.instantiate()
|
|
||||||
hit_effect.global_transform = global_transform
|
$OmniLight3D.light_energy = 3 + flicker /2
|
||||||
|
halo.mesh.size = Vector2.ONE * 2 + Vector2(flicker, flicker) / 16
|
||||||
|
|
||||||
|
var space_state = get_world_3d().direct_space_state
|
||||||
|
var physics_ray_query_parameters_3d = PhysicsRayQueryParameters3D.new()
|
||||||
|
physics_ray_query_parameters_3d.from = halo.global_transform.origin
|
||||||
|
physics_ray_query_parameters_3d.to = get_viewport().get_camera_3d().global_transform.origin
|
||||||
|
physics_ray_query_parameters_3d.exclude = [self]
|
||||||
|
var ray = space_state.intersect_ray(physics_ray_query_parameters_3d)
|
||||||
|
|
||||||
|
if ray.size() > 0 and not ray_previously:
|
||||||
|
halo.hide()
|
||||||
|
elif not ray.size() > 0 and ray_previously:
|
||||||
|
halo.show()
|
||||||
|
|
||||||
|
if ray.size() > 0:
|
||||||
|
ray_previously = true
|
||||||
|
else:
|
||||||
|
ray_previously = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func give_damage(target: Node, hit_position: Vector3, hit_normal: Vector3, damage: int, source_position: Vector3, type: Globals.DamageType, push: float):
|
||||||
|
if target.has_method(&'take_damage'): # we've hit a player or something else - the ywill handle everything like effects etc.
|
||||||
|
target.rpc(&'take_damage', get_multiplayer_authority(), hit_position, hit_normal, damage, source_position, type, push)
|
||||||
|
else:
|
||||||
|
# TODO take data from the material of the target and spawn an appropriate hit effect
|
||||||
|
var hit_effect : Node = hit_effect_scene.instantiate()
|
||||||
get_tree().root.add_child(hit_effect)
|
get_tree().root.add_child(hit_effect)
|
||||||
queue_free()
|
|
||||||
|
hit_effect.global_transform.origin = hit_position
|
||||||
|
#print(impact_vfx.global_transform)
|
||||||
|
var result = hit_effect.look_at(hit_position + hit_normal)
|
||||||
|
|
||||||
|
if not result: # if the look_at failed (as it will on floors and ceilings) try another approach:
|
||||||
|
hit_effect.look_at(hit_position + hit_normal, Vector3.LEFT)
|
||||||
|
|
||||||
|
hit_effect.rotate(hit_normal, randf_range(0, PI * 2))
|
||||||
|
|
||||||
|
#print(impact_vfx.global_transform)
|
||||||
|
|
||||||
func _on_Area3D_body_entered(body):
|
func _on_Area3D_body_entered(body):
|
||||||
hit()
|
var hit_normal = body.global_transform.origin - global_transform.origin # is this correct?
|
||||||
|
give_damage(body, global_transform.origin, hit_normal,damage, source_position, Globals.DamageType.EXPLOSION, 100)
|
||||||
|
queue_free()
|
||||||
|
|
||||||
func _on_Area3D_body_shape_entered(body_rid, body, body_shape_index, local_shape_index):
|
func _on_Timer_timeout():
|
||||||
hit()
|
queue_free()
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=13 format=3 uid="uid://bt0lppumya6fv"]
|
[gd_scene load_steps=17 format=3 uid="uid://bt0lppumya6fv"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://Assets/Weapons/Projectile.gd" id="1_3ywpo"]
|
[ext_resource type="Script" path="res://Assets/Weapons/Projectile.gd" id="1_3ywpo"]
|
||||||
[ext_resource type="PackedScene" uid="uid://wvxhewre31mo" path="res://Assets/Effects/ImpactExplosion.tscn" id="2_1tben"]
|
[ext_resource type="PackedScene" uid="uid://wvxhewre31mo" path="res://Assets/Effects/ImpactExplosion.tscn" id="2_1tben"]
|
||||||
|
@ -7,38 +7,42 @@
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qjk68"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qjk68"]
|
||||||
radius = 0.0853144
|
radius = 0.0853144
|
||||||
height = 0.512485
|
height = 0.547775
|
||||||
|
|
||||||
[sub_resource type="Gradient" id="Gradient_l1dmm"]
|
[sub_resource type="Gradient" id="Gradient_r8j3o"]
|
||||||
interpolation_mode = 2
|
interpolation_mode = 2
|
||||||
offsets = PackedFloat32Array(0, 0.0216998, 0.101266, 0.177215, 0.184448, 1)
|
offsets = PackedFloat32Array(0, 0.0252525, 0.10101, 0.219697, 0.287879, 0.413357, 1)
|
||||||
colors = PackedColorArray(0, 0, 0, 1, 2, 1.66, 0.88, 1, 1, 0.510755, 0.116048, 1, 0.347656, 0.148293, 0.0503992, 1, 0.273438, 0.273438, 0.273438, 1, 0, 0, 0, 1)
|
colors = PackedColorArray(0, 0, 0, 1, 1.1, 2.32, 3.47, 1, 2, 1.66, 0.88, 1, 1, 0.510755, 0.116048, 1, 0.699219, 0.298252, 0.101365, 1, 0.125, 0.125, 0.125, 1, 0, 0, 0, 1)
|
||||||
|
|
||||||
[sub_resource type="GradientTexture1D" id="GradientTexture1D_itq0n"]
|
[sub_resource type="GradientTexture1D" id="GradientTexture1D_3yf1e"]
|
||||||
gradient = SubResource( "Gradient_l1dmm" )
|
gradient = SubResource( "Gradient_r8j3o" )
|
||||||
use_hdr = true
|
use_hdr = true
|
||||||
|
|
||||||
[sub_resource type="Curve" id="Curve_vfbna"]
|
[sub_resource type="Curve" id="Curve_vfbna"]
|
||||||
_data = [Vector2(0, 0.154545), 0.0, 5.74743, 0, 0, Vector2(0.157761, 0.6), 1.49824, 1.49824, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
|
_data = [Vector2(0, 0), 0.0, 3.14727, 0, 0, Vector2(0.398568, 0.763636), 1.24892, 1.24892, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
|
||||||
|
|
||||||
[sub_resource type="CurveTexture" id="CurveTexture_n25a7"]
|
[sub_resource type="CurveTexture" id="CurveTexture_m7hhh"]
|
||||||
curve = SubResource( "Curve_vfbna" )
|
curve = SubResource( "Curve_vfbna" )
|
||||||
|
|
||||||
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_ckuul"]
|
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_mu7mc"]
|
||||||
lifetime_randomness = 0.25
|
lifetime_randomness = 0.6
|
||||||
|
emission_shape = 2
|
||||||
|
emission_box_extents = Vector3(0, 0, 1)
|
||||||
direction = Vector3(0, 0, -1)
|
direction = Vector3(0, 0, -1)
|
||||||
spread = 120.0
|
spread = 5.0
|
||||||
gravity = Vector3(0, 0, 0)
|
gravity = Vector3(0, 0, 0)
|
||||||
|
initial_velocity_min = 4.85
|
||||||
|
initial_velocity_max = 7.44
|
||||||
angular_velocity_min = -5.0
|
angular_velocity_min = -5.0
|
||||||
angular_velocity_max = 5.0
|
angular_velocity_max = 5.0
|
||||||
damping_min = 20.0
|
damping_min = 13.36
|
||||||
damping_max = 26.0
|
damping_max = 17.35
|
||||||
angle_min = -180.0
|
angle_min = -180.0
|
||||||
angle_max = 180.0
|
angle_max = 180.0
|
||||||
scale_min = 1.5
|
scale_min = 0.5
|
||||||
scale_max = 2.0
|
scale_max = 0.75
|
||||||
scale_curve = SubResource( "CurveTexture_n25a7" )
|
scale_curve = SubResource( "CurveTexture_m7hhh" )
|
||||||
color_ramp = SubResource( "GradientTexture1D_itq0n" )
|
color_ramp = SubResource( "GradientTexture1D_3yf1e" )
|
||||||
hue_variation_min = -0.01
|
hue_variation_min = -0.01
|
||||||
hue_variation_max = 0.01
|
hue_variation_max = 0.01
|
||||||
anim_offset_max = 4.0
|
anim_offset_max = 4.0
|
||||||
|
@ -50,7 +54,6 @@ collision_use_scale = true
|
||||||
blend_mode = 1
|
blend_mode = 1
|
||||||
shading_mode = 0
|
shading_mode = 0
|
||||||
vertex_color_use_as_albedo = true
|
vertex_color_use_as_albedo = true
|
||||||
albedo_color = Color(0.419608, 0.419608, 0.419608, 1)
|
|
||||||
albedo_texture = ExtResource( "4_aitcu" )
|
albedo_texture = ExtResource( "4_aitcu" )
|
||||||
disable_receive_shadows = true
|
disable_receive_shadows = true
|
||||||
billboard_mode = 3
|
billboard_mode = 3
|
||||||
|
@ -62,13 +65,53 @@ proximity_fade_enable = true
|
||||||
[sub_resource type="QuadMesh" id="QuadMesh_gkbg3"]
|
[sub_resource type="QuadMesh" id="QuadMesh_gkbg3"]
|
||||||
material = SubResource( "StandardMaterial3D_eernl" )
|
material = SubResource( "StandardMaterial3D_eernl" )
|
||||||
|
|
||||||
|
[sub_resource type="Gradient" id="Gradient_x5mjl"]
|
||||||
|
offsets = PackedFloat32Array(0, 0.0696517, 0.154229, 0.241294, 0.320896, 0.425373, 0.537313, 0.634328, 0.756219, 1)
|
||||||
|
colors = PackedColorArray(2, 2, 2, 1, 0.985075, 0.985075, 0.985075, 1, 0.500439, 0.500439, 0.500439, 1, 0.247924, 0.247924, 0.247924, 1, 0.120634, 0.120634, 0.120634, 1, 0.0580323, 0.0580323, 0.0580323, 1, 0.0304474, 0.0304474, 0.0304474, 1, 0.0187759, 0.0187759, 0.0187759, 1, 0.00932661, 0.00932661, 0.00932661, 1, 0, 0, 0, 1)
|
||||||
|
|
||||||
|
[sub_resource type="GradientTexture2D" id="GradientTexture2D_5y8sa"]
|
||||||
|
gradient = SubResource( "Gradient_x5mjl" )
|
||||||
|
use_hdr = true
|
||||||
|
fill = 1
|
||||||
|
fill_from = Vector2(0.5, 0.5)
|
||||||
|
fill_to = Vector2(0.5, 0)
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yhx2h"]
|
||||||
|
blend_mode = 1
|
||||||
|
no_depth_test = true
|
||||||
|
shading_mode = 0
|
||||||
|
albedo_color = Color(1, 0.529412, 0.270588, 1)
|
||||||
|
albedo_texture = SubResource( "GradientTexture2D_5y8sa" )
|
||||||
|
disable_receive_shadows = true
|
||||||
|
billboard_mode = 1
|
||||||
|
fixed_size = true
|
||||||
|
point_size = 89.7
|
||||||
|
proximity_fade_distance = 0.5
|
||||||
|
|
||||||
|
[sub_resource type="QuadMesh" id="QuadMesh_q2732"]
|
||||||
|
material = SubResource( "StandardMaterial3D_yhx2h" )
|
||||||
|
|
||||||
[node name="Rocket" type="Node3D"]
|
[node name="Rocket" type="Node3D"]
|
||||||
script = ExtResource( "1_3ywpo" )
|
script = ExtResource( "1_3ywpo" )
|
||||||
hit_effect_scene = ExtResource( "2_1tben" )
|
hit_effect_scene = ExtResource( "2_1tben" )
|
||||||
speed = 25.0
|
speed = 35.0
|
||||||
|
damage = 75
|
||||||
|
|
||||||
[node name="Rocket" parent="." instance=ExtResource( "3_wqrr6" )]
|
[node name="Rocket" parent="." instance=ExtResource( "3_wqrr6" )]
|
||||||
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0)
|
transform = Transform3D(-1.07092e-07, 0, -2.44998, 0, 2.44998, 0, 2.44998, 0, -1.07092e-07, 0, 0, -0.28679)
|
||||||
|
|
||||||
|
[node name="Cylinder005" parent="Rocket" index="0"]
|
||||||
|
transform = Transform3D(1, 0, -7.10543e-15, 0, 1, 0, 7.10543e-15, 0, 1, 0, 0, 0)
|
||||||
|
layers = 2
|
||||||
|
|
||||||
|
[node name="Cube003" parent="Rocket/Cylinder005" index="0"]
|
||||||
|
layers = 2
|
||||||
|
|
||||||
|
[node name="Cube004" parent="Rocket/Cylinder005" index="1"]
|
||||||
|
layers = 2
|
||||||
|
|
||||||
|
[node name="Cube005" parent="Rocket/Cylinder005" index="2"]
|
||||||
|
layers = 2
|
||||||
|
|
||||||
[node name="Area3D" type="Area3D" parent="."]
|
[node name="Area3D" type="Area3D" parent="."]
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
|
@ -76,26 +119,43 @@ collision_mask = 11
|
||||||
monitorable = false
|
monitorable = false
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
|
||||||
transform = Transform3D(0, 4.37114e-08, -1, 1, 0, 0, 0, -1, -4.37114e-08, 0, 0, 0)
|
transform = Transform3D(0, 8.16337e-08, -1.86756, 1.86756, 0, 0, 0, -1.86756, -8.16337e-08, 0.000959158, 2.38419e-07, -0.307333)
|
||||||
shape = SubResource( "CapsuleShape3D_qjk68" )
|
shape = SubResource( "CapsuleShape3D_qjk68" )
|
||||||
|
|
||||||
[node name="OmniLight3D" type="OmniLight3D" parent="."]
|
[node name="OmniLight3D" type="SpotLight3D" parent="."]
|
||||||
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0.378725)
|
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0.174589)
|
||||||
light_color = Color(1, 0.882353, 0.462745, 1)
|
light_color = Color(1, 0.529412, 0.270588, 1)
|
||||||
light_size = 0.25
|
light_size = 0.5
|
||||||
shadow_enabled = true
|
shadow_enabled = true
|
||||||
shadow_blur = 3.0
|
shadow_blur = 3.0
|
||||||
|
spot_range = 25.0
|
||||||
|
spot_angle = 71.7513
|
||||||
|
|
||||||
[node name="Smoke" type="GPUParticles3D" parent="OmniLight3D"]
|
[node name="Smoke" type="GPUParticles3D" parent="OmniLight3D"]
|
||||||
|
transform = Transform3D(0.999982, -0.000659683, 0.00600755, 0.000640738, 0.999995, 0.00315697, -0.0060096, -0.00315307, 0.999977, 0.00051539, 1.19209e-07, -0.8097)
|
||||||
layers = 2
|
layers = 2
|
||||||
emitting = false
|
amount = 1024
|
||||||
amount = 128
|
lifetime = 1.8
|
||||||
lifetime = 1.26
|
|
||||||
fixed_fps = 0
|
fixed_fps = 0
|
||||||
local_coords = false
|
local_coords = false
|
||||||
trail_length_secs = 0.72
|
trail_length_secs = 0.72
|
||||||
process_material = SubResource( "ParticlesMaterial_ckuul" )
|
process_material = SubResource( "ParticlesMaterial_mu7mc" )
|
||||||
draw_pass_1 = SubResource( "QuadMesh_gkbg3" )
|
draw_pass_1 = SubResource( "QuadMesh_gkbg3" )
|
||||||
|
|
||||||
|
[node name="Halo" type="MeshInstance3D" parent="OmniLight3D"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.1)
|
||||||
|
layers = 2
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource( "QuadMesh_q2732" )
|
||||||
|
skeleton = NodePath("../..")
|
||||||
|
surface_material_override/0 = null
|
||||||
|
|
||||||
|
[node name="Timer" type="Timer" parent="."]
|
||||||
|
wait_time = 10.0
|
||||||
|
one_shot = true
|
||||||
|
autostart = true
|
||||||
|
|
||||||
[connection signal="body_entered" from="Area3D" to="." method="_on_Area3D_body_entered"]
|
[connection signal="body_entered" from="Area3D" to="." method="_on_Area3D_body_entered"]
|
||||||
[connection signal="body_shape_entered" from="Area3D" to="." method="_on_Area3D_body_shape_entered"]
|
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
|
||||||
|
|
||||||
|
[editable path="Rocket"]
|
||||||
|
|
|
@ -116,8 +116,10 @@ var spread = spread_min
|
||||||
# TODO - spawn
|
# TODO - spawn
|
||||||
|
|
||||||
elif weapon_type == WeaponType.PROJECTILE:
|
elif weapon_type == WeaponType.PROJECTILE:
|
||||||
var projectile_instance : Node3D = projectile_or_tracer_scene.instantiate()
|
var projectile_instance = projectile_or_tracer_scene.instantiate()
|
||||||
projectile_instance.global_transform = muzzle.global_transform.looking_at(to)
|
projectile_instance.global_transform = muzzle.global_transform.looking_at(to)
|
||||||
|
projectile_instance.source_position = player.global_transform.origin
|
||||||
|
#projectile_instance.get_node("RayCast3D").add_exception(player)
|
||||||
#projectile_instance.rotate_x(PI/2)
|
#projectile_instance.rotate_x(PI/2)
|
||||||
get_tree().root.add_child(projectile_instance)
|
get_tree().root.add_child(projectile_instance)
|
||||||
|
|
||||||
|
|
Reference in New Issue