Added 1.20.5 support in NMS branch

This commit is contained in:
Stijn Bannink 2024-04-29 16:43:23 +02:00
parent 4f187b92bb
commit 874b7d227c
9 changed files with 64 additions and 34 deletions

2
.idea/encodings.xml generated
View file

@ -29,6 +29,8 @@
<file url="file://$PROJECT_DIR$/NMS-v1_20_R2/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/NMS-v1_20_R2/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/NMS-v1_20_R3/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/NMS-v1_20_R3/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/NMS-v1_20_R3/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/NMS-v1_20_R3/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/NMS-v1_20_R4/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/NMS-v1_20_R4/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component> </component>

9
.idea/misc.xml generated
View file

@ -12,6 +12,13 @@
<option value="$PROJECT_DIR$/pom.xml" /> <option value="$PROJECT_DIR$/pom.xml" />
</list> </list>
</option> </option>
<option name="ignoredFiles">
<set>
<option value="$PROJECT_DIR$/NMS-v1_20_R1/pom.xml" />
</set>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="temurin-11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="temurin-11" project-jdk-type="JavaSDK" />
</project> </project>

12
.idea/ros.xml generated Normal file
View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ROSSettings">
<option name="rosPath" value="" />
<option name="workspacePath" value="" />
<option name="additionalSources" value="" />
<option name="excludedXmls" value="" />
<option name="licenseLinkType" value="Summary" />
<option name="knownKeys" value="" />
<option name="depSources" value="https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml&quot;https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml&quot;https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml" />
</component>
</project>

View file

