summaryrefslogtreecommitdiff
path: root/src/systems
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-16 10:54:23 +0200
committertroido <troido@protonmail.com>2020-04-16 10:54:23 +0200
commit905c6b649521296bba609db5b5c9a39008d34325 (patch)
tree8d253de507b3663399e23819bf8b4a222e7b64a5 /src/systems
parent43bde225ebbadd0b917ca87f3164a50455a2b588 (diff)
add visit whitelist to homeportal, save and dedup its data even though it is loaded from template
Diffstat (limited to 'src/systems')
-rw-r--r--src/systems/deduplicate.rs57
-rw-r--r--src/systems/interact.rs39
-rw-r--r--src/systems/mod.rs4
3 files changed, 92 insertions, 8 deletions
diff --git a/src/systems/deduplicate.rs b/src/systems/deduplicate.rs
new file mode 100644
index 0000000..e9fb88a
--- /dev/null
+++ b/src/systems/deduplicate.rs
@@ -0,0 +1,57 @@
+
+use std::collections::HashSet;
+
+use specs::{
+ Read,
+ WriteStorage,
+ ReadStorage,
+ Entities,
+ Entity,
+ System,
+ Join
+};
+
+use crate::{
+ components::{Dedup, Removed, New, Position},
+ resources::Ground
+};
+
+
+pub struct Deduplicate;
+impl <'a> System<'a> for Deduplicate {
+ type SystemData = (
+ Entities<'a>,
+ WriteStorage<'a, Dedup>,
+ WriteStorage<'a, Removed>,
+ ReadStorage<'a, New>,
+ ReadStorage<'a, Position>,
+ Read<'a, Ground>
+ );
+ fn run(&mut self, (entities, mut dedups, mut removeds, news, positions, ground): Self::SystemData) {
+ for (entity, dedup, position, _) in (&entities, &dedups, &positions, &news).join() {
+ let others: Vec<(Entity, &Dedup)> = ground.cells
+ .get(&position.pos)
+ .unwrap_or(&HashSet::new())
+ .iter()
+ .filter_map(|e| Some((*e, dedups.get(*e)?)))
+ .collect();
+ for (e, d) in others {
+ if dedup.id == d.id {
+ if dedup.priority > d.priority {
+ removeds.insert(e, Removed).unwrap();
+ } else if dedup.priority < d.priority {
+ removeds.insert(entity, Removed).unwrap();
+ } else if entity > e {
+ removeds.insert(e, Removed).unwrap();
+ } else if entity < e {
+ removeds.insert(entity, Removed).unwrap();
+ }
+ }
+ }
+ }
+ for (dedup, _) in (&mut dedups, &news).join() {
+ dedup.priority += 1;
+ }
+ }
+}
+
diff --git a/src/systems/interact.rs b/src/systems/interact.rs
index c3cd0d2..d00f3d7 100644
--- a/src/systems/interact.rs
+++ b/src/systems/interact.rs
@@ -21,12 +21,14 @@ use crate::{
Ear,
Inventory,
Visible,
- Player
+ Player,
+ Whitelist
},
controls::{Control},
resources::{Ground, NewEntities, Emigration},
hashmap,
- playerstate::RoomPos
+ playerstate::RoomPos,
+ PlayerId
};
pub struct Interact;
@@ -44,10 +46,11 @@ impl <'a> System<'a> for Interact {
WriteStorage<'a, Inventory>,
ReadStorage<'a, Visible>,
ReadStorage<'a, Player>,
- Write<'a, Emigration>
+ Write<'a, Emigration>,
+ WriteStorage<'a, Whitelist>
);
- fn run(&mut self, (entities, controllers, positions, ground, mut cooldowns, interactables, mut triggerbox, new, mut ears, mut inventories, visibles, players, mut emigration): Self::SystemData) {
+ fn run(&mut self, (entities, controllers, positions, ground, mut cooldowns, interactables, mut triggerbox, new, mut ears, mut inventories, visibles, players, mut emigration, mut whitelists): Self::SystemData) {
for (entity, controller, position) in (&entities, &controllers, &positions).join(){
let mut target = None;
let ear = ears.get_mut(entity);
@@ -107,12 +110,34 @@ impl <'a> System<'a> for Interact {
}
}
Interactable::Visit(dest) => {
- if let Some(player) = players.get(entity){
+ if let (Some(player), Some(whitelist)) = (players.get(entity), whitelists.get_mut(ent)){
let argument = arg.unwrap();
- if argument.starts_with("visit") {
+ if argument.starts_with("visit ") {
let playername = argument.split_at("visit ".len()).1;
let destination = dest.format(hashmap!("{player}" => playername));
- emigration.emigrants.push((player.id.clone(), destination, RoomPos::Unknown));
+ if let Some(set) = whitelist.allowed.get(&destination.name) {
+ if set.contains(&player.id){
+ emigration.emigrants.push((player.id.clone(), destination, RoomPos::Unknown));
+ } else {
+ say(ear, format!("not allowed to visit {}", playername), name);
+ }
+ } else {
+ say(ear, format!("unknown destination {}", playername), name);
+ }
+ } else if argument.starts_with("allow ") {
+ let playername = argument.split_at("allow ".len()).1;
+ let destination = dest.format(hashmap!("{player}" => player.id.name.as_str()));
+ whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).insert(PlayerId{name: playername.to_string()});
+ say(ear, format!("allowed {} to enter your home", playername), name);
+ } else if argument.starts_with("disallow ") {
+ let playername = argument.split_at("disallow ".len()).1;
+ let destination = dest.format(hashmap!("{player}" => player.id.name.as_str()));
+ whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).remove(&PlayerId{name: playername.to_string()});
+ say(ear, format!("disallowed {} to enter your home", playername), name);
+ } else if argument.starts_with("whitelist") {
+ let destination = dest.format(hashmap!("{player}" => player.id.name.as_str()));
+ let allowed = whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).iter().map(|id| id.name.as_str()).collect::<Vec<&str>>();
+ say(ear, format!("allowed players: {}", allowed.join(", ")), name);
}
}
}
diff --git a/src/systems/mod.rs b/src/systems/mod.rs
index d45fc38..024f54f 100644
--- a/src/systems/mod.rs
+++ b/src/systems/mod.rs
@@ -21,6 +21,7 @@ mod droploot;
mod timeout;
mod clear;
mod building;
+mod deduplicate;
pub use self::{
controlinput::ControlInput,
@@ -44,5 +45,6 @@ pub use self::{
droploot::DropLoot,
timeout::Timeout,
clear::Clear,
- building::Building
+ building::Building,
+ deduplicate::Deduplicate
};