2020-12-13 17:11:55 +00:00
|
|
|
use crate::sync;
|
2022-01-15 18:22:28 +00:00
|
|
|
use common::{
|
|
|
|
comp,
|
|
|
|
link::Is,
|
2022-01-16 17:06:35 +00:00
|
|
|
mounting::{Mount, Rider},
|
|
|
|
resources::Time,
|
2022-01-15 18:22:28 +00:00
|
|
|
};
|
2020-07-06 14:23:08 +00:00
|
|
|
use serde::{Deserialize, Serialize};
|
2021-11-13 20:46:45 +00:00
|
|
|
use specs::WorldExt;
|
2019-04-29 20:37:19 +00:00
|
|
|
use std::marker::PhantomData;
|
2019-11-24 20:12:03 +00:00
|
|
|
use sum_type::sum_type;
|
2019-04-10 17:23:27 +00:00
|
|
|
|
2019-05-17 09:22:32 +00:00
|
|
|
// Automatically derive From<T> for EcsCompPacket
|
|
|
|
// for each variant EcsCompPacket::T(T.)
|
2019-11-04 00:57:36 +00:00
|
|
|
sum_type! {
|
2019-05-16 23:05:46 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub enum EcsCompPacket {
|
2019-06-30 11:48:28 +00:00
|
|
|
Body(comp::Body),
|
2019-04-10 17:23:27 +00:00
|
|
|
Player(comp::Player),
|
2019-07-02 18:52:44 +00:00
|
|
|
CanBuild(comp::CanBuild),
|
2019-05-13 13:58:01 +00:00
|
|
|
Stats(comp::Stats),
|
2021-04-14 15:35:34 +00:00
|
|
|
SkillSet(comp::SkillSet),
|
2021-11-12 03:37:37 +00:00
|
|
|
ActiveAbilities(comp::ActiveAbilities),
|
2020-08-10 22:54:45 +00:00
|
|
|
Buffs(comp::Buffs),
|
2020-12-04 22:24:56 +00:00
|
|
|
Auras(comp::Auras),
|
2020-01-12 16:43:25 +00:00
|
|
|
Energy(comp::Energy),
|
2021-02-27 19:55:06 +00:00
|
|
|
Combo(comp::Combo),
|
2020-10-31 22:34:08 +00:00
|
|
|
Health(comp::Health),
|
2020-12-05 18:23:45 +00:00
|
|
|
Poise(comp::Poise),
|
2019-07-21 16:50:13 +00:00
|
|
|
LightEmitter(comp::LightEmitter),
|
2021-01-08 19:12:09 +00:00
|
|
|
Inventory(comp::Inventory),
|
2019-07-26 21:01:41 +00:00
|
|
|
Item(comp::Item),
|
2019-08-02 18:56:37 +00:00
|
|
|
Scale(comp::Scale),
|
2020-04-26 17:03:19 +00:00
|
|
|
Group(comp::Group),
|
2022-01-15 18:22:28 +00:00
|
|
|
IsMount(Is<Mount>),
|
|
|
|
IsRider(Is<Rider>),
|
2019-09-25 20:22:39 +00:00
|
|
|
Mass(comp::Mass),
|
2021-03-23 09:51:53 +00:00
|
|
|
Density(comp::Density),
|
2020-04-26 14:37:13 +00:00
|
|
|
Collider(comp::Collider),
|
2019-10-02 19:28:35 +00:00
|
|
|
Sticky(comp::Sticky),
|
2020-02-24 19:57:33 +00:00
|
|
|
CharacterState(comp::CharacterState),
|
2020-03-18 21:00:07 +00:00
|
|
|
Pos(comp::Pos),
|
|
|
|
Vel(comp::Vel),
|
|
|
|
Ori(comp::Ori),
|
2020-08-08 22:22:21 +00:00
|
|
|
Shockwave(comp::Shockwave),
|
2020-09-24 02:02:30 +00:00
|
|
|
BeamSegment(comp::BeamSegment),
|
2022-01-16 13:57:38 +00:00
|
|
|
Alignment(comp::Alignment),
|
2019-04-10 17:23:27 +00:00
|
|
|
}
|
|
|
|
}
|
2019-05-17 09:22:32 +00:00
|
|
|
// Automatically derive From<T> for EcsCompPhantom
|
|
|
|
// for each variant EcsCompPhantom::T(PhantomData<T>).
|
2019-11-04 00:57:36 +00:00
|
|
|
sum_type! {
|
2019-04-10 17:23:27 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
2019-05-16 23:05:46 +00:00
|
|
|
pub enum EcsCompPhantom {
|
2019-06-30 11:48:28 +00:00
|
|
|
Body(PhantomData<comp::Body>),
|
2019-04-10 17:23:27 +00:00
|
|
|
Player(PhantomData<comp::Player>),
|
2019-07-02 18:52:44 +00:00
|
|
|
CanBuild(PhantomData<comp::CanBuild>),
|
2019-05-13 13:58:01 +00:00
|
|
|
Stats(PhantomData<comp::Stats>),
|
2021-04-14 15:35:34 +00:00
|
|
|
SkillSet(PhantomData<comp::SkillSet>),
|
2021-11-12 03:37:37 +00:00
|
|
|
ActiveAbilities(PhantomData<comp::ActiveAbilities>),
|
2020-08-10 22:54:45 +00:00
|
|
|
Buffs(PhantomData<comp::Buffs>),
|
2020-12-04 22:24:56 +00:00
|
|
|
Auras(PhantomData<comp::Auras>),
|
2020-01-12 16:43:25 +00:00
|
|
|
Energy(PhantomData<comp::Energy>),
|
2021-02-27 19:55:06 +00:00
|
|
|
Combo(PhantomData<comp::Combo>),
|
2020-10-31 22:34:08 +00:00
|
|
|
Health(PhantomData<comp::Health>),
|
2020-12-05 18:23:45 +00:00
|
|
|
Poise(PhantomData<comp::Poise>),
|
2019-07-21 16:50:13 +00:00
|
|
|
LightEmitter(PhantomData<comp::LightEmitter>),
|
2021-01-08 19:12:09 +00:00
|
|
|
Inventory(PhantomData<comp::Inventory>),
|
2019-07-26 21:01:41 +00:00
|
|
|
Item(PhantomData<comp::Item>),
|
2019-08-02 18:56:37 +00:00
|
|
|
Scale(PhantomData<comp::Scale>),
|
2020-04-26 17:03:19 +00:00
|
|
|
Group(PhantomData<comp::Group>),
|
2022-01-15 18:22:28 +00:00
|
|
|
IsMount(PhantomData<Is<Mount>>),
|
|
|
|
IsRider(PhantomData<Is<Rider>>),
|
2019-09-25 20:22:39 +00:00
|
|
|
Mass(PhantomData<comp::Mass>),
|
2021-03-23 09:51:53 +00:00
|
|
|
Density(PhantomData<comp::Density>),
|
2020-04-26 14:37:13 +00:00
|
|
|
Collider(PhantomData<comp::Collider>),
|
2019-10-02 19:28:35 +00:00
|
|
|
Sticky(PhantomData<comp::Sticky>),
|
2020-02-24 19:57:33 +00:00
|
|
|
CharacterState(PhantomData<comp::CharacterState>),
|
2020-03-18 21:00:07 +00:00
|
|
|
Pos(PhantomData<comp::Pos>),
|
|
|
|
Vel(PhantomData<comp::Vel>),
|
|
|
|
Ori(PhantomData<comp::Ori>),
|
2020-08-08 22:22:21 +00:00
|
|
|
Shockwave(PhantomData<comp::Shockwave>),
|
2020-09-24 02:02:30 +00:00
|
|
|
BeamSegment(PhantomData<comp::BeamSegment>),
|
2022-01-16 13:57:38 +00:00
|
|
|
Alignment(PhantomData<comp::Alignment>),
|
2019-04-10 17:23:27 +00:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 20:12:03 +00:00
|
|
|
impl sync::CompPacket for EcsCompPacket {
|
2019-05-16 23:05:46 +00:00
|
|
|
type Phantom = EcsCompPhantom;
|
2020-02-01 20:39:39 +00:00
|
|
|
|
2021-03-16 15:55:01 +00:00
|
|
|
fn apply_insert(self, entity: specs::Entity, world: &specs::World, force_update: bool) {
|
2019-11-04 00:57:36 +00:00
|
|
|
match self {
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Body(comp) => sync::handle_insert(comp, entity, world),
|
|
|
|
EcsCompPacket::Player(comp) => sync::handle_insert(comp, entity, world),
|
|
|
|
EcsCompPacket::CanBuild(comp) => sync::handle_insert(comp, entity, world),
|
|
|
|
EcsCompPacket::Stats(comp) => sync::handle_insert(comp, entity, world),
|
2021-04-14 15:35:34 +00:00
|
|
|
EcsCompPacket::SkillSet(comp) => sync::handle_insert(comp, entity, world),
|
2021-11-12 03:37:37 +00:00
|
|
|
EcsCompPacket::ActiveAbilities(comp) => sync::handle_insert(comp, entity, world),
|
2020-08-10 22:54:45 +00:00
|
|
|
EcsCompPacket::Buffs(comp) => sync::handle_insert(comp, entity, world),
|
2020-12-04 22:24:56 +00:00
|
|
|
EcsCompPacket::Auras(comp) => sync::handle_insert(comp, entity, world),
|
2020-01-12 16:43:25 +00:00
|
|
|
EcsCompPacket::Energy(comp) => sync::handle_insert(comp, entity, world),
|
2021-02-27 19:55:06 +00:00
|
|
|
EcsCompPacket::Combo(comp) => sync::handle_insert(comp, entity, world),
|
2021-11-13 20:46:45 +00:00
|
|
|
EcsCompPacket::Health(mut comp) => {
|
|
|
|
// Time isn't synced between client and server so replace the Time from the
|
|
|
|
// server with the Client's local Time to enable accurate comparison.
|
|
|
|
comp.last_change.time = *world.read_resource::<Time>();
|
|
|
|
sync::handle_insert(comp, entity, world)
|
|
|
|
},
|
2020-12-05 18:23:45 +00:00
|
|
|
EcsCompPacket::Poise(comp) => sync::handle_insert(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::LightEmitter(comp) => sync::handle_insert(comp, entity, world),
|
2021-01-08 19:12:09 +00:00
|
|
|
EcsCompPacket::Inventory(comp) => sync::handle_insert(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Item(comp) => sync::handle_insert(comp, entity, world),
|
|
|
|
EcsCompPacket::Scale(comp) => sync::handle_insert(comp, entity, world),
|
2020-04-26 17:03:19 +00:00
|
|
|
EcsCompPacket::Group(comp) => sync::handle_insert(comp, entity, world),
|
2022-01-15 18:22:28 +00:00
|
|
|
EcsCompPacket::IsMount(comp) => sync::handle_insert(comp, entity, world),
|
|
|
|
EcsCompPacket::IsRider(comp) => sync::handle_insert(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Mass(comp) => sync::handle_insert(comp, entity, world),
|
2021-03-23 09:51:53 +00:00
|
|
|
EcsCompPacket::Density(comp) => sync::handle_insert(comp, entity, world),
|
2020-04-26 14:37:13 +00:00
|
|
|
EcsCompPacket::Collider(comp) => sync::handle_insert(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Sticky(comp) => sync::handle_insert(comp, entity, world),
|
2020-02-24 19:57:33 +00:00
|
|
|
EcsCompPacket::CharacterState(comp) => sync::handle_insert(comp, entity, world),
|
2021-03-16 15:55:01 +00:00
|
|
|
EcsCompPacket::Pos(comp) => {
|
|
|
|
sync::handle_interp_insert(comp, entity, world, force_update)
|
|
|
|
},
|
|
|
|
EcsCompPacket::Vel(comp) => {
|
|
|
|
sync::handle_interp_insert(comp, entity, world, force_update)
|
|
|
|
},
|
|
|
|
EcsCompPacket::Ori(comp) => {
|
|
|
|
sync::handle_interp_insert(comp, entity, world, force_update)
|
|
|
|
},
|
2020-08-08 22:22:21 +00:00
|
|
|
EcsCompPacket::Shockwave(comp) => sync::handle_insert(comp, entity, world),
|
2020-09-24 02:02:30 +00:00
|
|
|
EcsCompPacket::BeamSegment(comp) => sync::handle_insert(comp, entity, world),
|
2022-01-16 13:57:38 +00:00
|
|
|
EcsCompPacket::Alignment(comp) => sync::handle_insert(comp, entity, world),
|
2019-11-04 00:57:36 +00:00
|
|
|
}
|
|
|
|
}
|
2020-02-01 20:39:39 +00:00
|
|
|
|
2021-03-16 15:55:01 +00:00
|
|
|
fn apply_modify(self, entity: specs::Entity, world: &specs::World, force_update: bool) {
|
2019-11-04 00:57:36 +00:00
|
|
|
match self {
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Body(comp) => sync::handle_modify(comp, entity, world),
|
|
|
|
EcsCompPacket::Player(comp) => sync::handle_modify(comp, entity, world),
|
|
|
|
EcsCompPacket::CanBuild(comp) => sync::handle_modify(comp, entity, world),
|
|
|
|
EcsCompPacket::Stats(comp) => sync::handle_modify(comp, entity, world),
|
2021-04-14 15:35:34 +00:00
|
|
|
EcsCompPacket::SkillSet(comp) => sync::handle_modify(comp, entity, world),
|
2021-11-12 03:37:37 +00:00
|
|
|
EcsCompPacket::ActiveAbilities(comp) => sync::handle_modify(comp, entity, world),
|
2020-08-10 22:54:45 +00:00
|
|
|
EcsCompPacket::Buffs(comp) => sync::handle_modify(comp, entity, world),
|
2020-12-04 22:24:56 +00:00
|
|
|
EcsCompPacket::Auras(comp) => sync::handle_modify(comp, entity, world),
|
2020-01-12 16:43:25 +00:00
|
|
|
EcsCompPacket::Energy(comp) => sync::handle_modify(comp, entity, world),
|
2021-02-27 19:55:06 +00:00
|
|
|
EcsCompPacket::Combo(comp) => sync::handle_modify(comp, entity, world),
|
2021-11-13 20:46:45 +00:00
|
|
|
EcsCompPacket::Health(mut comp) => {
|
|
|
|
// Time isn't synced between client and server so replace the Time from the
|
|
|
|
// server with the Client's local Time to enable accurate comparison.
|
|
|
|
comp.last_change.time = *world.read_resource::<Time>();
|
|
|
|
sync::handle_modify(comp, entity, world)
|
|
|
|
},
|
2020-12-05 18:23:45 +00:00
|
|
|
EcsCompPacket::Poise(comp) => sync::handle_modify(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::LightEmitter(comp) => sync::handle_modify(comp, entity, world),
|
2021-01-08 19:12:09 +00:00
|
|
|
EcsCompPacket::Inventory(comp) => sync::handle_modify(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Item(comp) => sync::handle_modify(comp, entity, world),
|
|
|
|
EcsCompPacket::Scale(comp) => sync::handle_modify(comp, entity, world),
|
2020-04-26 17:03:19 +00:00
|
|
|
EcsCompPacket::Group(comp) => sync::handle_modify(comp, entity, world),
|
2022-01-15 18:22:28 +00:00
|
|
|
EcsCompPacket::IsMount(comp) => sync::handle_modify(comp, entity, world),
|
|
|
|
EcsCompPacket::IsRider(comp) => sync::handle_modify(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Mass(comp) => sync::handle_modify(comp, entity, world),
|
2021-03-23 09:51:53 +00:00
|
|
|
EcsCompPacket::Density(comp) => sync::handle_modify(comp, entity, world),
|
2020-04-26 14:37:13 +00:00
|
|
|
EcsCompPacket::Collider(comp) => sync::handle_modify(comp, entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPacket::Sticky(comp) => sync::handle_modify(comp, entity, world),
|
2020-02-24 19:57:33 +00:00
|
|
|
EcsCompPacket::CharacterState(comp) => sync::handle_modify(comp, entity, world),
|
2021-03-16 15:55:01 +00:00
|
|
|
EcsCompPacket::Pos(comp) => {
|
|
|
|
sync::handle_interp_modify(comp, entity, world, force_update)
|
|
|
|
},
|
|
|
|
EcsCompPacket::Vel(comp) => {
|
|
|
|
sync::handle_interp_modify(comp, entity, world, force_update)
|
|
|
|
},
|
|
|
|
EcsCompPacket::Ori(comp) => {
|
|
|
|
sync::handle_interp_modify(comp, entity, world, force_update)
|
|
|
|
},
|
2020-08-08 22:22:21 +00:00
|
|
|
EcsCompPacket::Shockwave(comp) => sync::handle_modify(comp, entity, world),
|
2020-09-24 02:02:30 +00:00
|
|
|
EcsCompPacket::BeamSegment(comp) => sync::handle_modify(comp, entity, world),
|
2022-01-16 13:57:38 +00:00
|
|
|
EcsCompPacket::Alignment(comp) => sync::handle_modify(comp, entity, world),
|
2019-11-04 00:57:36 +00:00
|
|
|
}
|
|
|
|
}
|
2020-02-01 20:39:39 +00:00
|
|
|
|
2019-11-04 00:57:36 +00:00
|
|
|
fn apply_remove(phantom: Self::Phantom, entity: specs::Entity, world: &specs::World) {
|
|
|
|
match phantom {
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPhantom::Body(_) => sync::handle_remove::<comp::Body>(entity, world),
|
|
|
|
EcsCompPhantom::Player(_) => sync::handle_remove::<comp::Player>(entity, world),
|
|
|
|
EcsCompPhantom::CanBuild(_) => sync::handle_remove::<comp::CanBuild>(entity, world),
|
|
|
|
EcsCompPhantom::Stats(_) => sync::handle_remove::<comp::Stats>(entity, world),
|
2021-04-14 15:35:34 +00:00
|
|
|
EcsCompPhantom::SkillSet(_) => sync::handle_remove::<comp::SkillSet>(entity, world),
|
2021-11-12 03:37:37 +00:00
|
|
|
EcsCompPhantom::ActiveAbilities(_) => {
|
|
|
|
sync::handle_remove::<comp::ActiveAbilities>(entity, world)
|
2021-11-09 17:56:07 +00:00
|
|
|
},
|
2020-08-10 22:54:45 +00:00
|
|
|
EcsCompPhantom::Buffs(_) => sync::handle_remove::<comp::Buffs>(entity, world),
|
2020-12-04 22:24:56 +00:00
|
|
|
EcsCompPhantom::Auras(_) => sync::handle_remove::<comp::Auras>(entity, world),
|
2020-01-12 16:43:25 +00:00
|
|
|
EcsCompPhantom::Energy(_) => sync::handle_remove::<comp::Energy>(entity, world),
|
2021-02-27 19:55:06 +00:00
|
|
|
EcsCompPhantom::Combo(_) => sync::handle_remove::<comp::Combo>(entity, world),
|
2020-10-31 22:34:08 +00:00
|
|
|
EcsCompPhantom::Health(_) => sync::handle_remove::<comp::Health>(entity, world),
|
2020-12-05 18:23:45 +00:00
|
|
|
EcsCompPhantom::Poise(_) => sync::handle_remove::<comp::Poise>(entity, world),
|
2019-11-04 00:57:36 +00:00
|
|
|
EcsCompPhantom::LightEmitter(_) => {
|
2019-11-24 20:12:03 +00:00
|
|
|
sync::handle_remove::<comp::LightEmitter>(entity, world)
|
2020-02-01 20:39:39 +00:00
|
|
|
},
|
2021-01-08 19:12:09 +00:00
|
|
|
EcsCompPhantom::Inventory(_) => sync::handle_remove::<comp::Inventory>(entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPhantom::Item(_) => sync::handle_remove::<comp::Item>(entity, world),
|
|
|
|
EcsCompPhantom::Scale(_) => sync::handle_remove::<comp::Scale>(entity, world),
|
2020-04-26 17:03:19 +00:00
|
|
|
EcsCompPhantom::Group(_) => sync::handle_remove::<comp::Group>(entity, world),
|
2022-01-15 18:22:28 +00:00
|
|
|
EcsCompPhantom::IsMount(_) => sync::handle_remove::<Is<Mount>>(entity, world),
|
|
|
|
EcsCompPhantom::IsRider(_) => sync::handle_remove::<Is<Rider>>(entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPhantom::Mass(_) => sync::handle_remove::<comp::Mass>(entity, world),
|
2021-03-23 09:51:53 +00:00
|
|
|
EcsCompPhantom::Density(_) => sync::handle_remove::<comp::Density>(entity, world),
|
2020-04-26 14:37:13 +00:00
|
|
|
EcsCompPhantom::Collider(_) => sync::handle_remove::<comp::Collider>(entity, world),
|
2019-11-24 20:12:03 +00:00
|
|
|
EcsCompPhantom::Sticky(_) => sync::handle_remove::<comp::Sticky>(entity, world),
|
2020-02-24 19:57:33 +00:00
|
|
|
EcsCompPhantom::CharacterState(_) => {
|
|
|
|
sync::handle_remove::<comp::CharacterState>(entity, world)
|
|
|
|
},
|
2021-03-13 02:53:19 +00:00
|
|
|
EcsCompPhantom::Pos(_) => sync::handle_interp_remove::<comp::Pos>(entity, world),
|
2021-03-13 22:15:19 +00:00
|
|
|
EcsCompPhantom::Vel(_) => sync::handle_interp_remove::<comp::Vel>(entity, world),
|
|
|
|
EcsCompPhantom::Ori(_) => sync::handle_interp_remove::<comp::Ori>(entity, world),
|
2020-08-08 22:22:21 +00:00
|
|
|
EcsCompPhantom::Shockwave(_) => sync::handle_remove::<comp::Shockwave>(entity, world),
|
2022-01-16 17:06:35 +00:00
|
|
|
EcsCompPhantom::BeamSegment(_) => {
|
|
|
|
sync::handle_remove::<comp::BeamSegment>(entity, world)
|
|
|
|
},
|
2022-01-16 13:57:38 +00:00
|
|
|
EcsCompPhantom::Alignment(_) => sync::handle_remove::<comp::Alignment>(entity, world),
|
2019-11-04 00:57:36 +00:00
|
|
|
}
|
|
|
|
}
|
2019-04-10 17:23:27 +00:00
|
|
|
}
|