diff --git a/Game/Assets/Weapons/Projectile.gd b/Game/Assets/Weapons/Projectile.gd index 70cf7ac..ef5cef7 100644 --- a/Game/Assets/Weapons/Projectile.gd +++ b/Game/Assets/Weapons/Projectile.gd @@ -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() diff --git a/Game/Assets/Weapons/RocketLauncher/Rocket.tscn b/Game/Assets/Weapons/RocketLauncher/Rocket.tscn index 81adcc3..597e5a4 100644 --- a/Game/Assets/Weapons/RocketLauncher/Rocket.tscn +++ b/Game/Assets/Weapons/RocketLauncher/Rocket.tscn @@ -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"] diff --git a/Game/Assets/Weapons/Weapon.gd b/Game/Assets/Weapons/Weapon.gd index b96c474..7214de9 100644 --- a/Game/Assets/Weapons/Weapon.gd +++ b/Game/Assets/Weapons/Weapon.gd @@ -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)