@ -77,7 +77,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>tech.sbdevelopment</groupId> <groupId>tech.sbdevelopment</groupId>
<artifactId>MapReflectionAPI-NMS-v1_20_R1</artifactId> <artifactId>MapReflectionAPI-NMS-v1_20_R4</artifactId>
<version>${project.parent.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -27,11 +27,11 @@
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>MapReflectionAPI-NMS-v1_20_R1</artifactId> <artifactId>MapReflectionAPI-NMS-v1_20_R4</artifactId>
<properties> <properties>
<NMSVersion>1.20.1-R0.1-SNAPSHOT</NMSVersion> <NMSVersion>1.20.5-R0.1-SNAPSHOT</NMSVersion>
<jdk.version>17</jdk.version> <jdk.version>21</jdk.version>
</properties> </properties>
<build> <build>

View file

@ -19,9 +19,10 @@
package tech.sbdevelopment.mapreflectionapi.nms; package tech.sbdevelopment.mapreflectionapi.nms;
import net.minecraft.network.protocol.game.PacketPlayOutMap; import net.minecraft.network.protocol.game.PacketPlayOutMap;
import net.minecraft.world.level.saveddata.maps.MapId;
import net.minecraft.world.level.saveddata.maps.WorldMap; import net.minecraft.world.level.saveddata.maps.WorldMap;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import tech.sbdevelopment.mapreflectionapi.MapReflectionAPI; import tech.sbdevelopment.mapreflectionapi.MapReflectionAPI;
import tech.sbdevelopment.mapreflectionapi.api.ArrayImage; import tech.sbdevelopment.mapreflectionapi.api.ArrayImage;
@ -29,14 +30,16 @@ import tech.sbdevelopment.mapreflectionapi.api.ArrayImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static tech.sbdevelopment.mapreflectionapi.utils.ReflectionUtil.supports;
/** /**
* The {@link MapSender_v1_20_R1} sends the Map packets to players. * The {@link MapSender_v1_20_R4} sends the Map packets to players.
*/ */
public class MapSender_v1_20_R1 { public class MapSender_v1_20_R4 {
private static final List<QueuedMap> sendQueue = new ArrayList<>(); private static final List<QueuedMap> sendQueue = new ArrayList<>();
private static int senderID = -1; private static int senderID = -1;
private MapSender_v1_20_R1() { private MapSender_v1_20_R4() {
} }
/** /**
@ -118,8 +121,10 @@ public class MapSender_v1_20_R1 {
content.array //Data content.array //Data
); );
MapId mapId = new MapId(id);
PacketPlayOutMap packet = new PacketPlayOutMap( PacketPlayOutMap packet = new PacketPlayOutMap(
id, //ID mapId, //ID
(byte) 0, //Scale (byte) 0, //Scale
false, //Show icons false, //Show icons
new ArrayList<>(), //Icons new ArrayList<>(), //Icons

View file

@ -18,15 +18,18 @@
package tech.sbdevelopment.mapreflectionapi.nms; package tech.sbdevelopment.mapreflectionapi.nms;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
import net.minecraft.network.protocol.game.PacketPlayOutSetSlot; import net.minecraft.network.protocol.game.PacketPlayOutSetSlot;
import net.minecraft.network.syncher.DataWatcher; import net.minecraft.network.syncher.DataWatcher;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.decoration.EntityItemFrame; import net.minecraft.world.entity.decoration.EntityItemFrame;
import net.minecraft.world.level.saveddata.maps.MapId;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
import org.bukkit.entity.ItemFrame; import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -40,7 +43,7 @@ import tech.sbdevelopment.mapreflectionapi.api.exceptions.MapLimitExceededExcept
import java.util.*; import java.util.*;
public class MapWrapper_v1_20_R1 extends MapWrapper { public class MapWrapper_v1_20_R4 extends MapWrapper {
protected MapController controller = new MapController() { protected MapController controller = new MapController() {
private final Map<UUID, Integer> viewers = new HashMap<>(); private final Map<UUID, Integer> viewers = new HashMap<>();
@ -81,11 +84,11 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
public void update(ArrayImage content) { public void update(ArrayImage content) {
MapWrapper duplicate = MapReflectionAPI.getMapManager().getDuplicate(content); MapWrapper duplicate = MapReflectionAPI.getMapManager().getDuplicate(content);
if (duplicate != null) { if (duplicate != null) {
MapWrapper_v1_20_R1.this.content = duplicate.getContent(); MapWrapper_v1_20_R4.this.content = duplicate.getContent();
return; return;
} }
MapWrapper_v1_20_R1.this.content = content; MapWrapper_v1_20_R4.this.content = content;
for (UUID id : viewers.keySet()) { for (UUID id : viewers.keySet()) {
sendContent(Bukkit.getPlayer(id)); sendContent(Bukkit.getPlayer(id));
@ -103,16 +106,16 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
int id = getMapId(player); int id = getMapId(player);
if (withoutQueue) { if (withoutQueue) {
MapSender_v1_20_R1.sendMap(id, MapWrapper_v1_20_R1.this.content, player); MapSender_v1_20_R4.sendMap(id, MapWrapper_v1_20_R4.this.content, player);
} else { } else {
MapSender_v1_20_R1.addToQueue(id, MapWrapper_v1_20_R1.this.content, player); MapSender_v1_20_R4.addToQueue(id, MapWrapper_v1_20_R4.this.content, player);
} }
} }
@Override @Override
public void cancelSend() { public void cancelSend() {
for (int s : viewers.values()) { for (int s : viewers.values()) {
MapSender_v1_20_R1.cancelID(s); MapSender_v1_20_R4.cancelID(s);
} }
} }
@ -129,8 +132,8 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
} }
CraftPlayer craftPlayer = (CraftPlayer) player; CraftPlayer craftPlayer = (CraftPlayer) player;
int windowId = craftPlayer.getHandle().bQ.j; //inventoryMenu containerId int windowId = craftPlayer.getHandle().cb.j; //inventoryMenu containerId
int stateId = craftPlayer.getHandle().bQ.j(); //inventoryMenu getStateId() int stateId = craftPlayer.getHandle().cb.j(); //inventoryMenu getStateId()
ItemStack stack = new ItemStack(Material.FILLED_MAP, 1); ItemStack stack = new ItemStack(Material.FILLED_MAP, 1);
net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack);
@ -186,7 +189,7 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
ItemFrame frame = getItemFrameById(player.getWorld(), entityId); ItemFrame frame = getItemFrameById(player.getWorld(), entityId);
if (frame != null) { if (frame != null) {
frame.removeMetadata("MAP_WRAPPER_REF", MapReflectionAPI.getInstance()); frame.removeMetadata("MAP_WRAPPER_REF", MapReflectionAPI.getInstance());
frame.setMetadata("MAP_WRAPPER_REF", new FixedMetadataValue(MapReflectionAPI.getInstance(), MapWrapper_v1_20_R1.this)); frame.setMetadata("MAP_WRAPPER_REF", new FixedMetadataValue(MapReflectionAPI.getInstance(), MapWrapper_v1_20_R4.this));
} }
sendItemFramePacket(player, entityId, stack, getMapId(player)); sendItemFramePacket(player, entityId, stack, getMapId(player));
@ -217,10 +220,11 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) {
net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack);
nmsStack.w().a("map", mapId); //getOrCreateTag putInt MapId mapId1 = new MapId(mapId);
nmsStack.b(DataComponents.B, mapId1); //set
List<DataWatcher.b<?>> list = new ArrayList<>(); List<DataWatcher.c<?>> list = new ArrayList<>();
DataWatcher.b<?> dataWatcherItem = DataWatcher.b.a(EntityItemFrame.g, nmsStack); DataWatcher.c<?> dataWatcherItem = DataWatcher.c.a(EntityItemFrame.g, nmsStack);
list.add(dataWatcherItem); list.add(dataWatcherItem);
PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, list); PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, list);
@ -228,7 +232,7 @@ public class MapWrapper_v1_20_R1 extends MapWrapper {
} }
}; };
public MapWrapper_v1_20_R1(ArrayImage image) { public MapWrapper_v1_20_R4(ArrayImage image) {
super(image); super(image);
} }

View file

@ -27,8 +27,8 @@ import net.minecraft.world.EnumHand;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3D; import net.minecraft.world.phys.Vec3D;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import tech.sbdevelopment.mapreflectionapi.MapReflectionAPI; import tech.sbdevelopment.mapreflectionapi.MapReflectionAPI;
@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit;
import static tech.sbdevelopment.mapreflectionapi.utils.ReflectionUtil.*; import static tech.sbdevelopment.mapreflectionapi.utils.ReflectionUtil.*;
public class PacketListener_v1_20_R1 extends PacketListener { public class PacketListener_v1_20_R4 extends PacketListener {
@Override @Override
protected void injectPlayer(Player p) { protected void injectPlayer(Player p) {
ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@ -89,8 +89,8 @@ public class PacketListener_v1_20_R1 extends PacketListener {
return false; return false;
}).get(1, TimeUnit.SECONDS)) return; }).get(1, TimeUnit.SECONDS)) return;
} else if (packet instanceof PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot) { } else if (packet instanceof PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot) {
int slot = packetPlayInSetCreativeSlot.a(); int slot = (int) getDeclaredField(packetPlayInSetCreativeSlot, supports(20, 4) ? "b" : "a"); //slot, 1.20.5 = b, lower is a
ItemStack item = packetPlayInSetCreativeSlot.c(); ItemStack item = (ItemStack) getDeclaredField(packetPlayInSetCreativeSlot, supports(20, 4) ? "e" : "d"); //item, 1.20.5 = e, lower is d
boolean async = !plugin.getServer().isPrimaryThread(); boolean async = !plugin.getServer().isPrimaryThread();
CreateInventoryMapUpdateEvent event = new CreateInventoryMapUpdateEvent(p, slot, CraftItemStack.asBukkitCopy(item), async); CreateInventoryMapUpdateEvent event = new CreateInventoryMapUpdateEvent(p, slot, CraftItemStack.asBukkitCopy(item), async);
@ -106,7 +106,7 @@ public class PacketListener_v1_20_R1 extends PacketListener {
//The connection is private since 1.19.4 :| //The connection is private since 1.19.4 :|
NetworkManager networkManager = (NetworkManager) getField(((CraftPlayer) p).getHandle().c, "h"); NetworkManager networkManager = (NetworkManager) getField(((CraftPlayer) p).getHandle().c, "h");
ChannelPipeline pipeline = networkManager.m.pipeline(); //connection channel ChannelPipeline pipeline = networkManager.n.pipeline(); //connection channel
pipeline.addBefore("packet_handler", p.getName(), channelDuplexHandler); pipeline.addBefore("packet_handler", p.getName(), channelDuplexHandler);
} }
@ -114,7 +114,7 @@ public class PacketListener_v1_20_R1 extends PacketListener {
public void removePlayer(Player p) { public void removePlayer(Player p) {
//The connection is private since 1.19.4 :| //The connection is private since 1.19.4 :|
NetworkManager networkManager = (NetworkManager) getField(((CraftPlayer) p).getHandle().c, "h"); NetworkManager networkManager = (NetworkManager) getField(((CraftPlayer) p).getHandle().c, "h");
Channel channel = networkManager.m; //connection channel Channel channel = networkManager.n; //connection channel
channel.eventLoop().submit(() -> channel.pipeline().remove(p.getName())); channel.eventLoop().submit(() -> channel.pipeline().remove(p.getName()));
} }

View file

@ -40,9 +40,9 @@
<modules> <modules>
<module>API</module> <module>API</module>
<module>Dist</module> <module>Dist</module>
<module>NMS-v1_20_R4</module>
<module>NMS-v1_20_R3</module> <module>NMS-v1_20_R3</module>
<module>NMS-v1_20_R2</module> <module>NMS-v1_20_R2</module>
<module>NMS-v1_20_R1</module>
<module>NMS-v1_19_R3</module> <module>NMS-v1_19_R3</module>
<module>NMS-v1_18_R2</module> <module>NMS-v1_18_R2</module>
<module>NMS-v1_17_R1</module> <module>NMS-v1_17_R1</module>