diff --git a/common/src/data/level.rs b/common/src/data/level.rs index 737f2e5..3989f01 100644 --- a/common/src/data/level.rs +++ b/common/src/data/level.rs @@ -27,11 +27,20 @@ pub struct RuntimeGroupInstanceInfo { #[serde(rename_all = "PascalCase")] #[serde(default)] pub struct RuntimeGroupInfo { + pub load_on_initial: bool, + pub load_side: GroupLoadSide, pub group_name: Option, pub anchor_list: Option>, pub prop_list: Option>, } +#[derive(Default, Deserialize, PartialEq, Eq)] +pub enum GroupLoadSide { + #[default] + Client, + Server, +} + #[derive(Default, Deserialize)] #[serde(rename_all = "PascalCase")] #[serde(default)] diff --git a/gameserver/src/game/world/mod.rs b/gameserver/src/game/world/mod.rs index ea04436..0a3b321 100644 --- a/gameserver/src/game/world/mod.rs +++ b/gameserver/src/game/world/mod.rs @@ -5,7 +5,10 @@ pub use group::SceneGroup; use std::sync::atomic::{AtomicU32, Ordering}; -use common::data::{level::LevelAnchorInfo, LEVEL_TABLE}; +use common::data::{ + level::{GroupLoadSide, LevelAnchorInfo}, + LEVEL_TABLE, +}; use proto::{AvatarType, VectorBin}; use self::entity::{EntityType, SceneActor, SceneEntity, SceneProp}; @@ -87,11 +90,19 @@ impl GameWorld { pub fn init_groups(&mut self) { let floor = LEVEL_TABLE.level_floors.get(&self.floor_id).unwrap(); - for group_instance in &floor.group_instance_list { + for group_instance in floor + .group_instance_list + .iter() + .filter(|inst| !inst.is_delete) + { let level_group = LEVEL_TABLE .get_level_group(self.floor_id, group_instance.id) .unwrap(); + if !level_group.load_on_initial || level_group.load_side == GroupLoadSide::Client { + continue; + } + let mut prop_entity_list = Vec::new(); if let Some(prop_list) = level_group.prop_list.as_ref() { for level_prop in prop_list {