From f8c579573a5b88ac31aa043124f12fb0586d7b89 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 26 May 2019 15:25:35 -0500 Subject: [PATCH] Campfires regen only if line of sight --- docs/source/configuration.rst | 8 +++ .../0018-Add-regen-effect-to-campfires.patch | 61 ++++++++++++++++--- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst index 4a9ef281d..b60effdc2 100644 --- a/docs/source/configuration.rst +++ b/docs/source/configuration.rst @@ -116,6 +116,10 @@ campfire-regen - **default**: 0 - **description**: The amplifier on the regen buff. `0` for level 1, `1` for level 2 +* require-line-of-sight + - **default**: true + - **description**: Only players within line of sight of the campfire will receive the regen buff + * boost-duration - **default**: 80 - **description**: How long (in ticks) the regen buff lasts when the campfire is in smoke signal mode @@ -127,3 +131,7 @@ campfire-regen * boost-amplifier - **default**: 1 - **description**: The amplifier on the regen buff when the campfire is in smoke signal mode + +* boost-require-line-of-sight + - **default**: false + - **description**: Only players within line of sight of the campfire will receive the regen buff when the campfire is in smoke signal mode diff --git a/patches/server/0018-Add-regen-effect-to-campfires.patch b/patches/server/0018-Add-regen-effect-to-campfires.patch index bd5605c40..2f9898f2f 100644 --- a/patches/server/0018-Add-regen-effect-to-campfires.patch +++ b/patches/server/0018-Add-regen-effect-to-campfires.patch @@ -1,18 +1,46 @@ -From 5f6b1226ebd2d3316469b5b9c3f301a5e4a903cf Mon Sep 17 00:00:00 2001 +From c95c100ac2d6d0ca91afced8929e903d894bb2c0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 19 May 2019 18:11:53 -0500 Subject: [PATCH] Add regen effect to campfires --- - .../minecraft/server/TileEntityCampfire.java | 10 ++++++++++ - .../java/net/pl3x/purpur/PurpurWorldConfig.java | 17 +++++++++++++++++ - 2 files changed, 27 insertions(+) + .../net/minecraft/server/EntityLiving.java | 15 ++++++++++--- + .../minecraft/server/TileEntityCampfire.java | 21 +++++++++++++++++++ + .../net/pl3x/purpur/PurpurWorldConfig.java | 21 +++++++++++++++++++ + 3 files changed, 54 insertions(+), 3 deletions(-) +diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java +index 27375059f..a64639aeb 100644 +--- a/src/main/java/net/minecraft/server/EntityLiving.java ++++ b/src/main/java/net/minecraft/server/EntityLiving.java +@@ -2706,10 +2706,19 @@ public abstract class EntityLiving extends Entity { + } + + public boolean hasLineOfSight(Entity entity) { +- Vec3D vec3d = new Vec3D(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ); +- Vec3D vec3d1 = new Vec3D(entity.locX, entity.locY + (double) entity.getHeadHeight(), entity.locZ); ++ // Purpur start ++ return hasLineOfSight(entity.locX, entity.locY + (double) entity.getHeadHeight(), entity.locZ); ++ } ++ ++ public boolean hasLineOfSight(TileEntity te) { ++ return hasLineOfSight(te.position.x + 0.5, te.position.y + 0.5, te.position.z + 0.5); ++ } + +- return this.world.rayTrace(new RayTrace(vec3d, vec3d1, RayTrace.BlockCollisionOption.COLLIDER, RayTrace.FluidCollisionOption.NONE, this)).getType() == MovingObjectPosition.EnumMovingObjectType.MISS; ++ public boolean hasLineOfSight(double x, double y, double z) { ++ Vec3D start = new Vec3D(locX, locY + (double) getHeadHeight(), locZ); ++ Vec3D end = new Vec3D(x, y, z); ++ return this.world.rayTrace(new RayTrace(start, end, RayTrace.BlockCollisionOption.COLLIDER, RayTrace.FluidCollisionOption.NONE, this)).getType() == MovingObjectPosition.EnumMovingObjectType.MISS; ++ // Purpur end + } + + @Override diff --git a/src/main/java/net/minecraft/server/TileEntityCampfire.java b/src/main/java/net/minecraft/server/TileEntityCampfire.java -index 3a97a6571..530022248 100644 +index 3a97a6571..e93ecc7b5 100644 --- a/src/main/java/net/minecraft/server/TileEntityCampfire.java +++ b/src/main/java/net/minecraft/server/TileEntityCampfire.java -@@ -34,6 +34,16 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab +@@ -34,6 +34,27 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab } else { if (flag) { @@ -23,17 +51,28 @@ index 3a97a6571..530022248 100644 + byte amp = (byte) (signalBoost ? world.purpurConfig.campfireRegenBoostAmp : world.purpurConfig.campfireRegenAmp); + int range = signalBoost ? world.purpurConfig.campfireRegenBoostRange : world.purpurConfig.campfireRegenRange; + MobEffect regeneration = new MobEffect(MobEffects.REGENERATION, duration, amp, true, true); -+ world.a(EntityHuman.class, new AxisAlignedBB(position).g(range)).forEach(p -> p.addEffect(regeneration)); ++ world.a(EntityHuman.class, new AxisAlignedBB(position).g(range)).forEach(entityhuman -> { ++ boolean noLineOfSign = true; ++ if (!signalBoost && world.purpurConfig.campfireRegenRequireLineOfSight) { ++ noLineOfSign = false; ++ } ++ if (signalBoost && world.purpurConfig.campfireRegenBoostRequireLineOfSight) { ++ noLineOfSign = false; ++ } ++ if (noLineOfSign || entityhuman.hasLineOfSight(this)) { ++ entityhuman.addEffect(regeneration); ++ } ++ }); + } + // Purpur end this.f(); } else { for (int i = 0; i < this.items.size(); ++i) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 30f11fe26..becb6f3b7 100644 +index 30f11fe26..5e9c633ac 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -60,4 +60,21 @@ public class PurpurWorldConfig { +@@ -60,4 +60,25 @@ public class PurpurWorldConfig { config.addDefault("world-settings.default." + path, def); return config.getString("world-settings." + worldName + "." + path, config.getString("world-settings.default." + path)); } @@ -42,17 +81,21 @@ index 30f11fe26..becb6f3b7 100644 + public int campfireRegenDuration = 80; + public int campfireRegenRange = 5; + public int campfireRegenAmp = 0; ++ public boolean campfireRegenRequireLineOfSight = true; + public int campfireRegenBoostDuration = 80; + public int campfireRegenBoostRange = 10; + public int campfireRegenBoostAmp = 1; ++ public boolean campfireRegenBoostRequireLineOfSight = false; + private void campireRegenSettings() { + campfireRegenInterval = getInt("campfire-regen.interval", campfireRegenInterval); + campfireRegenDuration = getInt("campfire-regen.duration", campfireRegenDuration); + campfireRegenRange = getInt("campfire-regen.range", campfireRegenRange); + campfireRegenAmp = getInt("campfire-regen.amplifier", campfireRegenAmp); ++ campfireRegenRequireLineOfSight = getBoolean("campfire-regen.require-line-of-sight", campfireRegenRequireLineOfSight); + campfireRegenBoostDuration = getInt("campfire-regen.boost-duration", campfireRegenBoostDuration); + campfireRegenBoostRange = getInt("campfire-regen.boost-range", campfireRegenBoostRange); + campfireRegenBoostAmp = getInt("campfire-regen.boost-amplifier", campfireRegenBoostAmp); ++ campfireRegenBoostRequireLineOfSight = getBoolean("campfire-regen.boost-require-line-of-sight", campfireRegenBoostRequireLineOfSight); + } } --