Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-15 02:50:09 +01:00
Fix lightning - use vanilla lightning code.
Dieser Commit ist enthalten in:
Ursprung
38a24558c2
Commit
6b463d9614
@ -1,9 +1,7 @@
|
|||||||
From 90c324d6ba0cda9717efb4bd93cb21c666cc4b75 Mon Sep 17 00:00:00 2001
|
From 87a3ec2b6f68e6f87645abcc32426e4c0141e666 Mon Sep 17 00:00:00 2001
|
||||||
From: md_5 <md_5@bigpond.com>
|
From: md_5 <md_5@live.com.au>
|
||||||
Date: Sun, 30 Dec 2012 23:56:05 -0600
|
Date: Tue, 22 Jan 2013 15:56:54 +1100
|
||||||
Subject: [PATCH] Spigot Changes. This commit has undergone basic testing and
|
Subject: [PATCH] Spigot changes.
|
||||||
appears to now be safe for careful production usage. Please report any bugs
|
|
||||||
to IRC as soon as you encounter them. Long live Spigot!
|
|
||||||
|
|
||||||
---
|
---
|
||||||
.gitignore | 2 +
|
.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 +-
|
src/main/java/net/minecraft/server/PlayerList.java | 10 +-
|
||||||
.../java/net/minecraft/server/SpawnerCreature.java | 23 +-
|
.../java/net/minecraft/server/SpawnerCreature.java | 23 +-
|
||||||
.../net/minecraft/server/ThreadLoginVerifier.java | 23 +
|
.../net/minecraft/server/ThreadLoginVerifier.java | 23 +
|
||||||
src/main/java/net/minecraft/server/World.java | 202 ++++++++-
|
src/main/java/net/minecraft/server/World.java | 200 ++++++++-
|
||||||
.../java/net/minecraft/server/WorldServer.java | 133 ++++--
|
.../java/net/minecraft/server/WorldServer.java | 122 +++++-
|
||||||
.../java/org/bukkit/craftbukkit/CraftServer.java | 98 ++++-
|
.../java/org/bukkit/craftbukkit/CraftServer.java | 98 ++++-
|
||||||
.../java/org/bukkit/craftbukkit/CraftWorld.java | 76 +++-
|
.../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 +-
|
.../craftbukkit/chunkio/ChunkIOProvider.java | 2 +-
|
||||||
.../bukkit/craftbukkit/command/RestartCommand.java | 24 +
|
.../bukkit/craftbukkit/command/RestartCommand.java | 24 +
|
||||||
.../craftbukkit/command/TicksPerSecondCommand.java | 35 ++
|
.../craftbukkit/command/TicksPerSecondCommand.java | 35 ++
|
||||||
.../org/bukkit/craftbukkit/entity/CraftPlayer.java | 7 +
|
.../org/bukkit/craftbukkit/entity/CraftPlayer.java | 7 +
|
||||||
.../updater/BukkitDLUpdaterService.java | 26 +-
|
|
||||||
.../bukkit/craftbukkit/util/ExceptionHandler.java | 31 ++
|
.../bukkit/craftbukkit/util/ExceptionHandler.java | 31 ++
|
||||||
.../bukkit/craftbukkit/util/ExceptionReporter.java | 26 ++
|
.../bukkit/craftbukkit/util/ExceptionReporter.java | 26 ++
|
||||||
.../java/org/bukkit/craftbukkit/util/FlatMap.java | 34 ++
|
.../java/org/bukkit/craftbukkit/util/FlatMap.java | 34 ++
|
||||||
.../craftbukkit/util/LightningSimulator.java | 184 ++++++++
|
|
||||||
.../org/bukkit/craftbukkit/util/LongHashSet.java | 11 +-
|
.../org/bukkit/craftbukkit/util/LongHashSet.java | 11 +-
|
||||||
.../bukkit/craftbukkit/util/LongObjectHashMap.java | 5 +
|
.../bukkit/craftbukkit/util/LongObjectHashMap.java | 5 +
|
||||||
.../java/org/bukkit/craftbukkit/util/Metrics.java | 488 +++++++++++++++++++++
|
.../java/org/bukkit/craftbukkit/util/Metrics.java | 488 +++++++++++++++++++++
|
||||||
.../org/bukkit/craftbukkit/util/TimedThread.java | 37 ++
|
.../org/bukkit/craftbukkit/util/TimedThread.java | 37 ++
|
||||||
.../bukkit/craftbukkit/util/WatchdogThread.java | 88 ++++
|
.../bukkit/craftbukkit/util/WatchdogThread.java | 88 ++++
|
||||||
src/main/resources/configurations/bukkit.yml | 55 +++
|
src/main/resources/configurations/bukkit.yml | 30 ++
|
||||||
42 files changed, 1675 insertions(+), 156 deletions(-)
|
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/Spigot.java
|
||||||
create mode 100644 src/main/java/org/bukkit/craftbukkit/command/RestartCommand.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/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/ExceptionHandler.java
|
||||||
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/ExceptionReporter.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/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/Metrics.java
|
||||||
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/TimedThread.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
|
create mode 100644 src/main/java/org/bukkit/craftbukkit/util/WatchdogThread.java
|
||||||
|
|
||||||
diff --git a/.gitignore b/.gitignore
|
diff --git a/.gitignore b/.gitignore
|
||||||
index a689360..4138573 100644
|
index a689360..b97a549 100644
|
||||||
--- a/.gitignore
|
--- a/.gitignore
|
||||||
+++ b/.gitignore
|
+++ b/.gitignore
|
||||||
@@ -34,3 +34,5 @@
|
@@ -34,3 +34,5 @@
|
||||||
@ -70,6 +65,7 @@ index a689360..4138573 100644
|
|||||||
/src/main/resources/lang
|
/src/main/resources/lang
|
||||||
+
|
+
|
||||||
+/dependency-reduced-pom.xml
|
+/dependency-reduced-pom.xml
|
||||||
|
\ No newline at end of file
|
||||||
diff --git a/pom.xml b/pom.xml
|
diff --git a/pom.xml b/pom.xml
|
||||||
index f0b0bfb..bd394ae 100644
|
index f0b0bfb..bd394ae 100644
|
||||||
--- a/pom.xml
|
--- 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"));
|
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()));
|
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
|
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
|
--- a/src/main/java/net/minecraft/server/World.java
|
||||||
+++ b/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
|
// CraftBukkit start - public, longhashset
|
||||||
public boolean allowMonsters = true;
|
public boolean allowMonsters = true;
|
||||||
public boolean allowAnimals = true;
|
public boolean allowAnimals = true;
|
||||||
- protected LongHashSet chunkTickList = new LongHashSet();
|
- protected LongHashSet chunkTickList = new LongHashSet();
|
||||||
+ protected gnu.trove.map.hash.TLongShortHashMap chunkTickList; // Spigot
|
+ 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 ticksPerAnimalSpawns;
|
||||||
public long ticksPerMonsterSpawns;
|
public long ticksPerMonsterSpawns;
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -72,7 +73,20 @@ public abstract class World implements IBlockAccess {
|
@@ -72,7 +72,20 @@ public abstract class World implements IBlockAccess {
|
||||||
int[] H;
|
int[] H;
|
||||||
private List O;
|
private List O;
|
||||||
public boolean isStatic;
|
public boolean isStatic;
|
||||||
@ -752,7 +747,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
public BiomeBase getBiome(int i, int j) {
|
public BiomeBase getBiome(int i, int j) {
|
||||||
if (this.isLoaded(i, 0, j)) {
|
if (this.isLoaded(i, 0, j)) {
|
||||||
Chunk chunk = this.getChunkAtWorldCoords(i, 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 lastXAccessed = Integer.MIN_VALUE;
|
||||||
int lastZAccessed = Integer.MIN_VALUE;
|
int lastZAccessed = Integer.MIN_VALUE;
|
||||||
final Object chunkLock = new Object();
|
final Object chunkLock = new Object();
|
||||||
@ -760,7 +755,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
|
|
||||||
public CraftWorld getWorld() {
|
public CraftWorld getWorld() {
|
||||||
return this.world;
|
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
|
// Changed signature
|
||||||
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
|
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
|
||||||
this.generator = gen;
|
this.generator = gen;
|
||||||
@ -779,7 +774,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
this.N = this.random.nextInt(12000);
|
this.N = this.random.nextInt(12000);
|
||||||
this.H = new int['\u8000'];
|
this.H = new int['\u8000'];
|
||||||
this.O = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList
|
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.dataManager = idatamanager;
|
||||||
this.methodProfiler = methodprofiler;
|
this.methodProfiler = methodprofiler;
|
||||||
this.worldMaps = new WorldMapCollection(idatamanager);
|
this.worldMaps = new WorldMapCollection(idatamanager);
|
||||||
@ -788,7 +783,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
if (worldprovider != null) {
|
if (worldprovider != null) {
|
||||||
this.worldProvider = worldprovider;
|
this.worldProvider = worldprovider;
|
||||||
} else if (this.worldData != null && this.worldData.j() != 0) {
|
} 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);
|
event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason);
|
||||||
} else if (entity instanceof EntityItem) {
|
} else if (entity instanceof EntityItem) {
|
||||||
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
||||||
@ -836,7 +831,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
} else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
|
} else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
|
||||||
// Not all projectiles extend EntityProjectile, so check for Bukkit interface instead
|
// Not all projectiles extend EntityProjectile, so check for Bukkit interface instead
|
||||||
event = CraftEventFactory.callProjectileLaunchEvent(entity);
|
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 i1 = MathHelper.floor(axisalignedbb.c);
|
||||||
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);
|
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 k1 = i; k1 < j; ++k1) {
|
||||||
for (int l1 = i1; l1 < j1; ++l1) {
|
for (int l1 = i1; l1 < j1; ++l1) {
|
||||||
if (this.isLoaded(k1, 64, 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;
|
double d0 = 0.25D;
|
||||||
List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0));
|
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);
|
this.entityJoinedWorld(entity, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,15 +918,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
int i = MathHelper.floor(entity.locX);
|
int i = MathHelper.floor(entity.locX);
|
||||||
int j = MathHelper.floor(entity.locZ);
|
int j = MathHelper.floor(entity.locZ);
|
||||||
byte b0 = 32;
|
byte b0 = 32;
|
||||||
@@ -1815,6 +1942,7 @@ public abstract class World implements IBlockAccess {
|
@@ -1896,6 +2022,11 @@ 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 {
|
|
||||||
this.worldData.setWeatherDuration(1);
|
this.worldData.setWeatherDuration(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,7 +930,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
protected void z() {
|
protected void z() {
|
||||||
// this.chunkTickList.clear(); // CraftBukkit - removed
|
// this.chunkTickList.clear(); // CraftBukkit - removed
|
||||||
this.methodProfiler.a("buildList");
|
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 j;
|
||||||
int k;
|
int k;
|
||||||
|
|
||||||
@ -1000,7 +987,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
|
|
||||||
this.methodProfiler.b();
|
this.methodProfiler.b();
|
||||||
if (this.N > 0) {
|
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");
|
this.methodProfiler.a("playerCheckLight");
|
||||||
@ -1009,7 +996,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
i = this.random.nextInt(this.players.size());
|
i = this.random.nextInt(this.players.size());
|
||||||
entityhuman = (EntityHuman) this.players.get(i);
|
entityhuman = (EntityHuman) this.players.get(i);
|
||||||
j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5;
|
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();
|
chunk.o();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1026,7 +1013,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
|
|
||||||
public boolean w(int i, int j, int k) {
|
public boolean w(int i, int j, int k) {
|
||||||
return this.c(i, j, k, false);
|
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) {
|
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 i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D);
|
||||||
int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D);
|
int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D);
|
||||||
int k = MathHelper.floor((axisalignedbb.c - 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 i1 = i; i1 <= j; ++i1) {
|
||||||
for (int j1 = k; j1 <= l; ++j1) {
|
for (int j1 = k; j1 <= l; ++j1) {
|
||||||
if (this.isChunkLoaded(i1, j1)) {
|
if (this.isChunkLoaded(i1, j1)) {
|
||||||
@ -1054,7 +1041,7 @@ index e2fd0df..263cbd3 100644
|
|||||||
|
|
||||||
public List a(Class oclass, AxisAlignedBB axisalignedbb) {
|
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
|
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
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
||||||
@@ -1,5 +1,7 @@
|
@@ -1,5 +1,7 @@
|
||||||
@ -1135,25 +1122,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
// ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next();
|
// ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next();
|
||||||
int k = chunkX * 16;
|
int k = chunkX * 16;
|
||||||
int l = chunkZ * 16;
|
int l = chunkZ * 16;
|
||||||
@@ -293,16 +313,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
|
@@ -373,6 +393,14 @@ 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
|
|
||||||
|
|
||||||
if (block != null && block.isTicking()) {
|
if (block != null && block.isTicking()) {
|
||||||
++i;
|
++i;
|
||||||
@ -1168,7 +1137,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
block.b(this, k2 + k, i3 + chunksection.d(), l2 + l, this.random);
|
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);
|
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());
|
nextticklistentry.a((long) i1 + this.worldData.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1200,7 +1169,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void tickEntities() {
|
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) {
|
public boolean a(boolean flag) {
|
||||||
int i = this.M.size();
|
int i = this.M.size();
|
||||||
|
|
||||||
@ -1213,7 +1182,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
if (i > 1000) {
|
if (i > 1000) {
|
||||||
// CraftBukkit start - if the server has too much to process over time, try to alleviate that
|
// CraftBukkit start - if the server has too much to process over time, try to alleviate that
|
||||||
if (i > 20 * 1000) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1227,7 +1196,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
byte b0 = 8;
|
byte b0 = 8;
|
||||||
|
|
||||||
if (this.d(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) {
|
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();
|
return !this.M.isEmpty();
|
||||||
@ -1241,7 +1210,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
ArrayList arraylist = null;
|
ArrayList arraylist = null;
|
||||||
ChunkCoordIntPair chunkcoordintpair = chunk.l();
|
ChunkCoordIntPair chunkcoordintpair = chunk.l();
|
||||||
int i = chunkcoordintpair.x << 4;
|
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;
|
return arraylist;
|
||||||
@ -1249,7 +1218,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void entityJoinedWorld(Entity entity, boolean flag) {
|
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) {
|
if (this.L == null) {
|
||||||
@ -1258,7 +1227,7 @@ index 3f73ef9..6764bef 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.M == null) {
|
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() {
|
public PortalTravelAgent s() {
|
||||||
return this.P;
|
return this.P;
|
||||||
}
|
}
|
||||||
@ -1579,10 +1548,10 @@ index cb20066..3544aa3 100644
|
|||||||
return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y & 0xFF, z & 0xF);
|
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
|
diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..0e04773
|
index 0000000..9e8b12e
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
||||||
@@ -0,0 +1,27 @@
|
@@ -0,0 +1,25 @@
|
||||||
+package org.bukkit.craftbukkit;
|
+package org.bukkit.craftbukkit;
|
||||||
+
|
+
|
||||||
+import org.bukkit.command.SimpleCommandMap;
|
+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.getLogger().severe("[Spigot] You should not disable chunk-gc. Resetting period-in-ticks to 600 ticks.");
|
||||||
+ server.chunkGCPeriod = 600;
|
+ 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
|
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) {
|
public void setCompassTarget(Location loc) {
|
||||||
if (getHandle().playerConnection == null) return;
|
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
|
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
|
new file mode 100644
|
||||||
index 0000000..392155e
|
index 0000000..392155e
|
||||||
@ -1896,196 +1793,6 @@ index 0000000..e8a7725
|
|||||||
+ return get(LongHash.msw(key), LongHash.lsw(key));
|
+ 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
|
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
|
index 22c96c5..3f1617d 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java
|
--- 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
|
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
|
--- a/src/main/resources/configurations/bukkit.yml
|
||||||
+++ b/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
|
query-plugins: true
|
||||||
deprecated-verbose: default
|
deprecated-verbose: default
|
||||||
shutdown-message: Server closed
|
shutdown-message: Server closed
|
||||||
@ -2844,34 +2551,9 @@ index 61a95e3..e192700 100644
|
|||||||
+ growth-chunks-per-tick: 0
|
+ growth-chunks-per-tick: 0
|
||||||
+ random-light-updates: true
|
+ random-light-updates: true
|
||||||
+ water-creatures-per-chunk: 0
|
+ 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:
|
spawn-limits:
|
||||||
monsters: 70
|
monsters: 70
|
||||||
animals: 15
|
animals: 15
|
||||||
--
|
--
|
||||||
1.8.0.3
|
1.8.1-rc2
|
||||||
|
|
@ -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>
|
From: md_5 <md_5@bigpond.com>
|
||||||
Date: Sun, 23 Dec 2012 17:51:07 +1100
|
Date: Sun, 23 Dec 2012 17:51:07 +1100
|
||||||
Subject: [PATCH] Update item merge logic
|
Subject: [PATCH] Update item merge logic
|
||||||
@ -8,10 +8,10 @@ Subject: [PATCH] Update item merge logic
|
|||||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
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
|
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
|
--- a/src/main/java/net/minecraft/server/World.java
|
||||||
+++ b/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);
|
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
||||||
// Spigot start
|
// Spigot start
|
||||||
ItemStack item = ((EntityItem) entity).getItemStack();
|
ItemStack item = ((EntityItem) entity).getItemStack();
|
||||||
@ -19,7 +19,7 @@ index 263cbd3..6e9b13d 100644
|
|||||||
int maxSize = item.getMaxStackSize();
|
int maxSize = item.getMaxStackSize();
|
||||||
if (item.count < maxSize) {
|
if (item.count < maxSize) {
|
||||||
double radius = this.getWorld().itemMergeRadius;
|
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) {
|
if (e instanceof EntityItem) {
|
||||||
EntityItem loopItem = (EntityItem) e;
|
EntityItem loopItem = (EntityItem) e;
|
||||||
ItemStack loopStack = loopItem.getItemStack();
|
ItemStack loopStack = loopItem.getItemStack();
|
||||||
|
@ -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>
|
From: Mike Primm <mike@primmhome.com>
|
||||||
Date: Wed, 16 Jan 2013 15:27:22 -0600
|
Date: Wed, 16 Jan 2013 15:27:22 -0600
|
||||||
Subject: [PATCH] Alternate, sync-free-but-safe chunk reference cache
|
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(-)
|
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
|
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
|
--- a/src/main/java/net/minecraft/server/World.java
|
||||||
+++ b/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
|
// CraftBukkit start
|
||||||
public Chunk getChunkAt(int i, int j) {
|
public Chunk getChunkAt(int i, int j) {
|
||||||
|
@ -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>
|
From: Aikar <aikar@aikar.co>
|
||||||
Date: Thu, 10 Jan 2013 00:18:11 -0500
|
Date: Thu, 10 Jan 2013 00:18:11 -0500
|
||||||
Subject: [PATCH] Add Custom Timings to various points
|
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.
|
/* 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
|
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
|
--- a/src/main/java/net/minecraft/server/World.java
|
||||||
+++ b/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;
|
@@ -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.generator.ChunkGenerator;
|
||||||
import org.bukkit.craftbukkit.CraftServer;
|
import org.bukkit.craftbukkit.CraftServer;
|
||||||
import org.bukkit.craftbukkit.CraftWorld;
|
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();
|
final Object chunkLock = new Object();
|
||||||
private byte chunkTickRadius;
|
private byte chunkTickRadius;
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
public CraftWorld getWorld() {
|
public CraftWorld getWorld() {
|
||||||
return this.world;
|
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.a();
|
||||||
|
|
||||||
this.getServer().addWorld(this.world); // CraftBukkit
|
this.getServer().addWorld(this.world); // CraftBukkit
|
||||||
@ -237,7 +237,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected abstract IChunkProvider j();
|
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;
|
CrashReport crashreport;
|
||||||
CrashReportSystemDetails crashreportsystemdetails;
|
CrashReportSystemDetails crashreportsystemdetails;
|
||||||
|
|
||||||
@ -245,7 +245,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
for (i = 0; i < this.i.size(); ++i) {
|
for (i = 0; i < this.i.size(); ++i) {
|
||||||
entity = (Entity) this.i.get(i);
|
entity = (Entity) this.i.get(i);
|
||||||
// CraftBukkit start - fixed an NPE, don't process entities in chunks queued for unload
|
// 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.f.clear();
|
||||||
this.methodProfiler.c("regular");
|
this.methodProfiler.c("regular");
|
||||||
@ -255,7 +255,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
for (i = 0; i < this.entityList.size(); ++i) {
|
for (i = 0; i < this.entityList.size(); ++i) {
|
||||||
entity = (Entity) this.entityList.get(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();
|
this.methodProfiler.b();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
this.M = true;
|
this.M = true;
|
||||||
Iterator iterator = this.tileEntityList.iterator();
|
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();
|
this.a.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +274,7 @@ index e28aa00..3c6adb6 100644
|
|||||||
this.methodProfiler.b();
|
this.methodProfiler.b();
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
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
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||||
+++ b/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
|
@@ -157,9 +157,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
|
||||||
|
@ -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>
|
From: md_5 <md_5@live.com.au>
|
||||||
Date: Mon, 21 Jan 2013 14:31:25 +1100
|
Date: Mon, 21 Jan 2013 14:31:25 +1100
|
||||||
Subject: [PATCH] Better + more flexible itemstack merging
|
Subject: [PATCH] Better + more flexible itemstack merging
|
||||||
@ -40,10 +40,10 @@ index a7baa0f..5e3ac84 100644
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
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
|
--- a/src/main/java/net/minecraft/server/World.java
|
||||||
+++ b/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) {
|
} else if (entity instanceof EntityItem) {
|
||||||
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
||||||
// Spigot start
|
// Spigot start
|
||||||
@ -75,7 +75,7 @@ index 3c6adb6..88b7f7a 100644
|
|||||||
EntityExperienceOrb xp = (EntityExperienceOrb) entity;
|
EntityExperienceOrb xp = (EntityExperienceOrb) entity;
|
||||||
double radius = this.getWorld().expMergeRadius;
|
double radius = this.getWorld().expMergeRadius;
|
||||||
if (radius > 0) {
|
if (radius > 0) {
|
||||||
@@ -965,6 +942,7 @@ public abstract class World implements IBlockAccess {
|
@@ -964,6 +941,7 @@ public abstract class World implements IBlockAccess {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>
|
From: lishid <lishid@gmail.com>
|
||||||
Date: Mon, 21 Jan 2013 16:59:04 +1100
|
Date: Mon, 21 Jan 2013 16:59:04 +1100
|
||||||
Subject: [PATCH] Add oreobfuscator for Spigot.
|
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
|
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
|
--- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
||||||
@@ -24,6 +24,10 @@ public class Spigot {
|
@@ -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.getLogger().severe("[Spigot] You should not disable chunk-gc. Resetting period-in-ticks to 600 ticks.");
|
||||||
server.chunkGCPeriod = 600;
|
server.chunkGCPeriod = 600;
|
||||||
diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml
|
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
|
--- a/src/main/resources/configurations/bukkit.yml
|
||||||
+++ b/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
|
driver: org.sqlite.JDBC
|
||||||
password: walrus
|
password: walrus
|
||||||
url: jdbc:sqlite:{DIR}{NAME}.db
|
url: jdbc:sqlite:{DIR}{NAME}.db
|
||||||
@ -282,5 +282,5 @@ index c41fac1..fee0bb1 100644
|
|||||||
+ disabled-worlds:
|
+ disabled-worlds:
|
||||||
+ - world_the_end
|
+ - world_the_end
|
||||||
--
|
--
|
||||||
1.8.0.3
|
1.8.1-rc2
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren