diff --git a/config/zones/jedi_temple/ambient_npcs.yaml b/config/zones/jedi_temple/ambient_npcs.yaml index c3f0a72a..1488b4a9 100644 --- a/config/zones/jedi_temple/ambient_npcs.yaml +++ b/config/zones/jedi_temple/ambient_npcs.yaml @@ -583,7 +583,10 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: &starfighter_removal_config + !Graceful + enable_death_animation: false + force_despawn: true enable_gravity: false tickable_procedures: spawn: @@ -598,7 +601,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful {} min_duration_millis: 6000 next_possible_procedures: - procedure: spawn @@ -625,7 +627,8 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *starfighter_removal_config + force_despawn: true enable_gravity: false tickable_procedures: spawn: @@ -640,7 +643,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful {} min_duration_millis: 6000 next_possible_procedures: - procedure: spawn diff --git a/config/zones/jedi_temple/lifeday_orbs.yaml b/config/zones/jedi_temple/lifeday_orbs.yaml index e7dc8254..04674013 100644 --- a/config/zones/jedi_temple/lifeday_orbs.yaml +++ b/config/zones/jedi_temple/lifeday_orbs.yaml @@ -13,7 +13,11 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: &orb_removal_config + !Graceful + fade_duration_millis: 1000 + removal_delay_millis: 0 + force_despawn: true tickable_procedures: spawn: weight: 300 @@ -30,9 +34,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -59,7 +60,8 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true tickable_procedures: spawn: weight: 300 @@ -76,9 +78,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -105,7 +104,8 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true tickable_procedures: spawn: weight: 300 @@ -122,9 +122,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -151,7 +148,8 @@ jedi_temple: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true tickable_procedures: spawn: weight: 150 @@ -168,9 +166,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -211,15 +206,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -236,9 +229,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -281,15 +271,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -306,9 +294,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -362,15 +347,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -388,9 +371,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -418,15 +398,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 100 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -444,9 +422,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -482,15 +457,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -507,9 +480,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -547,15 +517,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -572,9 +540,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -612,15 +577,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -638,9 +601,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -676,15 +636,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -701,9 +659,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -741,15 +696,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -766,9 +719,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -806,15 +756,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -831,9 +779,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -871,15 +816,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -896,9 +839,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -940,15 +880,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -965,9 +903,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1009,15 +944,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1034,9 +967,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1082,15 +1012,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1108,9 +1036,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1142,15 +1067,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 100 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1168,9 +1091,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1206,15 +1126,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1231,9 +1149,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1271,15 +1186,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1296,9 +1209,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1340,15 +1250,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1366,9 +1274,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1404,15 +1309,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1429,9 +1332,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1469,15 +1369,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1494,9 +1392,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1534,15 +1429,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1560,9 +1453,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1606,15 +1496,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1631,9 +1519,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1683,15 +1568,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1708,9 +1591,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1768,15 +1648,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1794,9 +1672,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1828,15 +1703,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 100 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1854,9 +1727,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -1900,15 +1770,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -1925,9 +1793,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -1977,15 +1842,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -2002,9 +1865,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -2054,15 +1914,13 @@ jedi_temple: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true show_name: false enable_interact_popup: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -2080,9 +1938,6 @@ jedi_temple: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty diff --git a/config/zones/jedi_temple/members_only/lifeday_orbs.yaml b/config/zones/jedi_temple/members_only/lifeday_orbs.yaml index 87d9f5a1..979894c2 100644 --- a/config/zones/jedi_temple/members_only/lifeday_orbs.yaml +++ b/config/zones/jedi_temple/members_only/lifeday_orbs.yaml @@ -13,7 +13,11 @@ members_only: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: &orb_removal_config + !Graceful + fade_duration_millis: 1000 + removal_delay_millis: 0 + force_despawn: true tickable_procedures: spawn: weight: 300 @@ -30,9 +34,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -59,7 +60,8 @@ members_only: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true tickable_procedures: spawn: weight: 300 @@ -76,9 +78,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -105,7 +104,8 @@ members_only: y: 0 z: 0 w: 0 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true tickable_procedures: spawn: weight: 150 @@ -122,9 +122,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -161,15 +158,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -186,9 +181,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -226,15 +218,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -251,9 +241,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -299,15 +286,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -325,9 +310,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -363,15 +345,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 100 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -389,9 +369,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -431,15 +408,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -456,9 +431,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -500,15 +472,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -525,9 +495,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: spawn @@ -565,15 +532,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 25 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -591,9 +556,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty @@ -621,15 +583,13 @@ members_only: z: 0 w: 0 cursor: 54 - is_spawned: false + removal_mode: *orb_removal_config + force_despawn: true enable_interact_popup: false show_name: false one_shot_interaction: award_credits: 100 despawn_npc: true - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 duration_millis: 1000 tickable_procedures: spawn: @@ -647,9 +607,6 @@ members_only: remove: steps: - spawned_state: Despawn - removal_mode: !Graceful - fade_duration_millis: 1000 - removal_delay_millis: 0 min_duration_millis: 1000 next_possible_procedures: - procedure: empty diff --git a/src/game_server/handlers/character.rs b/src/game_server/handlers/character.rs index 7f35b2fc..58e0cadc 100644 --- a/src/game_server/handlers/character.rs +++ b/src/game_server/handlers/character.rs @@ -299,8 +299,10 @@ pub struct BaseNpcConfig { #[serde(default)] pub first_possible_procedures: Vec, pub synchronize_with: Option, - #[serde(default = "default_true")] - pub is_spawned: bool, + #[serde(default)] + pub force_despawn: bool, + #[serde(default)] + pub removal_mode: RemovalMode, pub composite_effect_id: Option, #[serde(default = "default_true")] pub clickable: bool, @@ -361,7 +363,7 @@ impl BaseNpc { character: &CharacterStats, override_is_spawned: bool, ) -> Vec> { - if !character.is_spawned && !override_is_spawned { + if !character.is_spawned() && !override_is_spawned { return Vec::new(); } @@ -513,7 +515,7 @@ impl BaseNpc { show_hp_delta: false, max_hp: character.max_health as i32, new_hp: character.health as i32, - hp_delta: 0, + hp_delta: (character.health as i32).saturating_sub(character.max_health as i32), critical: false, }, })); @@ -701,8 +703,6 @@ pub struct OneShotInteractionConfig { #[serde(default)] pub hud_message: HudMessageType, #[serde(default)] - pub removal_mode: RemovalMode, - #[serde(default)] pub despawn_npc: bool, pub duration_millis: u64, } @@ -717,7 +717,6 @@ pub struct OneShotInteractionTemplate { pub composite_effect_delay_millis: u32, pub dialog_option_id: Option, pub hud_message: HudMessageType, - pub removal_mode: RemovalMode, pub despawn_npc: bool, pub duration_millis: u64, } @@ -751,7 +750,6 @@ impl OneShotInteractionTemplate { animation_delay_seconds: config.animation_delay_seconds, composite_effect_id: config.composite_effect_id, composite_effect_delay_millis: config.composite_effect_delay_millis, - removal_mode: config.removal_mode, despawn_npc: config.despawn_npc, duration_millis: config.duration_millis, } @@ -770,8 +768,8 @@ impl OneShotInteractionTemplate { let mut packets_for_sender = Vec::new(); if self.despawn_npc { - character.is_spawned = false; - packets_for_all.extend(character.remove_packets(self.removal_mode)); + character.force_despawn = true; + packets_for_all.extend(character.remove_packets(character.removal_mode)); } if let Some(animation_id) = self.one_shot_animation_id { @@ -939,8 +937,6 @@ pub struct TickableStep { #[serde(default)] pub script: ScriptType, #[serde(default)] - pub removal_mode: RemovalMode, - #[serde(default)] pub spawned_state: SpawnedState, #[serde(default)] pub cursor: CursorUpdate, @@ -948,7 +944,9 @@ pub struct TickableStep { } impl TickableStep { - pub fn reselect_possible_pos(&self, character: &CharacterStats) -> Option { + pub fn reset_for_spawn(&self, character: &mut CharacterStats) -> Option { + character.refresh_health(); + if character.possible_pos.is_empty() { return None; } @@ -982,9 +980,9 @@ impl TickableStep { match self.spawned_state { SpawnedState::Always => { - if !character.is_spawned { - character.is_spawned = true; - pos_update = self.reselect_possible_pos(character); + if !character.is_spawned() { + character.force_despawn = false; + pos_update = self.reset_for_spawn(character); packets_for_all.extend(character.add_packets( false, mount_configs, @@ -994,10 +992,10 @@ impl TickableStep { } } SpawnedState::OnFirstStepTick => { - if !character.is_spawned { - // Spawn the character without updating its state to prevent it from being visible + if !character.is_spawned() { + // Spawn the character without updating force_despawn to prevent it from being visible // to players joining the room mid-step - pos_update = self.reselect_possible_pos(character); + pos_update = self.reset_for_spawn(character); packets_for_all.extend(character.add_packets( true, // Override is_spawned mount_configs, @@ -1007,10 +1005,10 @@ impl TickableStep { } } SpawnedState::Despawn => { - // Skip checking if the character is spawned before despawning it and instead check if - // its state needs updating as OnFirstStepTick doesn't maintain states - character.is_spawned = false; - packets_for_all.extend(character.remove_packets(self.removal_mode)); + // Skip checking if the character is spawned before despawning it and instead ensure + // force_despawn is true as OnFirstStepTick doesn't maintain this field + character.force_despawn = true; + packets_for_all.extend(character.remove_packets(character.removal_mode)); } SpawnedState::Keep => {} } @@ -1402,7 +1400,7 @@ impl TickableProcedure { (WeightedAliasIndex::new(weights), references) }; - let procedure = TickableProcedure { + TickableProcedure { steps: config.steps, current_step_index: None, last_step_change: Instant::now(), @@ -1410,11 +1408,7 @@ impl TickableProcedure { distribution: distribution.expect("Couldn't create weighted alias index"), next_possible_procedures, is_interruptible: config.is_interruptible, - }; - - procedure.panic_if_removal_exceeds_duration(); - - procedure + } } pub fn tick( @@ -1533,28 +1527,6 @@ impl TickableProcedure { pub fn is_interruptible(&self) -> bool { self.is_interruptible } - - fn panic_if_removal_exceeds_duration(&self) { - for step in &self.steps { - if let RemovalMode::Graceful { - removal_delay_millis, - removal_effect_delay_millis, - fade_duration_millis, - .. - } = step.removal_mode - { - let total_removal_time = - removal_delay_millis + removal_effect_delay_millis + fade_duration_millis; - - if total_removal_time > step.min_duration_millis as u32 { - panic!( - "(Removal delay: {}) + (Effect Delay: {}) + (Fade duration: {}) exceeded (Step duration: {})", - removal_delay_millis, removal_effect_delay_millis, fade_duration_millis, step.min_duration_millis - ); - } - } - } - } } #[derive(Clone)] @@ -2142,6 +2114,7 @@ pub struct BaseNpcTemplate { pub cursor: Option, pub health: u16, pub max_health: u16, + pub removal_mode: RemovalMode, pub interact_radius: f32, pub auto_interact_radius: f32, pub move_to_interact_offset: f32, @@ -2149,7 +2122,7 @@ pub struct BaseNpcTemplate { pub tickable_procedures: HashMap, pub first_possible_procedures: Vec, pub synchronize_with: Option, - pub is_spawned: bool, + pub force_despawn: bool, pub physics: PhysicsState, pub max_distance_from_target: f32, pub max_distance_from_origin: f32, @@ -2238,10 +2211,11 @@ impl BaseNpcTemplate { cursor: config.cursor, health: config.health, max_health: config.max_health.unwrap_or(config.health), + removal_mode: config.removal_mode, interact_radius: config.interact_radius, auto_interact_radius: config.auto_interact_radius.unwrap_or(0.0), move_to_interact_offset: config.move_to_interact_offset, - is_spawned: config.is_spawned, + force_despawn: config.force_despawn, physics: config.physics, mount_id: None, wield_type: WieldType::None, @@ -2322,7 +2296,7 @@ impl BaseNpcTemplate { mount_multiplier: 1.0, }, cursor: self.cursor, - is_spawned: self.is_spawned, + force_despawn: self.force_despawn, physics: self.physics, name: None, squad_guid: None, @@ -2334,6 +2308,7 @@ impl BaseNpcTemplate { threat_table: self.enemy_prioritization.clone().into(), health: self.health, max_health: self.max_health, + removal_mode: self.removal_mode, composite_effect_tags: BTreeMap::new(), navmesh: self.navmesh.clone(), ability_height: self.ability_height, @@ -2459,7 +2434,7 @@ pub struct CharacterStats { speed: CharacterStat, pub jump_height_multiplier: CharacterStat, pub cursor: Option, - pub is_spawned: bool, + pub force_despawn: bool, pub physics: PhysicsState, pub name: Option, pub squad_guid: Option, @@ -2474,11 +2449,20 @@ pub struct CharacterStats { pub threat_table: ThreatTable, pub health: u16, pub max_health: u16, + pub removal_mode: RemovalMode, pub composite_effect_tags: BTreeMap, pub navmesh: Option, } impl CharacterStats { + pub fn is_spawned(&self) -> bool { + !self.force_despawn && self.health > 0 + } + + pub fn refresh_health(&mut self) { + self.health = self.max_health; + } + pub fn add_packets( &self, override_is_spawned: bool, @@ -2706,7 +2690,7 @@ impl Character { character_type, mount: mount_id, cursor, - is_spawned: true, + force_despawn: false, physics: PhysicsState::default(), name: None, squad_guid: None, @@ -2734,6 +2718,7 @@ impl Character { threat_table: ThreatTable::default(), health: u16::MAX, max_health: u16::MAX, + removal_mode: RemovalMode::default(), composite_effect_tags: BTreeMap::new(), navmesh: None, ability_height: default_ability_height(), @@ -2776,7 +2761,7 @@ impl Character { character_type: CharacterType::Player(Box::new(data)), mount: None, cursor: None, - is_spawned: true, + force_despawn: false, physics: PhysicsState::default(), interact_radius: 0.0, auto_interact_radius: 0.0, @@ -2805,6 +2790,7 @@ impl Character { threat_table: ThreatTable::default(), health: u16::MAX, max_health: u16::MAX, + removal_mode: RemovalMode::default(), composite_effect_tags: BTreeMap::new(), navmesh: None, ability_height: default_ability_height(), diff --git a/src/game_server/handlers/zone.rs b/src/game_server/handlers/zone.rs index 6303ce89..5d7bb15e 100644 --- a/src/game_server/handlers/zone.rs +++ b/src/game_server/handlers/zone.rs @@ -1300,7 +1300,7 @@ pub fn interact_with_character( )); }; - if !target_read_handle.stats.is_spawned { + if !target_read_handle.stats.is_spawned() { return Err(ProcessPacketError::new( ProcessPacketErrorType::ConstraintViolated, format!("Received request to interact with inactive NPC {target} from {requester}"),