Fix lightning - use vanilla lightning code.

This commit is contained in:
md_5 2013-01-22 15:58:34 +11:00
parent 38a24558c2
commit 6b463d9614
6 changed files with 67 additions and 385 deletions

View file

@ -1,9 +1,7 @@
From 90c324d6ba0cda9717efb4bd93cb21c666cc4b75 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@bigpond.com>
Date: Sun, 30 Dec 2012 23:56:05 -0600
Subject: [PATCH] Spigot Changes. This commit has undergone basic testing and
appears to now be safe for careful production usage. Please report any bugs
to IRC as soon as you encounter them. Long live Spigot!
From 87a3ec2b6f68e6f87645abcc32426e4c0141e666 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au>
Date: Tue, 22 Jan 2013 15:56:54 +1100
Subject: [PATCH] Spigot changes.
---
.gitignore | 2 +
@ -28,40 +26,37 @@ Subject: [PATCH] Spigot Changes. This commit has undergone basic testing and
src/main/java/net/minecraft/server/PlayerList.java | 10 +-
.../java/net/minecraft/server/SpawnerCreature.java | 23 +-
.../net/minecraft/server/ThreadLoginVerifier.java | 23 +
src/main/java/net/minecraft/server/World.java | 202 ++++++++-
.../java/net/minecraft/server/WorldServer.java | 133 ++++--
src/main/java/net/minecraft/server/World.java | 200 ++++++++-
.../java/net/minecraft/server/WorldServer.java | 122 +++++-
.../java/org/bukkit/craftbukkit/CraftServer.java | 98 ++++-
.../java/org/bukkit/craftbukkit/CraftWorld.java | 76 +++-
src/main/java/org/bukkit/craftbukkit/Spigot.java | 27 ++
src/main/java/org/bukkit/craftbukkit/Spigot.java | 25 ++
.../craftbukkit/chunkio/ChunkIOProvider.java | 2 +-
.../bukkit/craftbukkit/command/RestartCommand.java | 24 +
.../craftbukkit/command/TicksPerSecondCommand.java | 35 ++
.../org/bukkit/craftbukkit/entity/CraftPlayer.java | 7 +
.../updater/BukkitDLUpdaterService.java | 26 +-
.../bukkit/craftbukkit/util/ExceptionHandler.java | 31 ++
.../bukkit/craftbukkit/util/ExceptionReporter.java | 26 ++
.../java/org/bukkit/craftbukkit/util/FlatMap.java | 34 ++
.../craftbukkit/util/LightningSimulator.java | 184 ++++++++
.../org/bukkit/craftbukkit/util/LongHashSet.java | 11 +-
.../bukkit/craftbukkit/util/LongObjectHashMap.java | 5 +
.../java/org/bukkit/craftbukkit/util/Metrics.java | 488 +++++++++++++++++++++
.../org/bukkit/craftbukkit/util/TimedThread.java | 37 ++
.../bukkit/craftbukkit/util/WatchdogThread.java | 88 ++++
src/main/resources/configurations/bukkit.yml | 55 +++
42 files changed, 1675 insertions(+), 156 deletions(-)
src/main/resources/configurations/bukkit.yml | 30 ++
40 files changed, 1444 insertions(+), 137 deletions(-)
create mode 100644 src/main/java/org/bukkit/craftbukkit/Spigot.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/command/RestartCommand.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/command/TicksPerSecondCommand.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/ExceptionHandler.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/ExceptionReporter.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/FlatMap.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/LightningSimulator.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/Metrics.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/TimedThread.java
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/WatchdogThread.java
diff --git a/.gitignore b/.gitignore
index a689360..4138573 100644
index a689360..b97a549 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,5 @@
@ -70,6 +65,7 @@ index a689360..4138573 100644
/src/main/resources/lang
+
+/dependency-reduced-pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f0b0bfb..bd394ae 100644
--- a/pom.xml
@ -718,20 +714,19 @@ index 0686ba0..58d30eb 100644
URL url = new URL("http://session.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(PendingConnection.d(this.pendingConnection), "UTF-8") + "&serverId=" + URLEncoder.encode(s, "UTF-8"));
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream()));
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index e2fd0df..263cbd3 100644
index e2fd0df..5a01944 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -64,7 +64,8 @@ public abstract class World implements IBlockAccess {
@@ -64,7 +64,7 @@ public abstract class World implements IBlockAccess {
// CraftBukkit start - public, longhashset
public boolean allowMonsters = true;
public boolean allowAnimals = true;
- protected LongHashSet chunkTickList = new LongHashSet();
+ protected gnu.trove.map.hash.TLongShortHashMap chunkTickList; // Spigot
+ private org.bukkit.craftbukkit.util.LightningSimulator lightningSim = new org.bukkit.craftbukkit.util.LightningSimulator(this); // Spigot
public long ticksPerAnimalSpawns;
public long ticksPerMonsterSpawns;
// CraftBukkit end
@@ -72,7 +73,20 @@ public abstract class World implements IBlockAccess {
@@ -72,7 +72,20 @@ public abstract class World implements IBlockAccess {
int[] H;
private List O;
public boolean isStatic;
@ -752,7 +747,7 @@ index e2fd0df..263cbd3 100644
public BiomeBase getBiome(int i, int j) {
if (this.isLoaded(i, 0, j)) {
Chunk chunk = this.getChunkAtWorldCoords(i, j);
@@ -98,6 +112,7 @@ public abstract class World implements IBlockAccess {
@@ -98,6 +111,7 @@ public abstract class World implements IBlockAccess {
int lastXAccessed = Integer.MIN_VALUE;
int lastZAccessed = Integer.MIN_VALUE;
final Object chunkLock = new Object();
@ -760,7 +755,7 @@ index e2fd0df..263cbd3 100644
public CraftWorld getWorld() {
return this.world;
@@ -110,11 +125,18 @@ public abstract class World implements IBlockAccess {
@@ -110,11 +124,18 @@ public abstract class World implements IBlockAccess {
// Changed signature
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
this.generator = gen;
@ -779,7 +774,7 @@ index e2fd0df..263cbd3 100644
this.N = this.random.nextInt(12000);
this.H = new int['\u8000'];
this.O = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList
@@ -122,7 +144,7 @@ public abstract class World implements IBlockAccess {
@@ -122,7 +143,7 @@ public abstract class World implements IBlockAccess {
this.dataManager = idatamanager;
this.methodProfiler = methodprofiler;
this.worldMaps = new WorldMapCollection(idatamanager);
@ -788,7 +783,7 @@ index e2fd0df..263cbd3 100644
if (worldprovider != null) {
this.worldProvider = worldprovider;
} else if (this.worldData != null && this.worldData.j() != 0) {
@@ -903,6 +925,47 @@ public abstract class World implements IBlockAccess {
@@ -903,6 +924,47 @@ public abstract class World implements IBlockAccess {
event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason);
} else if (entity instanceof EntityItem) {
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
@ -836,7 +831,7 @@ index e2fd0df..263cbd3 100644
} else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
// Not all projectiles extend EntityProjectile, so check for Bukkit interface instead
event = CraftEventFactory.callProjectileLaunchEvent(entity);
@@ -995,6 +1058,39 @@ public abstract class World implements IBlockAccess {
@@ -995,6 +1057,39 @@ public abstract class World implements IBlockAccess {
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);
@ -876,7 +871,7 @@ index e2fd0df..263cbd3 100644
for (int k1 = i; k1 < j; ++k1) {
for (int l1 = i1; l1 < j1; ++l1) {
if (this.isLoaded(k1, 64, l1)) {
@@ -1008,6 +1104,7 @@ public abstract class World implements IBlockAccess {
@@ -1008,6 +1103,7 @@ public abstract class World implements IBlockAccess {
}
}
}
@ -884,7 +879,7 @@ index e2fd0df..263cbd3 100644
double d0 = 0.25D;
List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0));
@@ -1315,7 +1412,37 @@ public abstract class World implements IBlockAccess {
@@ -1315,7 +1411,37 @@ public abstract class World implements IBlockAccess {
this.entityJoinedWorld(entity, true);
}
@ -923,15 +918,7 @@ index e2fd0df..263cbd3 100644
int i = MathHelper.floor(entity.locX);
int j = MathHelper.floor(entity.locZ);
byte b0 = 32;
@@ -1815,6 +1942,7 @@ public abstract class World implements IBlockAccess {
protected void n() {
if (!this.worldProvider.f) {
+ lightningSim.onTick(); // Spigot
int i = this.worldData.getThunderDuration();
if (i <= 0) {
@@ -1896,6 +2024,11 @@ public abstract class World implements IBlockAccess {
@@ -1896,6 +2022,11 @@ public abstract class World implements IBlockAccess {
this.worldData.setWeatherDuration(1);
}
@ -943,7 +930,7 @@ index e2fd0df..263cbd3 100644
protected void z() {
// this.chunkTickList.clear(); // CraftBukkit - removed
this.methodProfiler.a("buildList");
@@ -1905,25 +2038,42 @@ public abstract class World implements IBlockAccess {
@@ -1905,25 +2036,42 @@ public abstract class World implements IBlockAccess {
int j;
int k;
@ -1000,7 +987,7 @@ index e2fd0df..263cbd3 100644
this.methodProfiler.b();
if (this.N > 0) {
@@ -1931,7 +2081,7 @@ public abstract class World implements IBlockAccess {
@@ -1931,7 +2079,7 @@ public abstract class World implements IBlockAccess {
}
this.methodProfiler.a("playerCheckLight");
@ -1009,7 +996,7 @@ index e2fd0df..263cbd3 100644
i = this.random.nextInt(this.players.size());
entityhuman = (EntityHuman) this.players.get(i);
j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5;
@@ -1970,9 +2120,16 @@ public abstract class World implements IBlockAccess {
@@ -1970,9 +2118,16 @@ public abstract class World implements IBlockAccess {
chunk.o();
}
@ -1026,7 +1013,7 @@ index e2fd0df..263cbd3 100644
public boolean w(int i, int j, int k) {
return this.c(i, j, k, false);
@@ -2310,7 +2467,10 @@ public abstract class World implements IBlockAccess {
@@ -2310,7 +2465,10 @@ public abstract class World implements IBlockAccess {
}
public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) {
@ -1038,7 +1025,7 @@ index e2fd0df..263cbd3 100644
int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D);
int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D);
int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D);
@@ -2319,12 +2479,12 @@ public abstract class World implements IBlockAccess {
@@ -2319,12 +2477,12 @@ public abstract class World implements IBlockAccess {
for (int i1 = i; i1 <= j; ++i1) {
for (int j1 = k; j1 <= l; ++j1) {
if (this.isChunkLoaded(i1, j1)) {
@ -1054,7 +1041,7 @@ index e2fd0df..263cbd3 100644
public List a(Class oclass, AxisAlignedBB axisalignedbb) {
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 3f73ef9..6764bef 100644
index 3f73ef9..a42aa1e 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1,5 +1,7 @@
@ -1135,25 +1122,7 @@ index 3f73ef9..6764bef 100644
// ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next();
int k = chunkX * 16;
int l = chunkZ * 16;
@@ -293,16 +313,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
int k1;
int l1;
- if (this.random.nextInt(100000) == 0 && this.N() && this.M()) {
- this.k = this.k * 3 + 1013904223;
- i1 = this.k >> 2;
- j1 = k + (i1 & 15);
- k1 = l + (i1 >> 8 & 15);
- l1 = this.h(j1, k1);
- if (this.D(j1, l1, k1)) {
- this.strikeLightning(new EntityLightning(this, (double) j1, (double) l1, (double) k1));
- }
- }
+ // Spigot - remove lightning code
this.methodProfiler.c("iceandsnow");
int i2;
@@ -373,6 +384,14 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -373,6 +393,14 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
if (block != null && block.isTicking()) {
++i;
@ -1168,7 +1137,7 @@ index 3f73ef9..6764bef 100644
block.b(this, k2 + k, i3 + chunksection.d(), l2 + l, this.random);
}
}
@@ -413,10 +432,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -413,10 +441,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
nextticklistentry.a(j1);
}
@ -1184,7 +1153,7 @@ index 3f73ef9..6764bef 100644
}
}
@@ -427,10 +447,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -427,10 +456,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
nextticklistentry.a((long) i1 + this.worldData.getTime());
}
@ -1200,7 +1169,7 @@ index 3f73ef9..6764bef 100644
}
public void tickEntities() {
@@ -452,9 +473,9 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -452,9 +482,9 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
public boolean a(boolean flag) {
int i = this.M.size();
@ -1213,7 +1182,7 @@ index 3f73ef9..6764bef 100644
if (i > 1000) {
// CraftBukkit start - if the server has too much to process over time, try to alleviate that
if (i > 20 * 1000) {
@@ -472,8 +493,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -472,8 +502,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
break;
}
@ -1227,7 +1196,7 @@ index 3f73ef9..6764bef 100644
byte b0 = 8;
if (this.d(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) {
@@ -502,10 +526,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -502,10 +535,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
}
return !this.M.isEmpty();
@ -1241,7 +1210,7 @@ index 3f73ef9..6764bef 100644
ArrayList arraylist = null;
ChunkCoordIntPair chunkcoordintpair = chunk.l();
int i = chunkcoordintpair.x << 4;
@@ -532,6 +558,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -532,6 +567,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
}
return arraylist;
@ -1249,7 +1218,7 @@ index 3f73ef9..6764bef 100644
}
public void entityJoinedWorld(Entity entity, boolean flag) {
@@ -610,7 +637,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -610,7 +646,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
}
if (this.L == null) {
@ -1258,7 +1227,7 @@ index 3f73ef9..6764bef 100644
}
if (this.M == null) {
@@ -883,4 +910,48 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
@@ -883,4 +919,48 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
public PortalTravelAgent s() {
return this.P;
}
@ -1579,10 +1548,10 @@ index cb20066..3544aa3 100644
return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y & 0xFF, z & 0xF);
diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
new file mode 100644
index 0000000..0e04773
index 0000000..9e8b12e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
@@ -0,0 +1,27 @@
@@ -0,0 +1,25 @@
+package org.bukkit.craftbukkit;
+
+import org.bukkit.command.SimpleCommandMap;
@ -1606,8 +1575,6 @@ index 0000000..0e04773
+ server.getLogger().severe("[Spigot] You should not disable chunk-gc. Resetting period-in-ticks to 600 ticks.");
+ server.chunkGCPeriod = 600;
+ }
+
+ org.bukkit.craftbukkit.util.LightningSimulator.configure(configuration);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
@ -1717,76 +1684,6 @@ index f0e24d2..1c61830 100644
public void setCompassTarget(Location loc) {
if (getHandle().playerConnection == null) return;
diff --git a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java b/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java
index f027900..efc7889 100644
--- a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java
+++ b/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java
@@ -1,6 +1,6 @@
package org.bukkit.craftbukkit.updater;
-import com.google.gson.*;
+// import com.google.gson.*; // Spigot
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
@@ -16,7 +16,7 @@ import java.util.logging.Logger;
public class BukkitDLUpdaterService {
private static final String API_PREFIX_ARTIFACT = "/api/1.0/downloads/projects/craftbukkit/view/";
private static final String API_PREFIX_CHANNEL = "/api/1.0/downloads/channels/";
- private static final DateDeserializer dateDeserializer = new DateDeserializer();
+ // private static final DateDeserializer dateDeserializer = new DateDeserializer(); // Spigot
private final String host;
public BukkitDLUpdaterService(String host) {
@@ -47,8 +47,11 @@ public class BukkitDLUpdaterService {
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", getUserAgent());
reader = new InputStreamReader(connection.getInputStream());
- Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
- return gson.fromJson(reader, ArtifactDetails.class);
+ // Spigot start
+ // Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
+ // return gson.fromJson(reader, ArtifactDetails.class);
+ // Spigot end
+ return null;
} finally {
if (reader != null) {
reader.close();
@@ -76,10 +79,13 @@ public class BukkitDLUpdaterService {
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", getUserAgent());
reader = new InputStreamReader(connection.getInputStream());
- Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
- ArtifactDetails.ChannelDetails fromJson = gson.fromJson(reader, ArtifactDetails.ChannelDetails.class);
+ // Spigot start
+ // Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
+ // ArtifactDetails.ChannelDetails fromJson = gson.fromJson(reader, ArtifactDetails.ChannelDetails.class);
- return fromJson;
+ //return fromJson;
+ // Spigot end
+ return null;
} finally {
if (reader != null) {
reader.close();
@@ -87,7 +93,9 @@ public class BukkitDLUpdaterService {
}
}
- static class DateDeserializer implements JsonDeserializer<Date> {
+ // Spigot start
+ /*
+ static class DateDeserializer implements JsonDeserializer<Date> {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
@@ -97,5 +105,5 @@ public class BukkitDLUpdaterService {
throw new JsonParseException("Date is not formatted correctly", ex);
}
}
- }
+ }*/// Spigot end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/ExceptionHandler.java b/src/main/java/org/bukkit/craftbukkit/util/ExceptionHandler.java
new file mode 100644
index 0000000..392155e
@ -1896,196 +1793,6 @@ index 0000000..e8a7725
+ return get(LongHash.msw(key), LongHash.lsw(key));
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/LightningSimulator.java b/src/main/java/org/bukkit/craftbukkit/util/LightningSimulator.java
new file mode 100644
index 0000000..3b12b19
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/util/LightningSimulator.java
@@ -0,0 +1,184 @@
+package org.bukkit.craftbukkit.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+import net.minecraft.server.EntityLightning;
+import net.minecraft.server.EntityPlayer;
+import net.minecraft.server.MathHelper;
+import net.minecraft.server.World;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.event.weather.ThunderChangeEvent;
+
+public class LightningSimulator {
+
+ private static final int MAX_LIGHTNING_BRANCHES = 5;
+ final World world;
+ final HashMap<EntityPlayer, Integer> playerCountdown = new HashMap<EntityPlayer, Integer>();
+ Intensity stormIntensity = null;
+ boolean canceled = false;
+
+ public LightningSimulator(World world) {
+ this.world = world;
+ }
+
+ public static void configure(YamlConfiguration configuration) {
+ Bukkit.getLogger().info("--------Setting up Storm Configuration--------");
+ for (Intensity intensity : Intensity.values()) {
+ String nameFormatted = intensity.name().toLowerCase().replaceAll("_", "-");
+ intensity.chance = configuration.getInt("storm-settings." + nameFormatted + ".chance", intensity.chance);
+ intensity.baseTicks = configuration.getInt("storm-settings." + nameFormatted + ".lightning-delay", intensity.baseTicks);
+ intensity.randomTicks = configuration.getInt("storm-settings." + nameFormatted + ".lightning-random-delay", intensity.randomTicks);
+ Bukkit.getLogger().info(" Storm Type: " + nameFormatted);
+ Bukkit.getLogger().info(" Chance: " + intensity.chance);
+ Bukkit.getLogger().info(" Lightning Delay Ticks: " + intensity.baseTicks);
+ Bukkit.getLogger().info(" Lightning Random Delay Ticks: " + intensity.randomTicks);
+ }
+ Bukkit.getLogger().info("--------Finished Storm Configuration--------");
+ }
+
+ public void onTick() {
+ try {
+ updatePlayerTimers();
+ } catch (Exception e) {
+ System.out.println("Spigot failed to calculate lightning for the server");
+ System.out.println("Please report this to md_5");
+ System.out.println("Spigot Version: " + Bukkit.getBukkitVersion());
+ e.printStackTrace();
+ }
+ }
+
+ public void updatePlayerTimers() {
+ if (world.getWorld().hasStorm()) {
+ if (canceled) {
+ return;
+ }
+ if (stormIntensity == null) {
+ ThunderChangeEvent thunder = new ThunderChangeEvent(world.getWorld(), true);
+ Bukkit.getPluginManager().callEvent(thunder);
+ if (thunder.isCancelled()) {
+ canceled = true;
+ return;
+ }
+ stormIntensity = Intensity.getRandomIntensity(world.random);
+ System.out.println("Started a storm of type " + stormIntensity.name() + " in world [" + world.worldData.getName() + "]");
+ }
+ List<EntityPlayer> toStrike = new ArrayList<EntityPlayer>();
+ for (Object o : world.players) {
+ if (o instanceof EntityPlayer) {
+ EntityPlayer player = (EntityPlayer) o;
+ Integer ticksLeft = playerCountdown.get(player);
+ if (ticksLeft == null) {
+ playerCountdown.put(player, getTicksBeforeNextLightning(world.random));
+ } else if (ticksLeft == 1) {
+ //weed out dc'd players
+ if (!player.playerConnection.disconnected) {
+ toStrike.add(player);
+ playerCountdown.put(player, getTicksBeforeNextLightning(world.random));
+ }
+ } else {
+ playerCountdown.put(player, ticksLeft - 1);
+ }
+ }
+ }
+ strikePlayers(toStrike);
+ } else {
+ stormIntensity = null;
+ canceled = false;
+ }
+ }
+
+ public void strikePlayers(List<EntityPlayer> toStrike) {
+ for (EntityPlayer player : toStrike) {
+ final int posX = MathHelper.floor(player.locX);
+ final int posY = MathHelper.floor(player.locY);
+ final int posZ = MathHelper.floor(player.locZ);
+ for (int tries = 0; tries < 10; tries++) {
+ //pick a random chunk between -4, -4, to 4, 4 relative to the player's position to strike at
+ int cx = (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(5);
+ int cz = (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(5);
+
+ //pick random coords to try to strike at inside the chunk (0, 0) to (15, 15)
+ int rx = world.random.nextInt(16);
+ int rz = world.random.nextInt(16);
+
+ //pick a offset from the player's y position to strike at (-15 - +15) of their position
+ int offsetY = (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(15);
+
+ int x = cx * 16 + rx + posX;
+ int y = posY + offsetY;
+ int z = cz * 16 + rz + posZ;
+
+ if (isRainingAt(x, y, z)) {
+ int lightning = 1;
+ //30% chance of extra lightning at the spot
+ if (world.random.nextInt(10) < 3) {
+ lightning += world.random.nextInt(MAX_LIGHTNING_BRANCHES);
+ }
+ for (int strikes = 0; strikes < lightning; strikes++) {
+ double adjustX = 0.5D;
+ double adjustY = 0.0D;
+ double adjustZ = 0.5D;
+ //if there are extra strikes, tweak their placement slightly
+ if (strikes > 0) {
+ adjustX += (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(2);
+ adjustY += (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(8);
+ adjustZ += (world.random.nextBoolean() ? -1 : 1) * world.random.nextInt(2);
+ }
+ EntityLightning lightningStrike = new EntityLightning(world, x + adjustX, y + adjustY, z + adjustZ);
+ world.strikeLightning(lightningStrike);
+ }
+ //success, go to the next player
+ break;
+ }
+ }
+ }
+ }
+
+ public int getTicksBeforeNextLightning(Random rand) {
+ return stormIntensity.baseTicks + rand.nextInt(stormIntensity.randomTicks);
+ }
+
+ public boolean isRainingAt(int x, int y, int z) {
+ return world.D(x, y, z);
+ }
+}
+
+enum Intensity {
+
+ STRONG_ELECTRICAL_STORM(5, 10, 20),
+ ELECTRICAL_STORM(15, 40, 150),
+ STRONG_THUNDERSTORM(30, 60, 250),
+ THUNDERSTORM(50, 100, 500),
+ WEAK_THUNDERSTORM(75, 300, 1000),
+ RAINSTORM(100, 500, 2000);
+ int chance, baseTicks, randomTicks;
+
+ Intensity(int chance, int baseTicks, int randomTicks) {
+ this.chance = chance;
+ this.baseTicks = baseTicks;
+ this.randomTicks = randomTicks;
+ }
+
+ public static Intensity getRandomIntensity(Random rand) {
+ int r = rand.nextInt(100);
+ if (r < STRONG_ELECTRICAL_STORM.chance) {
+ return STRONG_ELECTRICAL_STORM;
+ }
+ if (r < ELECTRICAL_STORM.chance) {
+ return ELECTRICAL_STORM;
+ }
+ if (r < STRONG_THUNDERSTORM.chance) {
+ return STRONG_THUNDERSTORM;
+ }
+ if (r < THUNDERSTORM.chance) {
+ return THUNDERSTORM;
+ }
+ if (r < WEAK_THUNDERSTORM.chance) {
+ return WEAK_THUNDERSTORM;
+ }
+ return RAINSTORM;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java b/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java
index 22c96c5..3f1617d 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java
@ -2807,10 +2514,10 @@ index 0000000..9e92ea2
+ }
+}
diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml
index 61a95e3..e192700 100644
index 61a95e3..5262ae1 100644
--- a/src/main/resources/configurations/bukkit.yml
+++ b/src/main/resources/configurations/bukkit.yml
@@ -25,6 +25,61 @@ settings:
@@ -25,6 +25,36 @@ settings:
query-plugins: true
deprecated-verbose: default
shutdown-message: Server closed
@ -2844,34 +2551,9 @@ index 61a95e3..e192700 100644
+ growth-chunks-per-tick: 0
+ random-light-updates: true
+ water-creatures-per-chunk: 0
+storm-settings:
+ strong-electrical-storm:
+ chance: 5
+ lightning-delay: 10
+ lightning-random-delay: 20
+ electrical-storm:
+ chance: 15
+ lightning-delay: 40
+ lightning-random-delay: 150
+ strong-thunderstorm:
+ chance: 30
+ lightning-delay: 60
+ lightning-random-delay: 250
+ thunderstorm:
+ chance: 50
+ lightning-delay: 100
+ lightning-random-delay: 500
+ weak-thunderstorm:
+ chance: 75
+ lightning-delay: 300
+ lightning-random-delay: 1000
+ rainstorm:
+ chance: 100
+ lightning-delay: 500
+ lightning-random-delay: 2000
spawn-limits:
monsters: 70
animals: 15
--
1.8.0.3
1.8.1-rc2

View file

@ -1,4 +1,4 @@
From 771602a95edb220642e34e8e9ca3d205f6491561 Mon Sep 17 00:00:00 2001
From 41511c81fdae75c5daa04dca85051ddfa83a1b0c Mon Sep 17 00:00:00 2001
From: md_5 <md_5@bigpond.com>
Date: Sun, 23 Dec 2012 17:51:07 +1100
Subject: [PATCH] Update item merge logic
@ -8,10 +8,10 @@ Subject: [PATCH] Update item merge logic
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 263cbd3..6e9b13d 100644
index 5a01944..28ce1d7 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -927,6 +927,7 @@ public abstract class World implements IBlockAccess {
@@ -926,6 +926,7 @@ public abstract class World implements IBlockAccess {
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
// Spigot start
ItemStack item = ((EntityItem) entity).getItemStack();
@ -19,7 +19,7 @@ index 263cbd3..6e9b13d 100644
int maxSize = item.getMaxStackSize();
if (item.count < maxSize) {
double radius = this.getWorld().itemMergeRadius;
@@ -936,14 +937,12 @@ public abstract class World implements IBlockAccess {
@@ -935,14 +936,12 @@ public abstract class World implements IBlockAccess {
if (e instanceof EntityItem) {
EntityItem loopItem = (EntityItem) e;
ItemStack loopStack = loopItem.getItemStack();

View file

@ -1,4 +1,4 @@
From 369fd92f61f955ef427c3db66a650458b095f26a Mon Sep 17 00:00:00 2001
From d1e42f45b53d9af605000319340b2a160e205e35 Mon Sep 17 00:00:00 2001
From: Mike Primm <mike@primmhome.com>
Date: Wed, 16 Jan 2013 15:27:22 -0600
Subject: [PATCH] Alternate, sync-free-but-safe chunk reference cache
@ -8,10 +8,10 @@ Subject: [PATCH] Alternate, sync-free-but-safe chunk reference cache
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 6e9b13d..e28aa00 100644
index 28ce1d7..39e6110 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -297,15 +297,13 @@ public abstract class World implements IBlockAccess {
@@ -296,15 +296,13 @@ public abstract class World implements IBlockAccess {
// CraftBukkit start
public Chunk getChunkAt(int i, int j) {

View file

@ -1,4 +1,4 @@
From 2af2697578d73f9965a4578afe80aa49a0cd30ab Mon Sep 17 00:00:00 2001
From 5cfd2fa15e41201cc36959046d6a1c5ac860b265 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Thu, 10 Jan 2013 00:18:11 -0500
Subject: [PATCH] Add Custom Timings to various points
@ -210,7 +210,7 @@ index 43a24f5..7ca0acf 100644
/* CraftBukkit start - No longer needed as we have already handled it in server.dispatchServerCommand above.
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index e28aa00..3c6adb6 100644
index 39e6110..46e8d11 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -14,6 +14,7 @@ import java.util.concurrent.Callable;
@ -221,7 +221,7 @@ index e28aa00..3c6adb6 100644
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
@@ -114,6 +115,7 @@ public abstract class World implements IBlockAccess {
@@ -113,6 +114,7 @@ public abstract class World implements IBlockAccess {
final Object chunkLock = new Object();
private byte chunkTickRadius;
@ -229,7 +229,7 @@ index e28aa00..3c6adb6 100644
public CraftWorld getWorld() {
return this.world;
}
@@ -193,6 +195,7 @@ public abstract class World implements IBlockAccess {
@@ -192,6 +194,7 @@ public abstract class World implements IBlockAccess {
this.a();
this.getServer().addWorld(this.world); // CraftBukkit
@ -237,7 +237,7 @@ index e28aa00..3c6adb6 100644
}
protected abstract IChunkProvider j();
@@ -1207,6 +1210,7 @@ public abstract class World implements IBlockAccess {
@@ -1206,6 +1209,7 @@ public abstract class World implements IBlockAccess {
CrashReport crashreport;
CrashReportSystemDetails crashreportsystemdetails;
@ -245,7 +245,7 @@ index e28aa00..3c6adb6 100644
for (i = 0; i < this.i.size(); ++i) {
entity = (Entity) this.i.get(i);
// CraftBukkit start - fixed an NPE, don't process entities in chunks queued for unload
@@ -1261,7 +1265,9 @@ public abstract class World implements IBlockAccess {
@@ -1260,7 +1264,9 @@ public abstract class World implements IBlockAccess {
this.f.clear();
this.methodProfiler.c("regular");
@ -255,7 +255,7 @@ index e28aa00..3c6adb6 100644
for (i = 0; i < this.entityList.size(); ++i) {
entity = (Entity) this.entityList.get(i);
@@ -1314,7 +1320,9 @@ public abstract class World implements IBlockAccess {
@@ -1313,7 +1319,9 @@ public abstract class World implements IBlockAccess {
this.methodProfiler.b();
}
@ -265,7 +265,7 @@ index e28aa00..3c6adb6 100644
this.M = true;
Iterator iterator = this.tileEntityList.iterator();
@@ -1393,6 +1401,7 @@ public abstract class World implements IBlockAccess {
@@ -1392,6 +1400,7 @@ public abstract class World implements IBlockAccess {
this.a.clear();
}
@ -274,7 +274,7 @@ index e28aa00..3c6adb6 100644
this.methodProfiler.b();
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index faa56ac..b7ab326 100644
index 842d722..eb268ad 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -157,9 +157,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate

View file

@ -1,4 +1,4 @@
From e0396f9b7cbcb5f22183d97bd5d2e3858f27ce52 Mon Sep 17 00:00:00 2001
From f3c3312ad255c5d61121f0e4e3db437fe7bc3b19 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au>
Date: Mon, 21 Jan 2013 14:31:25 +1100
Subject: [PATCH] Better + more flexible itemstack merging
@ -40,10 +40,10 @@ index a7baa0f..5e3ac84 100644
}
} else {
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 3c6adb6..88b7f7a 100644
index 46e8d11..adb1312 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -927,30 +927,7 @@ public abstract class World implements IBlockAccess {
@@ -926,30 +926,7 @@ public abstract class World implements IBlockAccess {
} else if (entity instanceof EntityItem) {
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
// Spigot start
@ -75,7 +75,7 @@ index 3c6adb6..88b7f7a 100644
EntityExperienceOrb xp = (EntityExperienceOrb) entity;
double radius = this.getWorld().expMergeRadius;
if (radius > 0) {
@@ -965,6 +942,7 @@ public abstract class World implements IBlockAccess {
@@ -964,6 +941,7 @@ public abstract class World implements IBlockAccess {
}
}
}

View file

@ -1,4 +1,4 @@
From e25646701f0e99f9b8d25c5bab68fce7dabf37ec Mon Sep 17 00:00:00 2001
From 247b905d9553d0f0fe899e8569ce638053e0e66d Mon Sep 17 00:00:00 2001
From: lishid <lishid@gmail.com>
Date: Mon, 21 Jan 2013 16:59:04 +1100
Subject: [PATCH] Add oreobfuscator for Spigot.
@ -254,7 +254,7 @@ index 0000000..6d5a519
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
index a535b69..9f0a99a 100644
index 931356d..83988c3 100644
--- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
@@ -24,6 +24,10 @@ public class Spigot {
@ -269,10 +269,10 @@ index a535b69..9f0a99a 100644
server.getLogger().severe("[Spigot] You should not disable chunk-gc. Resetting period-in-ticks to 600 ticks.");
server.chunkGCPeriod = 600;
diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml
index c41fac1..fee0bb1 100644
index 9d6d613..6931712 100644
--- a/src/main/resources/configurations/bukkit.yml
+++ b/src/main/resources/configurations/bukkit.yml
@@ -109,3 +109,8 @@ database:
@@ -84,3 +84,8 @@ database:
driver: org.sqlite.JDBC
password: walrus
url: jdbc:sqlite:{DIR}{NAME}.db
@ -282,5 +282,5 @@ index c41fac1..fee0bb1 100644
+ disabled-worlds:
+ - world_the_end
--
1.8.0.3
1.8.1-rc2