Further work on Rockets

feature-rocketlauncher
unfa 2022-01-01 01:38:01 +01:00
parent 1f8bb1858b
commit dd924f53de
3 changed files with 161 additions and 45 deletions

View File

@ -1,8 +1,18 @@
extends Node3D
@export var hit_effect_scene : PackedScene
@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:
# var a = 2
@ -11,8 +21,13 @@ extends Node3D
# Called when the node enters the scene tree for the first time.
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):
#constant_linear_velocity = Vector3(1, 0, 0)
translate_object_local(Vector3.FORWARD * speed * delta)
@ -20,17 +35,56 @@ func _physics_process(delta):
# move_and_collide(global_transform.basis.x * Vector3.FORWARD * speed)
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _process(delta):
time += delta
var flicker = sin(time * 225) + sin(time * 240) / 2 + sin(time * 295) / 3
$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 hit():
var hit_effect = hit_effect_scene.instantiate()
hit_effect.global_transform = global_transform
get_tree().root.add_child(hit_effect)
queue_free()
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)
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):
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):
hit()
func _on_Timer_timeout():
queue_free()

View File

@ -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="PackedScene" uid="uid://wvxhewre31mo" path="res://Assets/Effects/ImpactExplosion.tscn" id="2_1tben"]
@ -7,38 +7,42 @@
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qjk68"]
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
offsets = PackedFloat32Array(0, 0.0216998, 0.101266, 0.177215, 0.184448, 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)
offsets = PackedFloat32Array(0, 0.0252525, 0.10101, 0.219697, 0.287879, 0.413357, 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"]
gradient = SubResource( "Gradient_l1dmm" )
[sub_resource type="GradientTexture1D" id="GradientTexture1D_3yf1e"]
gradient = SubResource( "Gradient_r8j3o" )
use_hdr = true
[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" )
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_ckuul"]
lifetime_randomness = 0.25
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_mu7mc"]
lifetime_randomness = 0.6
emission_shape = 2
emission_box_extents = Vector3(0, 0, 1)
direction = Vector3(0, 0, -1)
spread = 120.0
spread = 5.0
gravity = Vector3(0, 0, 0)
initial_velocity_min = 4.85
initial_velocity_max = 7.44
angular_velocity_min = -5.0
angular_velocity_max = 5.0
damping_min = 20.0
damping_max = 26.0
damping_min = 13.36
damping_max = 17.35
angle_min = -180.0
angle_max = 180.0
scale_min = 1.5
scale_max = 2.0
scale_curve = SubResource( "CurveTexture_n25a7" )
color_ramp = SubResource( "GradientTexture1D_itq0n" )
scale_min = 0.5
scale_max = 0.75
scale_curve = SubResource( "CurveTexture_m7hhh" )
color_ramp = SubResource( "GradientTexture1D_3yf1e" )
hue_variation_min = -0.01
hue_variation_max = 0.01
anim_offset_max = 4.0
@ -50,7 +54,6 @@ collision_use_scale = true
blend_mode = 1
shading_mode = 0
vertex_color_use_as_albedo = true
albedo_color = Color(0.419608, 0.419608, 0.419608, 1)
albedo_texture = ExtResource( "4_aitcu" )
disable_receive_shadows = true
billboard_mode = 3
@ -62,13 +65,53 @@ proximity_fade_enable = true
[sub_resource type="QuadMesh" id="QuadMesh_gkbg3"]
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"]
script = ExtResource( "1_3ywpo" )
hit_effect_scene = ExtResource( "2_1tben" )
speed = 25.0
speed = 35.0
damage = 75
[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="."]
collision_layer = 0
@ -76,26 +119,43 @@ collision_mask = 11
monitorable = false
[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" )
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0.378725)
light_color = Color(1, 0.882353, 0.462745, 1)
light_size = 0.25
[node name="OmniLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0.174589)
light_color = Color(1, 0.529412, 0.270588, 1)
light_size = 0.5
shadow_enabled = true
shadow_blur = 3.0
spot_range = 25.0
spot_angle = 71.7513
[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
emitting = false
amount = 128
lifetime = 1.26
amount = 1024
lifetime = 1.8
fixed_fps = 0
local_coords = false
trail_length_secs = 0.72
process_material = SubResource( "ParticlesMaterial_ckuul" )
process_material = SubResource( "ParticlesMaterial_mu7mc" )
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_shape_entered" from="Area3D" to="." method="_on_Area3D_body_shape_entered"]
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
[editable path="Rocket"]

View File

@ -116,8 +116,10 @@ var spread = spread_min
# TODO - spawn
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.source_position = player.global_transform.origin
#projectile_instance.get_node("RayCast3D").add_exception(player)
#projectile_instance.rotate_x(PI/2)
get_tree().root.add_child(projectile_instance)