extends BaseProjectileWeapon class_name RocketLauncher func _init() -> void: weapon_name = "Rocket Launcher" fire_rate = 1.0 # Moderate, but you only have 1 in the chamber anyway max_ammo = 1 reload_time = 2.5 # Extremely long reload time base_damage = 120.0 # High damage min_damage = 120.0 falloff_start = 0.0 max_range = 300.0 automatic = false spread_angle = 0.0 projectile_speed = 35.0 # Moderate speed projectile_gravity = 0.0 # Flies straight func _build_model() -> void: position = Vector3(0.4, -0.4, -0.945) var model_scene = load("res://assets/weapons/rocket launcher/source/Law72.fbx") if model_scene: var model = model_scene.instantiate() model_root.add_child(model) model.scale = Vector3(0.25, 0.25, 0.25) model.rotation_degrees.y = 90 for light in model.find_children("*", "Light3D", true, false): light.queue_free() # Muzzle Flash muzzle_flash = OmniLight3D.new() muzzle_flash.light_color = Color(1.0, 0.6, 0.2) muzzle_flash.light_energy = 0.0 muzzle_flash.omni_range = 5.0 muzzle_flash.position = Vector3(0, 0, -0.4) model_root.add_child(muzzle_flash) # Audio fire_sound = AudioStreamPlayer3D.new() fire_sound.bus = "SFX" fire_sound.stream = AudioManager.stream_for("rocket_fire", "res://assets/sounds/rocket_fire.wav") model_root.add_child(fire_sound) reload_sound = AudioStreamPlayer3D.new() reload_sound.bus = "SFX" reload_sound.stream = AudioManager.stream_for("shotgun_reload", "res://assets/sounds/shotgun_reload.wav") model_root.add_child(reload_sound) func _spawn_custom_projectile(origin: Vector3, fire_dir: Vector3) -> void: var proj = load("res://weapons/explosive_projectile.gd").new() # Mesh var mesh_instance = MeshInstance3D.new() var p_mesh = CylinderMesh.new() p_mesh.top_radius = 0.0 p_mesh.bottom_radius = 0.05 p_mesh.height = 0.2 var mat = StandardMaterial3D.new() mat.albedo_color = Color(0.8, 0.2, 0.2) # Red rocket p_mesh.material = mat mesh_instance.mesh = p_mesh mesh_instance.rotation.x = deg_to_rad(-90) proj.add_child(mesh_instance) # Rotation var up_vec = Vector3.UP if abs(fire_dir.dot(up_vec)) > 0.99: up_vec = Vector3.RIGHT proj.transform.basis = Basis.looking_at(fire_dir, up_vec) # Logic proj.position = muzzle_flash.global_position if muzzle_flash else origin proj.logical_source = origin proj.velocity = fire_dir * projectile_speed if player: proj.velocity += fire_dir * max(0.0, player.velocity.dot(fire_dir)) proj.damage = base_damage proj.min_damage = min_damage proj.falloff_start = falloff_start proj.max_range = max_range proj.drop_gravity = projectile_gravity proj.owner_player = player # Explosive stats proj.explosion_radius = 4.0 # Moderate AoE proj.explosion_knockback = 45.0 # Strong knockback! proj.can_self_damage = false # As requested proj.explosion_pitch = 0.7 # Fairly deep get_tree().current_scene.add_child(proj)