mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
determine location names when loading character list
This commit is contained in:
parent
6fbca74e88
commit
b20ff5144c
@ -55,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
- Fixed wild roaming cyclop loot table to not drop the quarry key
|
- Fixed wild roaming cyclop loot table to not drop the quarry key
|
||||||
- Dungeons now have an outer wall, preventing them from intersecting with caves or leaving holes in sides of mountains.
|
- Dungeons now have an outer wall, preventing them from intersecting with caves or leaving holes in sides of mountains.
|
||||||
|
- Location names are displayed in character selection dialog
|
||||||
|
|
||||||
## [0.15.0] - 2023-07-01
|
## [0.15.0] - 2023-07-01
|
||||||
|
|
||||||
|
@ -25,4 +25,6 @@ pub struct CharacterItem {
|
|||||||
pub character: Character,
|
pub character: Character,
|
||||||
pub body: comp::Body,
|
pub body: comp::Body,
|
||||||
pub inventory: Inventory,
|
pub inventory: Inventory,
|
||||||
|
// this string changes between database representation and human readable name in server.tick
|
||||||
|
pub location: Option<String>,
|
||||||
}
|
}
|
||||||
|
@ -894,10 +894,29 @@ impl Server {
|
|||||||
CharacterUpdaterMessage::CharacterScreenResponse(response) => {
|
CharacterUpdaterMessage::CharacterScreenResponse(response) => {
|
||||||
match response.response_kind {
|
match response.response_kind {
|
||||||
CharacterScreenResponseKind::CharacterList(result) => match result {
|
CharacterScreenResponseKind::CharacterList(result) => match result {
|
||||||
Ok(character_list_data) => self.notify_client(
|
Ok(mut character_list_data) => {
|
||||||
response.target_entity,
|
character_list_data.iter_mut().for_each(|c| {
|
||||||
ServerGeneral::CharacterListUpdate(character_list_data),
|
let name = c
|
||||||
),
|
.location
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|s| {
|
||||||
|
persistence::parse_waypoint(s).ok().and_then(
|
||||||
|
|(waypoint, _)| waypoint.map(|w| w.get_pos()),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.and_then(|wpos| {
|
||||||
|
self.world.get_location_name(
|
||||||
|
self.index.as_index_ref(),
|
||||||
|
wpos.xy().as_::<i32>(),
|
||||||
|
)
|
||||||
|
});
|
||||||
|
c.location = name;
|
||||||
|
});
|
||||||
|
self.notify_client(
|
||||||
|
response.target_entity,
|
||||||
|
ServerGeneral::CharacterListUpdate(character_list_data),
|
||||||
|
)
|
||||||
|
},
|
||||||
Err(error) => self.notify_client(
|
Err(error) => self.notify_client(
|
||||||
response.target_entity,
|
response.target_entity,
|
||||||
ServerGeneral::CharacterActionError(error.to_string()),
|
ServerGeneral::CharacterActionError(error.to_string()),
|
||||||
|
@ -41,6 +41,8 @@ mod conversions;
|
|||||||
|
|
||||||
pub(crate) type EntityId = i64;
|
pub(crate) type EntityId = i64;
|
||||||
|
|
||||||
|
pub(crate) use conversions::convert_waypoint_from_database_json as parse_waypoint;
|
||||||
|
|
||||||
const CHARACTER_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.character";
|
const CHARACTER_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.character";
|
||||||
const INVENTORY_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.inventory";
|
const INVENTORY_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.inventory";
|
||||||
const LOADOUT_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.loadout";
|
const LOADOUT_PSEUDO_CONTAINER_DEF_ID: &str = "veloren.core.pseudo_containers.loadout";
|
||||||
@ -297,7 +299,8 @@ pub fn load_character_list(player_uuid_: &str, connection: &Connection) -> Chara
|
|||||||
let mut stmt = connection.prepare_cached(
|
let mut stmt = connection.prepare_cached(
|
||||||
"
|
"
|
||||||
SELECT character_id,
|
SELECT character_id,
|
||||||
alias
|
alias,
|
||||||
|
waypoint
|
||||||
FROM character
|
FROM character
|
||||||
WHERE player_uuid = ?1
|
WHERE player_uuid = ?1
|
||||||
ORDER BY character_id",
|
ORDER BY character_id",
|
||||||
@ -309,7 +312,7 @@ pub fn load_character_list(player_uuid_: &str, connection: &Connection) -> Chara
|
|||||||
character_id: row.get(0)?,
|
character_id: row.get(0)?,
|
||||||
alias: row.get(1)?,
|
alias: row.get(1)?,
|
||||||
player_uuid: player_uuid_.to_owned(),
|
player_uuid: player_uuid_.to_owned(),
|
||||||
waypoint: None, // Not used for character select
|
waypoint: row.get(2)?,
|
||||||
})
|
})
|
||||||
})?
|
})?
|
||||||
.map(|x| x.unwrap())
|
.map(|x| x.unwrap())
|
||||||
@ -355,6 +358,7 @@ pub fn load_character_list(player_uuid_: &str, connection: &Connection) -> Chara
|
|||||||
character: char,
|
character: char,
|
||||||
body: char_body,
|
body: char_body,
|
||||||
inventory: Inventory::with_loadout(loadout, char_body),
|
inventory: Inventory::with_loadout(loadout, char_body),
|
||||||
|
location: character_data.waypoint.as_ref().cloned(),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
@ -21,6 +21,9 @@ use std::{
|
|||||||
};
|
};
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
|
// re-export waypoint parser for use to look up location names in character list
|
||||||
|
pub(crate) use character::parse_waypoint;
|
||||||
|
|
||||||
/// A struct of the components that are persisted to the DB for each character
|
/// A struct of the components that are persisted to the DB for each character
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PersistedComponents {
|
pub struct PersistedComponents {
|
||||||
|
@ -623,10 +623,15 @@ impl Controls {
|
|||||||
Text::new(&character.character.alias)
|
Text::new(&character.character.alias)
|
||||||
.size(fonts.cyri.scale(26))
|
.size(fonts.cyri.scale(26))
|
||||||
.into(),
|
.into(),
|
||||||
Text::new(
|
Text::new(character.location.as_ref().map_or_else(
|
||||||
// TODO: Add actual location here
|
|| {
|
||||||
i18n.get_msg("char_selection-uncanny_valley"),
|
i18n.get_msg(
|
||||||
)
|
"char_selection-uncanny_valley",
|
||||||
|
)
|
||||||
|
.to_string()
|
||||||
|
},
|
||||||
|
|s| s.clone(),
|
||||||
|
))
|
||||||
.into(),
|
.into(),
|
||||||
]),
|
]),
|
||||||
)
|
)
|
||||||
|
@ -51,7 +51,8 @@ use common::{
|
|||||||
resources::TimeOfDay,
|
resources::TimeOfDay,
|
||||||
rtsim::ChunkResource,
|
rtsim::ChunkResource,
|
||||||
terrain::{
|
terrain::{
|
||||||
Block, BlockKind, SpriteKind, TerrainChunk, TerrainChunkMeta, TerrainChunkSize, TerrainGrid,
|
Block, BlockKind, CoordinateConversions, SpriteKind, TerrainChunk, TerrainChunkMeta,
|
||||||
|
TerrainChunkSize, TerrainGrid,
|
||||||
},
|
},
|
||||||
vol::{ReadVol, RectVolSize, WriteVol},
|
vol::{ReadVol, RectVolSize, WriteVol},
|
||||||
};
|
};
|
||||||
@ -685,4 +686,21 @@ impl World {
|
|||||||
|
|
||||||
lod::Zone { objects }
|
lod::Zone { objects }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// determine waypoint name
|
||||||
|
pub fn get_location_name(&self, index: IndexRef, wpos2d: Vec2<i32>) -> Option<String> {
|
||||||
|
let chunk_pos = wpos2d.wpos_to_cpos();
|
||||||
|
let sim_chunk = self.sim.get(chunk_pos)?;
|
||||||
|
// TODO: Move this into SimChunk for reuse with above?
|
||||||
|
sim_chunk
|
||||||
|
.sites
|
||||||
|
.iter()
|
||||||
|
.filter(|id| {
|
||||||
|
index.sites[**id].get_origin().distance_squared(wpos2d) as f32
|
||||||
|
<= index.sites[**id].radius().powi(2)
|
||||||
|
})
|
||||||
|
.min_by_key(|id| index.sites[**id].get_origin().distance_squared(wpos2d))
|
||||||
|
.map(|id| index.sites[*id].name().to_string())
|
||||||
|
.or_else(|| sim_chunk.poi.map(|poi| self.civs.pois[poi].name.clone()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user