mapbuilder
This commit is contained in:
parent
ab8c5e6688
commit
08efcce6f7
@ -99,9 +99,18 @@ impl RareMonsterAppearTable {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn roll_is_rare(&self, monster: &MonsterType) -> bool {
|
||||
fn roll_is_rare(&self, monster: &MonsterType) -> bool {
|
||||
rand_chacha::ChaChaRng::from_entropy().gen::<f32>() < *self.appear_rate.get(monster).unwrap_or(&0.0f32)
|
||||
}
|
||||
|
||||
pub fn apply(&self, mut enemy: MapEnemy, event: ShipEvent) -> MapEnemy {
|
||||
if enemy.can_be_rare() && self.roll_is_rare(&enemy.monster) {
|
||||
enemy.into_rare(event)
|
||||
}
|
||||
else {
|
||||
enemy
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -8,12 +8,13 @@ use thiserror::Error;
|
||||
|
||||
use crate::ship::ship::ShipEvent;
|
||||
use crate::ship::monster::MonsterType;
|
||||
use crate::ship::room::{Episode, RoomMode};
|
||||
use crate::ship::room::{Episode, RoomMode, PlayerMode};
|
||||
|
||||
// TODO: don't use *
|
||||
use crate::ship::map::*;
|
||||
|
||||
|
||||
|
||||
pub fn objects_from_stream(cursor: &mut impl Read, episode: &Episode, map_area: &MapArea) -> Vec<Option<MapObject>> {
|
||||
let mut object_data = Vec::new();
|
||||
|
||||
@ -35,7 +36,7 @@ fn parse_enemy(episode: &Episode, map_area: &MapArea, raw_enemy: RawMapEnemy) ->
|
||||
enemy
|
||||
.map_or(vec![None], |monster| {
|
||||
let mut monsters = vec![Some(monster)];
|
||||
|
||||
|
||||
match monster.monster {
|
||||
MonsterType::Monest => {
|
||||
for _ in 0..30 {
|
||||
@ -172,25 +173,10 @@ fn enemy_data_from_map_data(map_variant: &MapVariant, episode: &Episode) -> Vec<
|
||||
}
|
||||
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
#[error("")]
|
||||
pub enum MapsError {
|
||||
InvalidMonsterId(usize),
|
||||
InvalidObjectId(usize),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Maps {
|
||||
map_variants: Vec<MapVariant>,
|
||||
enemy_data: Vec<Option<MapEnemy>>,
|
||||
object_data: Vec<Option<MapObject>>,
|
||||
}
|
||||
|
||||
impl Maps {
|
||||
pub fn new(room_mode: RoomMode, rare_monster_table: &enemy::RareMonsterAppearTable, event: ShipEvent) -> Maps {
|
||||
let map_variants = match (room_mode.episode(), room_mode.single_player()) {
|
||||
(Episode::One, 0) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep1, MapVariantMode::Online),
|
||||
fn map_variants(episode: Episode, player_mode: PlayerMode) -> Vec<MapVariant> {
|
||||
match (episode, player_mode) {
|
||||
(Episode::One, PlayerMode::Multi) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep1, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::Forest1, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::Forest2, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::Caves1, MapVariantMode::Online),
|
||||
@ -205,10 +191,10 @@ impl Maps {
|
||||
MapVariant::new(MapArea::DeRolLe, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::VolOpt, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::DarkFalz, MapVariantMode::Online),
|
||||
]
|
||||
},
|
||||
(Episode::One, 1) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep1, MapVariantMode::Offline),
|
||||
]
|
||||
},
|
||||
(Episode::One, PlayerMode::Single) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep1, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::Forest1, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::Forest2, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::Caves1, MapVariantMode::Offline),
|
||||
@ -223,10 +209,10 @@ impl Maps {
|
||||
MapVariant::new(MapArea::DeRolLe, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::VolOpt, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::DarkFalz, MapVariantMode::Offline),
|
||||
]
|
||||
},
|
||||
(Episode::Two, 0) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep2, MapVariantMode::Online),
|
||||
]
|
||||
},
|
||||
(Episode::Two, PlayerMode::Multi) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep2, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::VrTempleAlpha, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::VrTempleBeta, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::VrSpaceshipAlpha, MapVariantMode::Online),
|
||||
@ -242,10 +228,10 @@ impl Maps {
|
||||
MapVariant::new(MapArea::OlgaFlow, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::BarbaRay, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::GolDragon, MapVariantMode::Online),
|
||||
]
|
||||
},
|
||||
(Episode::Two, 1) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep2, MapVariantMode::Offline),
|
||||
]
|
||||
},
|
||||
(Episode::Two, PlayerMode::Single) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep2, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::VrTempleAlpha, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::VrTempleBeta, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::VrSpaceshipAlpha, MapVariantMode::Offline),
|
||||
@ -261,10 +247,10 @@ impl Maps {
|
||||
MapVariant::new(MapArea::OlgaFlow, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::BarbaRay, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::GolDragon, MapVariantMode::Offline),
|
||||
]
|
||||
},
|
||||
(Episode::Four, _) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep4, MapVariantMode::Online),
|
||||
]
|
||||
},
|
||||
(Episode::Four, PlayerMode::Multi) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep4, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::CraterEast, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::CraterWest, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::CraterSouth, MapVariantMode::Online),
|
||||
@ -274,23 +260,44 @@ impl Maps {
|
||||
MapVariant::new(MapArea::SubDesert2, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::SubDesert3, MapVariantMode::Online),
|
||||
MapVariant::new(MapArea::SaintMillion, MapVariantMode::Online),
|
||||
]
|
||||
},
|
||||
_ => unreachable!()
|
||||
};
|
||||
]
|
||||
},
|
||||
(Episode::Four, PlayerMode::Single) => {
|
||||
vec![MapVariant::new(MapArea::Pioneer2Ep4, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::CraterEast, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::CraterWest, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::CraterSouth, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::CraterNorth, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::CraterInterior, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::SubDesert1, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::SubDesert2, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::SubDesert3, MapVariantMode::Offline),
|
||||
MapVariant::new(MapArea::SaintMillion, MapVariantMode::Offline),
|
||||
]
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
#[error("")]
|
||||
pub enum MapsError {
|
||||
InvalidMonsterId(usize),
|
||||
InvalidObjectId(usize),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Maps {
|
||||
map_variants: Vec<MapVariant>,
|
||||
enemy_data: Vec<Option<MapEnemy>>,
|
||||
object_data: Vec<Option<MapObject>>,
|
||||
}
|
||||
|
||||
impl Maps {
|
||||
pub fn new(map_variants: Vec<MapVariant>, enemy_data: Vec<Option<MapEnemy>>, object_data: Vec<Option<MapObject>>) -> Maps {
|
||||
Maps {
|
||||
enemy_data: map_variants.iter()
|
||||
.flat_map(|map_variant| {
|
||||
enemy_data_from_map_data(map_variant, &room_mode.episode())
|
||||
})
|
||||
.map(|enemy| apply_rare_enemy(enemy, rare_monster_table, event))
|
||||
.collect(),
|
||||
object_data: map_variants.iter()
|
||||
.flat_map(|map_variant| {
|
||||
objects_from_map_data(map_variant.obj_file().into(), &room_mode.episode(), &map_variant.map)
|
||||
}).collect(),
|
||||
map_variants,
|
||||
enemy_data,
|
||||
object_data,
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,7 +329,7 @@ impl Maps {
|
||||
{
|
||||
self.enemy_data = enemies
|
||||
.into_iter()
|
||||
.map(|enemy| apply_rare_enemy(enemy, rare_monster_table, event))
|
||||
.map(|enemy| enemy.map(|enemy| rare_monster_table.apply(enemy, event)))
|
||||
.collect();
|
||||
self.object_data = objects;
|
||||
}
|
||||
@ -351,13 +358,37 @@ impl Maps {
|
||||
}
|
||||
}
|
||||
|
||||
fn apply_rare_enemy(enemy: Option<MapEnemy>, rare_enemy_table: &RareMonsterAppearTable, event: ShipEvent) -> Option<MapEnemy> {
|
||||
enemy.map(|enemy| {
|
||||
if enemy.can_be_rare() && rare_enemy_table.roll_is_rare(&enemy.monster) {
|
||||
enemy.into_rare(event)
|
||||
}
|
||||
else {
|
||||
enemy
|
||||
}
|
||||
})
|
||||
pub trait MapBuilder: Send + Sync {
|
||||
fn generate_maps(&self, room_mode: RoomMode, event: ShipEvent) -> Maps;
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct FreeRoamMapBuilder {
|
||||
}
|
||||
|
||||
impl FreeRoamMapBuilder {
|
||||
pub fn new() -> FreeRoamMapBuilder {
|
||||
FreeRoamMapBuilder {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl MapBuilder for FreeRoamMapBuilder {
|
||||
fn generate_maps(&self, room_mode: RoomMode, event: ShipEvent) -> Maps {
|
||||
let rare_monster_table = RareMonsterAppearTable::new(room_mode.episode());
|
||||
let map_variants = map_variants(room_mode.episode(), room_mode.player_mode());
|
||||
Maps {
|
||||
enemy_data: map_variants.iter()
|
||||
.flat_map(|map_variant| {
|
||||
enemy_data_from_map_data(map_variant, &room_mode.episode())
|
||||
})
|
||||
.map(|enemy| enemy.map(|enemy| rare_monster_table.apply(enemy, event)))
|
||||
.collect(),
|
||||
object_data: map_variants.iter()
|
||||
.flat_map(|map_variant| {
|
||||
objects_from_map_data(map_variant.obj_file().into(), &room_mode.episode(), &map_variant.map)
|
||||
}).collect(),
|
||||
map_variants,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -39,14 +39,14 @@ pub async fn join_room(id: ClientId,
|
||||
leader: leader.local_client.id(),
|
||||
one: 1,
|
||||
difficulty: room.mode.difficulty().into(),
|
||||
battle: room.mode.battle(),
|
||||
battle: room.mode.battle() as u8,
|
||||
event: event.into(),
|
||||
section: room.section_id.into(),
|
||||
challenge: room.mode.challenge(),
|
||||
challenge: room.mode.challenge() as u8,
|
||||
random_seed: room.random_seed,
|
||||
episode: room.mode.episode().into(),
|
||||
one2: 1,
|
||||
single_player: room.mode.single_player(),
|
||||
single_player: room.mode.player_mode().value(),
|
||||
unknown: 0,
|
||||
})
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ use libpso::packet::ship::*;
|
||||
use crate::common::serverstate::ClientId;
|
||||
use crate::ship::ship::{SendShipPacket, ShipError, Clients, ShipEvent};
|
||||
use crate::ship::room::Rooms;
|
||||
use crate::ship::map::enemy::RareMonsterAppearTable;
|
||||
use crate::ship::location::{ClientLocation};
|
||||
use crate::ship::packet::builder::quest;
|
||||
use libpso::util::array_to_utf8;
|
||||
@ -115,8 +116,8 @@ pub async fn player_chose_quest(id: ClientId,
|
||||
.ok_or_else(|| ShipError::InvalidQuest(questmenuselect.quest))?
|
||||
.clone();
|
||||
|
||||
let rare_monster_drops = room.rare_monster_table.clone();
|
||||
room.maps.set_quest_data(quest.enemies.clone(), quest.objects.clone(), &rare_monster_drops, event);
|
||||
let rare_monster_table = RareMonsterAppearTable::new(room.mode.episode());
|
||||
room.maps.set_quest_data(quest.enemies.clone(), quest.objects.clone(), &rare_monster_table, event);
|
||||
room.map_areas = quest.map_areas.clone();
|
||||
|
||||
let bin = quest::quest_header(&questmenuselect, &quest.bin_blob, "bin");
|
||||
|
@ -1,12 +1,15 @@
|
||||
use std::convert::{TryFrom, Into};
|
||||
use futures::stream::StreamExt;
|
||||
|
||||
use async_std::sync::Arc;
|
||||
|
||||
use libpso::packet::ship::*;
|
||||
use libpso::packet::messages::*;
|
||||
use crate::common::serverstate::ClientId;
|
||||
use crate::common::leveltable::LEVEL_TABLE;
|
||||
use crate::ship::ship::{SendShipPacket, Clients, ShipEvent};
|
||||
use crate::ship::room::Rooms;
|
||||
use crate::ship::map::MapBuilder;
|
||||
use crate::ship::location::{ClientLocation, RoomId, RoomLobby, GetAreaError};
|
||||
use crate::ship::packet::builder;
|
||||
use crate::ship::room;
|
||||
@ -18,6 +21,7 @@ pub async fn create_room(id: ClientId,
|
||||
clients: &Clients,
|
||||
item_state: &mut ItemState,
|
||||
rooms: &Rooms,
|
||||
map_builder: Arc<Box<dyn MapBuilder>>,
|
||||
event: ShipEvent)
|
||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error> {
|
||||
let level = clients.with(id, |client| Box::pin(async move {
|
||||
@ -45,7 +49,7 @@ pub async fn create_room(id: ClientId,
|
||||
let mut item_state = item_state.clone();
|
||||
Box::pin(async move {
|
||||
item_state.add_character_to_room(room_id, &client.character, area_client).await;
|
||||
let mut room = room::RoomState::from_create_room(&create_room, client.character.section_id, event)?;
|
||||
let mut room = room::RoomState::from_create_room(&create_room, map_builder, client.character.section_id, event)?;
|
||||
room.bursting = true;
|
||||
Ok::<_, anyhow::Error>(room)
|
||||
})}).await??;
|
||||
|
@ -8,7 +8,7 @@ use futures::stream::{FuturesOrdered, Stream};
|
||||
use thiserror::Error;
|
||||
use rand::Rng;
|
||||
|
||||
use crate::ship::map::Maps;
|
||||
use crate::ship::map::{Maps, MapBuilder};
|
||||
use crate::ship::drops::DropTable;
|
||||
use crate::entity::character::SectionID;
|
||||
use crate::ship::monster::{load_monster_stats_table, MonsterType, MonsterStats};
|
||||
@ -135,6 +135,21 @@ pub enum Episode {
|
||||
Four,
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub enum PlayerMode{
|
||||
Single,
|
||||
Multi,
|
||||
}
|
||||
|
||||
impl PlayerMode {
|
||||
pub fn value(&self) -> u8 {
|
||||
match self {
|
||||
PlayerMode::Single => 1,
|
||||
PlayerMode::Multi => 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<u8> for Episode {
|
||||
type Error = RoomCreationError;
|
||||
|
||||
@ -245,24 +260,24 @@ impl RoomMode {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn battle(&self) -> u8 {
|
||||
pub fn battle(&self) -> bool {
|
||||
match self {
|
||||
RoomMode::Battle {..} => 1,
|
||||
_ => 0,
|
||||
RoomMode::Battle {..} => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn challenge(&self) -> u8 {
|
||||
pub fn challenge(&self) -> bool {
|
||||
match self {
|
||||
RoomMode::Challenge {..} => 1,
|
||||
_ => 0,
|
||||
RoomMode::Challenge {..} => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn single_player(&self) -> u8 {
|
||||
pub fn player_mode(&self) -> PlayerMode {
|
||||
match self {
|
||||
RoomMode::Single {..} => 1,
|
||||
_ => 0,
|
||||
RoomMode::Single {..} => PlayerMode::Single,
|
||||
_ => PlayerMode::Multi,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -301,7 +316,6 @@ pub struct RoomState {
|
||||
pub bursting: bool,
|
||||
pub monster_stats: Box<HashMap<MonsterType, MonsterStats>>,
|
||||
pub map_areas: MapAreaLookup,
|
||||
pub rare_monster_table: Box<RareMonsterAppearTable>,
|
||||
pub quest_group: QuestCategoryType,
|
||||
pub quests: Vec<quests::QuestList>,
|
||||
// items on ground
|
||||
@ -343,7 +357,11 @@ impl RoomState {
|
||||
self.quest_group = QuestCategoryType::from(group);
|
||||
}
|
||||
|
||||
pub fn from_create_room(create_room: &libpso::packet::ship::CreateRoom, section_id: SectionID, event: ShipEvent) -> Result<RoomState, RoomCreationError> {
|
||||
pub fn from_create_room(create_room: &libpso::packet::ship::CreateRoom,
|
||||
map_builder: Arc<Box<dyn MapBuilder>>,
|
||||
section_id: SectionID,
|
||||
event: ShipEvent)
|
||||
-> Result<RoomState, RoomCreationError> {
|
||||
if [create_room.battle, create_room.challenge, create_room.single_player].iter().sum::<u8>() > 1 {
|
||||
return Err(RoomCreationError::InvalidMode)
|
||||
}
|
||||
@ -372,7 +390,6 @@ impl RoomState {
|
||||
}
|
||||
};
|
||||
|
||||
let rare_monster_table = RareMonsterAppearTable::new(room_mode.episode());
|
||||
|
||||
// push the usual set of quests for the selected mode
|
||||
let mut qpath = PathBuf::from("data/quests/bb");
|
||||
@ -407,10 +424,9 @@ impl RoomState {
|
||||
monster_stats: Box::new(load_monster_stats_table(&room_mode).map_err(|_| RoomCreationError::CouldNotLoadMonsterStats(room_mode))?),
|
||||
mode: room_mode,
|
||||
random_seed: rand::thread_rng().gen(),
|
||||
rare_monster_table: Box::new(rare_monster_table.clone()),
|
||||
name: String::from_utf16_lossy(&create_room.name).trim_matches(char::from(0)).into(),
|
||||
password: create_room.password,
|
||||
maps: Maps::new(room_mode, &rare_monster_table, event),
|
||||
maps: map_builder.generate_maps(room_mode, event),
|
||||
section_id,
|
||||
drop_table: Box::new(DropTable::new(room_mode.episode(), room_mode.difficulty(), section_id)),
|
||||
bursting: false,
|
||||
|
@ -32,7 +32,7 @@ use crate::ship::location::{ClientLocation, RoomLobby, ClientLocationError, Room
|
||||
|
||||
use crate::ship::items;
|
||||
use crate::ship::room;
|
||||
use crate::ship::map::{MapsError, MapAreaError};
|
||||
use crate::ship::map::{Maps, MapBuilder, FreeRoamMapBuilder, MapsError, MapAreaError};
|
||||
use crate::ship::packet::handler;
|
||||
use crate::ship::shops::{WeaponShop, ToolShop, ArmorShop};
|
||||
use crate::ship::trade::TradeState;
|
||||
@ -379,6 +379,7 @@ pub struct ShipServerStateBuilder<EG: EntityGateway + Clone + 'static> {
|
||||
port: Option<u16>,
|
||||
auth_token: Option<AuthToken>,
|
||||
event: Option<ShipEvent>,
|
||||
map_builder: Option<Box<dyn MapBuilder>>,
|
||||
num_blocks: usize,
|
||||
}
|
||||
|
||||
@ -391,6 +392,7 @@ impl<EG: EntityGateway + Clone + 'static> Default for ShipServerStateBuilder<EG>
|
||||
port: None,
|
||||
auth_token: None,
|
||||
event: None,
|
||||
map_builder: None,
|
||||
num_blocks: 2,
|
||||
}
|
||||
}
|
||||
@ -433,6 +435,12 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerStateBuilder<EG> {
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn map_builder(mut self, map_builder: Box<dyn MapBuilder>) -> ShipServerStateBuilder<EG> {
|
||||
self.map_builder = Some(map_builder);
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn blocks(mut self, num_blocks: usize) -> ShipServerStateBuilder<EG> {
|
||||
self.num_blocks = num_blocks;
|
||||
@ -451,6 +459,7 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerStateBuilder<EG> {
|
||||
shops: ItemShops::default(),
|
||||
blocks: Blocks(blocks),
|
||||
event: self.event.unwrap_or(ShipEvent::None),
|
||||
map_builder: Arc::new(self.map_builder.unwrap_or(Box::new(FreeRoamMapBuilder::new()))),
|
||||
|
||||
auth_token: self.auth_token.unwrap_or_else(|| AuthToken("".into())),
|
||||
ship_list: Arc::new(RwLock::new(Vec::new())),
|
||||
@ -499,6 +508,7 @@ pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
||||
ship_list: Arc<RwLock<Vec<Ship>>>,
|
||||
shipgate_sender: Option<channel::Sender<ShipMessage>>,
|
||||
trades: TradeState,
|
||||
map_builder: Arc<Box<dyn MapBuilder>>,
|
||||
}
|
||||
|
||||
impl<EG: EntityGateway + Clone + 'static> ShipServerState<EG> {
|
||||
@ -725,7 +735,7 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> {
|
||||
},
|
||||
RecvShipPacket::CreateRoom(create_room) => {
|
||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||
handler::room::create_room(id, create_room, &mut block.client_location, &self.clients, &mut self.item_state, &block.rooms, self.event).await?
|
||||
handler::room::create_room(id, create_room, &mut block.client_location, &self.clients, &mut self.item_state, &block.rooms, self.map_builder.clone(), self.event).await?
|
||||
},
|
||||
RecvShipPacket::RoomNameRequest(_req) => {
|
||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||
|
@ -97,6 +97,7 @@ async fn test_item_ids_reset_when_rejoining_rooms() {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
#[async_std::test]
|
||||
async fn test_load_rare_monster_default_appear_rates() {
|
||||
let mut entity_gateway = InMemoryGateway::default();
|
||||
@ -116,6 +117,7 @@ async fn test_load_rare_monster_default_appear_rates() {
|
||||
}
|
||||
})).await.unwrap();
|
||||
}
|
||||
*/
|
||||
|
||||
#[async_std::test]
|
||||
async fn test_set_valid_quest_group() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user