2415 lines
79 KiB
Diff
2415 lines
79 KiB
Diff
From 52ffc1e292f4a6ead573bdfcd884c800b8c4b1a5 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Williams <jonathan@mineplex.com>
|
|
Date: Tue, 2 Sep 2014 21:54:15 -0700
|
|
Subject: [PATCH] Mineplex Patches
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 0423ee9..559693f 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -633,6 +633,10 @@ public class Chunk {
|
|
// CraftBukkit end
|
|
}
|
|
|
|
+ ChunkAddEntityEvent event = new ChunkAddEntityEvent(entity.bukkitEntity);
|
|
+ Bukkit.getServer().getPluginManager().callEvent(event);
|
|
+
|
|
+
|
|
int k = MathHelper.floor(entity.locY / 16.0D);
|
|
|
|
if (k < 0) {
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkAddEntityEvent.java b/src/main/java/net/minecraft/server/ChunkAddEntityEvent.java
|
|
new file mode 100644
|
|
index 0000000..f3fd0e1
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/ChunkAddEntityEvent.java
|
|
@@ -0,0 +1,31 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import org.bukkit.event.Cancellable;
|
|
+import org.bukkit.event.Event;
|
|
+import org.bukkit.event.HandlerList;
|
|
+
|
|
+public class ChunkAddEntityEvent extends Event
|
|
+{
|
|
+ private static final HandlerList handlers = new HandlerList();
|
|
+ private org.bukkit.entity.Entity _entity;
|
|
+
|
|
+ public ChunkAddEntityEvent(org.bukkit.entity.Entity entity)
|
|
+ {
|
|
+ _entity = entity;
|
|
+ }
|
|
+
|
|
+ public HandlerList getHandlers()
|
|
+ {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ public static HandlerList getHandlerList()
|
|
+ {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ public org.bukkit.entity.Entity GetEntity()
|
|
+ {
|
|
+ return _entity;
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkPreLoadEvent.java b/src/main/java/net/minecraft/server/ChunkPreLoadEvent.java
|
|
new file mode 100644
|
|
index 0000000..9d698f3
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/ChunkPreLoadEvent.java
|
|
@@ -0,0 +1,58 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import org.bukkit.event.Cancellable;
|
|
+import org.bukkit.event.Event;
|
|
+import org.bukkit.event.HandlerList;
|
|
+
|
|
+public class ChunkPreLoadEvent extends Event implements Cancellable
|
|
+{
|
|
+ private static final HandlerList handlers = new HandlerList();
|
|
+ private boolean _cancelled;
|
|
+ private org.bukkit.World _world;
|
|
+ private int _x;
|
|
+ private int _z;
|
|
+
|
|
+ public ChunkPreLoadEvent(org.bukkit.World world, int x, int z)
|
|
+ {
|
|
+ _world = world;
|
|
+ _x = x;
|
|
+ _z = z;
|
|
+ }
|
|
+
|
|
+ public HandlerList getHandlers()
|
|
+ {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ public static HandlerList getHandlerList()
|
|
+ {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ public org.bukkit.World GetWorld()
|
|
+ {
|
|
+ return _world;
|
|
+ }
|
|
+
|
|
+ public int GetX()
|
|
+ {
|
|
+ return _x;
|
|
+ }
|
|
+
|
|
+ public int GetZ()
|
|
+ {
|
|
+ return _z;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isCancelled()
|
|
+ {
|
|
+ return _cancelled;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setCancelled(boolean arg0)
|
|
+ {
|
|
+ _cancelled = arg0;
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
index 22330c3..6438052 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
@@ -114,10 +114,42 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
// We can only use the queue for already generated chunks
|
|
if (chunk == null && loader != null && loader.chunkExists(this.world, i, j)) {
|
|
if (runnable != null) {
|
|
- ChunkIOExecutor.queueChunkLoad(this.world, loader, this, i, j, runnable);
|
|
+ Server server = this.world.getServer();
|
|
+
|
|
+ ChunkPreLoadEvent event = new ChunkPreLoadEvent(world.getWorld(), i, j);
|
|
+ server.getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled())
|
|
+ {
|
|
+ runnable.run();
|
|
+
|
|
+ chunk = new EmptyChunk(world, i, j);
|
|
+ chunk.done = true;
|
|
+ chunks.put(LongHash.toLong(i, j), chunk);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ ChunkIOExecutor.queueChunkLoad(this.world, loader, this, i, j, runnable);
|
|
+ }
|
|
+
|
|
return null;
|
|
} else {
|
|
- chunk = ChunkIOExecutor.syncChunkLoad(this.world, loader, this, i, j);
|
|
+ Server server = this.world.getServer();
|
|
+
|
|
+ if (server != null)
|
|
+ {
|
|
+ ChunkPreLoadEvent event = new ChunkPreLoadEvent(world.getWorld(), i, j);
|
|
+ server.getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled())
|
|
+ {
|
|
+ chunk = new EmptyChunk(world, i, j);
|
|
+ chunk.done = true;
|
|
+ chunks.put(LongHash.toLong(i, j), chunk);
|
|
+ }
|
|
+ else
|
|
+ chunk = ChunkIOExecutor.syncChunkLoad(this.world, loader, this, i, j);
|
|
+ }
|
|
}
|
|
} else if (chunk == null) {
|
|
chunk = this.originalGetChunkAt(i, j);
|
|
@@ -136,6 +168,23 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j));
|
|
boolean newChunk = false;
|
|
|
|
+ Server server = this.world.getServer();
|
|
+
|
|
+ if (chunk == null && server != null)
|
|
+ {
|
|
+ ChunkPreLoadEvent event = new ChunkPreLoadEvent(world.getWorld(), i, j);
|
|
+ server.getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled())
|
|
+ {
|
|
+ chunk = new EmptyChunk(world, i, j);
|
|
+ chunk.done = true;
|
|
+ chunks.put(LongHash.toLong(i, j), chunk);
|
|
+
|
|
+ return chunk;
|
|
+ }
|
|
+ }
|
|
+
|
|
if (chunk == null) {
|
|
world.timings.syncChunkLoadTimer.startTiming(); // Spigot
|
|
chunk = this.loadChunk(i, j);
|
|
@@ -162,7 +211,6 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
chunk.addEntities();
|
|
|
|
// CraftBukkit start
|
|
- Server server = this.world.getServer();
|
|
if (server != null) {
|
|
/*
|
|
* If it's a new world, the first few chunks are generated inside
|
|
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
index 9cc0526..337e962 100644
|
|
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
@@ -78,63 +78,50 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support
|
|
this.n = new EULA(new File("eula.txt"));
|
|
// Spigot Start
|
|
- boolean eulaAgreed = Boolean.getBoolean( "com.mojang.eula.agree" );
|
|
- if ( eulaAgreed )
|
|
- {
|
|
- System.err.println( "You have used the Spigot command line EULA agreement flag." );
|
|
- System.err.println( "By using this setting you are indicating your agreement to Mojang's EULA (https://account.mojang.com/documents/minecraft_eula)." );
|
|
- System.err.println( "If you do not agree to the above EULA please stop your server and remove this flag immediately." );
|
|
- }
|
|
- // Spigot End
|
|
- if (!this.n.a() && !eulaAgreed) {
|
|
- i.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info.");
|
|
- this.n.b();
|
|
- return false;
|
|
- } else {
|
|
- if (this.N()) {
|
|
- this.c("127.0.0.1");
|
|
- } else {
|
|
- this.setOnlineMode(this.propertyManager.getBoolean("online-mode", true));
|
|
- this.c(this.propertyManager.getString("server-ip", ""));
|
|
- }
|
|
-
|
|
- this.setSpawnAnimals(this.propertyManager.getBoolean("spawn-animals", true));
|
|
- this.setSpawnNPCs(this.propertyManager.getBoolean("spawn-npcs", true));
|
|
- this.setPvP(this.propertyManager.getBoolean("pvp", true));
|
|
- this.setAllowFlight(this.propertyManager.getBoolean("allow-flight", false));
|
|
- this.setTexturePack(this.propertyManager.getString("resource-pack", ""));
|
|
- this.setMotd(this.propertyManager.getString("motd", "A Minecraft Server"));
|
|
- this.setForceGamemode(this.propertyManager.getBoolean("force-gamemode", false));
|
|
- this.setIdleTimeout(this.propertyManager.getInt("player-idle-timeout", 0));
|
|
- if (this.propertyManager.getInt("difficulty", 1) < 0) {
|
|
- this.propertyManager.setProperty("difficulty", Integer.valueOf(0));
|
|
- } else if (this.propertyManager.getInt("difficulty", 1) > 3) {
|
|
- this.propertyManager.setProperty("difficulty", Integer.valueOf(3));
|
|
- }
|
|
-
|
|
- this.generateStructures = this.propertyManager.getBoolean("generate-structures", true);
|
|
- int gamemode = this.propertyManager.getInt("gamemode", EnumGamemode.SURVIVAL.getId()); // CraftBukkit - Unique name to avoid stomping on logger
|
|
-
|
|
- this.p = WorldSettings.a(gamemode); // CraftBukkit - Use new name
|
|
- i.info("Default game type: " + this.p);
|
|
- InetAddress inetaddress = null;
|
|
-
|
|
- if (this.getServerIp().length() > 0) {
|
|
- inetaddress = InetAddress.getByName(this.getServerIp());
|
|
- }
|
|
-
|
|
- if (this.L() < 0) {
|
|
- this.setPort(this.propertyManager.getInt("server-port", 25565));
|
|
- }
|
|
- // Spigot start
|
|
- this.a((PlayerList) (new DedicatedPlayerList(this)));
|
|
- org.spigotmc.SpigotConfig.init();
|
|
- org.spigotmc.SpigotConfig.registerCommands();
|
|
- // Spigot end
|
|
-
|
|
- i.info("Generating keypair");
|
|
- this.a(MinecraftEncryption.b());
|
|
- i.info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.L());
|
|
+ if (this.N()) {
|
|
+ this.c("127.0.0.1");
|
|
+ } else {
|
|
+ this.setOnlineMode(this.propertyManager.getBoolean("online-mode", true));
|
|
+ this.c(this.propertyManager.getString("server-ip", ""));
|
|
+ }
|
|
+
|
|
+ this.setSpawnAnimals(this.propertyManager.getBoolean("spawn-animals", true));
|
|
+ this.setSpawnNPCs(this.propertyManager.getBoolean("spawn-npcs", true));
|
|
+ this.setPvP(this.propertyManager.getBoolean("pvp", true));
|
|
+ this.setAllowFlight(this.propertyManager.getBoolean("allow-flight", false));
|
|
+ this.setTexturePack(this.propertyManager.getString("resource-pack", ""));
|
|
+ this.setMotd(this.propertyManager.getString("motd", "A Minecraft Server"));
|
|
+ this.setForceGamemode(this.propertyManager.getBoolean("force-gamemode", false));
|
|
+ this.setIdleTimeout(this.propertyManager.getInt("player-idle-timeout", 0));
|
|
+ if (this.propertyManager.getInt("difficulty", 1) < 0) {
|
|
+ this.propertyManager.setProperty("difficulty", Integer.valueOf(0));
|
|
+ } else if (this.propertyManager.getInt("difficulty", 1) > 3) {
|
|
+ this.propertyManager.setProperty("difficulty", Integer.valueOf(3));
|
|
+ }
|
|
+
|
|
+ this.generateStructures = this.propertyManager.getBoolean("generate-structures", true);
|
|
+ int gamemode = this.propertyManager.getInt("gamemode", EnumGamemode.SURVIVAL.getId()); // CraftBukkit - Unique name to avoid stomping on logger
|
|
+
|
|
+ this.p = WorldSettings.a(gamemode); // CraftBukkit - Use new name
|
|
+ i.info("Default game type: " + this.p);
|
|
+ InetAddress inetaddress = null;
|
|
+
|
|
+ if (this.getServerIp().length() > 0) {
|
|
+ inetaddress = InetAddress.getByName(this.getServerIp());
|
|
+ }
|
|
+
|
|
+ if (this.L() < 0) {
|
|
+ this.setPort(this.propertyManager.getInt("server-port", 25565));
|
|
+ }
|
|
+ // Spigot start
|
|
+ this.a((PlayerList) (new DedicatedPlayerList(this)));
|
|
+ org.spigotmc.SpigotConfig.init();
|
|
+ org.spigotmc.SpigotConfig.registerCommands();
|
|
+ // Spigot end
|
|
+
|
|
+ i.info("Generating keypair");
|
|
+ this.a(MinecraftEncryption.b());
|
|
+ i.info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.L());
|
|
|
|
if (!org.spigotmc.SpigotConfig.lateBind) {
|
|
try {
|
|
@@ -147,93 +134,93 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
}
|
|
}
|
|
|
|
- // Spigot Start - Move DedicatedPlayerList up and bring plugin loading from CraftServer to here
|
|
- // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit
|
|
- server.loadPlugins();
|
|
- server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.STARTUP);
|
|
- // Spigot End
|
|
-
|
|
- if (!this.getOnlineMode()) {
|
|
- i.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
|
|
- i.warn("The server will make no attempt to authenticate usernames. Beware.");
|
|
- i.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.");
|
|
- i.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file.");
|
|
- }
|
|
-
|
|
- if (this.aE()) {
|
|
- this.getUserCache().c();
|
|
- }
|
|
-
|
|
- if (!NameReferencingFileConverter.a(this.propertyManager)) {
|
|
- return false;
|
|
- } else {
|
|
- // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up
|
|
- this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor
|
|
- long j = System.nanoTime();
|
|
-
|
|
- if (this.O() == null) {
|
|
- this.k(this.propertyManager.getString("level-name", "world"));
|
|
- }
|
|
-
|
|
- String s = this.propertyManager.getString("level-seed", "");
|
|
- String s1 = this.propertyManager.getString("level-type", "DEFAULT");
|
|
- String s2 = this.propertyManager.getString("generator-settings", "");
|
|
- long k = (new Random()).nextLong();
|
|
-
|
|
- if (s.length() > 0) {
|
|
- try {
|
|
- long l = Long.parseLong(s);
|
|
-
|
|
- if (l != 0L) {
|
|
- k = l;
|
|
- }
|
|
- } catch (NumberFormatException numberformatexception) {
|
|
- k = (long) s.hashCode();
|
|
- }
|
|
- }
|
|
-
|
|
- WorldType worldtype = WorldType.getType(s1);
|
|
-
|
|
- if (worldtype == null) {
|
|
- worldtype = WorldType.NORMAL;
|
|
- }
|
|
-
|
|
- this.at();
|
|
- this.getEnableCommandBlock();
|
|
- this.l();
|
|
- this.getSnooperEnabled();
|
|
- this.c(this.propertyManager.getInt("max-build-height", 256));
|
|
- this.c((this.getMaxBuildHeight() + 8) / 16 * 16);
|
|
- this.c(MathHelper.a(this.getMaxBuildHeight(), 64, 256));
|
|
- this.propertyManager.setProperty("max-build-height", Integer.valueOf(this.getMaxBuildHeight()));
|
|
- i.info("Preparing level \"" + this.O() + "\"");
|
|
- this.a(this.O(), this.O(), k, worldtype, s2);
|
|
- long i1 = System.nanoTime() - j;
|
|
- String s3 = String.format("%.3fs", new Object[] { Double.valueOf((double) i1 / 1.0E9D)});
|
|
-
|
|
- i.info("Done (" + s3 + ")! For help, type \"help\" or \"?\"");
|
|
- if (this.propertyManager.getBoolean("enable-query", false)) {
|
|
- i.info("Starting GS4 status listener");
|
|
- this.k = new RemoteStatusListener(this);
|
|
- this.k.a();
|
|
- }
|
|
-
|
|
- if (this.propertyManager.getBoolean("enable-rcon", false)) {
|
|
- i.info("Starting remote control listener");
|
|
- this.l = new RemoteControlListener(this);
|
|
- this.l.a();
|
|
- this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit
|
|
- }
|
|
-
|
|
- // CraftBukkit start
|
|
- if (this.server.getBukkitSpawnRadius() > -1) {
|
|
- i.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you.");
|
|
- this.propertyManager.properties.remove("spawn-protection");
|
|
- this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius());
|
|
- this.server.removeBukkitSpawnRadius();
|
|
- this.propertyManager.savePropertiesFile();
|
|
- }
|
|
- // CraftBukkit end
|
|
+ // Spigot Start - Move DedicatedPlayerList up and bring plugin loading from CraftServer to here
|
|
+ // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit
|
|
+ server.loadPlugins();
|
|
+ server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.STARTUP);
|
|
+ // Spigot End
|
|
+
|
|
+ if (!this.getOnlineMode()) {
|
|
+ i.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
|
|
+ i.warn("The server will make no attempt to authenticate usernames. Beware.");
|
|
+ i.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.");
|
|
+ i.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file.");
|
|
+ }
|
|
+
|
|
+ if (this.aE()) {
|
|
+ this.getUserCache().c();
|
|
+ }
|
|
+
|
|
+ if (!NameReferencingFileConverter.a(this.propertyManager)) {
|
|
+ return false;
|
|
+ } else {
|
|
+ // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up
|
|
+ this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor
|
|
+ long j = System.nanoTime();
|
|
+
|
|
+ if (this.O() == null) {
|
|
+ this.k(this.propertyManager.getString("level-name", "world"));
|
|
+ }
|
|
+
|
|
+ String s = this.propertyManager.getString("level-seed", "");
|
|
+ String s1 = this.propertyManager.getString("level-type", "DEFAULT");
|
|
+ String s2 = this.propertyManager.getString("generator-settings", "");
|
|
+ long k = (new Random()).nextLong();
|
|
+
|
|
+ if (s.length() > 0) {
|
|
+ try {
|
|
+ long l = Long.parseLong(s);
|
|
+
|
|
+ if (l != 0L) {
|
|
+ k = l;
|
|
+ }
|
|
+ } catch (NumberFormatException numberformatexception) {
|
|
+ k = (long) s.hashCode();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ WorldType worldtype = WorldType.getType(s1);
|
|
+
|
|
+ if (worldtype == null) {
|
|
+ worldtype = WorldType.NORMAL;
|
|
+ }
|
|
+
|
|
+ this.at();
|
|
+ this.getEnableCommandBlock();
|
|
+ this.l();
|
|
+ this.getSnooperEnabled();
|
|
+ this.c(this.propertyManager.getInt("max-build-height", 256));
|
|
+ this.c((this.getMaxBuildHeight() + 8) / 16 * 16);
|
|
+ this.c(MathHelper.a(this.getMaxBuildHeight(), 64, 256));
|
|
+ this.propertyManager.setProperty("max-build-height", Integer.valueOf(this.getMaxBuildHeight()));
|
|
+ i.info("Preparing level \"" + this.O() + "\"");
|
|
+ this.a(this.O(), this.O(), k, worldtype, s2);
|
|
+ long i1 = System.nanoTime() - j;
|
|
+ String s3 = String.format("%.3fs", new Object[] { Double.valueOf((double) i1 / 1.0E9D)});
|
|
+
|
|
+ i.info("Done (" + s3 + ")! For help, type \"help\" or \"?\"");
|
|
+ if (this.propertyManager.getBoolean("enable-query", false)) {
|
|
+ i.info("Starting GS4 status listener");
|
|
+ this.k = new RemoteStatusListener(this);
|
|
+ this.k.a();
|
|
+ }
|
|
+
|
|
+ if (this.propertyManager.getBoolean("enable-rcon", false)) {
|
|
+ i.info("Starting remote control listener");
|
|
+ this.l = new RemoteControlListener(this);
|
|
+ this.l.a();
|
|
+ this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit
|
|
+ }
|
|
+
|
|
+ // CraftBukkit start
|
|
+ if (this.server.getBukkitSpawnRadius() > -1) {
|
|
+ i.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you.");
|
|
+ this.propertyManager.properties.remove("spawn-protection");
|
|
+ this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius());
|
|
+ this.server.removeBukkitSpawnRadius();
|
|
+ this.propertyManager.savePropertiesFile();
|
|
+ }
|
|
+ // CraftBukkit end
|
|
|
|
if (org.spigotmc.SpigotConfig.lateBind) {
|
|
try {
|
|
@@ -246,7 +233,6 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
}
|
|
}
|
|
return true;
|
|
- }
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index dea5e19..9253cd4 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -123,6 +123,9 @@ public abstract class Entity {
|
|
public void inactiveTick() { }
|
|
// Spigot end
|
|
|
|
+ public boolean Silent;
|
|
+ public boolean Invisible;
|
|
+
|
|
public int getId() {
|
|
return this.id;
|
|
}
|
|
@@ -692,7 +695,9 @@ public abstract class Entity {
|
|
this.makeSound(this.H(), f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F);
|
|
}
|
|
|
|
- this.a(l, k, i1, block);
|
|
+ if (!Silent)
|
|
+ this.a(l, k, i1, block);
|
|
+
|
|
block.b(this.world, l, k, i1, this);
|
|
}
|
|
}
|
|
@@ -788,7 +793,8 @@ public abstract class Entity {
|
|
}
|
|
|
|
public void makeSound(String s, float f, float f1) {
|
|
- this.world.makeSound(this, s, f, f1);
|
|
+ if (!Silent)
|
|
+ this.world.makeSound(this, s, f, f1);
|
|
}
|
|
|
|
protected boolean g_() {
|
|
@@ -1446,8 +1452,8 @@ public abstract class Entity {
|
|
if (entity == null) {
|
|
if (this.vehicle != null) {
|
|
// CraftBukkit start
|
|
- if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) {
|
|
- VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
+ if ((this.bukkitEntity instanceof LivingEntity)) {
|
|
+ VehicleExitEvent event = new VehicleExitEvent(this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
pluginManager.callEvent(event);
|
|
|
|
if (event.isCancelled() || this.vehicle != originalVehicle) {
|
|
@@ -1464,11 +1470,11 @@ public abstract class Entity {
|
|
this.vehicle = null;
|
|
} else {
|
|
// CraftBukkit start
|
|
- if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4)) {
|
|
+ if ((this.bukkitEntity instanceof LivingEntity) && (entity instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4)) {
|
|
// It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are.
|
|
VehicleExitEvent exitEvent = null;
|
|
if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) {
|
|
- exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
+ exitEvent = new VehicleExitEvent(this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
pluginManager.callEvent(exitEvent);
|
|
|
|
if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) {
|
|
@@ -1584,6 +1590,9 @@ public abstract class Entity {
|
|
}
|
|
|
|
public void setInvisible(boolean flag) {
|
|
+ if (Invisible && !flag)
|
|
+ return;
|
|
+
|
|
this.a(5, flag);
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java
|
|
new file mode 100644
|
|
index 0000000..dcf0a2e
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/EntityBat.java
|
|
@@ -0,0 +1,260 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.util.Calendar;
|
|
+import java.util.Random;
|
|
+
|
|
+import net.minecraft.server.ChunkCoordinates;
|
|
+import net.minecraft.server.DamageSource;
|
|
+import net.minecraft.server.Entity;
|
|
+import net.minecraft.server.EntityAmbient;
|
|
+import net.minecraft.server.GenericAttributes;
|
|
+import net.minecraft.server.MathHelper;
|
|
+import net.minecraft.server.NBTTagCompound;
|
|
+import net.minecraft.server.World;
|
|
+
|
|
+public class EntityBat extends EntityAmbient
|
|
+{
|
|
+ private ChunkCoordinates h;
|
|
+
|
|
+ public boolean Vegetated = false;
|
|
+
|
|
+ public EntityBat(World paramWorld)
|
|
+ {
|
|
+ super(paramWorld);
|
|
+
|
|
+ a(0.5F, 0.9F);
|
|
+ setAsleep(true);
|
|
+ }
|
|
+
|
|
+ protected void c()
|
|
+ {
|
|
+ super.c();
|
|
+
|
|
+ this.datawatcher.a(16, new Byte((byte) 0));
|
|
+ }
|
|
+
|
|
+ protected float bf()
|
|
+ {
|
|
+ return 0.1F;
|
|
+ }
|
|
+
|
|
+ protected float bg()
|
|
+ {
|
|
+ return super.bg() * 0.95F;
|
|
+ }
|
|
+
|
|
+ protected String t()
|
|
+ {
|
|
+ if ((isAsleep()) && (this.random.nextInt(4) != 0))
|
|
+ {
|
|
+ return null;
|
|
+ }
|
|
+ return "mob.bat.idle";
|
|
+ }
|
|
+
|
|
+ protected String aT()
|
|
+ {
|
|
+ return "mob.bat.hurt";
|
|
+ }
|
|
+
|
|
+ protected String aU()
|
|
+ {
|
|
+ return "mob.bat.death";
|
|
+ }
|
|
+
|
|
+ public boolean S()
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ protected void o(Entity paramEntity)
|
|
+ {
|
|
+ }
|
|
+
|
|
+ protected void bo()
|
|
+ {
|
|
+ }
|
|
+
|
|
+ protected void aD()
|
|
+ {
|
|
+ super.aD();
|
|
+
|
|
+ getAttributeInstance(GenericAttributes.maxHealth).setValue(6.0D);
|
|
+ }
|
|
+
|
|
+ public boolean isAsleep()
|
|
+ {
|
|
+ return (this.datawatcher.getByte(16) & 0x1) != 0;
|
|
+ }
|
|
+
|
|
+ public void setAsleep(boolean paramBoolean)
|
|
+ {
|
|
+ int i = this.datawatcher.getByte(16);
|
|
+ if (paramBoolean)
|
|
+ {
|
|
+ this.datawatcher.watch(16, Byte.valueOf((byte) (i | 0x1)));
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ this.datawatcher.watch(16, Byte.valueOf((byte) (i & 0xFFFFFFFE)));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected boolean bk()
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public void h()
|
|
+ {
|
|
+ super.h();
|
|
+
|
|
+ if (Vegetated)
|
|
+ return;
|
|
+
|
|
+ if (isAsleep())
|
|
+ {
|
|
+ this.motX = (this.motY = this.motZ = 0.0D);
|
|
+ this.locY = (MathHelper.floor(this.locY) + 1.0D - this.length);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ this.motY *= 0.6000000238418579D;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected void bn()
|
|
+ {
|
|
+ super.bn();
|
|
+
|
|
+ if (Vegetated)
|
|
+ return;
|
|
+
|
|
+ if (isAsleep())
|
|
+ {
|
|
+ if (!this.world.getType(MathHelper.floor(this.locX), (int) this.locY + 1, MathHelper.floor(this.locZ)).r())
|
|
+ {
|
|
+ setAsleep(false);
|
|
+ this.world.a(null, 1015, (int) this.locX, (int) this.locY, (int) this.locZ, 0);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if (this.random.nextInt(200) == 0)
|
|
+ {
|
|
+ this.aO = this.random.nextInt(360);
|
|
+ }
|
|
+ if (this.world.findNearbyPlayer(this, 4.0D) != null)
|
|
+ {
|
|
+ setAsleep(false);
|
|
+ this.world.a(null, 1015, (int) this.locX, (int) this.locY, (int) this.locZ, 0);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if ((this.h != null) && ((!this.world.isEmpty(this.h.x, this.h.y, this.h.z)) || (this.h.y < 1)))
|
|
+ {
|
|
+ this.h = null;
|
|
+ }
|
|
+ if ((this.h == null) || (this.random.nextInt(30) == 0)
|
|
+ || (this.h.e((int) this.locX, (int) this.locY, (int) this.locZ) < 4.0F))
|
|
+ {
|
|
+ this.h = new ChunkCoordinates((int) this.locX + this.random.nextInt(7) - this.random.nextInt(7),
|
|
+ (int) this.locY + this.random.nextInt(6) - 2, (int) this.locZ + this.random.nextInt(7)
|
|
+ - this.random.nextInt(7));
|
|
+ }
|
|
+ double d1 = this.h.x + 0.5D - this.locX;
|
|
+ double d2 = this.h.y + 0.1D - this.locY;
|
|
+ double d3 = this.h.z + 0.5D - this.locZ;
|
|
+
|
|
+ this.motX += (Math.signum(d1) * 0.5D - this.motX) * 0.1000000014901161D;
|
|
+ this.motY += (Math.signum(d2) * 0.699999988079071D - this.motY) * 0.1000000014901161D;
|
|
+ this.motZ += (Math.signum(d3) * 0.5D - this.motZ) * 0.1000000014901161D;
|
|
+
|
|
+ float f1 = (float) (Math.atan2(this.motZ, this.motX) * 180.0D / 3.141592741012573D) - 90.0F;
|
|
+ float f2 = MathHelper.g(f1 - this.yaw);
|
|
+ this.be = 0.5F;
|
|
+ this.yaw += f2;
|
|
+ if ((this.random.nextInt(100) == 0)
|
|
+ && (this.world.getType(MathHelper.floor(this.locX), (int) this.locY + 1,
|
|
+ MathHelper.floor(this.locZ)).r()))
|
|
+ {
|
|
+ setAsleep(true);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected boolean g_()
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ protected void b(float paramFloat)
|
|
+ {
|
|
+ }
|
|
+
|
|
+ protected void a(double paramDouble, boolean paramBoolean)
|
|
+ {
|
|
+ }
|
|
+
|
|
+ public boolean az()
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public boolean damageEntity(DamageSource paramDamageSource, float paramFloat)
|
|
+ {
|
|
+ if (isInvulnerable())
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+ if ((!this.world.isStatic) && (isAsleep()) && !Vegetated)
|
|
+ {
|
|
+ setAsleep(false);
|
|
+ }
|
|
+ return super.damageEntity(paramDamageSource, paramFloat);
|
|
+ }
|
|
+
|
|
+ public void a(NBTTagCompound paramNBTTagCompound)
|
|
+ {
|
|
+ super.a(paramNBTTagCompound);
|
|
+
|
|
+ this.datawatcher.watch(16, Byte.valueOf(paramNBTTagCompound.getByte("BatFlags")));
|
|
+ }
|
|
+
|
|
+ public void b(NBTTagCompound paramNBTTagCompound)
|
|
+ {
|
|
+ super.b(paramNBTTagCompound);
|
|
+
|
|
+ paramNBTTagCompound.setByte("BatFlags", this.datawatcher.getByte(16));
|
|
+ }
|
|
+
|
|
+ public boolean canSpawn()
|
|
+ {
|
|
+ int i = MathHelper.floor(this.boundingBox.b);
|
|
+ if (i >= 63)
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+ int j = MathHelper.floor(this.locX);
|
|
+ int k = MathHelper.floor(this.locZ);
|
|
+
|
|
+ int m = this.world.getLightLevel(j, i, k);
|
|
+ int n = 4;
|
|
+ Calendar localCalendar = this.world.V();
|
|
+ if (((localCalendar.get(2) + 1 == 10) && (localCalendar.get(5) >= 20))
|
|
+ || ((localCalendar.get(2) + 1 == 11) && (localCalendar.get(5) <= 3)))
|
|
+ {
|
|
+ n = 7;
|
|
+ }
|
|
+ else if (this.random.nextBoolean())
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+ if (m > this.random.nextInt(n))
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+ return super.canSpawn();
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java
|
|
new file mode 100644
|
|
index 0000000..2868ffa
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/EntityBlaze.java
|
|
@@ -0,0 +1,202 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.util.Random;
|
|
+
|
|
+import net.minecraft.server.DamageSource;
|
|
+import net.minecraft.server.Entity;
|
|
+import net.minecraft.server.EntityMonster;
|
|
+import net.minecraft.server.EntitySmallFireball;
|
|
+import net.minecraft.server.GenericAttributes;
|
|
+import net.minecraft.server.Item;
|
|
+import net.minecraft.server.Items;
|
|
+import net.minecraft.server.MathHelper;
|
|
+import net.minecraft.server.World;
|
|
+
|
|
+public class EntityBlaze extends EntityMonster
|
|
+{
|
|
+ private float bp = 0.5F;
|
|
+ private int bq;
|
|
+ private int br;
|
|
+
|
|
+ public EntityBlaze(World paramWorld)
|
|
+ {
|
|
+ super(paramWorld);
|
|
+
|
|
+ this.fireProof = true;
|
|
+ this.b = 10;
|
|
+ }
|
|
+
|
|
+ protected void aD()
|
|
+ {
|
|
+ super.aD();
|
|
+ getAttributeInstance(GenericAttributes.e).setValue(6.0D);
|
|
+ }
|
|
+
|
|
+ protected void c()
|
|
+ {
|
|
+ super.c();
|
|
+
|
|
+ this.datawatcher.a(16, new Byte((byte) 0));
|
|
+ }
|
|
+
|
|
+ protected String t()
|
|
+ {
|
|
+ return "mob.blaze.breathe";
|
|
+ }
|
|
+
|
|
+ protected String aT()
|
|
+ {
|
|
+ return "mob.blaze.hit";
|
|
+ }
|
|
+
|
|
+ protected String aU()
|
|
+ {
|
|
+ return "mob.blaze.death";
|
|
+ }
|
|
+
|
|
+ public float d(float paramFloat)
|
|
+ {
|
|
+ return 1.0F;
|
|
+ }
|
|
+
|
|
+ public void e()
|
|
+ {
|
|
+ if (!this.world.isStatic)
|
|
+ {
|
|
+ if (L())
|
|
+ {
|
|
+ damageEntity(DamageSource.DROWN, 1.0F);
|
|
+ }
|
|
+ this.bq -= 1;
|
|
+ if (this.bq <= 0)
|
|
+ {
|
|
+ this.bq = 100;
|
|
+ this.bp = (0.5F + (float) this.random.nextGaussian() * 3.0F);
|
|
+ }
|
|
+ if ((bT() != null) && (bT().locY + bT().getHeadHeight() > this.locY + getHeadHeight() + this.bp))
|
|
+ {
|
|
+ this.motY += (0.300000011920929D - this.motY) * 0.300000011920929D;
|
|
+ }
|
|
+ }
|
|
+ if (this.random.nextInt(24) == 0)
|
|
+ {
|
|
+ this.world.makeSound(this.locX + 0.5D, this.locY + 0.5D, this.locZ + 0.5D, "fire.fire",
|
|
+ 1.0F + this.random.nextFloat(), this.random.nextFloat() * 0.7F + 0.3F);
|
|
+ }
|
|
+ if (!Vegetated && (!this.onGround) && (this.motY < 0.0D))
|
|
+ {
|
|
+ this.motY *= 0.6D;
|
|
+ }
|
|
+ for (int i = 0; i < 2; i++)
|
|
+ {
|
|
+ this.world.addParticle("largesmoke", this.locX + (this.random.nextDouble() - 0.5D) * this.width, this.locY
|
|
+ + this.random.nextDouble() * this.length, this.locZ + (this.random.nextDouble() - 0.5D)
|
|
+ * this.width, 0.0D, 0.0D, 0.0D);
|
|
+ }
|
|
+ super.e();
|
|
+ }
|
|
+
|
|
+ protected void a(Entity paramEntity, float paramFloat)
|
|
+ {
|
|
+ if (Vegetated)
|
|
+ return;
|
|
+
|
|
+ if ((this.attackTicks <= 0) && (paramFloat < 2.0F) && (paramEntity.boundingBox.e > this.boundingBox.b)
|
|
+ && (paramEntity.boundingBox.b < this.boundingBox.e))
|
|
+ {
|
|
+ this.attackTicks = 20;
|
|
+ n(paramEntity);
|
|
+ }
|
|
+ else if (paramFloat < 30.0F)
|
|
+ {
|
|
+ double d1 = paramEntity.locX - this.locX;
|
|
+ double d2 = paramEntity.boundingBox.b + paramEntity.length / 2.0F - (this.locY + this.length / 2.0F);
|
|
+ double d3 = paramEntity.locZ - this.locZ;
|
|
+ if (this.attackTicks == 0)
|
|
+ {
|
|
+ this.br += 1;
|
|
+ if (this.br == 1)
|
|
+ {
|
|
+ this.attackTicks = 60;
|
|
+ a(true);
|
|
+ }
|
|
+ else if (this.br <= 4)
|
|
+ {
|
|
+ this.attackTicks = 6;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ this.attackTicks = 100;
|
|
+ this.br = 0;
|
|
+ a(false);
|
|
+ }
|
|
+ if (this.br > 1)
|
|
+ {
|
|
+ float f = MathHelper.c(paramFloat) * 0.5F;
|
|
+
|
|
+ this.world.a(null, 1009, (int) this.locX, (int) this.locY, (int) this.locZ, 0);
|
|
+ for (int i = 0; i < 1; i++)
|
|
+ {
|
|
+ EntitySmallFireball localEntitySmallFireball = new EntitySmallFireball(this.world, this, d1
|
|
+ + this.random.nextGaussian() * f, d2, d3 + this.random.nextGaussian() * f);
|
|
+ localEntitySmallFireball.locY = (this.locY + this.length / 2.0F + 0.5D);
|
|
+ this.world.addEntity(localEntitySmallFireball);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ this.yaw = ((float) (Math.atan2(d3, d1) * 180.0D / 3.141592741012573D) - 90.0F);
|
|
+
|
|
+ this.bn = true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected void b(float paramFloat)
|
|
+ {
|
|
+ }
|
|
+
|
|
+ protected Item getLoot()
|
|
+ {
|
|
+ return Items.BLAZE_ROD;
|
|
+ }
|
|
+
|
|
+ public boolean isBurning()
|
|
+ {
|
|
+ return bZ();
|
|
+ }
|
|
+
|
|
+ protected void dropDeathLoot(boolean paramBoolean, int paramInt)
|
|
+ {
|
|
+ if (paramBoolean)
|
|
+ {
|
|
+ int i = this.random.nextInt(2 + paramInt);
|
|
+ for (int j = 0; j < i; j++)
|
|
+ {
|
|
+ a(Items.BLAZE_ROD, 1);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean bZ()
|
|
+ {
|
|
+ return (this.datawatcher.getByte(16) & 0x1) != 0;
|
|
+ }
|
|
+
|
|
+ public void a(boolean paramBoolean)
|
|
+ {
|
|
+ byte b = this.datawatcher.getByte(16);
|
|
+ if (paramBoolean)
|
|
+ {
|
|
+ b = (byte) (b | 0x1);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ b = (byte) (b & 0xFFFFFFFE);
|
|
+ }
|
|
+ this.datawatcher.watch(16, Byte.valueOf(b));
|
|
+ }
|
|
+
|
|
+ protected boolean j_()
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java
|
|
index 5d761aa..f64a7e5 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java
|
|
@@ -38,6 +38,8 @@ public class EntityEnderDragon extends EntityInsentient implements IComplex, IMo
|
|
public EntityEnderCrystal bC;
|
|
private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN); // CraftBukkit - reusable source for CraftTNTPrimed.getSource()
|
|
|
|
+ public boolean Vegetated = false;
|
|
+
|
|
public EntityEnderDragon(World world) {
|
|
super(world);
|
|
this.children = new EntityComplexPart[] { this.bq = new EntityComplexPart(this, "head", 6.0F, 6.0F), this.br = new EntityComplexPart(this, "body", 8.0F, 8.0F), this.bs = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bt = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bu = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bv = new EntityComplexPart(this, "wing", 4.0F, 4.0F), this.bw = new EntityComplexPart(this, "wing", 4.0F, 4.0F)};
|
|
@@ -163,7 +165,7 @@ public class EntityEnderDragon extends EntityInsentient implements IComplex, IMo
|
|
this.bm += this.random.nextGaussian() * 2.0D;
|
|
}
|
|
|
|
- if (this.bz || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.F) {
|
|
+ if (!Vegetated && this.bz || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.F) {
|
|
this.bQ();
|
|
}
|
|
|
|
@@ -251,7 +253,7 @@ public class EntityEnderDragon extends EntityInsentient implements IComplex, IMo
|
|
this.bv.setPositionRotation(this.locX + (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ + (double) (f11 * 4.5F), 0.0F, 0.0F);
|
|
this.bw.h();
|
|
this.bw.setPositionRotation(this.locX - (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ - (double) (f11 * 4.5F), 0.0F, 0.0F);
|
|
- if (!this.world.isStatic && this.hurtTicks == 0) {
|
|
+ if (!this.world.isStatic && this.hurtTicks == 0 && !ghost) {
|
|
this.a(this.world.getEntities(this, this.bv.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D)));
|
|
this.a(this.world.getEntities(this, this.bw.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D)));
|
|
this.b(this.world.getEntities(this, this.bq.boundingBox.grow(1.0D, 1.0D, 1.0D)));
|
|
@@ -369,6 +371,19 @@ public class EntityEnderDragon extends EntityInsentient implements IComplex, IMo
|
|
}
|
|
}
|
|
|
|
+ public void setTargetBlock(int x, int y, int z)
|
|
+ {
|
|
+ this.h = x;
|
|
+ this.i = y;
|
|
+ this.bm = z;
|
|
+ this.bD = null;
|
|
+ }
|
|
+
|
|
+ public void setTargetEntity(Entity entity)
|
|
+ {
|
|
+ this.bD = entity;
|
|
+ }
|
|
+
|
|
private void bQ() {
|
|
this.bz = false;
|
|
if (this.random.nextInt(2) == 0 && !this.world.players.isEmpty()) {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
index 87afc9c..b9a2b3a 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
@@ -52,6 +52,9 @@ public class EntityEnderman extends EntityMonster {
|
|
}
|
|
|
|
protected Entity findTarget() {
|
|
+ if (Vegetated)
|
|
+ return null;
|
|
+
|
|
EntityHuman entityhuman = this.world.findNearbyVulnerablePlayer(this, 64.0D);
|
|
|
|
if (entityhuman != null) {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
index df602bd..a8ad2c4 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
@@ -17,6 +17,8 @@ public class EntityFallingBlock extends Entity {
|
|
private float fallHurtAmount;
|
|
public NBTTagCompound tileEntityData;
|
|
|
|
+ public boolean spectating;
|
|
+
|
|
public EntityFallingBlock(World world) {
|
|
super(world);
|
|
this.dropItem = true;
|
|
@@ -54,7 +56,15 @@ public class EntityFallingBlock extends Entity {
|
|
protected void c() {}
|
|
|
|
public boolean R() {
|
|
- return !this.dead;
|
|
+ return !this.dead && !spectating;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean damageEntity(DamageSource damagesource, float f)
|
|
+ {
|
|
+ CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f);
|
|
+
|
|
+ return true;
|
|
}
|
|
|
|
public void h() {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java
|
|
index e9f6236..8253ec9 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityHorse.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityHorse.java
|
|
@@ -115,6 +115,9 @@ public class EntityHorse extends EntityAnimal implements IInventoryListener {
|
|
private void b(int i, boolean flag) {
|
|
int j = this.datawatcher.getInt(16);
|
|
|
|
+ if (Vegetated)
|
|
+ return;
|
|
+
|
|
if (flag) {
|
|
this.datawatcher.watch(16, Integer.valueOf(j | i));
|
|
} else {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
|
|
index 5bb7295..595f15f 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
|
@@ -124,7 +124,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
|
if (this.f != null) {
|
|
ItemStack itemstack = this.inventory.getItemInHand();
|
|
|
|
- if (itemstack == this.f) {
|
|
+ if (ItemStack.equals(itemstack, this.f)) {
|
|
if (this.g <= 25 && this.g % 4 == 0) {
|
|
this.c(itemstack, 5);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
|
|
index 617f7d4..8781438 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
|
|
@@ -34,6 +34,10 @@ public abstract class EntityInsentient extends EntityLiving {
|
|
private Entity bw;
|
|
private NBTTagCompound bx;
|
|
|
|
+ public boolean Vegetated;
|
|
+ public boolean BreakLeash = true;
|
|
+ public boolean PullWhileLeashed = true;
|
|
+
|
|
public EntityInsentient(World world) {
|
|
super(world);
|
|
this.goalSelector = new PathfinderGoalSelector(world != null && world.methodProfiler != null ? world.methodProfiler : null);
|
|
@@ -114,7 +118,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
|
public void C() {
|
|
super.C();
|
|
this.world.methodProfiler.a("mobBaseTick");
|
|
- if (this.isAlive() && this.random.nextInt(1000) < this.a_++) {
|
|
+ if (this.isAlive() && !Silent && this.random.nextInt(1000) < this.a_++) {
|
|
this.a_ = -this.q();
|
|
this.r();
|
|
}
|
|
@@ -774,7 +778,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
|
}
|
|
|
|
public final boolean c(EntityHuman entityhuman) {
|
|
- if (this.bN() && this.getLeashHolder() == entityhuman) {
|
|
+ if (this.bN() && this.getLeashHolder() == entityhuman && BreakLeash) {
|
|
// CraftBukkit start - fire PlayerUnleashEntityEvent
|
|
if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) {
|
|
((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder()));
|
|
@@ -834,7 +838,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
|
}
|
|
|
|
public void unleash(boolean flag, boolean flag1) {
|
|
- if (this.bv) {
|
|
+ if (this.bv && BreakLeash) {
|
|
this.bv = false;
|
|
this.bw = null;
|
|
if (!this.world.isStatic && flag1) {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
index 546b952..881b87f 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -91,6 +91,7 @@ public abstract class EntityLiving extends Entity {
|
|
++this.aU; // Above all the floats
|
|
}
|
|
// Spigot end
|
|
+ public boolean ghost;
|
|
|
|
public EntityLiving(World world) {
|
|
super(world);
|
|
@@ -1699,7 +1700,7 @@ public abstract class EntityLiving extends Entity {
|
|
}
|
|
|
|
public boolean S() {
|
|
- return !this.dead;
|
|
+ return !ghost && !this.dead;
|
|
}
|
|
|
|
public float getHeadHeight() {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
index 6e80242..7eb8f94 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -71,7 +71,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
@Override
|
|
public boolean R()
|
|
{
|
|
- return this.collidesWithEntities && super.R(); // (first !this.isDead near bottom of EntityLiving)
|
|
+ return !spectating && this.collidesWithEntities && super.R(); // (first !this.isDead near bottom of EntityLiving)
|
|
}
|
|
|
|
@Override
|
|
@@ -81,6 +81,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
}
|
|
// Spigot end
|
|
|
|
+ public boolean spectating; // Mineplex
|
|
+
|
|
public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
|
|
super(worldserver, gameprofile);
|
|
playerinteractmanager.player = this;
|
|
diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java
|
|
index 65cd24d..60423f2 100644
|
|
--- a/src/main/java/net/minecraft/server/EntitySlime.java
|
|
+++ b/src/main/java/net/minecraft/server/EntitySlime.java
|
|
@@ -109,6 +109,10 @@ public class EntitySlime extends EntityInsentient implements IMonster {
|
|
|
|
protected void bq() {
|
|
this.w();
|
|
+
|
|
+ if (Vegetated)
|
|
+ return;
|
|
+
|
|
// CraftBukkit start
|
|
Entity entityhuman = this.world.findNearbyVulnerablePlayer(this, 16.0D); // EntityHuman -> Entity
|
|
EntityTargetEvent event = null;
|
|
diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
index 2214660..0905078 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
@@ -9,6 +9,8 @@ public class EntityTNTPrimed extends Entity {
|
|
public float yield = 4; // CraftBukkit - add field
|
|
public boolean isIncendiary = false; // CraftBukkit - add field
|
|
|
|
+ public boolean spectating = false;
|
|
+
|
|
public EntityTNTPrimed(World world) {
|
|
super(world);
|
|
this.k = true;
|
|
@@ -38,7 +40,7 @@ public class EntityTNTPrimed extends Entity {
|
|
}
|
|
|
|
public boolean R() {
|
|
- return !this.dead;
|
|
+ return !this.dead && !spectating;
|
|
}
|
|
|
|
public void h() {
|
|
diff --git a/src/main/java/net/minecraft/server/IPacketVerifier.java b/src/main/java/net/minecraft/server/IPacketVerifier.java
|
|
new file mode 100644
|
|
index 0000000..4a61c32
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/IPacketVerifier.java
|
|
@@ -0,0 +1,6 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public interface IPacketVerifier
|
|
+{
|
|
+ boolean verify(Packet packet);
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java b/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java
|
|
index 43df03a..5e34263 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java
|
|
@@ -2,7 +2,7 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayInCloseWindow extends Packet {
|
|
|
|
- private int a;
|
|
+ public int a;
|
|
|
|
public PacketPlayInCloseWindow() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutAnimation.java b/src/main/java/net/minecraft/server/PacketPlayOutAnimation.java
|
|
new file mode 100644
|
|
index 0000000..72eba15
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutAnimation.java
|
|
@@ -0,0 +1,42 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public class PacketPlayOutAnimation extends Packet
|
|
+{
|
|
+ public int a;
|
|
+ public int b;
|
|
+
|
|
+ public PacketPlayOutAnimation() {}
|
|
+
|
|
+ public PacketPlayOutAnimation(Entity paramEntity, int paramInt)
|
|
+ {
|
|
+ this.a = paramEntity.getId();
|
|
+ this.b = paramInt;
|
|
+ }
|
|
+
|
|
+ public void a(PacketDataSerializer paramPacketDataSerializer)
|
|
+ {
|
|
+ this.a = paramPacketDataSerializer.a();
|
|
+ this.b = paramPacketDataSerializer.readUnsignedByte();
|
|
+ }
|
|
+
|
|
+ public void b(PacketDataSerializer paramPacketDataSerializer)
|
|
+ {
|
|
+ paramPacketDataSerializer.b(this.a);
|
|
+ paramPacketDataSerializer.writeByte(this.b);
|
|
+ }
|
|
+
|
|
+ public void a(PacketPlayOutListener paramPacketPlayOutListener)
|
|
+ {
|
|
+ paramPacketPlayOutListener.a(this);
|
|
+ }
|
|
+
|
|
+ public String b()
|
|
+ {
|
|
+ return String.format("id=%d, type=%d", new Object[] { Integer.valueOf(this.a), Integer.valueOf(this.b) });
|
|
+ }
|
|
+
|
|
+@Override
|
|
+public void handle(PacketListener arg0)
|
|
+{
|
|
+}
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutAttachEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutAttachEntity.java
|
|
new file mode 100644
|
|
index 0000000..c182fae
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutAttachEntity.java
|
|
@@ -0,0 +1,41 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public class PacketPlayOutAttachEntity extends Packet
|
|
+{
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+
|
|
+ public PacketPlayOutAttachEntity() {}
|
|
+
|
|
+ public PacketPlayOutAttachEntity(int paramInt, Entity paramEntity1, Entity paramEntity2)
|
|
+ {
|
|
+ this.a = paramInt;
|
|
+ this.b = paramEntity1.getId();
|
|
+ this.c = (paramEntity2 != null ? paramEntity2.getId() : -1);
|
|
+ }
|
|
+
|
|
+ public void a(PacketDataSerializer paramPacketDataSerializer)
|
|
+ {
|
|
+ this.b = paramPacketDataSerializer.readInt();
|
|
+ this.c = paramPacketDataSerializer.readInt();
|
|
+ this.a = paramPacketDataSerializer.readUnsignedByte();
|
|
+ }
|
|
+
|
|
+ public void b(PacketDataSerializer paramPacketDataSerializer)
|
|
+ {
|
|
+ paramPacketDataSerializer.writeInt(this.b);
|
|
+ paramPacketDataSerializer.writeInt(this.c);
|
|
+ paramPacketDataSerializer.writeByte(this.a);
|
|
+ }
|
|
+
|
|
+ public void a(PacketPlayOutListener paramPacketPlayOutListener)
|
|
+ {
|
|
+ paramPacketPlayOutListener.a(this);
|
|
+ }
|
|
+
|
|
+@Override
|
|
+public void handle(PacketListener arg0)
|
|
+{
|
|
+}
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
|
|
index 749b32d..be48529 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
|
|
@@ -2,13 +2,13 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayOutEntity extends Packet {
|
|
|
|
- protected int a;
|
|
- protected byte b;
|
|
- protected byte c;
|
|
- protected byte d;
|
|
- protected byte e;
|
|
- protected byte f;
|
|
- protected boolean g;
|
|
+ public int a;
|
|
+ public byte b;
|
|
+ public byte c;
|
|
+ public byte d;
|
|
+ public byte e;
|
|
+ public byte f;
|
|
+ public boolean g;
|
|
|
|
public PacketPlayOutEntity() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntityEquipment.java b/src/main/java/net/minecraft/server/PacketPlayOutEntityEquipment.java
|
|
index 1ca4f08..d5376f4 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntityEquipment.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntityEquipment.java
|
|
@@ -2,9 +2,9 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayOutEntityEquipment extends Packet {
|
|
|
|
- private int a;
|
|
- private int b;
|
|
- private ItemStack c;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public ItemStack c;
|
|
|
|
public PacketPlayOutEntityEquipment() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java b/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java
|
|
index c937f59..06e933f 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java
|
|
@@ -4,8 +4,8 @@ import java.util.List;
|
|
|
|
public class PacketPlayOutEntityMetadata extends Packet {
|
|
|
|
- private int a;
|
|
- private List b;
|
|
+ public int a;
|
|
+ public List b;
|
|
|
|
public PacketPlayOutEntityMetadata() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntityTeleport.java b/src/main/java/net/minecraft/server/PacketPlayOutEntityTeleport.java
|
|
index 87260d5..a499083 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntityTeleport.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntityTeleport.java
|
|
@@ -2,12 +2,12 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayOutEntityTeleport extends Packet {
|
|
|
|
- private int a;
|
|
- private int b;
|
|
- private int c;
|
|
- private int d;
|
|
- private byte e;
|
|
- private byte f;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ public byte e;
|
|
+ public byte f;
|
|
private boolean onGround; // Spigot - protocol patch
|
|
|
|
public PacketPlayOutEntityTeleport() {}
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntityVelocity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntityVelocity.java
|
|
index 170f27f..d43f5d8 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntityVelocity.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntityVelocity.java
|
|
@@ -2,10 +2,10 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayOutEntityVelocity extends Packet {
|
|
|
|
- private int a;
|
|
- private int b;
|
|
- private int c;
|
|
- private int d;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
|
|
public PacketPlayOutEntityVelocity() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java
|
|
index 80857c9..7e06d42 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java
|
|
@@ -11,16 +11,16 @@ import java.io.IOException; // CraftBukkit
|
|
|
|
public class PacketPlayOutNamedEntitySpawn extends Packet {
|
|
|
|
- private int a;
|
|
- private GameProfile b;
|
|
- private int c;
|
|
- private int d;
|
|
- private int e;
|
|
- private byte f;
|
|
- private byte g;
|
|
- private int h;
|
|
- private DataWatcher i;
|
|
- private List j;
|
|
+ public int a;
|
|
+ public GameProfile b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ public int e;
|
|
+ public byte f;
|
|
+ public byte g;
|
|
+ public int h;
|
|
+ public DataWatcher i;
|
|
+ public List j;
|
|
|
|
public PacketPlayOutNamedEntitySpawn() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutPlayerInfo.java b/src/main/java/net/minecraft/server/PacketPlayOutPlayerInfo.java
|
|
index adb8e8f..d324bd7 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutPlayerInfo.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutPlayerInfo.java
|
|
@@ -9,19 +9,19 @@ import org.bukkit.craftbukkit.util.CraftChatMessage;
|
|
|
|
public class PacketPlayOutPlayerInfo extends Packet {
|
|
|
|
- private static final int ADD_PLAYER = 0;
|
|
- private static final int UPDATE_GAMEMODE = 1;
|
|
- private static final int UPDATE_LATENCY = 2;
|
|
- private static final int UPDATE_DISPLAY_NAME = 3;
|
|
- private static final int REMOVE_PLAYER = 4;
|
|
+ public static final int ADD_PLAYER = 0;
|
|
+ public static final int UPDATE_GAMEMODE = 1;
|
|
+ public static final int UPDATE_LATENCY = 2;
|
|
+ public static final int UPDATE_DISPLAY_NAME = 3;
|
|
+ public static final int REMOVE_PLAYER = 4;
|
|
|
|
- private int action;
|
|
+ public int action;
|
|
// private int length; We don't batch (yet)
|
|
- private GameProfile player;
|
|
+ public GameProfile player;
|
|
|
|
- private int gamemode;
|
|
- private int ping;
|
|
- private String username;
|
|
+ public int gamemode;
|
|
+ public int ping;
|
|
+ public String username;
|
|
|
|
public PacketPlayOutPlayerInfo() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntity.java
|
|
index dcf1204..37b685c 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntity.java
|
|
@@ -2,17 +2,17 @@ package net.minecraft.server;
|
|
|
|
public class PacketPlayOutSpawnEntity extends Packet {
|
|
|
|
- private int a;
|
|
- private int b;
|
|
- private int c;
|
|
- private int d;
|
|
- private int e;
|
|
- private int f;
|
|
- private int g;
|
|
- private int h;
|
|
- private int i;
|
|
- private int j;
|
|
- private int k;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ public int e;
|
|
+ public int f;
|
|
+ public int g;
|
|
+ public int h;
|
|
+ public int i;
|
|
+ public int j;
|
|
+ public int k;
|
|
|
|
public PacketPlayOutSpawnEntity() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java b/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java
|
|
index 98b4d97..0edd03a 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java
|
|
@@ -4,19 +4,19 @@ import java.util.List;
|
|
|
|
public class PacketPlayOutSpawnEntityLiving extends Packet {
|
|
|
|
- private int a;
|
|
- private int b;
|
|
- private int c;
|
|
- private int d;
|
|
- private int e;
|
|
- private int f;
|
|
- private int g;
|
|
- private int h;
|
|
- private byte i;
|
|
- private byte j;
|
|
- private byte k;
|
|
- private DataWatcher l;
|
|
- private List m;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ public int e;
|
|
+ public int f;
|
|
+ public int g;
|
|
+ public int h;
|
|
+ public byte i;
|
|
+ public byte j;
|
|
+ public byte k;
|
|
+ public DataWatcher l;
|
|
+ public List m;
|
|
|
|
public PacketPlayOutSpawnEntityLiving() {}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketProcessor.java b/src/main/java/net/minecraft/server/PacketProcessor.java
|
|
new file mode 100644
|
|
index 0000000..533ebfc
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/PacketProcessor.java
|
|
@@ -0,0 +1,44 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.util.ArrayList;
|
|
+import java.util.List;
|
|
+
|
|
+import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener;
|
|
+
|
|
+public class PacketProcessor
|
|
+{
|
|
+ private List<IPacketVerifier> _packetVerifiers;
|
|
+
|
|
+ public PacketProcessor()
|
|
+ {
|
|
+ _packetVerifiers = new ArrayList<IPacketVerifier>();
|
|
+ }
|
|
+
|
|
+ public void addPacketVerifier(IPacketVerifier verifier)
|
|
+ {
|
|
+ _packetVerifiers.add(verifier);
|
|
+ }
|
|
+
|
|
+ public void processPacket(Packet packet, NetworkManager networkManager)
|
|
+ {
|
|
+ boolean addDefaultPacket = true;
|
|
+
|
|
+ for (IPacketVerifier verifier : _packetVerifiers)
|
|
+ {
|
|
+ if (!verifier.verify(packet))
|
|
+ {
|
|
+ addDefaultPacket = false;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (addDefaultPacket)
|
|
+ {
|
|
+ networkManager.handle(packet, new GenericFutureListener[0]);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void clearVerifiers()
|
|
+ {
|
|
+ _packetVerifiers.clear();
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
index 10faa8c..6aa0018 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
@@ -81,6 +81,8 @@ public class PlayerConnection implements PacketPlayInListener {
|
|
public boolean checkMovement = true; // CraftBukkit - private -> public
|
|
private boolean processedDisconnect; // CraftBukkit - added
|
|
|
|
+ public PacketProcessor PacketVerifier;
|
|
+
|
|
public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) {
|
|
this.minecraftServer = minecraftserver;
|
|
this.networkManager = networkmanager;
|
|
@@ -88,6 +90,8 @@ public class PlayerConnection implements PacketPlayInListener {
|
|
this.player = entityplayer;
|
|
entityplayer.playerConnection = this;
|
|
|
|
+ PacketVerifier = new PacketProcessor();
|
|
+
|
|
// CraftBukkit start - add fields and methods
|
|
this.server = minecraftserver.server;
|
|
}
|
|
@@ -800,7 +804,7 @@ public class PlayerConnection implements PacketPlayInListener {
|
|
// CraftBukkit end
|
|
|
|
try {
|
|
- this.networkManager.handle(packet, new GenericFutureListener[0]);
|
|
+ PacketVerifier.processPacket(packet, this.networkManager);
|
|
} catch (Throwable throwable) {
|
|
CrashReport crashreport = CrashReport.a(throwable, "Sending packet");
|
|
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Packet being sent");
|
|
@@ -1252,9 +1256,12 @@ public class PlayerConnection implements PacketPlayInListener {
|
|
public void a(PacketPlayInCloseWindow packetplayinclosewindow) {
|
|
if (this.player.dead) return; // CraftBukkit
|
|
|
|
- CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit
|
|
+ if (packetplayinclosewindow.a == player.activeContainer.windowId)
|
|
+ {
|
|
+ CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit
|
|
|
|
- this.player.m();
|
|
+ this.player.m();
|
|
+ }
|
|
}
|
|
|
|
public void a(PacketPlayInWindowClick packetplayinwindowclick) {
|
|
diff --git a/src/main/java/net/minecraft/server/QueuedPacket.java b/src/main/java/net/minecraft/server/QueuedPacket.java
|
|
index fdebf9d..f1c3730 100644
|
|
--- a/src/main/java/net/minecraft/server/QueuedPacket.java
|
|
+++ b/src/main/java/net/minecraft/server/QueuedPacket.java
|
|
@@ -3,7 +3,7 @@ package net.minecraft.server;
|
|
import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener;
|
|
|
|
// CraftBukkit - imported class because the methods are package private
|
|
-class QueuedPacket {
|
|
+public class QueuedPacket {
|
|
|
|
private final Packet a;
|
|
private final GenericFutureListener[] b;
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 7a547da..5a42240 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -145,7 +145,7 @@ public abstract class World implements IBlockAccess {
|
|
}
|
|
triggerHoppersList.clear();
|
|
}
|
|
-
|
|
+
|
|
// Helper method for altHopperTicking. Updates chests at the specified location,
|
|
// accounting for double chests. Updating the chest will update adjacent hoppers.
|
|
public void updateChestAndHoppers(int a, int b, int c) {
|
|
@@ -200,6 +200,8 @@ public abstract class World implements IBlockAccess {
|
|
|
|
public final SpigotTimings.WorldTimingsHandler timings; // Spigot
|
|
|
|
+ private Entity _startEntity;
|
|
+
|
|
public CraftWorld getWorld() {
|
|
return this.world;
|
|
}
|
|
@@ -1661,13 +1663,32 @@ public abstract class World implements IBlockAccess {
|
|
|
|
this.methodProfiler.b();
|
|
if (flag && entity.ag && entity.passenger != null) {
|
|
- if (!entity.passenger.dead && entity.passenger.vehicle == entity) {
|
|
- this.playerJoinedWorld(entity.passenger);
|
|
- } else {
|
|
- entity.passenger.vehicle = null;
|
|
- entity.passenger = null;
|
|
- }
|
|
- }
|
|
+ if (!entity.passenger.dead && entity.passenger.vehicle == entity) {
|
|
+ if (_startEntity == null)
|
|
+ _startEntity = entity;
|
|
+
|
|
+ this.playerJoinedWorld(entity.passenger);
|
|
+ }
|
|
+ else if (entity == _startEntity) {
|
|
+ for (StackTraceElement element : Thread.currentThread().getStackTrace())
|
|
+ {
|
|
+ System.out.println(element);
|
|
+ }
|
|
+
|
|
+ entity.passenger.vehicle = null;
|
|
+ entity.passenger = null;
|
|
+ _startEntity = null;
|
|
+ }
|
|
+ else {
|
|
+ entity.passenger.vehicle = null;
|
|
+ entity.passenger = null;
|
|
+ _startEntity = null;
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ _startEntity = null;
|
|
+ }
|
|
+
|
|
entity.tickTimer.stopTiming(); // Spigot
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index ea786ae..20ab405 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -1062,9 +1062,9 @@ public class CraftWorld implements World {
|
|
( (EntityOcelot) entity ).spawnBonus = false;
|
|
}
|
|
// Spigot end
|
|
- if (entity instanceof EntityInsentient) {
|
|
- ((EntityInsentient) entity).prepare((GroupDataEntity) null);
|
|
- }
|
|
+ //if (entity instanceof EntityInsentient) {
|
|
+ // ((EntityInsentient) entity).prepare((GroupDataEntity) null);
|
|
+ //}
|
|
|
|
world.addEntity(entity, reason);
|
|
return (T) entity.getBukkitEntity();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
|
|
index 0c4976d..28ab76a 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
|
@@ -49,25 +49,6 @@ public class Main {
|
|
+ "*** Any bug reports not running the very latest versions of these softwares will be ignored ***\n\n" );
|
|
|
|
Enumeration<URL> resources = Main.class.getClassLoader().getResources( "META-INF/MANIFEST.MF" );
|
|
- while ( resources.hasMoreElements() )
|
|
- {
|
|
- Manifest manifest = new Manifest( resources.nextElement().openStream() );
|
|
- String ts = manifest.getMainAttributes().getValue( "Timestamp" );
|
|
- if ( ts != null )
|
|
- {
|
|
- Date buildDate = new SimpleDateFormat( "yyyyMMdd-hhmm" ).parse( ts );
|
|
-
|
|
- Calendar cal = Calendar.getInstance();
|
|
- cal.add( Calendar.DAY_OF_YEAR, -2 );
|
|
- if ( buildDate.before(cal.getTime() ) )
|
|
- {
|
|
- System.err.println( "WARNING: This build is more than 2 days old and there are likely updates available!" );
|
|
- System.err.println( "You will get no support with this build unless you update from http://ci.md-5.net/job/Spigot/" );
|
|
- System.err.println( "The server will start in 10 seconds!" );
|
|
- Thread.sleep( TimeUnit.SECONDS.toMillis( 10 ) );
|
|
- }
|
|
- }
|
|
- }
|
|
// Spigot End
|
|
// Todo: Installation script
|
|
OptionParser parser = new OptionParser() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 35f2bfa..8a6ca55 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -890,11 +890,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
}
|
|
}
|
|
|
|
- public void hidePlayer(Player player) {
|
|
+ public void hidePlayer(Player player) {
|
|
+ hidePlayer(player, false, true);
|
|
+ }
|
|
+
|
|
+ public void hidePlayer(Player player, boolean override, boolean hideList) {
|
|
Validate.notNull(player, "hidden player cannot be null");
|
|
if (getHandle().playerConnection == null) return;
|
|
if (equals(player)) return;
|
|
- if (hiddenPlayers.contains(player.getUniqueId())) return;
|
|
+ if (!override && hiddenPlayers.contains(player.getUniqueId())) return;
|
|
hiddenPlayers.add(player.getUniqueId());
|
|
|
|
//remove this player from the hidden player's EntityTrackerEntry
|
|
@@ -906,6 +910,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
}
|
|
|
|
//remove the hidden player from this player user list
|
|
+ if (hideList)
|
|
getHandle().playerConnection.sendPacket(PacketPlayOutPlayerInfo.removePlayer( ( (CraftPlayer) player ).getHandle ())); // Spigot - protocol patch
|
|
}
|
|
|
|
@@ -1321,17 +1326,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
}
|
|
|
|
@Override
|
|
- public boolean getCollidesWithEntities()
|
|
- {
|
|
- return getHandle().collidesWithEntities;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setCollidesWithEntities(boolean collides)
|
|
- {
|
|
- getHandle().collidesWithEntities = collides;
|
|
- getHandle().k = collides; // First boolean of Entity
|
|
- }
|
|
+ public boolean getCollidesWithEntities()
|
|
+ {
|
|
+ return !getHandle().spectating;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setCollidesWithEntities(boolean collides)
|
|
+ {
|
|
+ getHandle().spectating = !collides;
|
|
+ getHandle().k = collides; // First boolean of Entity
|
|
+ }
|
|
|
|
@Override
|
|
public void respawn()
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
|
|
index 6748465..24f5970 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
|
|
@@ -18,6 +18,7 @@ import net.minecraft.server.TileEntityDispenser;
|
|
import net.minecraft.server.TileEntityDropper;
|
|
import net.minecraft.server.TileEntityFurnace;
|
|
|
|
+import org.bukkit.craftbukkit.inventory.MinecraftInventory;
|
|
import org.apache.commons.lang.Validate;
|
|
import org.bukkit.entity.HumanEntity;
|
|
import org.bukkit.event.inventory.InventoryType;
|
|
@@ -440,8 +441,8 @@ public class CraftInventory implements Inventory {
|
|
return InventoryType.ENCHANTING;
|
|
} else if (inventory instanceof TileEntityBrewingStand) {
|
|
return InventoryType.BREWING;
|
|
- } else if (inventory instanceof CraftInventoryCustom.MinecraftInventory) {
|
|
- return ((CraftInventoryCustom.MinecraftInventory) inventory).getType();
|
|
+ } else if (inventory instanceof MinecraftInventory) {
|
|
+ return ((MinecraftInventory) inventory).getType();
|
|
} else if (inventory instanceof InventoryEnderChest) {
|
|
return InventoryType.ENDER_CHEST;
|
|
} else if (inventory instanceof InventoryMerchant) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
|
|
index 8b8a317..6565b0f 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
|
|
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.apache.commons.lang.Validate;
|
|
+import org.bukkit.craftbukkit.inventory.MinecraftInventory;
|
|
import org.bukkit.craftbukkit.entity.CraftHumanEntity;
|
|
import org.bukkit.entity.HumanEntity;
|
|
import org.bukkit.event.inventory.InventoryType;
|
|
@@ -29,135 +30,4 @@ public class CraftInventoryCustom extends CraftInventory {
|
|
public CraftInventoryCustom(InventoryHolder owner, int size, String title) {
|
|
super(new MinecraftInventory(owner, size, title));
|
|
}
|
|
-
|
|
- static class MinecraftInventory implements IInventory {
|
|
- private final ItemStack[] items;
|
|
- private int maxStack = MAX_STACK;
|
|
- private final List<HumanEntity> viewers;
|
|
- private final String title;
|
|
- private InventoryType type;
|
|
- private final InventoryHolder owner;
|
|
-
|
|
- public MinecraftInventory(InventoryHolder owner, InventoryType type) {
|
|
- this(owner, type.getDefaultSize(), type.getDefaultTitle());
|
|
- this.type = type;
|
|
- }
|
|
-
|
|
- public MinecraftInventory(InventoryHolder owner, InventoryType type, String title) {
|
|
- this(owner, type.getDefaultSize(), title);
|
|
- this.type = type;
|
|
- }
|
|
-
|
|
- public MinecraftInventory(InventoryHolder owner, int size) {
|
|
- this(owner, size, "Chest");
|
|
- }
|
|
-
|
|
- public MinecraftInventory(InventoryHolder owner, int size, String title) {
|
|
- Validate.notNull(title, "Title cannot be null");
|
|
- Validate.isTrue(title.length() <= 32, "Title cannot be longer than 32 characters");
|
|
- this.items = new ItemStack[size];
|
|
- this.title = title;
|
|
- this.viewers = new ArrayList<HumanEntity>();
|
|
- this.owner = owner;
|
|
- this.type = InventoryType.CHEST;
|
|
- }
|
|
-
|
|
- public int getSize() {
|
|
- return items.length;
|
|
- }
|
|
-
|
|
- public ItemStack getItem(int i) {
|
|
- return items[i];
|
|
- }
|
|
-
|
|
- public ItemStack splitStack(int i, int j) {
|
|
- ItemStack stack = this.getItem(i);
|
|
- ItemStack result;
|
|
- if (stack == null) return null;
|
|
- if (stack.count <= j) {
|
|
- this.setItem(i, null);
|
|
- result = stack;
|
|
- } else {
|
|
- result = CraftItemStack.copyNMSStack(stack, j);
|
|
- stack.count -= j;
|
|
- }
|
|
- this.update();
|
|
- return result;
|
|
- }
|
|
-
|
|
- public ItemStack splitWithoutUpdate(int i) {
|
|
- ItemStack stack = this.getItem(i);
|
|
- ItemStack result;
|
|
- if (stack == null) return null;
|
|
- if (stack.count <= 1) {
|
|
- this.setItem(i, null);
|
|
- result = stack;
|
|
- } else {
|
|
- result = CraftItemStack.copyNMSStack(stack, 1);
|
|
- stack.count -= 1;
|
|
- }
|
|
- return result;
|
|
- }
|
|
-
|
|
- public void setItem(int i, ItemStack itemstack) {
|
|
- items[i] = itemstack;
|
|
- if (itemstack != null && this.getMaxStackSize() > 0 && itemstack.count > this.getMaxStackSize()) {
|
|
- itemstack.count = this.getMaxStackSize();
|
|
- }
|
|
- }
|
|
-
|
|
- public String getInventoryName() {
|
|
- return title;
|
|
- }
|
|
-
|
|
- public int getMaxStackSize() {
|
|
- return maxStack;
|
|
- }
|
|
-
|
|
- public void setMaxStackSize(int size) {
|
|
- maxStack = size;
|
|
- }
|
|
-
|
|
- public void update() {}
|
|
-
|
|
- public boolean a(EntityHuman entityhuman) {
|
|
- return true;
|
|
- }
|
|
-
|
|
- public ItemStack[] getContents() {
|
|
- return items;
|
|
- }
|
|
-
|
|
- public void onOpen(CraftHumanEntity who) {
|
|
- viewers.add(who);
|
|
- }
|
|
-
|
|
- public void onClose(CraftHumanEntity who) {
|
|
- viewers.remove(who);
|
|
- }
|
|
-
|
|
- public List<HumanEntity> getViewers() {
|
|
- return viewers;
|
|
- }
|
|
-
|
|
- public InventoryType getType() {
|
|
- return type;
|
|
- }
|
|
-
|
|
- public void closeContainer() {}
|
|
-
|
|
- public InventoryHolder getOwner() {
|
|
- return owner;
|
|
- }
|
|
-
|
|
- public void startOpen() {}
|
|
-
|
|
- public boolean k_() {
|
|
- return false;
|
|
- }
|
|
-
|
|
- public boolean b(int i, ItemStack itemstack) {
|
|
- return true;
|
|
- }
|
|
- }
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
index 704be69..848f748 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
@@ -22,7 +22,7 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|
import com.google.common.collect.ImmutableMap;
|
|
|
|
@DelegateDeserialization(ItemStack.class)
|
|
-public final class CraftItemStack extends ItemStack {
|
|
+public class CraftItemStack extends ItemStack {
|
|
|
|
public static net.minecraft.server.ItemStack asNMSCopy(ItemStack original) {
|
|
if (original instanceof CraftItemStack) {
|
|
@@ -95,18 +95,18 @@ public final class CraftItemStack extends ItemStack {
|
|
this.handle = item;
|
|
}
|
|
|
|
- private CraftItemStack(ItemStack item) {
|
|
+ protected CraftItemStack(ItemStack item) {
|
|
this(item.getTypeId(), item.getAmount(), item.getDurability(), item.hasItemMeta() ? item.getItemMeta() : null);
|
|
}
|
|
|
|
- private CraftItemStack(Material type, int amount, short durability, ItemMeta itemMeta) {
|
|
+ protected CraftItemStack(Material type, int amount, short durability, ItemMeta itemMeta) {
|
|
setType(type);
|
|
setAmount(amount);
|
|
setDurability(durability);
|
|
setItemMeta(itemMeta);
|
|
}
|
|
|
|
- private CraftItemStack(int typeId, int amount, short durability, ItemMeta itemMeta) {
|
|
+ protected CraftItemStack(int typeId, int amount, short durability, ItemMeta itemMeta) {
|
|
this(Material.getMaterial(typeId), amount, durability, itemMeta);
|
|
|
|
}
|
|
@@ -136,6 +136,11 @@ public final class CraftItemStack extends ItemStack {
|
|
setData(null);
|
|
}
|
|
|
|
+ public net.minecraft.server.ItemStack getHandle()
|
|
+ {
|
|
+ return handle;
|
|
+ }
|
|
+
|
|
@Override
|
|
public int getAmount() {
|
|
return handle != null ? handle.count : 0;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/MinecraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/MinecraftInventory.java
|
|
new file mode 100644
|
|
index 0000000..9102b06
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/MinecraftInventory.java
|
|
@@ -0,0 +1,199 @@
|
|
+package org.bukkit.craftbukkit.inventory;
|
|
+
|
|
+import java.util.ArrayList;
|
|
+import java.util.List;
|
|
+
|
|
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
|
|
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
|
+import org.bukkit.entity.HumanEntity;
|
|
+import org.bukkit.event.inventory.InventoryType;
|
|
+import org.bukkit.inventory.InventoryHolder;
|
|
+
|
|
+import net.minecraft.server.EntityHuman;
|
|
+import net.minecraft.server.IInventory;
|
|
+import net.minecraft.server.ItemStack;
|
|
+import net.minecraft.util.org.apache.commons.lang3.Validate;
|
|
+
|
|
+public class MinecraftInventory implements IInventory
|
|
+{
|
|
+ private final ItemStack[] items;
|
|
+ private int maxStack = MAX_STACK;
|
|
+ private final List<HumanEntity> viewers;
|
|
+ private String title;
|
|
+ private InventoryType type;
|
|
+ private final InventoryHolder owner;
|
|
+
|
|
+ public MinecraftInventory(InventoryHolder owner, InventoryType type)
|
|
+ {
|
|
+ this(owner, type.getDefaultSize(), type.getDefaultTitle());
|
|
+ this.type = type;
|
|
+ }
|
|
+
|
|
+ public MinecraftInventory(InventoryHolder owner, InventoryType type, String title) {
|
|
+ this(owner, type.getDefaultSize(), title);
|
|
+ this.type = type;
|
|
+ }
|
|
+
|
|
+ public MinecraftInventory(InventoryHolder owner, int size)
|
|
+ {
|
|
+ this(owner, size, "Chest");
|
|
+ }
|
|
+
|
|
+ public MinecraftInventory(InventoryHolder owner, int size, String title)
|
|
+ {
|
|
+ Validate.notNull(title, "Title cannot be null");
|
|
+ Validate.isTrue(title.length() <= 32, "Title cannot be longer than 32 characters");
|
|
+ this.items = new ItemStack[size];
|
|
+ this.title = title;
|
|
+ this.viewers = new ArrayList();
|
|
+ this.owner = owner;
|
|
+ this.type = InventoryType.CHEST;
|
|
+ }
|
|
+
|
|
+ public int getSize()
|
|
+ {
|
|
+ return items.length;
|
|
+ }
|
|
+
|
|
+ public ItemStack getItem(int i)
|
|
+ {
|
|
+ return items[i];
|
|
+ }
|
|
+
|
|
+ public ItemStack splitStack(int i, int j)
|
|
+ {
|
|
+ ItemStack stack = this.getItem(i);
|
|
+ ItemStack result;
|
|
+ if (stack == null)
|
|
+ return null;
|
|
+ if (stack.count <= j)
|
|
+ {
|
|
+ this.setItem(i, null);
|
|
+ result = stack;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ result = CraftItemStack.copyNMSStack(stack, j);
|
|
+ stack.count -= j;
|
|
+ }
|
|
+ this.update();
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ public ItemStack splitWithoutUpdate(int i)
|
|
+ {
|
|
+ ItemStack stack = this.getItem(i);
|
|
+ ItemStack result;
|
|
+ if (stack == null)
|
|
+ return null;
|
|
+ if (stack.count <= 1)
|
|
+ {
|
|
+ this.setItem(i, null);
|
|
+ result = stack;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ result = CraftItemStack.copyNMSStack(stack, 1);
|
|
+ stack.count -= 1;
|
|
+ }
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ public void setItem(int i, ItemStack itemstack)
|
|
+ {
|
|
+ items[i] = itemstack;
|
|
+ if (itemstack != null && this.getMaxStackSize() > 0 && itemstack.count > this.getMaxStackSize())
|
|
+ {
|
|
+ itemstack.count = this.getMaxStackSize();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void setInventoryName(String name)
|
|
+ {
|
|
+ title = name;
|
|
+ }
|
|
+
|
|
+ public int getMaxStackSize()
|
|
+ {
|
|
+ return maxStack;
|
|
+ }
|
|
+
|
|
+ public void setMaxStackSize(int size)
|
|
+ {
|
|
+ maxStack = size;
|
|
+ }
|
|
+
|
|
+ public void update()
|
|
+ {
|
|
+ }
|
|
+
|
|
+ public boolean a(EntityHuman entityhuman)
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public ItemStack[] getContents()
|
|
+ {
|
|
+ return items;
|
|
+ }
|
|
+
|
|
+ public void onOpen(CraftHumanEntity who)
|
|
+ {
|
|
+ viewers.add(who);
|
|
+ }
|
|
+
|
|
+ public void onClose(CraftHumanEntity who)
|
|
+ {
|
|
+ viewers.remove(who);
|
|
+ }
|
|
+
|
|
+ public List<HumanEntity> getViewers()
|
|
+ {
|
|
+ return viewers;
|
|
+ }
|
|
+
|
|
+ public InventoryType getType()
|
|
+ {
|
|
+ return type;
|
|
+ }
|
|
+
|
|
+ public void g()
|
|
+ {
|
|
+ }
|
|
+
|
|
+ public InventoryHolder getOwner()
|
|
+ {
|
|
+ return owner;
|
|
+ }
|
|
+
|
|
+ public void startOpen()
|
|
+ {
|
|
+ }
|
|
+
|
|
+ public boolean c()
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ public boolean b(int i, ItemStack itemstack)
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public String getInventoryName()
|
|
+ {
|
|
+ return title;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean k_()
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void closeContainer()
|
|
+ {
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/src/main/java/org/bukkit/event/vehicle/VehicleExitEvent.java b/src/main/java/org/bukkit/event/vehicle/VehicleExitEvent.java
|
|
new file mode 100644
|
|
index 0000000..31fa335
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/bukkit/event/vehicle/VehicleExitEvent.java
|
|
@@ -0,0 +1,56 @@
|
|
+package org.bukkit.event.vehicle;
|
|
+
|
|
+import org.bukkit.entity.LivingEntity;
|
|
+import org.bukkit.entity.Entity;
|
|
+import org.bukkit.event.Cancellable;
|
|
+import org.bukkit.event.Event;
|
|
+import org.bukkit.event.HandlerList;
|
|
+
|
|
+/**
|
|
+ * Raised when a living entity exits a vehicle.
|
|
+ */
|
|
+public class VehicleExitEvent extends Event implements Cancellable {
|
|
+ private static final HandlerList handlers = new HandlerList();
|
|
+ private boolean cancelled;
|
|
+ private Entity vehicle;
|
|
+ private final LivingEntity exited;
|
|
+
|
|
+ public VehicleExitEvent(final Entity vehicle, final LivingEntity exited) {
|
|
+ this.vehicle = vehicle;
|
|
+ this.exited = exited;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the vehicle.
|
|
+ *
|
|
+ * @return the vehicle
|
|
+ */
|
|
+ public final Entity getVehicle() {
|
|
+ return vehicle;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the living entity that exited the vehicle.
|
|
+ *
|
|
+ * @return The entity.
|
|
+ */
|
|
+ public LivingEntity getExited() {
|
|
+ return exited;
|
|
+ }
|
|
+
|
|
+ public boolean isCancelled() {
|
|
+ return cancelled;
|
|
+ }
|
|
+
|
|
+ public void setCancelled(boolean cancel) {
|
|
+ this.cancelled = cancel;
|
|
+ }
|
|
+
|
|
+ public HandlerList getHandlers() {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ public static HandlerList getHandlerList() {
|
|
+ return handlers;
|
|
+ }
|
|
+}
|
|
--
|
|
1.8.4.msysgit.0
|
|
|