wicked-waifus-rs/wicked-waifus-game-server/src/logic/ecs/world.rs
xavo95 ab868a158a 2.2.2 (#3)
Ongoing changes for 2.2.2

Reviewed-on: WutheringSlaves/wicked-waifus-rs#3
2025-03-09 09:10:08 +00:00

127 lines
3.9 KiB
Rust

use super::component::ComponentContainer;
use super::entity::{Entity, EntityBuilder, EntityManager};
use crate::logic::ecs::buf::BufManager;
use crate::logic::player::InWorldPlayer;
use std::cell::{RefCell, RefMut};
use std::collections::hash_map::{Keys, Values};
use std::collections::HashMap;
use wicked_waifus_protocol::FightBuffInformation;
pub struct WorldEntity {
components: HashMap<i32, Vec<RefCell<ComponentContainer>>>,
entity_manager: EntityManager,
buff_manager: BufManager,
}
pub struct World {
pub player_cur_map_id: i32,
pub world_entitys: HashMap<i32, WorldEntity>, // i32 -> map_id
pub in_world_players: HashMap<i32, InWorldPlayer>, // joined players metadata
}
impl World {
pub fn new() -> Self {
Self {
player_cur_map_id: 8,
world_entitys: HashMap::new(),
in_world_players: HashMap::new(),
}
}
pub fn player_ids(&self) -> Keys<'_, i32, InWorldPlayer> {
self.in_world_players.keys()
}
pub fn players(&self) -> Values<'_, i32, InWorldPlayer> {
self.in_world_players.values()
}
pub fn set_in_world_player_data(&mut self, in_world_player: InWorldPlayer) {
self.in_world_players
.insert(in_world_player.player_id, in_world_player);
}
pub fn get_mut_world_entity(&mut self) -> &mut WorldEntity {
self.world_entitys
.get_mut(&self.player_cur_map_id)
.unwrap_or_else(|| panic!("Failed to get cur map data: {}", self.player_cur_map_id))
}
pub fn get_world_entity(&self) -> &WorldEntity {
self.world_entitys
.get(&self.player_cur_map_id)
.unwrap_or_else(|| panic!("Failed to get cur map data: {}", self.player_cur_map_id))
}
}
impl WorldEntity {
pub fn create_entity(&mut self, config_id: i32, entity_type: i32, map_id: i32) -> Entity {
self.entity_manager.create(config_id, entity_type, map_id)
}
pub fn create_builder(&mut self, entity: Entity) -> EntityBuilder {
EntityBuilder::builder(
entity,
self.components
.entry(entity.entity_id)
.or_insert(Vec::new()),
)
}
pub fn is_in_all_world_map(&self, entity_id: i32) -> bool {
self.entity_manager.get_all_entity_id().contains(&entity_id)
}
pub fn is_in_world_map(&self, entity_id: i32, map_id: i32) -> bool {
self.entity_manager
.get_entity_ids_by_map(map_id)
.contains(&entity_id)
}
pub fn get_entity_id(&self, config_id: i32) -> i64 {
self.entity_manager.get_entity_id(config_id) as i64
}
pub fn get_config_id(&self, entity_id: i32) -> i32 {
self.entity_manager.get_config_id(entity_id)
}
pub fn get_entity(&self, config_id: i32) -> Entity {
self.entity_manager.get(config_id)
}
pub fn components(&self) -> &HashMap<i32, Vec<RefCell<ComponentContainer>>> {
&self.components
}
pub fn get_entity_components(&self, entity_id: i32) -> Vec<RefMut<ComponentContainer>> {
if let Some(components) = self.components.get(&entity_id) {
components.iter().map(|rc| rc.borrow_mut()).collect()
} else {
Vec::new()
}
}
pub fn remove_entity(&mut self, entity_id: i32) -> bool {
self.buff_manager.remove_entity_buffs(entity_id as i64);
self.components.remove(&entity_id).is_some() && self.entity_manager.remove(entity_id)
}
pub fn active_entity_empty(&self) -> bool {
self.entity_manager.active_entity_empty()
}
pub fn generate_role_permanent_buffs(&mut self, entity_id: i64) -> Vec<FightBuffInformation> {
self.buff_manager.create_permanent_buffs(entity_id)
}
}
impl Default for WorldEntity {
fn default() -> Self {
Self {
components: HashMap::new(),
entity_manager: EntityManager::default(),
buff_manager: BufManager::default(),
}
}
}