geforkt von Mirrors/Paper
8d8475fc46
Also moved the application of the force parameter inside EntityHuman, to no longer allow bypassing of very essential checks.
835 Zeilen
36 KiB
Diff
835 Zeilen
36 KiB
Diff
--- a/net/minecraft/server/EntityPlayer.java
|
|
+++ b/net/minecraft/server/EntityPlayer.java
|
|
@@ -12,10 +12,28 @@
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
+// CraftBukkit start
|
|
+import com.google.common.base.Preconditions;
|
|
+import org.bukkit.Bukkit;
|
|
+import org.bukkit.GameMode;
|
|
+import org.bukkit.Location;
|
|
+import org.bukkit.WeatherType;
|
|
+import org.bukkit.craftbukkit.CraftWorld;
|
|
+import org.bukkit.craftbukkit.entity.CraftPlayer;
|
|
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
|
+import org.bukkit.event.inventory.InventoryType;
|
|
+import org.bukkit.event.player.PlayerChangedMainHandEvent;
|
|
+import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
|
+import org.bukkit.event.player.PlayerLocaleChangeEvent;
|
|
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
|
+import org.bukkit.inventory.MainHand;
|
|
+// CraftBukkit end
|
|
+
|
|
public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
|
|
private static final Logger cc = LogManager.getLogger();
|
|
- public String locale = "en_US";
|
|
+ public String locale = "en_us"; // CraftBukkit - lowercase
|
|
public PlayerConnection playerConnection;
|
|
public final MinecraftServer server;
|
|
public final PlayerInteractManager playerInteractManager;
|
|
@@ -51,6 +69,20 @@
|
|
public int ping;
|
|
public boolean viewingCredits;
|
|
|
|
+ // CraftBukkit start
|
|
+ public String displayName;
|
|
+ public IChatBaseComponent listName;
|
|
+ public org.bukkit.Location compassTarget;
|
|
+ public int newExp = 0;
|
|
+ public int newLevel = 0;
|
|
+ public int newTotalExp = 0;
|
|
+ public boolean keepLevel = false;
|
|
+ public double maxHealthCache;
|
|
+ public boolean joining = true;
|
|
+ public boolean sentListPacket = false;
|
|
+ public Integer clientViewDistance;
|
|
+ // CraftBukkit end
|
|
+
|
|
public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
|
|
super((World) worldserver, gameprofile);
|
|
playerinteractmanager.player = this;
|
|
@@ -61,8 +93,50 @@
|
|
this.cf = minecraftserver.getPlayerList().h(this);
|
|
this.Q = 1.0F;
|
|
this.a(worldserver);
|
|
+
|
|
+ // CraftBukkit start
|
|
+ this.displayName = this.getName();
|
|
+ this.canPickUpLoot = true;
|
|
+ this.maxHealthCache = this.getMaxHealth();
|
|
}
|
|
|
|
+ // Yes, this doesn't match Vanilla, but it's the best we can do for now.
|
|
+ // If this is an issue, PRs are welcome
|
|
+ public final BlockPosition getSpawnPoint(WorldServer worldserver) {
|
|
+ BlockPosition blockposition = worldserver.getSpawn();
|
|
+
|
|
+ if (worldserver.worldProvider.g() && worldserver.getWorldData().getGameType() != EnumGamemode.ADVENTURE) {
|
|
+ int i = Math.max(0, this.server.a(worldserver));
|
|
+ int j = MathHelper.floor(worldserver.getWorldBorder().b((double) blockposition.getX(), (double) blockposition.getZ()));
|
|
+
|
|
+ if (j < i) {
|
|
+ i = j;
|
|
+ }
|
|
+
|
|
+ if (j <= 1) {
|
|
+ i = 1;
|
|
+ }
|
|
+
|
|
+ int k = (i * 2 + 1) * (i * 2 + 1);
|
|
+ int l = this.r(k);
|
|
+ int i1 = (new Random()).nextInt(k);
|
|
+
|
|
+ for (int j1 = 0; j1 < k; ++j1) {
|
|
+ int k1 = (i1 + l * j1) % k;
|
|
+ int l1 = k1 % (i * 2 + 1);
|
|
+ int i2 = k1 / (i * 2 + 1);
|
|
+ BlockPosition blockposition1 = worldserver.o().a(blockposition.getX() + l1 - i, blockposition.getZ() + i2 - i, false);
|
|
+
|
|
+ if (blockposition1 != null) {
|
|
+ return blockposition1;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return blockposition;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
private void a(WorldServer worldserver) {
|
|
BlockPosition blockposition = worldserver.getSpawn();
|
|
|
|
@@ -129,6 +203,7 @@
|
|
if (nbttagcompound.hasKeyOfType("recipeBook", 10)) {
|
|
this.recipeBook.a(nbttagcompound.getCompound("recipeBook"));
|
|
}
|
|
+ this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit
|
|
|
|
}
|
|
|
|
@@ -148,7 +223,20 @@
|
|
Entity entity = this.getRootVehicle();
|
|
Entity entity1 = this.getVehicle();
|
|
|
|
- if (entity1 != null && entity != this && entity.bR()) {
|
|
+ // CraftBukkit start - handle non-persistent vehicles
|
|
+ boolean persistVehicle = true;
|
|
+ if (entity1 != null) {
|
|
+ Entity vehicle;
|
|
+ for (vehicle = entity1; vehicle != null; vehicle = vehicle.getVehicle()) {
|
|
+ if (!vehicle.persist) {
|
|
+ persistVehicle = false;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (persistVehicle && entity1 != null && entity != this && entity.bR()) {
|
|
+ // CraftBukkit end
|
|
NBTTagCompound nbttagcompound2 = new NBTTagCompound();
|
|
NBTTagCompound nbttagcompound3 = new NBTTagCompound();
|
|
|
|
@@ -159,7 +247,33 @@
|
|
}
|
|
|
|
nbttagcompound.set("recipeBook", this.recipeBook.e());
|
|
+ this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit
|
|
+ }
|
|
+
|
|
+ // CraftBukkit start - World fallback code, either respawn location or global spawn
|
|
+ public void spawnIn(World world) {
|
|
+ super.spawnIn(world);
|
|
+ if (world == null) {
|
|
+ this.dead = false;
|
|
+ BlockPosition position = null;
|
|
+ if (this.spawnWorld != null && !this.spawnWorld.equals("")) {
|
|
+ CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld);
|
|
+ if (cworld != null && this.getBed() != null) {
|
|
+ world = cworld.getHandle();
|
|
+ position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false);
|
|
+ }
|
|
+ }
|
|
+ if (world == null || position == null) {
|
|
+ world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle();
|
|
+ position = world.getSpawn();
|
|
+ }
|
|
+ this.world = world;
|
|
+ this.setPosition(position.getX() + 0.5, position.getY(), position.getZ() + 0.5);
|
|
+ }
|
|
+ this.dimension = ((WorldServer) this.world).dimension;
|
|
+ this.playerInteractManager.a((WorldServer) world);
|
|
}
|
|
+ // CraftBukkit end
|
|
|
|
public void a(int i) {
|
|
float f = (float) this.getExpToLevel();
|
|
@@ -207,6 +321,11 @@
|
|
}
|
|
|
|
public void tick() {
|
|
+ // CraftBukkit start
|
|
+ if (this.joining) {
|
|
+ this.joining = false;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
this.playerInteractManager.a();
|
|
--this.invulnerableTicks;
|
|
if (this.noDamageTicks > 0) {
|
|
@@ -272,7 +391,7 @@
|
|
}
|
|
|
|
if (this.getHealth() != this.lastHealthSent || this.lastFoodSent != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.cp) {
|
|
- this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel()));
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); // CraftBukkit
|
|
this.lastHealthSent = this.getHealth();
|
|
this.lastFoodSent = this.foodData.getFoodLevel();
|
|
this.cp = this.foodData.getSaturationLevel() == 0.0F;
|
|
@@ -303,6 +422,12 @@
|
|
this.a(IScoreboardCriteria.XP, MathHelper.f((float) this.cm));
|
|
}
|
|
|
|
+ // CraftBukkit start - Force max health updates
|
|
+ if (this.maxHealthCache != this.getMaxHealth()) {
|
|
+ this.getBukkitEntity().updateScaledHealth();
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
if (this.expLevel != this.cl) {
|
|
this.cl = this.expLevel;
|
|
this.a(IScoreboardCriteria.LEVEL, MathHelper.f((float) this.cl));
|
|
@@ -317,6 +442,16 @@
|
|
CriterionTriggers.p.a(this);
|
|
}
|
|
|
|
+ // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent
|
|
+ if (this.oldLevel == -1) {
|
|
+ this.oldLevel = this.expLevel;
|
|
+ }
|
|
+
|
|
+ if (this.oldLevel != this.expLevel) {
|
|
+ CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel);
|
|
+ this.oldLevel = this.expLevel;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
} catch (Throwable throwable) {
|
|
CrashReport crashreport = CrashReport.a(throwable, "Ticking player");
|
|
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked");
|
|
@@ -327,16 +462,48 @@
|
|
}
|
|
|
|
private void a(IScoreboardCriteria iscoreboardcriteria, int i) {
|
|
- this.getScoreboard().getObjectivesForCriteria(iscoreboardcriteria, this.getName(), (scoreboardscore) -> {
|
|
+ // CraftBukkit - Use our scores instead
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(iscoreboardcriteria, this.getName(), (scoreboardscore) -> {
|
|
scoreboardscore.setScore(i);
|
|
});
|
|
}
|
|
|
|
public void die(DamageSource damagesource) {
|
|
boolean flag = this.world.getGameRules().getBoolean("showDeathMessages");
|
|
+ // CraftBukkit start - fire PlayerDeathEvent
|
|
+ if (this.dead) {
|
|
+ return;
|
|
+ }
|
|
+ java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>(this.inventory.getSize());
|
|
+ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory") || this.isSpectator();
|
|
+
|
|
+ if (!keepInventory) {
|
|
+ for (ItemStack item : this.inventory.getContents()) {
|
|
+ if (!item.isEmpty() && !EnchantmentManager.shouldNotDrop(item)) {
|
|
+ loot.add(CraftItemStack.asCraftMirror(item));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
|
|
- if (flag) {
|
|
- IChatBaseComponent ichatbasecomponent = this.getCombatTracker().getDeathMessage();
|
|
+ IChatBaseComponent defaultMessage = this.getCombatTracker().getDeathMessage();
|
|
+
|
|
+ String deathmessage = defaultMessage.getString();
|
|
+ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory);
|
|
+
|
|
+ // SPIGOT-943 - only call if they have an inventory open
|
|
+ if (this.activeContainer != this.defaultContainer) {
|
|
+ this.closeInventory();
|
|
+ }
|
|
+
|
|
+ String deathMessage = event.getDeathMessage();
|
|
+
|
|
+ if (deathMessage != null && deathMessage.length() > 0 && flag) { // TODO: allow plugins to override?
|
|
+ IChatBaseComponent ichatbasecomponent;
|
|
+ if (deathMessage.equals(deathmessage)) {
|
|
+ ichatbasecomponent = this.getCombatTracker().getDeathMessage();
|
|
+ } else {
|
|
+ ichatbasecomponent = org.bukkit.craftbukkit.util.CraftChatMessage.fromStringOrNull(deathMessage);
|
|
+ }
|
|
|
|
this.playerConnection.a((Packet) (new PacketPlayOutCombatEvent(this.getCombatTracker(), PacketPlayOutCombatEvent.EnumCombatEventType.ENTITY_DIED, ichatbasecomponent)), (future) -> {
|
|
if (!future.isSuccess()) {
|
|
@@ -367,12 +534,16 @@
|
|
}
|
|
|
|
this.releaseShoulderEntities();
|
|
- if (!this.world.getGameRules().getBoolean("keepInventory") && !this.isSpectator()) {
|
|
- this.removeCursedItems();
|
|
- this.inventory.dropContents();
|
|
- }
|
|
+ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
|
|
+ if (!event.getKeepInventory()) {
|
|
+ this.inventory.clear();
|
|
+ }
|
|
+
|
|
+ this.setSpectatorTarget(this); // Remove spectated target
|
|
+ // CraftBukkit end
|
|
|
|
- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.DEATH_COUNT, this.getName(), ScoreboardScore::incrementScore);
|
|
+ // CraftBukkit - Get our scores instead
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.DEATH_COUNT, this.getName(), ScoreboardScore::incrementScore);
|
|
EntityLiving entityliving = this.cv();
|
|
|
|
if (entityliving != null) {
|
|
@@ -395,10 +566,12 @@
|
|
String s = this.getName();
|
|
String s1 = entity.getName();
|
|
|
|
- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.TOTAL_KILL_COUNT, s, ScoreboardScore::incrementScore);
|
|
+ // CraftBukkit - Get our scores instead
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.TOTAL_KILL_COUNT, s, ScoreboardScore::incrementScore);
|
|
if (entity instanceof EntityHuman) {
|
|
this.a(StatisticList.PLAYER_KILLS);
|
|
- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.PLAYER_KILL_COUNT, s, ScoreboardScore::incrementScore);
|
|
+ // CraftBukkit - Get our scores instead
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.PLAYER_KILL_COUNT, s, ScoreboardScore::incrementScore);
|
|
} else {
|
|
this.a(StatisticList.MOB_KILLS);
|
|
}
|
|
@@ -416,7 +589,8 @@
|
|
int i = scoreboardteam.getColor().b();
|
|
|
|
if (i >= 0 && i < aiscoreboardcriteria.length) {
|
|
- this.getScoreboard().getObjectivesForCriteria(aiscoreboardcriteria[i], s, ScoreboardScore::incrementScore);
|
|
+ // CraftBukkit - Get our scores instead
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(aiscoreboardcriteria[i], s, ScoreboardScore::incrementScore);
|
|
}
|
|
}
|
|
|
|
@@ -458,12 +632,14 @@
|
|
}
|
|
|
|
private boolean canPvP() {
|
|
- return this.server.getPVP();
|
|
+ // CraftBukkit - this.server.getPvP() -> this.world.pvpMode
|
|
+ return this.world.pvpMode;
|
|
}
|
|
|
|
@Nullable
|
|
public Entity a(DimensionManager dimensionmanager) {
|
|
- this.worldChangeInvuln = true;
|
|
+ if (this.isSleeping()) return this; // CraftBukkit - SPIGOT-3154
|
|
+ // this.worldChangeInvuln = true; // CraftBukkit - Moved down and into PlayerList#changeDimension
|
|
if (this.dimension == DimensionManager.OVERWORLD && dimensionmanager == DimensionManager.NETHER) {
|
|
this.cC = new Vec3D(this.locX, this.locY, this.locZ);
|
|
} else if (this.dimension != DimensionManager.NETHER && dimensionmanager != DimensionManager.OVERWORLD) {
|
|
@@ -471,6 +647,7 @@
|
|
}
|
|
|
|
if (this.dimension == DimensionManager.THE_END && dimensionmanager == DimensionManager.THE_END) {
|
|
+ this.worldChangeInvuln = true; // CraftBukkit - Moved down from above
|
|
this.world.kill(this);
|
|
if (!this.viewingCredits) {
|
|
this.viewingCredits = true;
|
|
@@ -484,7 +661,10 @@
|
|
dimensionmanager = DimensionManager.THE_END;
|
|
}
|
|
|
|
- this.server.getPlayerList().a(this, dimensionmanager);
|
|
+ // CraftBukkit start
|
|
+ TeleportCause cause = (this.dimension == DimensionManager.THE_END || dimensionmanager == DimensionManager.THE_END) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL;
|
|
+ this.server.getPlayerList().changeDimension(this, dimensionmanager, cause); // PAIL: check all this
|
|
+ // CraftBukkit end
|
|
this.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1032, BlockPosition.ZERO, 0, false));
|
|
this.lastSentExp = -1;
|
|
this.lastHealthSent = -1.0F;
|
|
@@ -514,7 +694,13 @@
|
|
}
|
|
|
|
public EntityHuman.EnumBedResult a(BlockPosition blockposition) {
|
|
- EntityHuman.EnumBedResult entityhuman_enumbedresult = super.a(blockposition);
|
|
+ // CraftBukkit start - add force parameter
|
|
+ return this.a(blockposition, false);
|
|
+ }
|
|
+
|
|
+ public EntityHuman.EnumBedResult a(BlockPosition blockposition, boolean force) {
|
|
+ EntityHuman.EnumBedResult entityhuman_enumbedresult = super.a(blockposition, force);
|
|
+ // CraftBukkit end
|
|
|
|
if (entityhuman_enumbedresult == EntityHuman.EnumBedResult.OK) {
|
|
this.a(StatisticList.SLEEP_IN_BED);
|
|
@@ -530,6 +716,7 @@
|
|
}
|
|
|
|
public void a(boolean flag, boolean flag1, boolean flag2) {
|
|
+ if (!this.sleeping) return; // CraftBukkit - Can't leave bed if not in one!
|
|
if (this.isSleeping()) {
|
|
this.getWorldServer().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2));
|
|
}
|
|
@@ -608,23 +795,55 @@
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition()));
|
|
}
|
|
|
|
- public void nextContainerCounter() {
|
|
+ public int nextContainerCounter() { // CraftBukkit - void -> int
|
|
this.containerCounter = this.containerCounter % 100 + 1;
|
|
+ return containerCounter; // CraftBukkit
|
|
}
|
|
|
|
public void openTileEntity(ITileEntityContainer itileentitycontainer) {
|
|
- if (itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).getLootTable() != null && this.isSpectator()) {
|
|
+ // CraftBukkit start - Inventory open hook
|
|
+ if (false && itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).getLootTable() != null && this.isSpectator()) {
|
|
this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true);
|
|
} else {
|
|
+ boolean cancelled = itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).getLootTable()!= null && this.isSpectator();
|
|
+ Container container = CraftEventFactory.callInventoryOpenEvent(this, itileentitycontainer.createContainer(this.inventory, this), cancelled);
|
|
+ if (container == null) {
|
|
+ return;
|
|
+ }
|
|
this.nextContainerCounter();
|
|
+ this.activeContainer = container;
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, itileentitycontainer.getContainerName(), itileentitycontainer.getScoreboardDisplayName()));
|
|
- this.activeContainer = itileentitycontainer.createContainer(this.inventory, this);
|
|
+ // CraftBukkit end
|
|
this.activeContainer.windowId = this.containerCounter;
|
|
this.activeContainer.addSlotListener(this);
|
|
}
|
|
}
|
|
|
|
public void openContainer(IInventory iinventory) {
|
|
+ // CraftBukkit start - Inventory open hook
|
|
+ // Copied from below
|
|
+ boolean cancelled = false;
|
|
+ if (iinventory instanceof ITileInventory) {
|
|
+ ITileInventory itileinventory = (ITileInventory) iinventory;
|
|
+ cancelled = itileinventory.isLocked() && !this.a(itileinventory.getLock()) && !this.isSpectator();
|
|
+ }
|
|
+
|
|
+ Container container;
|
|
+ if (iinventory instanceof ITileEntityContainer) {
|
|
+ if (iinventory instanceof TileEntity) {
|
|
+ Preconditions.checkArgument(((TileEntity) iinventory).getWorld() != null, "Container must have world to be opened");
|
|
+ }
|
|
+ container = ((ITileEntityContainer) iinventory).createContainer(this.inventory, this);
|
|
+ } else {
|
|
+ container = new ContainerChest(this.inventory, iinventory, this);
|
|
+ }
|
|
+ container = CraftEventFactory.callInventoryOpenEvent(this, container, cancelled);
|
|
+ if (container == null && !cancelled) { // Let pre-cancelled events fall through
|
|
+ iinventory.closeContainer(this);
|
|
+ return;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
if (iinventory instanceof ILootable && ((ILootable) iinventory).getLootTable() != null && this.isSpectator()) {
|
|
this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true);
|
|
} else {
|
|
@@ -638,18 +857,21 @@
|
|
if (itileinventory.isLocked() && !this.a(itileinventory.getLock()) && !this.isSpectator()) {
|
|
this.playerConnection.sendPacket(new PacketPlayOutChat(new ChatMessage("container.isLocked", new Object[] { iinventory.getScoreboardDisplayName()}), ChatMessageType.GAME_INFO));
|
|
this.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, this.locX, this.locY, this.locZ, 1.0F, 1.0F));
|
|
+ iinventory.closeContainer(this); // CraftBukkit
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.nextContainerCounter();
|
|
+ // CraftBukkit start
|
|
if (iinventory instanceof ITileEntityContainer) {
|
|
+ this.activeContainer = container;
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, ((ITileEntityContainer) iinventory).getContainerName(), iinventory.getScoreboardDisplayName(), iinventory.getSize()));
|
|
- this.activeContainer = ((ITileEntityContainer) iinventory).createContainer(this.inventory, this);
|
|
} else {
|
|
+ this.activeContainer = container;
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "minecraft:container", iinventory.getScoreboardDisplayName(), iinventory.getSize()));
|
|
- this.activeContainer = new ContainerChest(this.inventory, iinventory, this);
|
|
}
|
|
+ // CraftBukkit end
|
|
|
|
this.activeContainer.windowId = this.containerCounter;
|
|
this.activeContainer.addSlotListener(this);
|
|
@@ -657,14 +879,27 @@
|
|
}
|
|
|
|
public void openTrade(IMerchant imerchant) {
|
|
+ // CraftBukkit start - Inventory open hook
|
|
+ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world));
|
|
+ if (container == null) {
|
|
+ return;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
this.nextContainerCounter();
|
|
- this.activeContainer = new ContainerMerchant(this.inventory, imerchant, this.world);
|
|
- this.activeContainer.windowId = this.containerCounter;
|
|
- this.activeContainer.addSlotListener(this);
|
|
+ this.activeContainer = container; // CraftBukkit
|
|
+ // CraftBukkit start - moved down (SPIGOT-4619)
|
|
+ // this.activeContainer.windowId = this.containerCounter;
|
|
+ // this.activeContainer.addSlotListener(this);
|
|
+ // CraftBukkit end
|
|
+
|
|
InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).d();
|
|
IChatBaseComponent ichatbasecomponent = imerchant.getScoreboardDisplayName();
|
|
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "minecraft:villager", ichatbasecomponent, inventorymerchant.getSize()));
|
|
+ // CraftBukkit start
|
|
+ this.activeContainer.windowId = this.containerCounter;
|
|
+ this.activeContainer.addSlotListener(this);
|
|
+ // CraftBukkit end
|
|
MerchantRecipeList merchantrecipelist = imerchant.getOffers(this);
|
|
|
|
if (merchantrecipelist != null) {
|
|
@@ -678,13 +913,20 @@
|
|
}
|
|
|
|
public void openHorseInventory(EntityHorseAbstract entityhorseabstract, IInventory iinventory) {
|
|
+ // CraftBukkit start - Inventory open hook
|
|
+ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorseabstract, this));
|
|
+ if (container == null) {
|
|
+ iinventory.closeContainer(this);
|
|
+ return;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
if (this.activeContainer != this.defaultContainer) {
|
|
this.closeInventory();
|
|
}
|
|
|
|
this.nextContainerCounter();
|
|
this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "EntityHorse", iinventory.getScoreboardDisplayName(), iinventory.getSize(), entityhorseabstract.getId()));
|
|
- this.activeContainer = new ContainerHorse(this.inventory, iinventory, entityhorseabstract, this);
|
|
+ this.activeContainer = container; // CraftBukkit
|
|
this.activeContainer.windowId = this.containerCounter;
|
|
this.activeContainer.addSlotListener(this);
|
|
}
|
|
@@ -725,6 +967,11 @@
|
|
public void a(Container container, NonNullList<ItemStack> nonnulllist) {
|
|
this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, nonnulllist));
|
|
this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried()));
|
|
+ // CraftBukkit start - Send a Set Slot to update the crafting result slot
|
|
+ if (java.util.EnumSet.of(InventoryType.CRAFTING,InventoryType.WORKBENCH).contains(container.getBukkitView().getType())) {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem()));
|
|
+ }
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
public void setContainerData(Container container, int i, int j) {
|
|
@@ -739,6 +986,7 @@
|
|
}
|
|
|
|
public void closeInventory() {
|
|
+ CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit
|
|
this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId));
|
|
this.m();
|
|
}
|
|
@@ -772,14 +1020,14 @@
|
|
|
|
public void a(Statistic<?> statistic, int i) {
|
|
this.cg.b(this, statistic, i);
|
|
- this.getScoreboard().getObjectivesForCriteria(statistic, this.getName(), (scoreboardscore) -> {
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(statistic, this.getName(), (scoreboardscore) -> { // CraftBukkit - Get our scores instead
|
|
scoreboardscore.addScore(i);
|
|
});
|
|
}
|
|
|
|
public void a(Statistic<?> statistic) {
|
|
this.cg.setStatistic(this, statistic, 0);
|
|
- this.getScoreboard().getObjectivesForCriteria(statistic, this.getName(), ScoreboardScore::c);
|
|
+ this.world.getServer().getScoreboardManager().getScoreboardScores(statistic, this.getName(), ScoreboardScore::c); // CraftBukkit - Get our scores instead
|
|
}
|
|
|
|
public int discoverRecipes(Collection<IRecipe> collection) {
|
|
@@ -827,8 +1075,17 @@
|
|
|
|
public void triggerHealthUpdate() {
|
|
this.lastHealthSent = -1.0E8F;
|
|
+ this.lastSentExp = -1; // CraftBukkit - Added to reset
|
|
}
|
|
|
|
+ // CraftBukkit start - Support multi-line messages
|
|
+ public void sendMessage(IChatBaseComponent[] ichatbasecomponent) {
|
|
+ for (IChatBaseComponent component : ichatbasecomponent) {
|
|
+ this.sendMessage(component);
|
|
+ }
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
public void a(IChatBaseComponent ichatbasecomponent, boolean flag) {
|
|
this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent, flag ? ChatMessageType.GAME_INFO : ChatMessageType.CHAT));
|
|
}
|
|
@@ -879,7 +1136,7 @@
|
|
this.lastSentExp = -1;
|
|
this.lastHealthSent = -1.0F;
|
|
this.lastFoodSent = -1;
|
|
- this.recipeBook.a((RecipeBook) entityplayer.recipeBook);
|
|
+ // this.recipeBook.a((RecipeBook) entityplayer.recipeBook); // CraftBukkit
|
|
this.removeQueue.addAll(entityplayer.removeQueue);
|
|
this.cx = entityplayer.cx;
|
|
this.cC = entityplayer.cC;
|
|
@@ -938,6 +1195,18 @@
|
|
}
|
|
|
|
public void a(EnumGamemode enumgamemode) {
|
|
+ // CraftBukkit start
|
|
+ if (enumgamemode == this.playerInteractManager.getGameMode()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ PlayerGameModeChangeEvent event = new PlayerGameModeChangeEvent(getBukkitEntity(), GameMode.getByValue(enumgamemode.getId()));
|
|
+ world.getServer().getPluginManager().callEvent(event);
|
|
+ if (event.isCancelled()) {
|
|
+ return;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
this.playerInteractManager.setGameMode(enumgamemode);
|
|
this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, (float) enumgamemode.getId()));
|
|
if (enumgamemode == EnumGamemode.SPECTATOR) {
|
|
@@ -985,6 +1254,17 @@
|
|
}
|
|
|
|
public void a(PacketPlayInSettings packetplayinsettings) {
|
|
+ // CraftBukkit start
|
|
+ if (getMainHand() != packetplayinsettings.getMainHand()) {
|
|
+ PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(getBukkitEntity(), getMainHand() == EnumMainHand.LEFT ? MainHand.LEFT : MainHand.RIGHT);
|
|
+ this.server.server.getPluginManager().callEvent(event);
|
|
+ }
|
|
+ if (!this.locale.equals(packetplayinsettings.b())) {
|
|
+ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), packetplayinsettings.b());
|
|
+ this.server.server.getPluginManager().callEvent(event);
|
|
+ }
|
|
+ this.clientViewDistance = packetplayinsettings.viewDistance;
|
|
+ // CraftBukkit end
|
|
this.locale = packetplayinsettings.b();
|
|
this.cs = packetplayinsettings.d();
|
|
this.ct = packetplayinsettings.e();
|
|
@@ -1020,13 +1300,13 @@
|
|
if (entity instanceof EntityHuman) {
|
|
this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(new int[] { entity.getId()}));
|
|
} else {
|
|
- this.removeQueue.add(entity.getId());
|
|
+ this.removeQueue.add((Integer) entity.getId()); // CraftBukkit - decompile error
|
|
}
|
|
|
|
}
|
|
|
|
public void d(Entity entity) {
|
|
- this.removeQueue.remove(entity.getId());
|
|
+ this.removeQueue.remove((Integer) entity.getId()); // CraftBukkit - decompile error
|
|
}
|
|
|
|
protected void C() {
|
|
@@ -1050,7 +1330,7 @@
|
|
this.spectatedEntity = (Entity) (entity == null ? this : entity);
|
|
if (entity1 != this.spectatedEntity) {
|
|
this.playerConnection.sendPacket(new PacketPlayOutCamera(this.spectatedEntity));
|
|
- this.enderTeleportTo(this.spectatedEntity.locX, this.spectatedEntity.locY, this.spectatedEntity.locZ);
|
|
+ this.playerConnection.a(this.spectatedEntity.locX, this.spectatedEntity.locY, this.spectatedEntity.locZ, this.yaw, this.pitch, TeleportCause.SPECTATE); // CraftBukkit
|
|
}
|
|
|
|
}
|
|
@@ -1077,7 +1357,7 @@
|
|
|
|
@Nullable
|
|
public IChatBaseComponent getPlayerListName() {
|
|
- return null;
|
|
+ return listName; // CraftBukkit
|
|
}
|
|
|
|
public void a(EnumHand enumhand) {
|
|
@@ -1094,12 +1374,17 @@
|
|
}
|
|
|
|
public void J() {
|
|
+ if (!CraftEventFactory.callToggleGlideEvent(this, true).isCancelled()) // CraftBukkit
|
|
this.setFlag(7, true);
|
|
}
|
|
|
|
public void K() {
|
|
+ // CraftBukkit start
|
|
+ if (!CraftEventFactory.callToggleGlideEvent(this, false).isCancelled()) {
|
|
this.setFlag(7, true);
|
|
this.setFlag(7, false);
|
|
+ }
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
public AdvancementDataPlayer getAdvancementData() {
|
|
@@ -1111,9 +1396,16 @@
|
|
return this.cC;
|
|
}
|
|
|
|
+ // CraftBukkit start
|
|
public void a(WorldServer worldserver, double d0, double d1, double d2, float f, float f1) {
|
|
+ this.a(worldserver, d0, d1, d2, f, f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
|
|
+ }
|
|
+
|
|
+ public void a(WorldServer worldserver, double d0, double d1, double d2, float f, float f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) {
|
|
+ // CraftBukkit end
|
|
this.setSpectatorTarget(this);
|
|
this.stopRiding();
|
|
+ /* CraftBukkit start - replace with bukkit handling for multi-world
|
|
if (worldserver == this.world) {
|
|
this.playerConnection.a(d0, d1, d2, f, f1);
|
|
} else {
|
|
@@ -1138,6 +1430,149 @@
|
|
this.server.getPlayerList().b(this, worldserver);
|
|
this.server.getPlayerList().updateClient(this);
|
|
}
|
|
+ */
|
|
+ this.getBukkitEntity().teleport(new Location(worldserver.getWorld(), d0, d1, d2, f, f1), cause);
|
|
+ // CraftBukkit end
|
|
+
|
|
+ }
|
|
+
|
|
+ // CraftBukkit start - Add per-player time and weather.
|
|
+ public long timeOffset = 0;
|
|
+ public boolean relativeTime = true;
|
|
+
|
|
+ public long getPlayerTime() {
|
|
+ if (this.relativeTime) {
|
|
+ // Adds timeOffset to the current server time.
|
|
+ return this.world.getDayTime() + this.timeOffset;
|
|
+ } else {
|
|
+ // Adds timeOffset to the beginning of this day.
|
|
+ return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public WeatherType weather = null;
|
|
+
|
|
+ public WeatherType getPlayerWeather() {
|
|
+ return this.weather;
|
|
+ }
|
|
+
|
|
+ public void setPlayerWeather(WeatherType type, boolean plugin) {
|
|
+ if (!plugin && this.weather != null) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (plugin) {
|
|
+ this.weather = type;
|
|
+ }
|
|
+
|
|
+ if (type == WeatherType.DOWNFALL) {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0));
|
|
+ } else {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private float pluginRainPosition;
|
|
+ private float pluginRainPositionPrevious;
|
|
+
|
|
+ public void updateWeather(float oldRain, float newRain, float oldThunder, float newThunder) {
|
|
+ if (this.weather == null) {
|
|
+ // Vanilla
|
|
+ if (oldRain != newRain) {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, newRain));
|
|
+ }
|
|
+ } else {
|
|
+ // Plugin
|
|
+ if (pluginRainPositionPrevious != pluginRainPosition) {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, pluginRainPosition));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (oldThunder != newThunder) {
|
|
+ if (weather == WeatherType.DOWNFALL || weather == null) {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, newThunder));
|
|
+ } else {
|
|
+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, 0));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void tickWeather() {
|
|
+ if (this.weather == null) return;
|
|
+
|
|
+ pluginRainPositionPrevious = pluginRainPosition;
|
|
+ if (weather == WeatherType.DOWNFALL) {
|
|
+ pluginRainPosition += 0.01;
|
|
+ } else {
|
|
+ pluginRainPosition -= 0.01;
|
|
+ }
|
|
+
|
|
+ pluginRainPosition = MathHelper.a(pluginRainPosition, 0.0F, 1.0F);
|
|
+ }
|
|
+
|
|
+ public void resetPlayerWeather() {
|
|
+ this.weather = null;
|
|
+ this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public String toString() {
|
|
+ return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")";
|
|
+ }
|
|
+
|
|
+ // SPIGOT-1903, MC-98153
|
|
+ public void forceSetPositionRotation(double x, double y, double z, float yaw, float pitch) {
|
|
+ this.setPositionRotation(x, y, z, yaw, pitch);
|
|
+ this.playerConnection.syncPosition();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected boolean isFrozen() {
|
|
+ return super.isFrozen() || !getBukkitEntity().isOnline();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Scoreboard getScoreboard() {
|
|
+ return getBukkitEntity().getScoreboard().getHandle();
|
|
+ }
|
|
+
|
|
+ public void reset() {
|
|
+ float exp = 0;
|
|
+ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory");
|
|
+
|
|
+ if (this.keepLevel || keepInventory) {
|
|
+ exp = this.exp;
|
|
+ this.newTotalExp = this.expTotal;
|
|
+ this.newLevel = this.expLevel;
|
|
+ }
|
|
+
|
|
+ this.setHealth(this.getMaxHealth());
|
|
+ this.fireTicks = 0;
|
|
+ this.fallDistance = 0;
|
|
+ this.foodData = new FoodMetaData(this);
|
|
+ this.expLevel = this.newLevel;
|
|
+ this.expTotal = this.newTotalExp;
|
|
+ this.exp = 0;
|
|
+ this.deathTicks = 0;
|
|
+ this.setArrowCount(0);
|
|
+ this.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DEATH);
|
|
+ this.updateEffects = true;
|
|
+ this.activeContainer = this.defaultContainer;
|
|
+ this.killer = null;
|
|
+ this.lastDamager = null;
|
|
+ this.combatTracker = new CombatTracker(this);
|
|
+ this.lastSentExp = -1;
|
|
+ if (this.keepLevel || keepInventory) {
|
|
+ this.exp = exp;
|
|
+ } else {
|
|
+ this.giveExp(this.newExp);
|
|
+ }
|
|
+ this.keepLevel = false;
|
|
+ }
|
|
|
|
+ @Override
|
|
+ public CraftPlayer getBukkitEntity() {
|
|
+ return (CraftPlayer) super.getBukkitEntity();
|
|
}
|
|
+ // CraftBukkit end
|
|
}
|