mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Changed persistence of abilities to go through an intermediate state in json models.
This commit is contained in:
parent
6d0913bb5e
commit
fe80e365fa
@ -5,7 +5,7 @@ use crate::persistence::{
|
||||
|
||||
use crate::persistence::{
|
||||
error::PersistenceError,
|
||||
json_models::{self, CharacterPosition, GenericBody, HumanoidBody},
|
||||
json_models::{self, CharacterPosition, DatabaseAbilitySet, GenericBody, HumanoidBody},
|
||||
};
|
||||
use common::{
|
||||
character::CharacterId,
|
||||
@ -607,11 +607,7 @@ pub fn convert_active_abilities_to_database(
|
||||
entity_id: CharacterId,
|
||||
active_abilities: &ability::ActiveAbilities,
|
||||
) -> AbilitySets {
|
||||
let ability_sets = active_abilities
|
||||
.auxiliary_sets
|
||||
.iter()
|
||||
.filter_map(|set| serde_json::to_string(&set).ok())
|
||||
.collect::<Vec<String>>();
|
||||
let ability_sets = json_models::active_abilities_to_db_model(active_abilities);
|
||||
AbilitySets {
|
||||
entity_id,
|
||||
ability_sets: serde_json::to_string(&ability_sets).unwrap_or_default(),
|
||||
@ -621,10 +617,7 @@ pub fn convert_active_abilities_to_database(
|
||||
pub fn convert_active_abilities_from_database(
|
||||
ability_sets: &AbilitySets,
|
||||
) -> ability::ActiveAbilities {
|
||||
let ability_sets = core::iter::once(ability_sets)
|
||||
.flat_map(|sets| serde_json::from_str::<Vec<String>>(&sets.ability_sets))
|
||||
.flatten()
|
||||
.filter_map(|set| serde_json::from_str::<(ability::AuxiliaryKey, [ability::AuxiliaryAbility; ability::MAX_ABILITIES])>(&set).ok())
|
||||
.collect::<HashMap<ability::AuxiliaryKey, [ability::AuxiliaryAbility; ability::MAX_ABILITIES]>>();
|
||||
ability::ActiveAbilities::new(ability_sets)
|
||||
let ability_sets = serde_json::from_str::<Vec<DatabaseAbilitySet>>(&ability_sets.ability_sets)
|
||||
.unwrap_or_default();
|
||||
json_models::active_abilities_from_db_model(ability_sets)
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
use common::comp;
|
||||
use hashbrown::HashMap;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::string::ToString;
|
||||
use vek::Vec3;
|
||||
@ -106,3 +107,47 @@ pub fn db_string_to_skill_group(skill_group_string: &str) -> comp::skillset::Ski
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct DatabaseAbilitySet {
|
||||
mainhand: Option<comp::item::tool::ToolKind>,
|
||||
offhand: Option<comp::item::tool::ToolKind>,
|
||||
abilities: Vec<comp::ability::AuxiliaryAbility>,
|
||||
}
|
||||
|
||||
pub fn active_abilities_to_db_model(
|
||||
active_abilities: &comp::ability::ActiveAbilities,
|
||||
) -> Vec<DatabaseAbilitySet> {
|
||||
active_abilities
|
||||
.auxiliary_sets
|
||||
.iter()
|
||||
.map(|((mainhand, offhand), abilities)| DatabaseAbilitySet {
|
||||
mainhand: *mainhand,
|
||||
offhand: *offhand,
|
||||
abilities: abilities.to_vec(),
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
pub fn active_abilities_from_db_model(
|
||||
ability_sets: Vec<DatabaseAbilitySet>,
|
||||
) -> comp::ability::ActiveAbilities {
|
||||
let ability_sets = ability_sets
|
||||
.iter()
|
||||
.map(
|
||||
|DatabaseAbilitySet {
|
||||
mainhand,
|
||||
offhand,
|
||||
abilities,
|
||||
}| {
|
||||
let mut auxiliary_abilities =
|
||||
[comp::ability::AuxiliaryAbility::Empty; comp::ability::MAX_ABILITIES];
|
||||
for (empty, ability) in auxiliary_abilities.iter_mut().zip(abilities.iter()) {
|
||||
*empty = *ability;
|
||||
}
|
||||
((*mainhand, *offhand), auxiliary_abilities)
|
||||
},
|
||||
)
|
||||
.collect::<HashMap<_, _>>();
|
||||
comp::ability::ActiveAbilities::new(ability_sets)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user