Minecraft 1.21 & Fixes #59
This commit is contained in:
1 parent
b33c0f1eee
commit
3cb325a200
38 files changed
+424
-147
No files matched your search
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_16</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_16_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -213,14 +212,14 @@ public class V1_16 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.server.v1_16_R1.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.server.v1_16_R1.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata();
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_16_2</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_16_R2.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -213,14 +212,14 @@ public class V1_16_2 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.server.v1_16_R2.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.server.v1_16_R2.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata();
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_16_4</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_16_R3.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -213,14 +212,14 @@ public class V1_16_4 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.server.v1_16_R3.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.server.v1_16_R3.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata();
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_17</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_17_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -200,14 +199,14 @@ public class V1_17 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.world.item.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.world.item.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = (PacketPlayOutEntityMetadata) UnsafeAccessor.getUnsafe().allocateInstance(PacketPlayOutEntityMetadata.class);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_18</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_18_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_18_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_18_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -200,14 +199,14 @@ public class V1_18 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.world.item.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.world.item.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = (PacketPlayOutEntityMetadata) UnsafeAccessor.getUnsafe().allocateInstance(PacketPlayOutEntityMetadata.class);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_18_2</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_18_R2.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_18_R2.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -200,14 +199,14 @@ public class V1_18_2 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.world.item.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.world.item.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = (PacketPlayOutEntityMetadata) UnsafeAccessor.getUnsafe().allocateInstance(PacketPlayOutEntityMetadata.class);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_19</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_19_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_19_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -200,14 +199,14 @@ public class V1_19 extends NMSWrapper {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
try {
|
||||
nmsItemFrameItemStackDataWatcherField.setAccessible(true);
|
||||
DataWatcherObject<net.minecraft.world.item.ItemStack> dataWatcherObject = (DataWatcherObject<net.minecraft.world.item.ItemStack>) nmsItemFrameItemStackDataWatcherField.get(null);
|
||||
List<DataWatcher.Item<?>> dataWatchers = Collections.singletonList(new DataWatcher.Item<>(dataWatcherObject, CraftItemStack.asNMSCopy(itemStack)));
|
||||
PacketPlayOutEntityMetadata packet = (PacketPlayOutEntityMetadata) UnsafeAccessor.getUnsafe().allocateInstance(PacketPlayOutEntityMetadata.class);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, itemFrame.getEntityId());
|
||||
nmsPacketPlayOutEntityMetadataFields[0].setInt(packet, entityId);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].setAccessible(true);
|
||||
nmsPacketPlayOutEntityMetadataFields[1].set(packet, dataWatchers);
|
||||
return packet;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_19_3</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_19_R2.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_19_R2.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_19_R2.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -193,9 +192,9 @@ public class V1_19_3 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.b<?>> dataWatchers = Collections.singletonList(DataWatcher.b.a(EntityItemFrame.ao, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_19_4</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_19_R3.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_19_R3.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_19_R3.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -193,9 +192,9 @@ public class V1_19_4 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.b<?>> dataWatchers = Collections.singletonList(DataWatcher.b.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_20</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_20_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -193,9 +192,9 @@ public class V1_20 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.b<?>> dataWatchers = Collections.singletonList(DataWatcher.b.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_20_2</artifactId>
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.bukkit.craftbukkit.v1_20_R2.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_20_R2.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_20_R2.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -193,9 +192,9 @@ public class V1_20_2 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.b<?>> dataWatchers = Collections.singletonList(DataWatcher.b.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_20_3</artifactId>
|
||||
|
||||
@@ -48,7 +48,6 @@ import org.bukkit.craftbukkit.v1_20_R3.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_20_R3.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_20_R3.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -173,9 +172,9 @@ public class V1_20_3 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.b<?>> dataWatchers = Collections.singletonList(DataWatcher.b.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_20_5</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_20_R4.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -181,9 +180,9 @@ public class V1_20_5 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.c<?>> dataWatchers = Collections.singletonList(DataWatcher.c.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_20_6</artifactId>
|
||||
|
||||
@@ -55,7 +55,6 @@ import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_20_R4.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -181,9 +180,9 @@ public class V1_20_6 extends NMSWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack) {
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.c<?>> dataWatchers = Collections.singletonList(DataWatcher.c.a(EntityItemFrame.g, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(itemFrame.getEntityId(), dataWatchers);
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-V1_21</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.21-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>craftbukkit</artifactId>
|
||||
<version>1.21-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Abstraction</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,227 @@
|
||||
/*
|
||||
* This file is part of ImageFrame.
|
||||
*
|
||||
* Copyright (C) 2024. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2024. Contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.loohp.imageframe.nms;
|
||||
|
||||
import com.loohp.imageframe.objectholders.CombinedMapItemInfo;
|
||||
import com.loohp.imageframe.objectholders.MutablePair;
|
||||
import com.loohp.imageframe.utils.ReflectionUtils;
|
||||
import com.loohp.imageframe.utils.UUIDUtils;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.component.DataComponents;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.chat.IChatBaseComponent;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutMap;
|
||||
import net.minecraft.network.syncher.DataWatcher;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.level.WorldServer;
|
||||
import net.minecraft.world.entity.decoration.EntityItemFrame;
|
||||
import net.minecraft.world.entity.player.EntityHuman;
|
||||
import net.minecraft.world.item.component.CustomData;
|
||||
import net.minecraft.world.level.saveddata.maps.MapDecorationType;
|
||||
import net.minecraft.world.level.saveddata.maps.MapIcon;
|
||||
import net.minecraft.world.level.saveddata.maps.MapId;
|
||||
import net.minecraft.world.level.saveddata.maps.PersistentIdCounts;
|
||||
import net.minecraft.world.level.saveddata.maps.WorldMap;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapCursor;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapView;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.map.RenderData;
|
||||
import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
import org.bukkit.map.MapView;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class V1_21 extends NMSWrapper {
|
||||
|
||||
private final Field craftMapViewWorldMapField;
|
||||
private final Field persistentIdCountsUsedAuxIdsField;
|
||||
|
||||
public V1_21() {
|
||||
try {
|
||||
craftMapViewWorldMapField = CraftMapView.class.getDeclaredField("worldMap");
|
||||
persistentIdCountsUsedAuxIdsField = ReflectionUtils.findDeclaredField(PersistentIdCounts.class, Object2IntMap.class, "usedAuxIds", "b");
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public WorldMap getWorldMap(MapView mapView) {
|
||||
try {
|
||||
CraftMapView craftMapView = (CraftMapView) mapView;
|
||||
craftMapViewWorldMapField.setAccessible(true);
|
||||
return (WorldMap) craftMapViewWorldMapField.get(craftMapView);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColors(MapView mapView, byte[] colors) {
|
||||
if (colors.length != COLOR_ARRAY_LENGTH) {
|
||||
throw new IllegalArgumentException("colors array length must be " + COLOR_ARRAY_LENGTH);
|
||||
}
|
||||
WorldMap nmsWorldMap = getWorldMap(mapView);
|
||||
nmsWorldMap.g = colors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Player> getViewers(MapView mapView) {
|
||||
WorldMap nmsWorldMap = getWorldMap(mapView);
|
||||
Map<EntityHuman, WorldMap.WorldMapHumanTracker> humansMap = nmsWorldMap.p;
|
||||
return humansMap.keySet().stream().map(e -> (Player) e.getBukkitEntity()).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapIcon toNMSMapIcon(MapCursor mapCursor) {
|
||||
Holder<MapDecorationType> decorationTypeHolder = toNMSMapIconType(mapCursor.getType());
|
||||
IChatBaseComponent iChat = CraftChatMessage.fromStringOrNull(mapCursor.getCaption());
|
||||
return new MapIcon(decorationTypeHolder, mapCursor.getX(), mapCursor.getY(), mapCursor.getDirection(), Optional.ofNullable(iChat));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Holder<MapDecorationType> toNMSMapIconType(MapCursor.Type type) {
|
||||
return CraftMapCursor.CraftType.bukkitToMinecraftHolder(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRenderOnFrame(MapCursor.Type type) {
|
||||
Holder<MapDecorationType> decorationTypeHolder = toNMSMapIconType(type);
|
||||
return decorationTypeHolder.a().c();
|
||||
}
|
||||
|
||||
@SuppressWarnings({"deprecation", "unchecked"})
|
||||
@Override
|
||||
public MapView getMapOrCreateMissing(World world, int id) {
|
||||
try {
|
||||
MapView mapView = Bukkit.getMap(id);
|
||||
if (mapView != null) {
|
||||
return mapView;
|
||||
}
|
||||
persistentIdCountsUsedAuxIdsField.setAccessible(true);
|
||||
Location spawnLocation = world.getSpawnLocation();
|
||||
WorldServer worldServer = ((CraftWorld) world).getHandle();
|
||||
ResourceKey<net.minecraft.world.level.World> worldTypeKey = worldServer.af();
|
||||
WorldMap worldMap = WorldMap.a(spawnLocation.getX(), spawnLocation.getZ(), (byte) 3, false, false, worldTypeKey);
|
||||
MapId mapId = new MapId(id);
|
||||
worldServer.a(mapId, worldMap);
|
||||
PersistentIdCounts persistentIdCounts = worldServer.o().I().u().a(PersistentIdCounts.a(), PersistentIdCounts.a);
|
||||
Object2IntMap<String> usedAuxIds = (Object2IntMap<String>) persistentIdCountsUsedAuxIdsField.get(persistentIdCounts);
|
||||
int freeAuxValue = usedAuxIds.getInt("map");
|
||||
if (freeAuxValue < id) {
|
||||
usedAuxIds.put("map", id);
|
||||
persistentIdCounts.c();
|
||||
}
|
||||
return Bukkit.getMap(id);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutablePair<byte[], ArrayList<MapCursor>> bukkitRenderMap(MapView mapView, Player player) {
|
||||
CraftMapView craftMapView = (CraftMapView) mapView;
|
||||
CraftPlayer craftPlayer = (CraftPlayer) player;
|
||||
RenderData renderData = craftMapView.render(craftPlayer);
|
||||
return new MutablePair<>(renderData.buffer, renderData.cursors);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Player> getEntityTrackers(Entity entity) {
|
||||
return new HashSet<>(entity.getTrackedBy());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutMap createMapPacket(int mapId, byte[] colors, Collection<MapCursor> cursors) {
|
||||
List<MapIcon> mapIcons = cursors == null ? null : cursors.stream().map(this::toNMSMapIcon).collect(Collectors.toList());
|
||||
WorldMap.b b = colors == null ? null : new WorldMap.b(0, 0, 128, 128, colors);
|
||||
return new PacketPlayOutMap(new MapId(mapId), (byte) 0, false, Optional.ofNullable(mapIcons), Optional.ofNullable(b));
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPlayOutEntityMetadata createItemFrameItemChangePacket(int entityId, ItemStack itemStack) {
|
||||
List<DataWatcher.c<?>> dataWatchers = Collections.singletonList(DataWatcher.c.a(EntityItemFrame.f, CraftItemStack.asNMSCopy(itemStack)));
|
||||
return new PacketPlayOutEntityMetadata(entityId, dataWatchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Player player, Object packet) {
|
||||
((CraftPlayer) player).getHandle().c.sendPacket((Packet<?>) packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CombinedMapItemInfo getCombinedMapItemInfo(ItemStack itemStack) {
|
||||
net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
|
||||
CustomData customData = nmsItemStack.a(DataComponents.b);
|
||||
if (customData == null) {
|
||||
return null;
|
||||
}
|
||||
NBTTagCompound tag = customData.c();
|
||||
if (!tag.e(CombinedMapItemInfo.KEY)) {
|
||||
return null;
|
||||
}
|
||||
int imageMapIndex = tag.h(CombinedMapItemInfo.KEY);
|
||||
if (!tag.e(CombinedMapItemInfo.PLACEMENT_UUID_KEY) || !tag.e(CombinedMapItemInfo.PLACEMENT_YAW_KEY)) {
|
||||
return new CombinedMapItemInfo(imageMapIndex);
|
||||
}
|
||||
float yaw = tag.j(CombinedMapItemInfo.PLACEMENT_YAW_KEY);
|
||||
UUID uuid = UUIDUtils.fromIntArray(tag.n(CombinedMapItemInfo.PLACEMENT_UUID_KEY));
|
||||
return new CombinedMapItemInfo(imageMapIndex, new CombinedMapItemInfo.PlacementInfo(yaw, uuid));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack withCombinedMapItemInfo(ItemStack itemStack, CombinedMapItemInfo combinedMapItemInfo) {
|
||||
net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
|
||||
CustomData customData = nmsItemStack.a(DataComponents.b, CustomData.a);
|
||||
NBTTagCompound tag = customData.c();
|
||||
tag.a(CombinedMapItemInfo.KEY, combinedMapItemInfo.getImageMapIndex());
|
||||
if (combinedMapItemInfo.hasPlacement()) {
|
||||
CombinedMapItemInfo.PlacementInfo placement = combinedMapItemInfo.getPlacement();
|
||||
tag.a(CombinedMapItemInfo.PLACEMENT_YAW_KEY, placement.getYaw());
|
||||
tag.a(CombinedMapItemInfo.PLACEMENT_UUID_KEY, UUIDUtils.toIntArray(placement.getUniqueId()));
|
||||
}
|
||||
nmsItemStack.b(DataComponentPatch.a().a(DataComponents.b, CustomData.a(tag)).a());
|
||||
return CraftItemStack.asCraftMirror(nmsItemStack);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ImageFrame-Abstraction</artifactId>
|
||||
|
||||
@@ -24,7 +24,6 @@ import com.loohp.imageframe.objectholders.CombinedMapItemInfo;
|
||||
import com.loohp.imageframe.objectholders.MutablePair;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapCursor;
|
||||
@@ -57,7 +56,7 @@ public abstract class NMSWrapper {
|
||||
|
||||
public abstract Object createMapPacket(int mapId, byte[] colors, Collection<MapCursor> cursors);
|
||||
|
||||
public abstract Object createItemFrameItemChangePacket(ItemFrame itemFrame, ItemStack itemStack);
|
||||
public abstract Object createItemFrameItemChangePacket(int entityId, ItemStack itemStack);
|
||||
|
||||
public abstract void sendPacket(Player player, Object packet);
|
||||
|
||||
|
||||
+9
-3
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>ImageFrame</name>
|
||||
@@ -236,13 +236,13 @@
|
||||
<dependency>
|
||||
<groupId>dev.folia</groupId>
|
||||
<artifactId>folia-api</artifactId>
|
||||
<version>1.20.4-R0.1-SNAPSHOT</version>
|
||||
<version>1.20.6-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.20.6-R0.1-SNAPSHOT</version>
|
||||
<version>1.21-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -341,5 +341,11 @@
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-V1_21</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
+84
-74
@@ -51,12 +51,12 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -65,12 +65,12 @@ import java.util.concurrent.TimeoutException;
|
||||
|
||||
public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
|
||||
private final Map<ItemFrame, Holder<AnimationData>> itemFrames;
|
||||
private final Map<UUID, TrackedItemFrameData> itemFrames;
|
||||
private final Map<Player, Set<Integer>> knownMapIds;
|
||||
private final Map<Player, Set<Integer>> pendingKnownMapIds;
|
||||
|
||||
public AnimatedFakeMapManager() {
|
||||
this.itemFrames = Collections.synchronizedMap(new IdentityHashMap<>());
|
||||
this.itemFrames = new ConcurrentHashMap<>();
|
||||
this.knownMapIds = new ConcurrentHashMap<>();
|
||||
this.pendingKnownMapIds = new ConcurrentHashMap<>();
|
||||
Scheduler.runTaskTimerAsynchronously(ImageFrame.plugin, this, 0, 1);
|
||||
@@ -89,21 +89,12 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
private Map<ItemFrame, ItemFrameInfo> buildAllItemFrameInfo(Set<Map.Entry<ItemFrame, Holder<AnimationData>>> dataToProcess, boolean async) {
|
||||
// DO NOT USE DIRECTLY - Use the synchronized map in this method and return the unmodifiable map
|
||||
IdentityHashMap<ItemFrame, ItemFrameInfo> identityMap = new IdentityHashMap<>();
|
||||
// Allows for safe async insertion
|
||||
Map<ItemFrame, ItemFrameInfo> syncMap = Collections.synchronizedMap(identityMap);
|
||||
|
||||
// Our list of futures that need to complete before returning
|
||||
List<CompletableFuture<ItemFrameInfo>> futures = new ArrayList<>();
|
||||
Map<CompletableFuture<ItemFrameInfo>, ItemFrame> localReverseMap = new HashMap<>();
|
||||
|
||||
for (Map.Entry<ItemFrame, Holder<AnimationData>> entry : dataToProcess) {
|
||||
ItemFrame itemFrame = entry.getKey();
|
||||
private Map<UUID, CompletableFuture<ItemFrameInfo>> collectItemFramesInfo(boolean async) {
|
||||
Map<UUID, CompletableFuture<ItemFrameInfo>> futures = new HashMap<>();
|
||||
for (Map.Entry<UUID, TrackedItemFrameData> entry : itemFrames.entrySet()) {
|
||||
UUID uuid = entry.getKey();
|
||||
ItemFrame itemFrame = entry.getValue().getItemFrame();
|
||||
CompletableFuture<ItemFrameInfo> future = new CompletableFuture<>();
|
||||
|
||||
// Collect frame info
|
||||
Runnable task = () -> {
|
||||
try {
|
||||
if (itemFrame.isValid()) {
|
||||
@@ -118,9 +109,7 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
} else {
|
||||
trackedPlayers = NMS.getInstance().getEntityTrackers(itemFrame);
|
||||
}
|
||||
ItemFrameInfo frameInfo = new ItemFrameInfo(trackedPlayers, itemFrame.getItem());
|
||||
syncMap.put(itemFrame, frameInfo);
|
||||
future.complete(frameInfo);
|
||||
future.complete(new ItemFrameInfo(itemFrame.getEntityId(), trackedPlayers, itemFrame.getItem()));
|
||||
} else {
|
||||
future.complete(null);
|
||||
}
|
||||
@@ -128,53 +117,47 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
future.completeExceptionally(e);
|
||||
}
|
||||
};
|
||||
|
||||
if (async) {
|
||||
task.run(); // We're already async
|
||||
task.run();
|
||||
} else {
|
||||
Scheduler.executeOrScheduleSync(ImageFrame.plugin, task, itemFrame); // Execute on entity's thread
|
||||
Scheduler.executeOrScheduleSync(ImageFrame.plugin, task, itemFrame);
|
||||
}
|
||||
|
||||
futures.add(future);
|
||||
localReverseMap.put(future, itemFrame);
|
||||
futures.put(uuid, future);
|
||||
}
|
||||
|
||||
// Wait for all futures to complete
|
||||
futures.parallelStream().forEach(future -> {
|
||||
try {
|
||||
// Max wait time is 2 seconds per frame
|
||||
future.get(2, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException | TimeoutException | ExecutionException e) {
|
||||
new RuntimeException("Failed to get item frame info for an item frame! Removing from cache...", e).printStackTrace();
|
||||
ItemFrame itemFrame = localReverseMap.get(future);
|
||||
if (itemFrame != null) itemFrames.remove(itemFrame);
|
||||
}
|
||||
});
|
||||
|
||||
// Prevent modification of the returned map
|
||||
return Collections.unmodifiableMap(identityMap);
|
||||
return futures;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
Map<ItemFrame, ItemFrameInfo> entityTrackers = buildAllItemFrameInfo(itemFrames.entrySet(), !ImageFrame.handleAnimatedMapsOnMainThread);
|
||||
Map<UUID, CompletableFuture<ItemFrameInfo>> entityTrackers = collectItemFramesInfo(!ImageFrame.handleAnimatedMapsOnMainThread);
|
||||
Map<Player, List<FakeItemUtils.ItemFrameUpdateData>> updateData = new HashMap<>();
|
||||
for (Map.Entry<ItemFrame, ItemFrameInfo> entry : entityTrackers.entrySet()) {
|
||||
ItemFrame itemFrame = entry.getKey();
|
||||
ItemFrameInfo frameInfo = entry.getValue();
|
||||
|
||||
Set<Player> players = frameInfo.getTrackedPlayers();
|
||||
ItemStack itemStack = frameInfo.getItemStack();
|
||||
|
||||
Holder<AnimationData> holder = itemFrames.get(itemFrame);
|
||||
if (holder == null) {
|
||||
long deadline = System.currentTimeMillis() + 2000;
|
||||
for (Map.Entry<UUID, CompletableFuture<ItemFrameInfo>> entry : entityTrackers.entrySet()) {
|
||||
UUID uuid = entry.getKey();
|
||||
ItemFrameInfo frameInfo;
|
||||
try {
|
||||
frameInfo = entry.getValue().get(Math.max(0, deadline - System.currentTimeMillis()), TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException | ExecutionException | TimeoutException e) {
|
||||
frameInfo = null;
|
||||
}
|
||||
if (frameInfo == null) {
|
||||
itemFrames.remove(uuid);
|
||||
continue;
|
||||
}
|
||||
|
||||
AnimationData animationData = holder.getValue();
|
||||
int entityId = frameInfo.getEntityId();
|
||||
Set<Player> players = frameInfo.getTrackedPlayers();
|
||||
ItemStack itemStack = frameInfo.getItemStack();
|
||||
|
||||
TrackedItemFrameData data = itemFrames.get(uuid);
|
||||
if (data == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
AnimationData animationData = data.getAnimationData();
|
||||
MapView mapView = MapUtils.getItemMapView(itemStack);
|
||||
|
||||
if (mapView == null) {
|
||||
holder.setValue(AnimationData.EMPTY);
|
||||
data.setAnimationData(AnimationData.EMPTY);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -182,23 +165,23 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
ImageMap map = ImageFrame.imageMapManager.getFromMapView(mapView);
|
||||
if (map == null || !map.requiresAnimationService()) {
|
||||
if (!animationData.isEmpty()) {
|
||||
holder.setValue(AnimationData.EMPTY);
|
||||
data.setAnimationData(AnimationData.EMPTY);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
holder.setValue(animationData = new AnimationData(map, mapView, map.getMapViews().indexOf(mapView)));
|
||||
data.setAnimationData(animationData = new AnimationData(map, mapView, map.getMapViews().indexOf(mapView)));
|
||||
} else if (!animationData.isEmpty()) {
|
||||
if (!animationData.getImageMap().isValid()) {
|
||||
for (Player player : players) {
|
||||
FakeItemUtils.sendFakeItemChange(player, itemFrame, itemStack);
|
||||
FakeItemUtils.sendFakeItemChange(player, entityId, itemStack);
|
||||
}
|
||||
holder.setValue(AnimationData.EMPTY);
|
||||
data.setAnimationData(AnimationData.EMPTY);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ImageMap imageMap = animationData.getImageMap();
|
||||
if (!imageMap.requiresAnimationService()) {
|
||||
holder.setValue(AnimationData.EMPTY);
|
||||
data.setAnimationData(AnimationData.EMPTY);
|
||||
continue;
|
||||
}
|
||||
int index = animationData.getIndex();
|
||||
@@ -240,10 +223,10 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
});
|
||||
}
|
||||
if (!needReset.isEmpty()) {
|
||||
FakeItemUtils.ItemFrameUpdateData itemFrameUpdateData = new FakeItemUtils.ItemFrameUpdateData(itemFrame, itemFrame.getItem(), mapView.getId(), mapView, currentPosition);
|
||||
FakeItemUtils.ItemFrameUpdateData itemFrameUpdateData = new FakeItemUtils.ItemFrameUpdateData(entityId, itemStack, mapView.getId(), mapView, currentPosition);
|
||||
needReset.forEach(p -> updateData.computeIfAbsent(p, k -> new ArrayList<>()).add(itemFrameUpdateData));
|
||||
}
|
||||
FakeItemUtils.ItemFrameUpdateData itemFrameUpdateData = new FakeItemUtils.ItemFrameUpdateData(itemFrame, getMapItem(mapId), mapView.getId(), mapView, currentPosition);
|
||||
FakeItemUtils.ItemFrameUpdateData itemFrameUpdateData = new FakeItemUtils.ItemFrameUpdateData(entityId, getMapItem(mapId), mapView.getId(), mapView, currentPosition);
|
||||
players.forEach(p -> updateData.computeIfAbsent(p, k -> new ArrayList<>()).add(itemFrameUpdateData));
|
||||
}
|
||||
Map<Player, List<Runnable>> sendingTasks = new HashMap<>();
|
||||
@@ -291,6 +274,7 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private ItemStack getMapItem(int mapId) {
|
||||
ItemStack itemStack = new ItemStack(Material.FILLED_MAP);
|
||||
MapMeta mapMeta = (MapMeta) itemStack.getItemMeta();
|
||||
@@ -304,20 +288,21 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
return;
|
||||
}
|
||||
ItemFrame itemFrame = (ItemFrame) entity;
|
||||
if (itemFrames.containsKey(itemFrame)) {
|
||||
UUID uuid = itemFrame.getUniqueId();
|
||||
if (itemFrames.containsKey(uuid)) {
|
||||
return;
|
||||
}
|
||||
MapView mapView = MapUtils.getItemMapView(itemFrame.getItem());
|
||||
if (mapView == null) {
|
||||
itemFrames.put(itemFrame, Holder.hold(AnimationData.EMPTY));
|
||||
itemFrames.put(uuid, new TrackedItemFrameData(itemFrame, AnimationData.EMPTY));
|
||||
return;
|
||||
}
|
||||
ImageMap map = ImageFrame.imageMapManager.getFromMapView(mapView);
|
||||
if (map == null || !map.requiresAnimationService()) {
|
||||
itemFrames.put(itemFrame, Holder.hold(AnimationData.EMPTY));
|
||||
itemFrames.put(uuid, new TrackedItemFrameData(itemFrame, AnimationData.EMPTY));
|
||||
return;
|
||||
}
|
||||
itemFrames.put(itemFrame, Holder.hold(new AnimationData(map, mapView, map.getMapViews().indexOf(mapView))));
|
||||
itemFrames.put(uuid, new TrackedItemFrameData(itemFrame, new AnimationData(map, mapView, map.getMapViews().indexOf(mapView))));
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
@@ -357,16 +342,11 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
public void onEntityTeleport(EntityTeleportEvent event) {
|
||||
Entity entity = event.getEntity();
|
||||
if (entity instanceof ItemFrame) {
|
||||
UUID uuid = entity.getUniqueId();
|
||||
Scheduler.runTaskAsynchronously(ImageFrame.plugin, () -> {
|
||||
ItemFrame itemFrame = (ItemFrame) entity;
|
||||
// Synchronized maps allow sync on the instance
|
||||
// We sync here to avoid inconsistent states
|
||||
// & to reduce synchronization enter/leave penalties (we would have to sync twice otherwise)
|
||||
synchronized (itemFrames) {
|
||||
Holder<AnimationData> holder = itemFrames.remove(itemFrame);
|
||||
if (holder != null) {
|
||||
itemFrames.put(itemFrame, holder);
|
||||
}
|
||||
TrackedItemFrameData data = itemFrames.remove(uuid);
|
||||
if (data != null) {
|
||||
itemFrames.put(uuid, data);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -400,6 +380,30 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
|
||||
}
|
||||
|
||||
public static class TrackedItemFrameData {
|
||||
|
||||
private final ItemFrame itemFrame;
|
||||
private AnimationData animationData;
|
||||
|
||||
public TrackedItemFrameData(ItemFrame itemFrame, AnimationData animationData) {
|
||||
this.itemFrame = itemFrame;
|
||||
this.animationData = animationData;
|
||||
}
|
||||
|
||||
public ItemFrame getItemFrame() {
|
||||
return itemFrame;
|
||||
}
|
||||
|
||||
public AnimationData getAnimationData() {
|
||||
return animationData;
|
||||
}
|
||||
|
||||
public void setAnimationData(AnimationData animationData) {
|
||||
this.animationData = animationData;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class AnimationData {
|
||||
|
||||
public static final AnimationData EMPTY = new AnimationData(null, null, -1);
|
||||
@@ -433,14 +437,20 @@ public class AnimatedFakeMapManager implements Listener, Runnable {
|
||||
|
||||
public static class ItemFrameInfo {
|
||||
|
||||
private final int entityId;
|
||||
private final Set<Player> trackedPlayers;
|
||||
private final ItemStack itemStack;
|
||||
|
||||
public ItemFrameInfo(Set<Player> trackedPlayers, ItemStack itemStack) {
|
||||
public ItemFrameInfo(int entityId, Set<Player> trackedPlayers, ItemStack itemStack) {
|
||||
this.entityId = entityId;
|
||||
this.trackedPlayers = trackedPlayers;
|
||||
this.itemStack = itemStack;
|
||||
}
|
||||
|
||||
public int getEntityId() {
|
||||
return entityId;
|
||||
}
|
||||
|
||||
public Set<Player> getTrackedPlayers() {
|
||||
return trackedPlayers;
|
||||
}
|
||||
|
||||
@@ -232,7 +232,6 @@ public class ImageMapManager implements AutoCloseable {
|
||||
List<MutablePair<File, Future<? extends ImageMap>>> futures = new LinkedList<>();
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) {
|
||||
Bukkit.getConsoleSender().sendMessage(ChatColor.GRAY + "[ImageFrame] Loading ImageMap ID " + file.getName());
|
||||
try {
|
||||
futures.add(new MutablePair<>(file, ImageMap.load(this, file)));
|
||||
} catch (Throwable e) {
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
package com.loohp.imageframe.utils;
|
||||
|
||||
import com.loohp.imageframe.nms.NMS;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapView;
|
||||
@@ -34,7 +33,7 @@ public class FakeItemUtils {
|
||||
public static void sendFakeItemChange(Player player, List<ItemFrameUpdateData> updateData) {
|
||||
List<Object> packets = new ArrayList<>(updateData.size());
|
||||
for (ItemFrameUpdateData itemFrameUpdateData : updateData) {
|
||||
packets.add(NMS.getInstance().createItemFrameItemChangePacket(itemFrameUpdateData.getItemFrame(), itemFrameUpdateData.getItemStack()));
|
||||
packets.add(NMS.getInstance().createItemFrameItemChangePacket(itemFrameUpdateData.getEntityId(), itemFrameUpdateData.getItemStack()));
|
||||
}
|
||||
if (player.isOnline()) {
|
||||
for (Object packet : packets) {
|
||||
@@ -43,8 +42,8 @@ public class FakeItemUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendFakeItemChange(Player player, ItemFrame itemFrame, ItemStack itemStack) {
|
||||
Object packet = NMS.getInstance().createItemFrameItemChangePacket(itemFrame, itemStack);
|
||||
public static void sendFakeItemChange(Player player, int entityId, ItemStack itemStack) {
|
||||
Object packet = NMS.getInstance().createItemFrameItemChangePacket(entityId, itemStack);
|
||||
if (player.isOnline()) {
|
||||
NMS.getInstance().sendPacket(player, packet);
|
||||
}
|
||||
@@ -52,22 +51,22 @@ public class FakeItemUtils {
|
||||
|
||||
public static class ItemFrameUpdateData {
|
||||
|
||||
private final ItemFrame itemFrame;
|
||||
private final int entityId;
|
||||
private final ItemStack itemStack;
|
||||
private final int realMapId;
|
||||
private final MapView mapView;
|
||||
private final int currentPosition;
|
||||
|
||||
public ItemFrameUpdateData(ItemFrame itemFrame, ItemStack itemStack, int realMapId, MapView mapView, int currentPosition) {
|
||||
this.itemFrame = itemFrame;
|
||||
public ItemFrameUpdateData(int entityId, ItemStack itemStack, int realMapId, MapView mapView, int currentPosition) {
|
||||
this.entityId = entityId;
|
||||
this.itemStack = itemStack;
|
||||
this.realMapId = realMapId;
|
||||
this.mapView = mapView;
|
||||
this.currentPosition = currentPosition;
|
||||
}
|
||||
|
||||
public ItemFrame getItemFrame() {
|
||||
return itemFrame;
|
||||
public int getEntityId() {
|
||||
return entityId;
|
||||
}
|
||||
|
||||
public ItemStack getItemStack() {
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
public enum MCVersion {
|
||||
|
||||
V1_21("1.21", "1_21_R1", 26),
|
||||
V1_20_6("1.20.6", "1_20_R4", 25),
|
||||
V1_20_5("1.20.5", "1_20_R4", 24),
|
||||
V1_20_3("1.20.3", "1_20_R3", 23),
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.loohp</groupId>
|
||||
<artifactId>ImageFrame-Parent</artifactId>
|
||||
<version>1.7.8.5</version>
|
||||
<version>1.7.9.0</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<properties>
|
||||
@@ -29,6 +29,7 @@
|
||||
<module>V1_20_3</module>
|
||||
<module>V1_20_5</module>
|
||||
<module>V1_20_6</module>
|
||||
<module>V1_21</module>
|
||||
<module>common</module>
|
||||
</modules>
|
||||
</project>
|
||||
Reference in new issue
Block a user