extends BaseHitscanWeapon class_name DMR var is_ads: bool = false var default_fov: float = 90.0 var ads_fov: float = 40.0 func _init() -> void: weapon_name = "DMR" fire_rate = 0.3 # Cooldown to prevent autoclicker spam max_ammo = 15 reload_time = 2.2 base_damage = 75.0 min_damage = 60.0 falloff_start = 50.0 max_range = 300.0 automatic = false spread_angle = 0.002 # Extremely accurate func _ready() -> void: super._ready() if camera: default_fov = camera.fov func _build_model() -> void: position = Vector3(0.3, -0.3, -0.49) var model_scene = load("res://assets/weapons/dmr/source/M14 .blend") if model_scene: var model = model_scene.instantiate() model_root.add_child(model) model.scale = Vector3(0.1875, 0.1875, 0.1875) 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.8, 0.4) muzzle_flash.light_energy = 0.0 muzzle_flash.omni_range = 6.0 muzzle_flash.position = Vector3(0, 0.03, -0.6) model_root.add_child(muzzle_flash) # Audio fire_sound = AudioStreamPlayer3D.new() fire_sound.bus = "SFX" fire_sound.stream = AudioManager.stream_for("dmr_fire", "res://assets/sounds/dmr_fire.wav") fire_sound.position = muzzle_flash.position fire_sound.volume_db = -3.0 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 _process(delta: float) -> void: super._process(delta) if not visible: return if camera: var target_fov = ads_fov if is_ads else -1.0 var rig = camera.get_parent() if rig and rig.has_method("set_weapon_fov"): rig.set_weapon_fov(target_fov) # Move model to center when ADS var target_pos = Vector3(0.0, -0.2, -0.5) if is_ads else Vector3(0.3, -0.3, -0.7) position = position.lerp(target_pos, 15.0 * delta) # Adjust sensitivity if player has a way to modify it (we can modify the camera rig later) # For now, FOV alone gives the zoom effect. func _input(event: InputEvent) -> void: super._input(event) if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: return if event.is_action_pressed("fire_alt"): is_ads = true elif event.is_action_released("fire_alt"): is_ads = false func _start_reload() -> void: super._start_reload() is_ads = false # Drop out of ADS on reload func unequip() -> void: is_ads = false if camera: var rig = camera.get_parent() if rig and rig.has_method("set_weapon_fov"): rig.set_weapon_fov(-1.0) position = Vector3(0.3, -0.3, -0.49)