3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-25 15:50:06 +01:00
Paper/src/main/java/net/minecraft/server/NetServerHandler.java

1480 Zeilen
64 KiB
Java

package net.minecraft.server;
2012-07-29 09:33:13 +02:00
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
2011-01-29 22:50:29 +01:00
import java.util.ArrayList;
2012-07-29 09:33:13 +02:00
import java.util.Iterator;
2011-09-15 02:23:52 +02:00
import java.util.Random;
import java.util.logging.Logger;
// CraftBukkit start
2012-02-29 22:31:04 +01:00
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.HashSet;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.LazyPlayerSet;
import org.bukkit.craftbukkit.util.Waitable;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.entity.Player;
2011-03-24 23:27:40 +01:00
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.PlayerToggleSprintEvent;
import org.bukkit.event.inventory.*;
import org.bukkit.event.inventory.InventoryType.SlotType;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.InventoryView;
// CraftBukkit end
2012-07-29 09:33:13 +02:00
public class NetServerHandler extends NetHandler {
public static Logger logger = Logger.getLogger("Minecraft");
2012-07-29 09:33:13 +02:00
public INetworkManager networkManager;
public boolean disconnected = false;
private MinecraftServer minecraftServer;
2011-05-14 16:29:42 +02:00
public EntityPlayer player; // CraftBukkit - private -> public
2011-02-23 03:37:56 +01:00
private int f;
private int g;
2011-09-15 02:23:52 +02:00
private boolean h;
private int i;
private long j;
private static Random k = new Random();
private long l;
2012-01-12 23:10:13 +01:00
private int m = 0;
2012-03-01 11:49:23 +01:00
private int x = 0;
private double y;
private double z;
2012-03-01 11:49:23 +01:00
private double q;
2012-07-29 09:33:13 +02:00
public boolean checkMovement = true; // CraftBukkit - private -> public
2012-03-01 11:49:23 +01:00
private IntHashMap s = new IntHashMap();
2012-07-29 09:33:13 +02:00
public NetServerHandler(MinecraftServer minecraftserver, INetworkManager inetworkmanager, EntityPlayer entityplayer) {
this.minecraftServer = minecraftserver;
2012-07-29 09:33:13 +02:00
this.networkManager = inetworkmanager;
inetworkmanager.a(this);
this.player = entityplayer;
entityplayer.netServerHandler = this;
2011-01-29 22:50:29 +01:00
// CraftBukkit start
this.server = minecraftserver.server;
2011-01-29 22:50:29 +01:00
}
2012-01-14 23:02:10 +01:00
private final org.bukkit.craftbukkit.CraftServer server;
2011-05-14 16:29:42 +02:00
private int lastTick = MinecraftServer.currentTick;
2011-08-09 05:01:33 +02:00
private int lastDropTick = MinecraftServer.currentTick;
private int dropCount = 0;
2011-05-14 16:29:42 +02:00
private static final int PLACE_DISTANCE_SQUARED = 6 * 6;
2011-01-29 22:50:29 +01:00
// Get position of last block hit for BlockDamageLevel.STOPPED
private double lastPosX = Double.MAX_VALUE;
private double lastPosY = Double.MAX_VALUE;
private double lastPosZ = Double.MAX_VALUE;
private float lastPitch = Float.MAX_VALUE;
private float lastYaw = Float.MAX_VALUE;
private boolean justTeleported = false;
// For the packet15 hack :(
Long lastPacket;
2011-01-29 22:50:29 +01:00
// Store the last block right clicked and what type it was
private int lastMaterial;
public CraftPlayer getPlayer() {
return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity();
}
private final static HashSet<Integer> invalidItems = new HashSet<Integer>(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 51, 52, 55, 59, 60, 63, 64, 68, 71, 75, 78, 83, 90, 92, 93, 94, 95));
// CraftBukkit end
2012-07-29 09:33:13 +02:00
public void d() {
2011-09-15 02:23:52 +02:00
this.h = false;
++this.f;
2012-09-10 06:19:28 +02:00
this.minecraftServer.methodProfiler.a("packetflow");
this.networkManager.b();
this.minecraftServer.methodProfiler.c("keepAlive");
2011-09-15 02:23:52 +02:00
if ((long) this.f - this.l > 20L) {
this.l = (long) this.f;
this.j = System.nanoTime() / 1000000L;
this.i = k.nextInt();
this.sendPacket(new Packet0KeepAlive(this.i));
}
2012-01-12 23:10:13 +01:00
if (this.m > 0) {
--this.m;
}
2012-03-01 11:49:23 +01:00
if (this.x > 0) {
--this.x;
}
2012-07-29 09:33:13 +02:00
2012-09-10 06:19:28 +02:00
this.minecraftServer.methodProfiler.c("playerTick");
2012-07-29 09:33:13 +02:00
if (!this.h && !this.player.viewingCredits) {
this.player.g();
2012-08-25 02:51:51 +02:00
if (this.player.vehicle == null) {
this.player.setPositionRotation(this.y, this.z, this.q, this.player.yaw, this.player.pitch);
}
2012-07-29 09:33:13 +02:00
}
2012-09-10 06:19:28 +02:00
this.minecraftServer.methodProfiler.b();
}
public void disconnect(String s) {
2012-01-12 23:10:13 +01:00
if (!this.disconnected) {
// CraftBukkit start
String leaveMessage = "\u00A7e" + this.player.name + " left the game.";
2012-01-12 23:10:13 +01:00
PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage);
this.server.getPluginManager().callEvent(event);
2011-05-28 22:50:08 +02:00
2012-01-12 23:10:13 +01:00
if (event.isCancelled()) {
// Do not kick the player
return;
}
// Send the possibly modified leave message
s = event.getReason();
// CraftBukkit end
2011-05-28 22:50:08 +02:00
2012-07-29 09:33:13 +02:00
this.player.m();
2012-01-12 23:10:13 +01:00
this.sendPacket(new Packet255KickDisconnect(s));
this.networkManager.d();
2012-01-12 23:10:13 +01:00
// CraftBukkit start
leaveMessage = event.getLeaveMessage();
if (leaveMessage != null && leaveMessage.length() > 0) {
2012-07-29 09:33:13 +02:00
this.minecraftServer.getServerConfigurationManager().sendAll(new Packet3Chat(leaveMessage));
2012-01-12 23:10:13 +01:00
}
getPlayer().disconnect(s);
2012-01-12 23:10:13 +01:00
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.minecraftServer.getServerConfigurationManager().disconnect(this.player);
2012-01-12 23:10:13 +01:00
this.disconnected = true;
}
2011-02-23 03:37:56 +01:00
}
public void a(Packet10Flying packet10flying) {
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
2011-05-26 14:48:22 +02:00
2011-09-15 02:23:52 +02:00
this.h = true;
if (!this.player.viewingCredits) {
2011-11-20 09:01:14 +01:00
double d0;
2011-11-20 09:01:14 +01:00
if (!this.checkMovement) {
2012-03-01 11:49:23 +01:00
d0 = packet10flying.y - this.z;
if (packet10flying.x == this.y && d0 * d0 < 0.01D && packet10flying.z == this.q) {
2011-11-20 09:01:14 +01:00
this.checkMovement = true;
}
}
2011-11-20 09:01:14 +01:00
// CraftBukkit start
Player player = this.getPlayer();
Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location.
Location to = player.getLocation().clone(); // Start off the To location as the Players current location.
// If the packet contains movement information then we update the To location with the correct XYZ.
if (packet10flying.hasPos && !(packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D)) {
2011-11-20 09:01:14 +01:00
to.setX(packet10flying.x);
to.setY(packet10flying.y);
to.setZ(packet10flying.z);
}
2011-11-20 09:01:14 +01:00
// If the packet contains look information then we update the To location with the correct Yaw & Pitch.
if (packet10flying.hasLook) {
to.setYaw(packet10flying.yaw);
to.setPitch(packet10flying.pitch);
}
2011-03-27 00:34:33 +01:00
2011-11-20 09:01:14 +01:00
// Prevent 40 event-calls for less than a single pixel of movement >.>
double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2);
float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch());
if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) {
this.lastPosX = to.getX();
this.lastPosY = to.getY();
this.lastPosZ = to.getZ();
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
// Skip the first time we do this
if (from.getX() != Double.MAX_VALUE) {
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
this.server.getPluginManager().callEvent(event);
// If the event is cancelled we move the player back to their old location.
if (event.isCancelled()) {
this.player.netServerHandler.sendPacket(new Packet13PlayerLookMove(from.getX(), from.getY() + 1.6200000047683716D, from.getY(), from.getZ(), from.getYaw(), from.getPitch(), false));
return;
}
2011-11-20 09:01:14 +01:00
/* If a Plugin has changed the To destination then we teleport the Player
there to avoid any 'Moved wrongly' or 'Moved too quickly' errors.
We only do this if the Event was not cancelled. */
if (!to.equals(event.getTo()) && !event.isCancelled()) {
this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN);
2011-11-20 09:01:14 +01:00
return;
}
2011-11-20 09:01:14 +01:00
/* Check to see if the Players Location has some how changed during the call of the event.
This can happen due to a plugin teleporting the player instead of using .setTo() */
if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) {
this.justTeleported = false;
return;
}
}
}
2011-11-20 09:01:14 +01:00
if (Double.isNaN(packet10flying.x) || Double.isNaN(packet10flying.y) || Double.isNaN(packet10flying.z) || Double.isNaN(packet10flying.stance)) {
player.teleport(player.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.UNKNOWN);
2011-11-20 09:01:14 +01:00
System.err.println(player.getName() + " was caught trying to crash the server with an invalid position.");
player.kickPlayer("Nope!");
return;
}
2011-11-20 09:01:14 +01:00
if (this.checkMovement && !this.player.dead) {
// CraftBukkit end
double d1;
double d2;
double d3;
double d4;
2011-11-20 09:01:14 +01:00
if (this.player.vehicle != null) {
float f = this.player.yaw;
float f1 = this.player.pitch;
2012-07-29 09:33:13 +02:00
this.player.vehicle.V();
2011-11-20 09:01:14 +01:00
d1 = this.player.locX;
d2 = this.player.locY;
d3 = this.player.locZ;
double d5 = 0.0D;
d4 = 0.0D;
if (packet10flying.hasLook) {
f = packet10flying.yaw;
f1 = packet10flying.pitch;
}
if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) {
2012-08-25 02:51:51 +02:00
if (Math.abs(packet10flying.x) > 1.0D || Math.abs(packet10flying.z) > 1.0D) {
System.err.println(player.getName() + " was caught trying to crash the server with an invalid position.");
player.kickPlayer("Nope!");
return;
}
2012-07-29 09:33:13 +02:00
2011-11-20 09:01:14 +01:00
d5 = packet10flying.x;
d4 = packet10flying.z;
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
this.player.onGround = packet10flying.g;
2012-07-29 09:33:13 +02:00
this.player.g();
2011-11-20 09:01:14 +01:00
this.player.move(d5, 0.0D, d4);
this.player.setLocation(d1, d2, d3, f, f1);
this.player.motX = d5;
this.player.motZ = d4;
if (this.player.vehicle != null) {
worldserver.vehicleEnteredWorld(this.player.vehicle, true);
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
if (this.player.vehicle != null) {
2012-07-29 09:33:13 +02:00
this.player.vehicle.V();
2011-11-20 09:01:14 +01:00
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
this.minecraftServer.getServerConfigurationManager().d(this.player);
2012-03-01 11:49:23 +01:00
this.y = this.player.locX;
this.z = this.player.locY;
this.q = this.player.locZ;
2011-11-20 09:01:14 +01:00
worldserver.playerJoinedWorld(this.player);
return;
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
if (this.player.isSleeping()) {
2012-07-29 09:33:13 +02:00
this.player.g();
2012-03-01 11:49:23 +01:00
this.player.setLocation(this.y, this.z, this.q, this.player.yaw, this.player.pitch);
2011-11-20 09:01:14 +01:00
worldserver.playerJoinedWorld(this.player);
return;
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
d0 = this.player.locY;
2012-03-01 11:49:23 +01:00
this.y = this.player.locX;
this.z = this.player.locY;
this.q = this.player.locZ;
2011-11-20 09:01:14 +01:00
d1 = this.player.locX;
d2 = this.player.locY;
d3 = this.player.locZ;
float f2 = this.player.yaw;
float f3 = this.player.pitch;
2011-05-31 15:55:45 +02:00
if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) {
packet10flying.hasPos = false;
2011-11-20 09:01:14 +01:00
}
if (packet10flying.hasPos) {
2011-11-20 09:01:14 +01:00
d1 = packet10flying.x;
d2 = packet10flying.y;
d3 = packet10flying.z;
d4 = packet10flying.stance - packet10flying.y;
if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) {
this.disconnect("Illegal stance");
logger.warning(this.player.name + " had an illegal stance: " + d4);
2011-11-20 09:01:14 +01:00
return;
}
if (Math.abs(packet10flying.x) > 3.2E7D || Math.abs(packet10flying.z) > 3.2E7D) {
this.disconnect("Illegal position");
return;
}
2011-04-20 22:47:26 +02:00
}
2011-11-20 09:01:14 +01:00
if (packet10flying.hasLook) {
f2 = packet10flying.yaw;
f3 = packet10flying.pitch;
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
this.player.g();
this.player.V = 0.0F;
2012-03-01 11:49:23 +01:00
this.player.setLocation(this.y, this.z, this.q, f2, f3);
2011-11-20 09:01:14 +01:00
if (!this.checkMovement) {
return;
}
2011-04-20 22:47:26 +02:00
2011-11-20 09:01:14 +01:00
d4 = d1 - this.player.locX;
double d6 = d2 - this.player.locY;
double d7 = d3 - this.player.locZ;
2012-08-06 06:45:38 +02:00
// CraftBukkit start - min to max
double d8 = Math.max(Math.abs(d4), Math.abs(this.player.motX));
double d9 = Math.max(Math.abs(d6), Math.abs(this.player.motY));
double d10 = Math.max(Math.abs(d7), Math.abs(this.player.motZ));
// CraftBukkit end
2012-07-29 09:33:13 +02:00
double d11 = d8 * d8 + d9 * d9 + d10 * d10;
if (d11 > 100.0D && this.checkMovement && (!this.minecraftServer.H() || !this.minecraftServer.G().equals(this.player.name))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports
logger.warning(this.player.name + " moved too quickly! " + d4 + "," + d6 + "," + d7 + " (" + d8 + ", " + d9 + ", " + d10 + ")");
2012-08-06 06:45:38 +02:00
this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch);
2011-11-20 09:01:14 +01:00
return;
}
2011-11-20 09:01:14 +01:00
float f4 = 0.0625F;
2012-07-29 09:33:13 +02:00
boolean flag = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty();
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
if (this.player.onGround && !packet10flying.g && d6 > 0.0D) {
2012-07-29 09:33:13 +02:00
this.player.j(0.2F);
2011-11-20 09:01:14 +01:00
}
2011-04-20 22:47:26 +02:00
2011-11-20 09:01:14 +01:00
this.player.move(d4, d6, d7);
this.player.onGround = packet10flying.g;
2012-02-29 22:31:04 +01:00
this.player.checkMovement(d4, d6, d7);
2012-07-29 09:33:13 +02:00
double d12 = d6;
2011-09-15 02:23:52 +02:00
2011-11-20 09:01:14 +01:00
d4 = d1 - this.player.locX;
d6 = d2 - this.player.locY;
if (d6 > -0.5D || d6 < 0.5D) {
d6 = 0.0D;
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
d7 = d3 - this.player.locZ;
2012-07-29 09:33:13 +02:00
d11 = d4 * d4 + d6 * d6 + d7 * d7;
2011-11-20 09:01:14 +01:00
boolean flag1 = false;
2012-07-29 09:33:13 +02:00
if (d11 > 0.0625D && !this.player.isSleeping() && !this.player.itemInWorldManager.isCreative()) {
2011-11-20 09:01:14 +01:00
flag1 = true;
logger.warning(this.player.name + " moved wrongly!");
2011-11-20 09:01:14 +01:00
}
2011-01-29 22:50:29 +01:00
2011-11-20 09:01:14 +01:00
this.player.setLocation(d1, d2, d3, f2, f3);
2012-07-29 09:33:13 +02:00
boolean flag2 = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty();
2011-11-20 09:01:14 +01:00
if (flag && (flag1 || !flag2) && !this.player.isSleeping()) {
2012-03-01 11:49:23 +01:00
this.a(this.y, this.z, this.q, f2, f3);
2011-11-20 09:01:14 +01:00
return;
}
2011-01-29 22:50:29 +01:00
2012-01-12 16:27:39 +01:00
AxisAlignedBB axisalignedbb = this.player.boundingBox.clone().grow((double) f4, (double) f4, (double) f4).a(0.0D, -0.55D, 0.0D);
2011-04-20 22:47:26 +02:00
2012-07-29 09:33:13 +02:00
if (!this.minecraftServer.getAllowFlight() && !this.player.abilities.canFly && !worldserver.c(axisalignedbb)) { // CraftBukkit - check abilities instead of creative mode
if (d12 >= -0.03125D) {
2011-11-20 09:01:14 +01:00
++this.g;
if (this.g > 80) {
logger.warning(this.player.name + " was kicked for floating too long!");
2011-11-20 09:01:14 +01:00
this.disconnect("Flying is not enabled on this server");
return;
}
2011-04-20 22:47:26 +02:00
}
2011-11-20 09:01:14 +01:00
} else {
this.g = 0;
2011-04-20 22:47:26 +02:00
}
2011-11-20 09:01:14 +01:00
this.player.onGround = packet10flying.g;
2012-07-29 09:33:13 +02:00
this.minecraftServer.getServerConfigurationManager().d(this.player);
if (this.player.itemInWorldManager.isCreative()) return; // CraftBukkit - fixed fall distance accumulating while being in Creative mode.
2011-11-20 09:01:14 +01:00
this.player.b(this.player.locY - d0, packet10flying.g);
}
}
}
2011-03-23 18:42:36 +01:00
public void a(double d0, double d1, double d2, float f, float f1) {
2011-05-14 16:29:42 +02:00
// CraftBukkit start - Delegate to teleport(Location)
Player player = this.getPlayer();
Location from = player.getLocation();
Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1);
PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN);
this.server.getPluginManager().callEvent(event);
from = event.getFrom();
to = event.isCancelled() ? from : event.getTo();
this.teleport(to);
}
public void teleport(Location dest) {
double d0, d1, d2;
float f, f1;
d0 = dest.getX();
d1 = dest.getY();
d2 = dest.getZ();
f = dest.getYaw();
f1 = dest.getPitch();
// TODO: make sure this is the best way to address this.
if (Float.isNaN(f)) {
f = 0;
}
if (Float.isNaN(f1)) {
f1 = 0;
}
this.lastPosX = d0;
this.lastPosY = d1;
this.lastPosZ = d2;
this.lastYaw = f;
this.lastPitch = f1;
this.justTeleported = true;
2011-03-23 18:42:36 +01:00
// CraftBukkit end
this.checkMovement = false;
2012-03-01 11:49:23 +01:00
this.y = d0;
this.z = d1;
this.q = d2;
this.player.setLocation(d0, d1, d2, f, f1);
this.player.netServerHandler.sendPacket(new Packet13PlayerLookMove(d0, d1 + 1.6200000047683716D, d1, d2, f, f1, false));
}
public void a(Packet14BlockDig packet14blockdig) {
if (this.player.dead) return; // CraftBukkit
2011-05-12 16:22:52 +02:00
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
2011-05-26 14:48:22 +02:00
if (packet14blockdig.e == 4) {
2011-08-09 05:01:33 +02:00
// CraftBukkit start
// If the ticks aren't the same then the count starts from 0 and we update the lastDropTick.
if (this.lastDropTick != MinecraftServer.currentTick) {
this.dropCount = 0;
this.lastDropTick = MinecraftServer.currentTick;
} else {
// Else we increment the drop count and check the amount.
this.dropCount++;
if (this.dropCount >= 20) {
logger.warning(this.player.name + " dropped their items too quickly!");
2011-08-09 05:01:33 +02:00
this.disconnect("You dropped your items too quickly (Hacking?)");
2011-09-15 04:22:56 +02:00
return;
2011-08-09 05:01:33 +02:00
}
}
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.player.bB();
2011-09-15 04:22:56 +02:00
} else if (packet14blockdig.e == 5) {
2012-07-29 09:33:13 +02:00
this.player.by();
2011-01-29 22:50:29 +01:00
} else {
2012-07-29 09:33:13 +02:00
boolean flag = worldserver.weirdIsOpCache = worldserver.dimension != 0 || this.minecraftServer.getServerConfigurationManager().isOp(this.player.name) || this.minecraftServer.H(); // CraftBukkit
2011-01-29 22:50:29 +01:00
boolean flag1 = false;
2011-01-29 22:50:29 +01:00
if (packet14blockdig.e == 0) {
flag1 = true;
}
2011-02-23 03:37:56 +01:00
if (packet14blockdig.e == 2) {
2011-01-29 22:50:29 +01:00
flag1 = true;
}
2011-01-29 22:50:29 +01:00
int i = packet14blockdig.a;
int j = packet14blockdig.b;
int k = packet14blockdig.c;
if (flag1) {
double d0 = this.player.locX - ((double) i + 0.5D);
2011-11-20 09:01:14 +01:00
double d1 = this.player.locY - ((double) j + 0.5D) + 1.5D;
double d2 = this.player.locZ - ((double) k + 0.5D);
2011-01-29 22:50:29 +01:00
double d3 = d0 * d0 + d1 * d1 + d2 * d2;
if (d3 > 36.0D) {
return;
}
2012-03-01 11:49:23 +01:00
2012-07-29 09:33:13 +02:00
if (j >= this.minecraftServer.getMaxBuildHeight()) {
2012-03-01 11:49:23 +01:00
return;
}
}
2011-05-26 14:48:22 +02:00
ChunkCoordinates chunkcoordinates = worldserver.getSpawn();
2011-09-15 02:23:52 +02:00
int l = MathHelper.a(i - chunkcoordinates.x);
int i1 = MathHelper.a(k - chunkcoordinates.z);
2011-02-23 03:37:56 +01:00
if (l > i1) {
i1 = l;
2011-01-29 22:50:29 +01:00
}
2011-01-10 02:36:19 +01:00
2011-01-29 22:50:29 +01:00
if (packet14blockdig.e == 0) {
// CraftBukkit start
if (i1 < this.server.getSpawnRadius() && !flag) {
CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand());
// CraftBukkit end
2011-05-26 14:48:22 +02:00
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
} else {
this.player.itemInWorldManager.dig(i, j, k, packet14blockdig.face);
2011-01-29 22:50:29 +01:00
}
} else if (packet14blockdig.e == 2) {
2011-05-26 14:48:22 +02:00
this.player.itemInWorldManager.a(i, j, k);
if (worldserver.getTypeId(i, j, k) != 0) {
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
}
2012-07-29 09:33:13 +02:00
} else if (packet14blockdig.e == 1) {
this.player.itemInWorldManager.c(i, j, k);
if (worldserver.getTypeId(i, j, k) != 0) {
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
}
2011-01-29 22:50:29 +01:00
} else if (packet14blockdig.e == 3) {
double d4 = this.player.locX - ((double) i + 0.5D);
double d5 = this.player.locY - ((double) j + 0.5D);
double d6 = this.player.locZ - ((double) k + 0.5D);
2011-02-23 03:37:56 +01:00
double d7 = d4 * d4 + d5 * d5 + d6 * d6;
2011-01-29 22:50:29 +01:00
2011-02-23 03:37:56 +01:00
if (d7 < 256.0D) {
2011-05-26 14:48:22 +02:00
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
2011-01-10 02:36:19 +01:00
}
}
2011-05-26 14:48:22 +02:00
worldserver.weirdIsOpCache = false;
2011-01-29 22:50:29 +01:00
}
}
public void a(Packet15Place packet15place) {
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
2011-05-26 14:48:22 +02:00
2011-03-24 12:11:28 +01:00
// CraftBukkit start
if (this.player.dead) return;
2011-05-12 16:22:52 +02:00
// This is a horrible hack needed because the client sends 2 packets on 'right mouse click'
// aimed at a block. We shouldn't need to get the second packet if the data is handled
// but we cannot know what the client will do, so we might still get it
//
// If the time between packets is small enough, and the 'signature' similar, we discard the
// second one. This sadly has to remain until Mojang makes their packets saner. :(
// -- Grum
2011-01-10 02:36:19 +01:00
2012-07-29 09:33:13 +02:00
if (packet15place.getFace() == 255) {
if (packet15place.getItemStack() != null && packet15place.getItemStack().id == this.lastMaterial && this.lastPacket != null && packet15place.timestamp - this.lastPacket < 100) {
this.lastPacket = null;
return;
}
} else {
2012-07-29 09:33:13 +02:00
this.lastMaterial = packet15place.getItemStack() == null ? -1 : packet15place.getItemStack().id;
this.lastPacket = packet15place.timestamp;
}
2011-01-10 02:36:19 +01:00
2011-05-14 16:29:42 +02:00
// CraftBukkit - if rightclick decremented the item, always send the update packet.
// this is not here for CraftBukkit's own functionality; rather it is to fix
// a notch bug where the item doesn't update correctly.
boolean always = false;
// CraftBukkit end
2011-01-10 02:36:19 +01:00
ItemStack itemstack = this.player.inventory.getItemInHand();
2012-03-01 11:49:23 +01:00
boolean flag = false;
2012-07-29 09:33:13 +02:00
int i = packet15place.d();
int j = packet15place.f();
int k = packet15place.g();
int l = packet15place.getFace();
boolean flag1 = worldserver.weirdIsOpCache = worldserver.worldProvider.dimension != 0 || this.minecraftServer.getServerConfigurationManager().isOp(this.player.name) || this.minecraftServer.H();
2012-07-29 09:33:13 +02:00
if (packet15place.getFace() == 255) {
if (itemstack == null) {
return;
}
2011-01-10 02:36:19 +01:00
2011-03-24 12:11:28 +01:00
// CraftBukkit start
2011-03-24 23:27:40 +01:00
int itemstackAmount = itemstack.count;
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack);
if (event.useItemInHand() != Event.Result.DENY) {
this.player.itemInWorldManager.useItem(this.player, this.player.world, itemstack);
}
2011-05-14 16:29:42 +02:00
// CraftBukkit - notch decrements the counter by 1 in the above method with food,
// snowballs and so forth, but he does it in a place that doesn't cause the
2011-03-24 23:27:40 +01:00
// inventory update packet to get sent
always = (itemstack.count != itemstackAmount);
// CraftBukkit end
2012-07-29 09:33:13 +02:00
} else if (packet15place.f() >= this.minecraftServer.getMaxBuildHeight() - 1 && (packet15place.getFace() == 1 || packet15place.f() >= this.minecraftServer.getMaxBuildHeight())) {
this.player.netServerHandler.sendPacket(new Packet3Chat("\u00A77Height limit for building is " + this.minecraftServer.getMaxBuildHeight()));
2012-03-01 11:49:23 +01:00
flag = true;
} else {
2011-05-26 14:48:22 +02:00
ChunkCoordinates chunkcoordinates = worldserver.getSpawn();
2011-09-15 02:23:52 +02:00
int i1 = MathHelper.a(i - chunkcoordinates.x);
int j1 = MathHelper.a(k - chunkcoordinates.z);
2011-01-29 22:50:29 +01:00
if (i1 > j1) {
j1 = i1;
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
// CraftBukkit start - Check if we can actually do something over this large a distance
Location eyeLoc = this.getPlayer().getEyeLocation();
if (Math.pow(eyeLoc.getX() - i, 2) + Math.pow(eyeLoc.getY() - j, 2) + Math.pow(eyeLoc.getZ() - k, 2) > PLACE_DISTANCE_SQUARED) {
return;
}
2012-03-01 11:49:23 +01:00
flag1 = true; // spawn protection moved to ItemBlock!!!
if (j1 > 16 || flag1) {
2012-07-29 09:33:13 +02:00
// CraftBukkit end
this.player.itemInWorldManager.interact(this.player, worldserver, itemstack, i, j, k, l, packet15place.j(), packet15place.l(), packet15place.m());
2011-05-26 14:48:22 +02:00
}
2012-03-01 11:49:23 +01:00
flag = true;
}
if (flag) {
2011-05-26 14:48:22 +02:00
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
2011-01-29 22:50:29 +01:00
if (l == 0) {
--j;
}
2011-01-29 22:50:29 +01:00
if (l == 1) {
++j;
}
2011-01-29 22:50:29 +01:00
if (l == 2) {
--k;
}
2011-01-29 22:50:29 +01:00
if (l == 3) {
++k;
}
2011-01-29 22:50:29 +01:00
if (l == 4) {
--i;
}
2011-01-29 22:50:29 +01:00
if (l == 5) {
++i;
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver));
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
itemstack = this.player.inventory.getItemInHand();
2011-01-29 22:50:29 +01:00
if (itemstack != null && itemstack.count == 0) {
this.player.inventory.items[this.player.inventory.itemInHandIndex] = null;
2011-09-15 02:23:52 +02:00
itemstack = null;
}
2012-07-29 09:33:13 +02:00
if (itemstack == null || itemstack.m() == 0) {
2011-09-15 02:23:52 +02:00
this.player.h = true;
this.player.inventory.items[this.player.inventory.itemInHandIndex] = ItemStack.b(this.player.inventory.items[this.player.inventory.itemInHandIndex]);
2011-11-20 09:01:14 +01:00
Slot slot = this.player.activeContainer.a((IInventory) this.player.inventory, this.player.inventory.itemInHandIndex);
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
this.player.activeContainer.b();
2011-09-15 02:23:52 +02:00
this.player.h = false;
2012-01-12 12:02:39 +01:00
// CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future
2012-07-29 09:33:13 +02:00
if (!ItemStack.matches(this.player.inventory.getItemInHand(), packet15place.getItemStack()) || always) {
this.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, slot.d, this.player.inventory.getItemInHand()));
2011-09-15 02:23:52 +02:00
}
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
worldserver.weirdIsOpCache = false;
}
2011-01-10 02:36:19 +01:00
2011-01-29 22:50:29 +01:00
public void a(String s, Object[] aobject) {
if (this.disconnected) return; // CraftBukkit - rarely it would send a disconnect line twice
logger.info(this.player.name + " lost connection: " + s);
2011-04-26 04:36:55 +02:00
// CraftBukkit start - we need to handle custom quit messages
2012-07-29 09:33:13 +02:00
String quitMessage = this.minecraftServer.getServerConfigurationManager().disconnect(this.player);
if ((quitMessage != null) && (quitMessage.length() > 0)) {
2012-07-29 09:33:13 +02:00
this.minecraftServer.getServerConfigurationManager().sendAll(new Packet3Chat(quitMessage));
2011-04-26 04:36:55 +02:00
}
// CraftBukkit end
this.disconnected = true;
2012-07-29 09:33:13 +02:00
if (this.minecraftServer.H() && this.player.name.equals(this.minecraftServer.G())) {
logger.info("Stopping singleplayer server as player logged out");
this.minecraftServer.safeShutdown();
}
}
2012-02-29 22:31:04 +01:00
public void onUnhandledPacket(Packet packet) {
2011-12-28 01:57:54 +01:00
if (this.disconnected) return; // CraftBukkit
logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + packet.getClass());
this.disconnect("Protocol error, unexpected packet");
}
public void sendPacket(Packet packet) {
2012-07-29 09:33:13 +02:00
if (packet instanceof Packet3Chat) {
Packet3Chat packet3chat = (Packet3Chat) packet;
int i = this.player.getChatFlags();
if (i == 2) {
return;
}
if (i == 1 && !packet3chat.isServer()) {
return;
}
// CraftBukkit start
String message = packet3chat.message;
for (final String line : org.bukkit.craftbukkit.TextWrapper.wrapText(message)) {
this.networkManager.queue(new Packet3Chat(line));
}
2012-07-29 09:33:13 +02:00
return;
// CraftBukkit end
}
// CraftBukkit start
if (packet == null) {
return;
} else if (packet instanceof Packet6SpawnPosition) {
Packet6SpawnPosition packet6 = (Packet6SpawnPosition) packet;
this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.x, packet6.y, packet6.z);
} else if (packet.lowPriority == true) {
// Reroute all low-priority packets through to compression thread.
org.bukkit.craftbukkit.ChunkCompressionThread.sendPacket(this.player, packet);
2012-07-29 09:33:13 +02:00
return;
2011-03-25 21:22:03 +01:00
}
2011-05-14 16:29:42 +02:00
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.networkManager.queue(packet);
}
public void a(Packet16BlockItemSwitch packet16blockitemswitch) {
2011-10-01 06:15:45 +02:00
// CraftBukkit start
if (this.player.dead) return;
2011-05-12 16:22:52 +02:00
if (packet16blockitemswitch.itemInHandIndex >= 0 && packet16blockitemswitch.itemInHandIndex < PlayerInventory.getHotbarSize()) {
PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packet16blockitemswitch.itemInHandIndex);
this.server.getPluginManager().callEvent(event);
// CraftBukkit end
2011-05-14 16:29:42 +02:00
this.player.inventory.itemInHandIndex = packet16blockitemswitch.itemInHandIndex;
} else {
logger.warning(this.player.name + " tried to set an invalid carried item");
2012-03-22 07:55:50 +01:00
this.disconnect("Nope!"); // CraftBukkit
}
}
public void a(Packet3Chat packet3chat) {
2012-07-29 09:33:13 +02:00
if (this.player.getChatFlags() == 2) {
this.sendPacket(new Packet3Chat("Cannot send chat message."));
} else {
2012-07-29 09:33:13 +02:00
String s = packet3chat.message;
if (s.length() > 100) {
this.disconnect("Chat message too long");
} else {
s = s.trim();
for (int i = 0; i < s.length(); ++i) {
if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) {
this.disconnect("Illegal characters in chat");
return;
}
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
// CraftBukkit start
if (this.player.getChatFlags() == 1) {
this.sendPacket(new Packet3Chat("Cannot send chat message."));
2011-01-29 22:50:29 +01:00
return;
}
this.chat(s, packet3chat.a_());
2012-07-29 09:33:13 +02:00
}
2011-02-17 06:46:01 +01:00
}
}
public void chat(String s, boolean async) {
2011-05-26 14:48:22 +02:00
if (!this.player.dead) {
if (s.length() == 0) {
logger.warning(this.player.name + " tried to send an empty message");
return;
}
if (getPlayer().isConversing()) {
getPlayer().acceptConversationInput(s);
return;
}
2011-05-26 14:48:22 +02:00
if (s.startsWith("/")) {
this.handleCommand(s);
return;
2011-05-26 14:48:22 +02:00
} else {
Player player = this.getPlayer();
AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet());
this.server.getPluginManager().callEvent(event);
2011-05-26 14:48:22 +02:00
if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) {
// Evil plugins still listening to deprecated event
final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients());
queueEvent.setCancelled(event.isCancelled());
Waitable waitable = new Waitable() {
@Override
protected Object evaluate() {
Bukkit.getPluginManager().callEvent(queueEvent);
if (queueEvent.isCancelled()) {
return null;
}
String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage());
NetServerHandler.this.minecraftServer.console.sendMessage(message);
if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) {
for (Object player : NetServerHandler.this.minecraftServer.getServerConfigurationManager().players) {
((EntityPlayer) player).sendMessage(message);
}
} else {
for (Player player : queueEvent.getRecipients()) {
player.sendMessage(message);
}
}
return null;
}};
if (async) {
minecraftServer.processQueue.add(waitable);
} else {
waitable.run();
}
try {
waitable.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on!
} catch (java.util.concurrent.ExecutionException e) {
throw new RuntimeException("Exception processing chat event", e.getCause());
}
} else {
if (event.isCancelled()) {
return;
}
s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage());
minecraftServer.console.sendMessage(s);
if (((LazyPlayerSet) event.getRecipients()).isLazy()) {
for (Object recipient : minecraftServer.getServerConfigurationManager().players) {
((EntityPlayer) recipient).sendMessage(s);
}
} else {
2012-09-14 07:03:47 +02:00
for (Player recipient : event.getRecipients()) {
recipient.sendMessage(s);
}
}
2011-05-26 14:48:22 +02:00
}
2012-01-12 23:10:13 +01:00
}
this.m += 20;
2012-07-29 09:33:13 +02:00
if (this.m > 200 && !this.minecraftServer.getServerConfigurationManager().isOp(this.player.name)) {
2012-01-12 23:10:13 +01:00
this.disconnect("disconnect.spam");
}
}
return;
}
2012-07-29 09:33:13 +02:00
// CraftBukkit end
private void handleCommand(String s) {
// CraftBukkit start
CraftPlayer player = this.getPlayer();
2011-01-29 22:50:29 +01:00
PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet());
this.server.getPluginManager().callEvent(event);
2011-01-10 02:36:19 +01:00
if (event.isCancelled()) {
return;
}
try {
2012-08-25 02:51:51 +02:00
logger.info(event.getPlayer().getName() + " issued server command: " + event.getMessage()); // CraftBukkit
if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) {
return;
}
} catch (org.bukkit.command.CommandException ex) {
player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command");
Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, null, ex);
return;
}
2011-05-14 16:29:42 +02:00
// CraftBukkit end
/* CraftBukkit start - No longer needed as we have already handled it in server.dispatchServerCommand above.
2012-08-25 02:51:51 +02:00
this.minecraftServer.getCommandHandler().a(this.player, s);
// CraftBukkit end */
}
public void a(Packet18ArmAnimation packet18armanimation) {
if (this.player.dead) return; // CraftBukkit
2011-05-12 16:22:52 +02:00
if (packet18armanimation.b == 1) {
2011-05-14 16:29:42 +02:00
// CraftBukkit start - raytrace to look for 'rogue armswings'
float f = 1.0F;
float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f;
float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f;
double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f;
double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height;
double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f;
2012-07-29 09:33:13 +02:00
Vec3D vec3d = Vec3D.a().create(d0, d1, d2);
float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F);
float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F);
float f5 = -MathHelper.cos(-f1 * 0.017453292F);
float f6 = MathHelper.sin(-f1 * 0.017453292F);
float f7 = f4 * f5;
float f8 = f3 * f5;
double d3 = 5.0D;
Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3);
MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, true);
if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.TILE) {
CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand());
}
// Arm swing animation
PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer());
this.server.getPluginManager().callEvent(event);
if (event.isCancelled()) return;
2011-01-29 22:50:29 +01:00
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.player.i();
2011-01-14 14:31:10 +01:00
}
}
2011-01-29 22:50:29 +01:00
public void a(Packet19EntityAction packet19entityaction) {
// CraftBukkit start
if (this.player.dead) return;
2011-05-12 16:22:52 +02:00
if (packet19entityaction.animation == 1 || packet19entityaction.animation == 2) {
PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packet19entityaction.animation == 1);
this.server.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
}
if (packet19entityaction.animation == 4 || packet19entityaction.animation == 5) {
PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getPlayer(), packet19entityaction.animation == 4);
this.server.getPluginManager().callEvent(event);
2011-01-25 19:08:54 +01:00
if (event.isCancelled()) {
return;
}
}
// CraftBukkit end
2011-01-25 19:08:54 +01:00
if (packet19entityaction.animation == 1) {
2012-07-29 09:33:13 +02:00
this.player.setSneaking(true);
} else if (packet19entityaction.animation == 2) {
2012-07-29 09:33:13 +02:00
this.player.setSneaking(false);
2011-09-15 02:23:52 +02:00
} else if (packet19entityaction.animation == 4) {
this.player.setSprinting(true);
2011-09-15 02:23:52 +02:00
} else if (packet19entityaction.animation == 5) {
this.player.setSprinting(false);
} else if (packet19entityaction.animation == 3) {
this.player.a(false, true, true);
2012-08-06 06:45:38 +02:00
// this.checkMovement = false; // CraftBukkit - this is handled in teleport
}
}
public void a(Packet255KickDisconnect packet255kickdisconnect) {
// CraftBukkit start
getPlayer().disconnect("disconnect.quitting");
// CraftBukkit end
this.networkManager.a("disconnect.quitting", new Object[0]);
}
public int lowPriorityCount() {
2011-05-26 14:48:22 +02:00
return this.networkManager.e();
}
2011-01-29 22:50:29 +01:00
public void a(Packet7UseEntity packet7useentity) {
if (this.player.dead) return; // CraftBukkit
2011-05-12 16:22:52 +02:00
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
2011-05-26 14:48:22 +02:00
Entity entity = worldserver.getEntity(packet7useentity.target);
2012-03-01 11:49:23 +01:00
if (entity != null) {
2012-07-29 09:33:13 +02:00
boolean flag = this.player.l(entity);
2012-03-01 11:49:23 +01:00
double d0 = 36.0D;
2012-03-01 11:49:23 +01:00
if (!flag) {
d0 = 9.0D;
}
2012-07-29 09:33:13 +02:00
if (this.player.e(entity) < d0) {
2012-03-01 11:49:23 +01:00
ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit
if (packet7useentity.action == 0) {
// CraftBukkit start
PlayerInteractEntityEvent event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity());
this.server.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.player.m(entity);
2012-03-01 11:49:23 +01:00
// CraftBukkit start - update the client if the item is an infinite one
if (itemInHand != null && itemInHand.count <= -1) {
this.player.updateInventory(this.player.activeContainer);
}
} else if (packet7useentity.action == 1) {
if ((entity instanceof EntityItem) || (entity instanceof EntityExperienceOrb) || (entity instanceof EntityArrow)) {
String type = entity.getClass().getSimpleName();
disconnect("Attacking an " + type + " is not permitted");
System.out.println("Player " + player.name + " tried to attack an " + type + ", so I have disconnected them for exploiting.");
return;
}
2012-03-01 11:49:23 +01:00
this.player.attack(entity);
2012-03-01 11:49:23 +01:00
if (itemInHand != null && itemInHand.count <= -1) {
this.player.updateInventory(this.player.activeContainer);
}
// CraftBukkit end
}
}
}
}
2012-07-29 09:33:13 +02:00
public void a(Packet205ClientCommand packet205clientcommand) {
if (packet205clientcommand.a == 1) {
if (this.player.viewingCredits) {
// CraftBukkit start
org.bukkit.craftbukkit.PortalTravelAgent pta = new org.bukkit.craftbukkit.PortalTravelAgent();
Location toLocation;
if (this.player.getBukkitEntity().getBedSpawnLocation() == null) {
CraftWorld cworld = (CraftWorld) this.server.getWorlds().get(0);
ChunkCoordinates chunkcoordinates = cworld.getHandle().getSpawn();
toLocation = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5);
this.player.netServerHandler.sendPacket(new Packet70Bed(0, 0));
} else {
toLocation = this.player.getBukkitEntity().getBedSpawnLocation();
toLocation = new Location(toLocation.getWorld(), toLocation.getX() + 0.5, toLocation.getY(), toLocation.getZ() + 0.5);
}
PlayerPortalEvent event = new PlayerPortalEvent(this.player.getBukkitEntity(), this.player.getBukkitEntity().getLocation(), toLocation, pta, PlayerPortalEvent.TeleportCause.END_PORTAL);
event.useTravelAgent(false);
Bukkit.getServer().getPluginManager().callEvent(event);
this.player = this.minecraftServer.getServerConfigurationManager().moveToWorld(this.player, 0, true, event.getTo());
// CraftBukkit end
2012-07-29 09:33:13 +02:00
} else if (this.player.q().getWorldData().isHardcore()) {
if (this.minecraftServer.H() && this.player.name.equals(this.minecraftServer.G())) {
this.player.netServerHandler.disconnect("You have died. Game over, man, it\'s game over!");
this.minecraftServer.O();
} else {
BanEntry banentry = new BanEntry(this.player.name);
2012-07-29 09:33:13 +02:00
banentry.setReason("Death in Hardcore");
this.minecraftServer.getServerConfigurationManager().getNameBans().add(banentry);
this.player.netServerHandler.disconnect("You have died. Game over, man, it\'s game over!");
}
} else {
if (this.player.getHealth() > 0) {
return;
}
2012-07-29 09:33:13 +02:00
this.player = this.minecraftServer.getServerConfigurationManager().moveToWorld(this.player, 0, false);
2011-11-20 09:01:14 +01:00
}
}
}
2012-07-29 09:33:13 +02:00
public boolean b() {
return true;
}
2011-05-12 16:22:52 +02:00
2012-07-29 09:33:13 +02:00
public void a(Packet9Respawn packet9respawn) {}
2012-07-29 09:33:13 +02:00
public void handleContainerClose(Packet101CloseWindow packet101closewindow) {
if (this.player.dead) return; // CraftBukkit
// CraftBukkit start - INVENTORY_CLOSE hook
InventoryCloseEvent event = new InventoryCloseEvent(this.player.activeContainer.getBukkitView());
server.getPluginManager().callEvent(event);
this.player.activeContainer.transferTo(this.player.defaultContainer, getPlayer());
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.player.l();
}
2011-01-29 22:50:29 +01:00
public void a(Packet102WindowClick packet102windowclick) {
if (this.player.dead) return; // CraftBukkit
2011-05-12 16:22:52 +02:00
2012-07-29 09:33:13 +02:00
if (this.player.activeContainer.windowId == packet102windowclick.a && this.player.activeContainer.b(this.player)) {
// CraftBukkit start - fire InventoryClickEvent
InventoryView inventory = this.player.activeContainer.getBukkitView();
2012-02-29 22:31:04 +01:00
SlotType type = CraftInventoryView.getSlotType(inventory, packet102windowclick.slot);
InventoryClickEvent event = new InventoryClickEvent(inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift);
org.bukkit.inventory.Inventory top = inventory.getTopInventory();
if (packet102windowclick.slot == 0 && top instanceof CraftingInventory) {
org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe();
if (recipe != null) {
event = new CraftItemEvent(recipe, inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift);
}
}
server.getPluginManager().callEvent(event);
ItemStack itemstack = null;
boolean defaultBehaviour = false;
switch(event.getResult()) {
case DEFAULT:
2012-02-29 22:31:04 +01:00
itemstack = this.player.activeContainer.clickItem(packet102windowclick.slot, packet102windowclick.button, packet102windowclick.shift, this.player);
defaultBehaviour = true;
break;
case DENY: // Deny any change, including changes from the event
break;
case ALLOW: // Allow changes unconditionally
org.bukkit.inventory.ItemStack cursor = event.getCursor();
if (cursor == null) {
2012-02-29 22:31:04 +01:00
this.player.inventory.setCarried((ItemStack) null);
} else {
2012-02-29 22:31:04 +01:00
this.player.inventory.setCarried(CraftItemStack.createNMSItemStack(cursor));
}
org.bukkit.inventory.ItemStack item = event.getCurrentItem();
if (item != null) {
itemstack = CraftItemStack.createNMSItemStack(item);
2012-02-29 22:31:04 +01:00
if (packet102windowclick.slot == -999) {
this.player.drop(itemstack);
} else {
2012-02-29 22:31:04 +01:00
this.player.activeContainer.getSlot(packet102windowclick.slot).set(itemstack);
}
2012-02-29 22:31:04 +01:00
} else if (packet102windowclick.slot != -999) {
this.player.activeContainer.getSlot(packet102windowclick.slot).set((ItemStack) null);
}
break;
}
// CraftBukkit end
2011-05-14 16:29:42 +02:00
2012-07-29 09:33:13 +02:00
if (ItemStack.matches(packet102windowclick.item, itemstack)) {
this.player.netServerHandler.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, true));
this.player.h = true;
2012-07-29 09:33:13 +02:00
this.player.activeContainer.b();
2012-02-29 22:31:04 +01:00
this.player.broadcastCarriedItem();
this.player.h = false;
} else {
2012-03-01 11:49:23 +01:00
this.s.a(this.player.activeContainer.windowId, Short.valueOf(packet102windowclick.d));
this.player.netServerHandler.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, false));
this.player.activeContainer.a(this.player, false);
ArrayList arraylist = new ArrayList();
2012-07-29 09:33:13 +02:00
for (int i = 0; i < this.player.activeContainer.b.size(); ++i) {
arraylist.add(((Slot) this.player.activeContainer.b.get(i)).getItem());
}
this.player.a(this.player.activeContainer, arraylist);
// CraftBukkit start - send a Set Slot to update the crafting result slot
if(type == SlotType.RESULT && itemstack != null)
this.player.netServerHandler.sendPacket((Packet) (new Packet103SetSlot(this.player.activeContainer.windowId, 0, itemstack)));
// CraftBukkit end
}
}
}
public void a(Packet108ButtonClick packet108buttonclick) {
2012-07-29 09:33:13 +02:00
if (this.player.activeContainer.windowId == packet108buttonclick.a && this.player.activeContainer.b(this.player)) {
this.player.activeContainer.a((EntityHuman) this.player, packet108buttonclick.b);
2012-07-29 09:33:13 +02:00
this.player.activeContainer.b();
2011-11-20 09:01:14 +01:00
}
}
2011-09-15 02:23:52 +02:00
public void a(Packet107SetCreativeSlot packet107setcreativeslot) {
if (this.player.itemInWorldManager.isCreative()) {
2012-02-29 22:31:04 +01:00
boolean flag = packet107setcreativeslot.slot < 0;
2011-11-20 09:01:14 +01:00
ItemStack itemstack = packet107setcreativeslot.b;
2012-07-29 09:33:13 +02:00
boolean flag1 = packet107setcreativeslot.slot >= 1 && packet107setcreativeslot.slot < 36 + PlayerInventory.getHotbarSize();
2012-02-29 22:31:04 +01:00
// CraftBukkit
boolean flag2 = itemstack == null || itemstack.id < Item.byId.length && itemstack.id >= 0 && Item.byId[itemstack.id] != null && !invalidItems.contains(itemstack.id);
2011-11-20 09:01:14 +01:00
boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0;
// CraftBukkit start - Fire INVENTORY_CLICK event
org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity();
InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer);
SlotType slot = SlotType.QUICKBAR;
2012-02-29 22:31:04 +01:00
if (packet107setcreativeslot.slot == -1) {
slot = SlotType.OUTSIDE;
}
2012-02-29 22:31:04 +01:00
InventoryClickEvent event = new InventoryClickEvent(inventory, slot, slot == SlotType.OUTSIDE ? -999 : packet107setcreativeslot.slot, false, false);
server.getPluginManager().callEvent(event);
org.bukkit.inventory.ItemStack item = event.getCurrentItem();
2012-02-29 22:31:04 +01:00
switch (event.getResult()) {
case ALLOW:
if (slot == SlotType.QUICKBAR) {
if (item == null) {
2012-02-29 22:31:04 +01:00
this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null);
} else {
2012-02-29 22:31:04 +01:00
this.player.defaultContainer.setItem(packet107setcreativeslot.slot, CraftItemStack.createNMSItemStack(item));
}
} else if (item != null) {
2012-02-29 22:31:04 +01:00
this.player.drop(CraftItemStack.createNMSItemStack(item));
2011-09-15 02:23:52 +02:00
}
2012-02-29 22:31:04 +01:00
return;
case DENY:
// TODO: Will this actually work?
2012-02-29 22:31:04 +01:00
if (packet107setcreativeslot.slot > -1) {
this.player.netServerHandler.sendPacket(new Packet103SetSlot(this.player.defaultContainer.windowId, packet107setcreativeslot.slot, CraftItemStack.createNMSItemStack(item)));
}
2012-02-29 22:31:04 +01:00
return;
case DEFAULT:
// We do the stuff below
break;
default:
return;
}
// CraftBukkit end
if (flag1 && flag2 && flag3) {
if (itemstack == null) {
this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null);
} else {
this.player.defaultContainer.setItem(packet107setcreativeslot.slot, itemstack);
}
2012-02-29 22:31:04 +01:00
this.player.defaultContainer.a(this.player, true);
2012-03-01 11:49:23 +01:00
} else if (flag && flag2 && flag3 && this.x < 200) {
this.x += 20;
EntityItem entityitem = this.player.drop(itemstack);
if (entityitem != null) {
2012-07-29 09:33:13 +02:00
entityitem.d();
2012-03-01 11:49:23 +01:00
}
2012-02-29 22:31:04 +01:00
}
2011-09-15 02:23:52 +02:00
}
}
2011-01-29 22:50:29 +01:00
public void a(Packet106Transaction packet106transaction) {
if (this.player.dead) return; // CraftBukkit
2012-03-01 11:49:23 +01:00
Short oshort = (Short) this.s.get(this.player.activeContainer.windowId);
2012-07-29 09:33:13 +02:00
if (oshort != null && packet106transaction.b == oshort.shortValue() && this.player.activeContainer.windowId == packet106transaction.a && !this.player.activeContainer.b(this.player)) {
this.player.activeContainer.a(this.player, true);
}
}
2011-01-29 22:50:29 +01:00
public void a(Packet130UpdateSign packet130updatesign) {
if (this.player.dead) return; // CraftBukkit
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
2011-05-12 16:22:52 +02:00
2011-05-26 14:48:22 +02:00
if (worldserver.isLoaded(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z)) {
TileEntity tileentity = worldserver.getTileEntity(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z);
2011-03-09 00:18:14 +01:00
if (tileentity instanceof TileEntitySign) {
TileEntitySign tileentitysign = (TileEntitySign) tileentity;
2012-07-29 09:33:13 +02:00
if (!tileentitysign.a()) {
2011-11-20 09:01:14 +01:00
this.minecraftServer.warning("Player " + this.player.name + " just tried to change non-editable sign");
this.sendPacket(new Packet130UpdateSign(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z, tileentitysign.lines)); // CraftBukkit
2011-03-09 00:18:14 +01:00
return;
}
2011-05-14 16:29:42 +02:00
}
2011-01-29 22:50:29 +01:00
2011-05-14 16:29:42 +02:00
int i;
int j;
2011-05-14 16:29:42 +02:00
for (j = 0; j < 4; ++j) {
boolean flag = true;
2011-05-14 16:29:42 +02:00
if (packet130updatesign.lines[j].length() > 15) {
flag = false;
} else {
for (i = 0; i < packet130updatesign.lines[j].length(); ++i) {
if (SharedConstants.allowedCharacters.indexOf(packet130updatesign.lines[j].charAt(i)) < 0) {
2011-05-14 16:29:42 +02:00
flag = false;
}
}
2011-05-14 16:29:42 +02:00
}
2011-01-29 22:50:29 +01:00
2011-05-14 16:29:42 +02:00
if (!flag) {
packet130updatesign.lines[j] = "!?";
}
2011-05-14 16:29:42 +02:00
}
2011-01-29 22:50:29 +01:00
2011-05-14 16:29:42 +02:00
if (tileentity instanceof TileEntitySign) {
j = packet130updatesign.x;
int k = packet130updatesign.y;
2011-05-14 16:29:42 +02:00
i = packet130updatesign.z;
TileEntitySign tileentitysign1 = (TileEntitySign) tileentity;
2011-02-23 13:56:36 +01:00
2011-05-14 16:29:42 +02:00
// CraftBukkit start
Player player = this.server.getPlayer(this.player);
SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(j, k, i), this.server.getPlayer(this.player), packet130updatesign.lines);
this.server.getPluginManager().callEvent(event);
2011-02-11 03:15:59 +01:00
2011-05-14 16:29:42 +02:00
if (!event.isCancelled()) {
for (int l = 0; l < 4; ++l) {
tileentitysign1.lines[l] = event.getLine(l);
if(tileentitysign1.lines[l] == null) {
tileentitysign1.lines[l] = "";
}
2011-05-14 16:29:42 +02:00
}
tileentitysign1.isEditable = false;
}
2011-05-14 16:29:42 +02:00
// CraftBukkit end
tileentitysign1.update();
2011-05-26 14:48:22 +02:00
worldserver.notify(j, k, i);
}
}
}
2011-04-20 22:47:26 +02:00
2011-09-15 02:23:52 +02:00
public void a(Packet0KeepAlive packet0keepalive) {
if (packet0keepalive.a == this.i) {
2011-09-15 05:13:14 +02:00
int i = (int) (System.nanoTime() / 1000000L - this.j);
2011-09-15 02:23:52 +02:00
2012-01-12 16:27:39 +01:00
this.player.ping = (this.player.ping * 3 + i) / 4;
2011-09-15 02:23:52 +02:00
}
}
2012-07-29 09:33:13 +02:00
public boolean a() {
2011-04-20 22:47:26 +02:00
return true;
}
public void a(Packet202Abilities packet202abilities) {
// CraftBukkit start
2012-07-29 09:33:13 +02:00
if (this.player.abilities.canFly && this.player.abilities.isFlying != packet202abilities.f()) {
PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packet202abilities.f());
this.server.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
2012-07-29 09:33:13 +02:00
this.player.abilities.isFlying = packet202abilities.f(); // Actually set the player's flying status
}
else {
this.player.updateAbilities(); // Tell the player their ability was reverted
}
}
// CraftBukkit end
}
2012-07-29 09:33:13 +02:00
public void a(Packet203TabComplete packet203tabcomplete) {
StringBuilder stringbuilder = new StringBuilder();
String s;
for (Iterator iterator = this.minecraftServer.a((ICommandListener) this.player, packet203tabcomplete.d()).iterator(); iterator.hasNext(); stringbuilder.append(s)) {
s = (String) iterator.next();
if (stringbuilder.length() > 0) {
stringbuilder.append('\0'); // CraftBukkit - fix decompile issue
}
}
this.player.netServerHandler.sendPacket(new Packet203TabComplete(stringbuilder.toString()));
}
public void a(Packet204LocaleAndViewDistance packet204localeandviewdistance) {
this.player.a(packet204localeandviewdistance);
}
public void a(Packet250CustomPayload packet250custompayload) {
DataInputStream datainputstream;
ItemStack itemstack;
ItemStack itemstack1;
if ("MC|BEdit".equals(packet250custompayload.tag)) {
try {
datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data));
itemstack = Packet.c(datainputstream);
if (!ItemBookAndQuill.a(itemstack.getTag())) {
throw new IOException("Invalid book tag!");
}
itemstack1 = this.player.inventory.getItemInHand();
if (itemstack != null && itemstack.id == Item.BOOK_AND_QUILL.id && itemstack.id == itemstack1.id) {
itemstack1.setTag(itemstack.getTag());
}
} catch (Exception exception) {
exception.printStackTrace();
}
} else if ("MC|BSign".equals(packet250custompayload.tag)) {
try {
2012-07-29 09:33:13 +02:00
datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data));
itemstack = Packet.c(datainputstream);
if (!ItemWrittenBook.a(itemstack.getTag())) {
throw new IOException("Invalid book tag!");
}
itemstack1 = this.player.inventory.getItemInHand();
if (itemstack != null && itemstack.id == Item.WRITTEN_BOOK.id && itemstack1.id == Item.BOOK_AND_QUILL.id) {
// CraftBukkit start
itemstack1.a("author", new NBTTagString("author", this.player.name));
itemstack1.a("title", new NBTTagString("title", itemstack.getTag().getString("title")));
itemstack1.a("pages", itemstack.getTag().getList("pages"));
// CraftBukkit end
2012-07-29 09:33:13 +02:00
itemstack1.id = Item.WRITTEN_BOOK.id;
}
} catch (Exception exception1) {
// CraftBukkit start
// exception1.printStackTrace();
// CraftBukkit end
}
} else if ("MC|TrSel".equals(packet250custompayload.tag)) {
try {
datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data));
int i = datainputstream.readInt();
Container container = this.player.activeContainer;
if (container instanceof ContainerMerchant) {
((ContainerMerchant) container).c(i);
}
} catch (Exception exception2) {
exception2.printStackTrace();
}
}
// CraftBukkit start
else if (packet250custompayload.tag.equals("REGISTER")) {
try {
String channels = new String(packet250custompayload.data, "UTF8");
for (String channel : channels.split("\0")) {
getPlayer().addChannel(channel);
}
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, "Could not parse REGISTER payload in plugin message packet", ex);
}
2012-07-29 09:33:13 +02:00
} else if (packet250custompayload.tag.equals("UNREGISTER")) {
try {
2012-07-29 09:33:13 +02:00
String channels = new String(packet250custompayload.data, "UTF8");
for (String channel : channels.split("\0")) {
getPlayer().removeChannel(channel);
}
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, "Could not parse UNREGISTER payload in plugin message packet", ex);
}
} else {
2012-07-29 09:33:13 +02:00
server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packet250custompayload.tag, packet250custompayload.data);
}
2012-07-29 09:33:13 +02:00
// CraftBukkit end
}
}