Implement ReverseClonner, which should fix all issues with teleportation/inventories/crashed after respawning
This commit is contained in:
@ -381,7 +381,7 @@
|
||||
public EntityPlayerMP createPlayerForUser(GameProfile p_148545_1_)
|
||||
{
|
||||
UUID uuid = EntityPlayer.func_146094_a(p_148545_1_);
|
||||
@@ -410,80 +620,200 @@
|
||||
@@ -410,80 +620,199 @@
|
||||
return new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(0), p_148545_1_, (ItemInWorldManager)object);
|
||||
}
|
||||
|
||||
@ -451,10 +451,10 @@
|
||||
+ // Cauldron start - refactor entire method for sanity.
|
||||
+ public EntityPlayerMP respawnPlayer(EntityPlayerMP par1EntityPlayerMP, int par2, boolean par3)
|
||||
+ {
|
||||
+ return this.respawnPlayer(par1EntityPlayerMP, par2, par3, null, TeleportCause.DEATH);
|
||||
+ return this.respawnPlayer(par1EntityPlayerMP, par2, par3 ? TeleportCause.END_PORTAL : TeleportCause.UNKNOWN, null);
|
||||
+ }
|
||||
+
|
||||
+ public EntityPlayerMP respawnPlayer(EntityPlayerMP par1EntityPlayerMP, int targetDimension, boolean returnFromEnd, Location location, TeleportCause cause)
|
||||
+ public EntityPlayerMP respawnPlayer(EntityPlayerMP par1EntityPlayerMP, int targetDimension, TeleportCause cause, Location location)
|
||||
+ {
|
||||
+ // Phase 1 - check if the player is allowed to respawn in same dimension
|
||||
+ World world = mcServer.worldServerForDimension(targetDimension);
|
||||
@ -470,7 +470,7 @@
|
||||
+ }
|
||||
+
|
||||
+ // Phase 2 - handle return from End
|
||||
+ if (returnFromEnd)
|
||||
+ if (cause == TeleportCause.END_PORTAL)
|
||||
+ {
|
||||
+ WorldServer exitWorld = this.mcServer.worldServerForDimension(targetDimension);
|
||||
+ Location enter = par1EntityPlayerMP.getBukkitEntity().getLocation();
|
||||
@ -488,7 +488,7 @@
|
||||
+ Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
+ if (event.isCancelled() || event.getTo() == null)
|
||||
+ {
|
||||
+ return par1EntityPlayerMP;
|
||||
+ return null;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
@ -504,9 +504,8 @@
|
||||
+ boolean spawnForced = par1EntityPlayerMP.isSpawnForced(targetDimension);
|
||||
+ par1EntityPlayerMP.dimension = targetDimension;
|
||||
+ // CraftBukkit start
|
||||
+ EntityPlayerMP entityplayermp1 = par1EntityPlayerMP;
|
||||
+ EntityPlayerMP entityplayermp1 = kcauldron.ReverseClonner.clone(par1EntityPlayerMP, cause == TeleportCause.DEATH);
|
||||
+ entityplayermp1.setWorld(this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension)); // make sure to update reference for bed spawn logic
|
||||
+ MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerEvent.Clone(entityplayermp1, entityplayermp1, cause == TeleportCause.DEATH));
|
||||
+ entityplayermp1.playerConqueredTheEnd = false;
|
||||
ChunkCoordinates chunkcoordinates1;
|
||||
+ boolean isBedSpawn = false;
|
||||
@ -614,7 +613,7 @@
|
||||
entityplayermp1.setHealth(entityplayermp1.getHealth());
|
||||
- FMLCommonHandler.instance().firePlayerRespawnEvent(entityplayermp1);
|
||||
+ // If world changed then fire the appropriate change world event else respawn
|
||||
+ if (fromWorld != location.getWorld())
|
||||
+ if (fromWorld != location.getWorld() && cause != TeleportCause.DEATH)
|
||||
+ FMLCommonHandler.instance().firePlayerChangedDimensionEvent(entityplayermp1, ((CraftWorld) fromWorld).getHandle().provider.dimensionId,
|
||||
+ ((CraftWorld) location.getWorld()).getHandle().provider.dimensionId, (CraftWorld) fromWorld); // Cauldron - fire forge changed dimension event
|
||||
+ else
|
||||
@ -622,7 +621,7 @@
|
||||
return entityplayermp1;
|
||||
}
|
||||
|
||||
@@ -492,34 +822,112 @@
|
||||
@@ -492,34 +821,112 @@
|
||||
transferPlayerToDimension(p_72356_1_, p_72356_2_, mcServer.worldServerForDimension(p_72356_2_).getDefaultTeleporter());
|
||||
}
|
||||
|
||||
@ -754,7 +753,7 @@
|
||||
}
|
||||
|
||||
public void transferEntityToWorld(Entity p_82448_1_, int p_82448_2_, WorldServer p_82448_3_, WorldServer p_82448_4_, Teleporter teleporter)
|
||||
@@ -605,6 +1013,109 @@
|
||||
@@ -605,6 +1012,109 @@
|
||||
p_82448_1_.setWorld(p_82448_4_);
|
||||
}
|
||||
|
||||
@ -864,7 +863,7 @@
|
||||
public void sendPlayerInfoToAllPlayers()
|
||||
{
|
||||
if (++this.playerPingIndex > 600)
|
||||
@@ -612,11 +1123,13 @@
|
||||
@@ -612,11 +1122,13 @@
|
||||
this.playerPingIndex = 0;
|
||||
}
|
||||
|
||||
@ -878,7 +877,7 @@
|
||||
}
|
||||
|
||||
public void sendPacketToAllPlayers(Packet p_148540_1_)
|
||||
@@ -877,13 +1390,24 @@
|
||||
@@ -877,13 +1389,24 @@
|
||||
for (int j = 0; j < this.playerEntityList.size(); ++j)
|
||||
{
|
||||
EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(j);
|
||||
@ -905,7 +904,7 @@
|
||||
if (d4 * d4 + d5 * d5 + d6 * d6 < p_148543_8_ * p_148543_8_)
|
||||
{
|
||||
entityplayermp.playerNetServerHandler.sendPacket(p_148543_11_);
|
||||
@@ -941,13 +1465,16 @@
|
||||
@@ -941,13 +1464,16 @@
|
||||
p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(1, 0.0F));
|
||||
p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(7, p_72354_2_.getRainStrength(1.0F)));
|
||||
p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(8, p_72354_2_.getWeightedThunderStrength(1.0F)));
|
||||
@ -923,7 +922,7 @@
|
||||
p_72385_1_.playerNetServerHandler.sendPacket(new S09PacketHeldItemChange(p_72385_1_.inventory.currentItem));
|
||||
}
|
||||
|
||||
@@ -961,9 +1488,17 @@
|
||||
@@ -961,9 +1487,17 @@
|
||||
return this.maxPlayers;
|
||||
}
|
||||
|
||||
@ -942,7 +941,7 @@
|
||||
}
|
||||
|
||||
public void setWhiteListEnabled(boolean p_72371_1_)
|
||||
@@ -1032,12 +1567,30 @@
|
||||
@@ -1032,12 +1566,30 @@
|
||||
|
||||
public void removeAllPlayers()
|
||||
{
|
||||
|
Reference in New Issue
Block a user