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::{
|
use crate::persistence::{
|
||||||
error::PersistenceError,
|
error::PersistenceError,
|
||||||
json_models::{self, CharacterPosition, GenericBody, HumanoidBody},
|
json_models::{self, CharacterPosition, DatabaseAbilitySet, GenericBody, HumanoidBody},
|
||||||
};
|
};
|
||||||
use common::{
|
use common::{
|
||||||
character::CharacterId,
|
character::CharacterId,
|
||||||
@ -607,11 +607,7 @@ pub fn convert_active_abilities_to_database(
|
|||||||
entity_id: CharacterId,
|
entity_id: CharacterId,
|
||||||
active_abilities: &ability::ActiveAbilities,
|
active_abilities: &ability::ActiveAbilities,
|
||||||
) -> AbilitySets {
|
) -> AbilitySets {
|
||||||
let ability_sets = active_abilities
|
let ability_sets = json_models::active_abilities_to_db_model(active_abilities);
|
||||||
.auxiliary_sets
|
|
||||||
.iter()
|
|
||||||
.filter_map(|set| serde_json::to_string(&set).ok())
|
|
||||||
.collect::<Vec<String>>();
|
|
||||||
AbilitySets {
|
AbilitySets {
|
||||||
entity_id,
|
entity_id,
|
||||||
ability_sets: serde_json::to_string(&ability_sets).unwrap_or_default(),
|
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(
|
pub fn convert_active_abilities_from_database(
|
||||||
ability_sets: &AbilitySets,
|
ability_sets: &AbilitySets,
|
||||||
) -> ability::ActiveAbilities {
|
) -> ability::ActiveAbilities {
|
||||||
let ability_sets = core::iter::once(ability_sets)
|
let ability_sets = serde_json::from_str::<Vec<DatabaseAbilitySet>>(&ability_sets.ability_sets)
|
||||||
.flat_map(|sets| serde_json::from_str::<Vec<String>>(&sets.ability_sets))
|
.unwrap_or_default();
|
||||||
.flatten()
|
json_models::active_abilities_from_db_model(ability_sets)
|
||||||
.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)
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use common::comp;
|
use common::comp;
|
||||||
|
use hashbrown::HashMap;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::string::ToString;
|
use std::string::ToString;
|
||||||
use vek::Vec3;
|
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…
x
Reference in New Issue
Block a user