diff --git a/assets/common/abilities/custom/harvester/explodingpumpkin.ron b/assets/common/abilities/custom/harvester/explodingpumpkin.ron index 88b2b2d48a..ecea54a587 100644 --- a/assets/common/abilities/custom/harvester/explodingpumpkin.ron +++ b/assets/common/abilities/custom/harvester/explodingpumpkin.ron @@ -3,9 +3,9 @@ BasicRanged( buildup_duration: 0.5, recover_duration: 0.8, projectile: ExplodingPumpkin( - damage: 500.0, + damage: 200.0, knockback: 25.0, - radius: 10.0, + radius: 5.0, ), projectile_body: Object(Pumpkin), projectile_light: None, diff --git a/assets/common/abilities/custom/harvester/firebreath.ron b/assets/common/abilities/custom/harvester/firebreath.ron index eff08060f6..c94818ad01 100644 --- a/assets/common/abilities/custom/harvester/firebreath.ron +++ b/assets/common/abilities/custom/harvester/firebreath.ron @@ -2,8 +2,8 @@ BasicBeam( buildup_duration: 0.5, recover_duration: 0.5, beam_duration: 1.0, - damage: 35, - tick_rate: 3.0, + damage: 30, + tick_rate: 1.5, range: 20.0, max_angle: 15.0, damage_effect: Some(Buff(( @@ -15,6 +15,6 @@ BasicBeam( energy_regen: 0, energy_drain: 0, orientation_behavior: Normal, - ori_rate: 0.6, + ori_rate: 0.2, specifier: Flamethrower, ) diff --git a/common/src/states/sprite_summon.rs b/common/src/states/sprite_summon.rs index 75bfcccf60..0139c4fa15 100644 --- a/common/src/states/sprite_summon.rs +++ b/common/src/states/sprite_summon.rs @@ -88,12 +88,12 @@ impl CharacterBehavior for Data { data.pos.0.z.floor() as i32, ); - // Check for collision in z up to 25 blocks up or down + // Check for collision in z up to 10 blocks up or down let obstacle_z = data .terrain .ray( - sprite_pos.map(|x| x as f32 + 0.5) + Vec3::unit_z() * 25.0, - sprite_pos.map(|x| x as f32 + 0.5) - Vec3::unit_z() * 25.0, + sprite_pos.map(|x| x as f32 + 0.5) + Vec3::unit_z() * 10.0, + sprite_pos.map(|x| x as f32 + 0.5) - Vec3::unit_z() * 10.0, ) .until(|b| { // Until reaching a solid block that is not the created sprite @@ -104,7 +104,7 @@ impl CharacterBehavior for Data { .0; // z height relative to caster - let z = sprite_pos.z + (25.5 - obstacle_z).ceil() as i32; + let z = sprite_pos.z + (10.5 - obstacle_z).ceil() as i32; // Location sprite will be created let sprite_pos = Vec3::new(sprite_pos.x as i32, sprite_pos.y as i32, z); diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 475115cc36..54d9fa04c2 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -3734,10 +3734,16 @@ impl<'a> AgentData<'a> { agent.action_state.condition = true; } } else if attack_data.dist_sqrd < FIRE_BREATH_RANGE.powi(2) { - if matches!(self.char_state, CharacterState::BasicBeam(c) if c.timer < Duration::from_secs(10)) + if matches!(self.char_state, CharacterState::BasicBeam(c) if c.timer < Duration::from_secs(5)) + && can_see_tgt( + &*read_data.terrain, + self.pos, + tgt_data.pos, + attack_data.dist_sqrd, + ) { - // Keep breathing fire if close enough and have not been breathing for more than - // 10 seconds + // Keep breathing fire if close enough, can see target, and have not been + // breathing for more than 5 seconds controller .actions .push(ControlAction::basic_input(InputKind::Secondary));