From 6a1ef4d47a0e6a8d633f85edce61b7739f695732 Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Sat, 17 Apr 2021 17:54:11 -0400
Subject: [PATCH] Gated safe zone behind a server setting, removed unneeded
 function.

---
 server/src/events/entity_creation.rs | 4 ----
 server/src/events/mod.rs             | 9 ++++-----
 server/src/settings.rs               | 2 ++
 server/src/state_ext.rs              | 2 --
 server/src/sys/terrain.rs            | 8 +++++---
 5 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/server/src/events/entity_creation.rs b/server/src/events/entity_creation.rs
index c42b2f86a5..284aebb86a 100644
--- a/server/src/events/entity_creation.rs
+++ b/server/src/events/entity_creation.rs
@@ -255,7 +255,3 @@ pub fn handle_create_waypoint(server: &mut Server, pos: Vec3<f32>) {
         )]))
         .build();
 }
-
-pub fn handle_create_safezone(server: &mut Server, range: Option<f32>, pos: Pos) {
-    server.state.create_safezone(range, pos).build();
-}
diff --git a/server/src/events/mod.rs b/server/src/events/mod.rs
index 9a3d6f1781..784a8ef483 100644
--- a/server/src/events/mod.rs
+++ b/server/src/events/mod.rs
@@ -2,9 +2,8 @@ use crate::{state_ext::StateExt, Server};
 use common::event::{EventBus, ServerEvent};
 use common_base::span;
 use entity_creation::{
-    handle_beam, handle_create_npc, handle_create_safezone, handle_create_ship,
-    handle_create_waypoint, handle_initialize_character, handle_loaded_character_data,
-    handle_shockwave, handle_shoot,
+    handle_beam, handle_create_npc, handle_create_ship, handle_create_waypoint,
+    handle_initialize_character, handle_loaded_character_data, handle_shockwave, handle_shoot,
 };
 use entity_manipulation::{
     handle_aura, handle_buff, handle_combo_change, handle_damage, handle_delete, handle_destroy,
@@ -20,7 +19,7 @@ use interaction::{
 use inventory_manip::handle_inventory;
 use invite::{handle_invite, handle_invite_response};
 use player::{handle_client_disconnect, handle_exit_ingame};
-use specs::{Entity as EcsEntity, WorldExt};
+use specs::{Builder, Entity as EcsEntity, WorldExt};
 use trade::{cancel_trade_for, handle_process_trade_action};
 
 mod entity_creation;
@@ -214,7 +213,7 @@ impl Server {
                     max_range,
                 } => handle_teleport_to(&self, entity, target, max_range),
                 ServerEvent::CreateSafezone { range, pos } => {
-                    handle_create_safezone(self, range, pos)
+                    self.state.create_safezone(range, pos).build();
                 },
             }
         }
diff --git a/server/src/settings.rs b/server/src/settings.rs
index 67a1af3817..1ffc79b051 100644
--- a/server/src/settings.rs
+++ b/server/src/settings.rs
@@ -43,6 +43,7 @@ pub struct Settings {
     pub max_player_group_size: u32,
     pub client_timeout: Duration,
     pub spawn_town: Option<String>,
+    pub safe_spawn: bool,
 }
 
 impl Default for Settings {
@@ -61,6 +62,7 @@ impl Default for Settings {
             max_player_group_size: 6,
             client_timeout: Duration::from_secs(40),
             spawn_town: None,
+            safe_spawn: true,
         }
     }
 }
diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs
index 93682f4870..ab4a9eb04c 100644
--- a/server/src/state_ext.rs
+++ b/server/src/state_ext.rs
@@ -325,12 +325,10 @@ impl StateExt for State {
         use comp::{
             aura::{Aura, AuraKind, AuraTarget, Auras},
             buff::{BuffCategory, BuffData, BuffKind, BuffSource},
-            object, Body,
         };
         self.ecs_mut()
             .create_entity_synced()
             .with(pos)
-            .with(Body::Object(object::Body::BoltNature))
             .with(Auras::new(vec![Aura::new(
                 AuraKind::Buff {
                     kind: BuffKind::Invulnerability,
diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs
index 27afdda57f..7f10728439 100644
--- a/server/src/sys/terrain.rs
+++ b/server/src/sys/terrain.rs
@@ -1,6 +1,6 @@
 use crate::{
-    chunk_generator::ChunkGenerator, client::Client, presence::Presence, rtsim::RtSim, SpawnPoint,
-    Tick,
+    chunk_generator::ChunkGenerator, client::Client, presence::Presence, rtsim::RtSim,
+    settings::Settings, SpawnPoint, Tick,
 };
 use common::{
     comp::{
@@ -35,6 +35,7 @@ impl<'a> System<'a> for Sys {
         Read<'a, EventBus<ServerEvent>>,
         Read<'a, Tick>,
         Read<'a, SpawnPoint>,
+        Read<'a, Settings>,
         WriteExpect<'a, ChunkGenerator>,
         WriteExpect<'a, TerrainGrid>,
         Write<'a, TerrainChanges>,
@@ -54,6 +55,7 @@ impl<'a> System<'a> for Sys {
             server_event_bus,
             tick,
             spawn_point,
+            server_settings,
             mut chunk_generator,
             mut terrain,
             mut terrain_changes,
@@ -223,7 +225,7 @@ impl<'a> System<'a> for Sys {
             }
 
             // Insert a safezone if chunk contains the spawn position
-            if is_spawn_chunk(key, *spawn_point, &terrain) {
+            if server_settings.safe_spawn && is_spawn_chunk(key, *spawn_point, &terrain) {
                 server_emitter.emit(ServerEvent::CreateSafezone {
                     range: Some(100.0),
                     pos: Pos(spawn_point.0),