geforkt von Mirrors/Paper
#1201: Add Player#sendBlockUpdate to send tile entity updates
By: Yannick Lamprecht <yannicklamprecht@live.de>
Dieser Commit ist enthalten in:
Ursprung
ec1bb878f3
Commit
2c9bf00c5b
@ -1,10 +1,17 @@
|
|||||||
package org.bukkit.craftbukkit.block;
|
package org.bukkit.craftbukkit.block;
|
||||||
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.network.protocol.Packet;
|
||||||
|
import net.minecraft.network.protocol.game.PacketListenerPlayOut;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayOutTileEntityData;
|
||||||
import net.minecraft.world.level.block.entity.TileEntity;
|
import net.minecraft.world.level.block.entity.TileEntity;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.TileState;
|
import org.bukkit.block.TileState;
|
||||||
|
import org.bukkit.craftbukkit.util.CraftLocation;
|
||||||
import org.bukkit.persistence.PersistentDataContainer;
|
import org.bukkit.persistence.PersistentDataContainer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState implements TileState {
|
public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState implements TileState {
|
||||||
|
|
||||||
@ -105,4 +112,10 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
|
|||||||
public PersistentDataContainer getPersistentDataContainer() {
|
public PersistentDataContainer getPersistentDataContainer() {
|
||||||
return this.getSnapshot().persistentDataContainer;
|
return this.getSnapshot().persistentDataContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Packet<PacketListenerPlayOut> getUpdatePacket(@NotNull Location location) {
|
||||||
|
T vanillaTileEntitiy = (T) TileEntity.loadStatic(CraftLocation.toBlockPosition(location), getHandle(), getSnapshotNBT());
|
||||||
|
return PacketPlayOutTileEntityData.create(vanillaTileEntitiy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import org.bukkit.Location;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.SoundGroup;
|
import org.bukkit.SoundGroup;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.BlockSupport;
|
import org.bukkit.block.BlockSupport;
|
||||||
import org.bukkit.block.PistonMoveReaction;
|
import org.bukkit.block.PistonMoveReaction;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
@ -37,11 +38,13 @@ import org.bukkit.block.structure.StructureRotation;
|
|||||||
import org.bukkit.craftbukkit.CraftSoundGroup;
|
import org.bukkit.craftbukkit.CraftSoundGroup;
|
||||||
import org.bukkit.craftbukkit.CraftWorld;
|
import org.bukkit.craftbukkit.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.block.CraftBlock;
|
import org.bukkit.craftbukkit.block.CraftBlock;
|
||||||
|
import org.bukkit.craftbukkit.block.CraftBlockStates;
|
||||||
import org.bukkit.craftbukkit.block.CraftBlockSupport;
|
import org.bukkit.craftbukkit.block.CraftBlockSupport;
|
||||||
import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||||
import org.bukkit.craftbukkit.util.CraftLocation;
|
import org.bukkit.craftbukkit.util.CraftLocation;
|
||||||
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class CraftBlockData implements BlockData {
|
public class CraftBlockData implements BlockData {
|
||||||
|
|
||||||
@ -641,4 +644,10 @@ public class CraftBlockData implements BlockData {
|
|||||||
public void mirror(Mirror mirror) {
|
public void mirror(Mirror mirror) {
|
||||||
this.state = state.mirror(EnumBlockMirror.valueOf(mirror.name()));
|
this.state = state.mirror(EnumBlockMirror.valueOf(mirror.name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public BlockState createBlockState() {
|
||||||
|
return CraftBlockStates.getBlockState(this.state, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||||||
import net.minecraft.network.PacketDataSerializer;
|
import net.minecraft.network.PacketDataSerializer;
|
||||||
import net.minecraft.network.chat.IChatBaseComponent;
|
import net.minecraft.network.chat.IChatBaseComponent;
|
||||||
import net.minecraft.network.chat.PlayerChatMessage;
|
import net.minecraft.network.chat.PlayerChatMessage;
|
||||||
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.ClientboundClearTitlesPacket;
|
import net.minecraft.network.protocol.game.ClientboundClearTitlesPacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket;
|
import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket;
|
import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket;
|
||||||
@ -62,6 +63,7 @@ import net.minecraft.network.protocol.game.PacketPlayOutNamedSoundEffect;
|
|||||||
import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter;
|
import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayOutSpawnPosition;
|
import net.minecraft.network.protocol.game.PacketPlayOutSpawnPosition;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayOutStopSound;
|
import net.minecraft.network.protocol.game.PacketPlayOutStopSound;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayOutTileEntityData;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayOutUpdateAttributes;
|
import net.minecraft.network.protocol.game.PacketPlayOutUpdateAttributes;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayOutUpdateHealth;
|
import net.minecraft.network.protocol.game.PacketPlayOutUpdateHealth;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayOutWorldEvent;
|
import net.minecraft.network.protocol.game.PacketPlayOutWorldEvent;
|
||||||
@ -86,6 +88,7 @@ import net.minecraft.world.item.EnumColor;
|
|||||||
import net.minecraft.world.level.EnumGamemode;
|
import net.minecraft.world.level.EnumGamemode;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.entity.SignText;
|
import net.minecraft.world.level.block.entity.SignText;
|
||||||
|
import net.minecraft.world.level.block.entity.TileEntity;
|
||||||
import net.minecraft.world.level.block.entity.TileEntitySign;
|
import net.minecraft.world.level.block.entity.TileEntitySign;
|
||||||
import net.minecraft.world.level.block.state.IBlockData;
|
import net.minecraft.world.level.block.state.IBlockData;
|
||||||
import net.minecraft.world.level.border.IWorldBorderListener;
|
import net.minecraft.world.level.border.IWorldBorderListener;
|
||||||
@ -111,6 +114,7 @@ import org.bukkit.WorldBorder;
|
|||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.block.TileState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.sign.Side;
|
import org.bukkit.block.sign.Side;
|
||||||
import org.bukkit.configuration.serialization.DelegateDeserialization;
|
import org.bukkit.configuration.serialization.DelegateDeserialization;
|
||||||
@ -128,7 +132,9 @@ import org.bukkit.craftbukkit.CraftWorld;
|
|||||||
import org.bukkit.craftbukkit.CraftWorldBorder;
|
import org.bukkit.craftbukkit.CraftWorldBorder;
|
||||||
import org.bukkit.craftbukkit.advancement.CraftAdvancement;
|
import org.bukkit.craftbukkit.advancement.CraftAdvancement;
|
||||||
import org.bukkit.craftbukkit.advancement.CraftAdvancementProgress;
|
import org.bukkit.craftbukkit.advancement.CraftAdvancementProgress;
|
||||||
|
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
|
||||||
import org.bukkit.craftbukkit.block.CraftBlockState;
|
import org.bukkit.craftbukkit.block.CraftBlockState;
|
||||||
|
import org.bukkit.craftbukkit.block.CraftBlockStates;
|
||||||
import org.bukkit.craftbukkit.block.CraftSign;
|
import org.bukkit.craftbukkit.block.CraftSign;
|
||||||
import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
||||||
import org.bukkit.craftbukkit.conversations.ConversationTracker;
|
import org.bukkit.craftbukkit.conversations.ConversationTracker;
|
||||||
@ -705,6 +711,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
getHandle().connection.send(sign.getUpdatePacket());
|
getHandle().connection.send(sign.getUpdatePacket());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendBlockUpdate(@NotNull Location location, @NotNull TileState tileState) throws IllegalArgumentException {
|
||||||
|
Preconditions.checkArgument(location != null, "Location can not be null");
|
||||||
|
Preconditions.checkArgument(tileState != null, "TileState can not be null");
|
||||||
|
|
||||||
|
if (getHandle().connection == null) return;
|
||||||
|
|
||||||
|
CraftBlockEntityState<?> craftState = ((CraftBlockEntityState<?>) tileState);
|
||||||
|
getHandle().connection.send(craftState.getUpdatePacket(location));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendEquipmentChange(LivingEntity entity, EquipmentSlot slot, ItemStack item) {
|
public void sendEquipmentChange(LivingEntity entity, EquipmentSlot slot, ItemStack item) {
|
||||||
this.sendEquipmentChange(entity, Map.of(slot, item));
|
this.sendEquipmentChange(entity, Map.of(slot, item));
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren