Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -134,5 +134,9 @@
<groupId>${project.groupId}</groupId>
<artifactId>illusion-nms-v26_2</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>illusion-nms-v26_3</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void enable(Plugin plugin, ErrorCollector errorCollector) throws PluginEn
nmsManager = NMSVersion.getCurrent().createNMSManager(errorCollector);
} catch (UnknownVersionException e) {
throw new PluginEnableException(
"Holographic Displays only supports Spigot from 1.8 to 26.2, but your server is running "
"Holographic Displays only supports Spigot from 1.8 to 26.3, but your server is running "
+ Bukkit.getServer().getVersion());
} catch (OutdatedVersionException e) {
throw new PluginEnableException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import me.filoghost.fcommons.logging.ErrorCollector;
import me.filoghost.holographicdisplays.nms.common.NMSManager;
import me.filoghost.holographicdisplays.nms.v26_2.VersionNMSManager;
import me.filoghost.holographicdisplays.nms.v26_3.VersionNMSManager;
import org.bukkit.Bukkit;

/**
Expand Down Expand Up @@ -44,7 +44,8 @@ public enum NMSVersion {
/* 1.21.9- 1.21.10 */ v1_21_R6(me.filoghost.holographicdisplays.nms.v1_21_R6.VersionNMSManager::new),
/* 1.21.11 */ v1_21_R7(me.filoghost.holographicdisplays.nms.v1_21_R7.VersionNMSManager::new),
/* 26.1.2 */ v26_1(me.filoghost.holographicdisplays.nms.v26_1.VersionNMSManager::new),
/* 26.2 - X */ v26_2(VersionNMSManager::new),
/* 26.2 */ v26_2(me.filoghost.holographicdisplays.nms.v26_2.VersionNMSManager::new),
/* 26.3 - X */ v26_3(VersionNMSManager::new),
/* Other versions */ UNKNOWN(NMSManagerFactory.unknownVersion());

private static final NMSVersion CURRENT_VERSION = detectCurrentVersion();
Expand Down Expand Up @@ -85,6 +86,8 @@ private static NMSVersion detectVersion(String bukkitVersion, String nmsPackageN
return v26_1;
case "26.2":
return v26_2;
case "26.3":
return v26_3;
default:
return UNKNOWN;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ static Stream<Arguments> normalizeYearBasedVersionTestArguments() {
// Spigot format, unchanged since before the year-based versioning switch
Arguments.of("26.1.2-R0.1-SNAPSHOT", "26.1.2"),
Arguments.of("26.2-R0.1-SNAPSHOT", "26.2"),
Arguments.of("26.3-R0.1-SNAPSHOT", "26.3"),

// Paper release format: "<version>.build.<n>-<channel>"
Arguments.of("26.2.build.62-beta", "26.2"),
Arguments.of("26.3.build.1-alpha", "26.3"),
Arguments.of("26.1.2.build.5-default", "26.1.2"),

// Paper development build format: "<version>-DEV-<branch>@<commit>"
Expand Down
1 change: 1 addition & 0 deletions nms/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
<module>v1_21_r7</module>
<module>v26_1</module>
<module>v26_2</module>
<module>v26_3</module>
</modules>

<dependencies>
Expand Down
43 changes: 43 additions & 0 deletions nms/v26_3/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?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>studio.magemonkey</groupId>
<artifactId>illusion-nms</artifactId>
<version>3.0.15-SNAPSHOT</version>
</parent>

<artifactId>illusion-nms-v26_3</artifactId>
<name>Illusion NMS v26_3</name>

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>illusion-nms-common</artifactId>
</dependency>

<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>26.3-R0.1-SNAPSHOT</version>
<!--<classifier>remapped-mojang</classifier>-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>26.3-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.joml</groupId>
<artifactId>joml</artifactId>
<version>1.10.9</version>
<scope>provided</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.nms.v26_3;

import io.netty.handler.codec.EncoderException;
import net.minecraft.network.chat.Component;
import net.minecraft.network.syncher.EntityDataSerializer;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.world.item.ItemStack;

import java.util.Optional;

class DataWatcherKey<T> {

private static final EntityDataSerializer<Byte> BYTE_SERIALIZER = EntityDataSerializers.BYTE;
private static final EntityDataSerializer<Integer> INT_SERIALIZER = EntityDataSerializers.INT;
private static final EntityDataSerializer<Boolean> BOOLEAN_SERIALIZER = EntityDataSerializers.BOOLEAN;
private static final EntityDataSerializer<ItemStack> ITEM_STACK_SERIALIZER = EntityDataSerializers.ITEM_STACK;
private static final EntityDataSerializer<Optional<Component>> OPTIONAL_CHAT_COMPONENT_SERIALIZER = EntityDataSerializers.OPTIONAL_COMPONENT;

static final DataWatcherKey<Byte> ENTITY_STATUS = new DataWatcherKey<>(0, BYTE_SERIALIZER);
static final DataWatcherKey<Optional<Component>> CUSTOM_NAME = new DataWatcherKey<>(2, OPTIONAL_CHAT_COMPONENT_SERIALIZER);
static final DataWatcherKey<Boolean> CUSTOM_NAME_VISIBILITY = new DataWatcherKey<>(3, BOOLEAN_SERIALIZER);
static final DataWatcherKey<ItemStack> ITEM_STACK = new DataWatcherKey<>(8, ITEM_STACK_SERIALIZER);
static final DataWatcherKey<Byte> ARMOR_STAND_STATUS = new DataWatcherKey<>(15, BYTE_SERIALIZER);
static final DataWatcherKey<Integer> SLIME_SIZE = new DataWatcherKey<>(18, INT_SERIALIZER);

private final int index;
private final EntityDataSerializer<T> serializer;
private final int serializerTypeID;

private DataWatcherKey(int index, EntityDataSerializer<T> serializer) {
this.index = index;
this.serializer = serializer;
this.serializerTypeID = EntityDataSerializers.getSerializedId(serializer);
if (serializerTypeID < 0) {
throw new EncoderException("Could not find serializer ID of " + serializer);
}
}

int getIndex() {
return index;
}

EntityDataSerializer<T> getSerializer() {
return serializer;
}

int getSerializerTypeID() {
return serializerTypeID;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.nms.v26_3;

import me.filoghost.fcommons.Strings;
import me.filoghost.holographicdisplays.nms.common.EntityID;
import net.minecraft.network.chat.Component;
import net.minecraft.network.syncher.SynchedEntityData;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.inventory.ItemStack;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

abstract class DataWatcherPacketBuilder<T> {

private static final int MAX_CUSTOM_NAME_LENGTH = 5000;

protected final EntityID entityId;
protected List<SynchedEntityData.DataValue<?>> watchers = new ArrayList<>();

public DataWatcherPacketBuilder(EntityID entityId) {
this.entityId = entityId;
}

DataWatcherPacketBuilder<T> setInvisible() {
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.ENTITY_STATUS.getIndex(),
DataWatcherKey.ENTITY_STATUS.getSerializer(),
(byte) 0x20));
return this;
}

DataWatcherPacketBuilder<T> setArmorStandMarker() {
setInvisible();
// Small, no gravity, no base plate, marker
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.ARMOR_STAND_STATUS.getIndex(),
DataWatcherKey.ARMOR_STAND_STATUS.getSerializer(),
(byte) (0x01 | 0x02 | 0x08 | 0x10)));
return this;
}

DataWatcherPacketBuilder<T> setCustomName(String customName) {
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.CUSTOM_NAME.getIndex(),
DataWatcherKey.CUSTOM_NAME.getSerializer(),
getCustomNameDataWatcherValue(customName)));
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.CUSTOM_NAME_VISIBILITY.getIndex(),
DataWatcherKey.CUSTOM_NAME_VISIBILITY.getSerializer(),
!Strings.isEmpty(customName)));
return this;
}

private Optional<Component> getCustomNameDataWatcherValue(String customName) {
customName = Strings.truncate(customName, MAX_CUSTOM_NAME_LENGTH);
if (!Strings.isEmpty(customName)) {
return Optional.of(CraftChatMessage.fromString(customName, false, true)[0]);
} else {
return Optional.empty();
}
}

DataWatcherPacketBuilder<T> setItemStack(ItemStack itemStack) {
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.ITEM_STACK.getIndex(),
DataWatcherKey.ITEM_STACK.getSerializer(),
CraftItemStack.asNMSCopy(itemStack)));
return this;
}

DataWatcherPacketBuilder<T> setSlimeSmall() {
watchers.add(new SynchedEntityData.DataValue<>(DataWatcherKey.SLIME_SIZE.getIndex(),
DataWatcherKey.SLIME_SIZE.getSerializer(),
0));
return this;
}

T build() {
return createPacket();
}

abstract T createPacket();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.nms.v26_3;

import me.filoghost.holographicdisplays.nms.common.EntityID;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;

class EntityDestroyNMSPacket extends VersionNMSPacket {

private final Packet<?> rawPacket;

EntityDestroyNMSPacket(EntityID entityID) {
this.rawPacket = new ClientboundRemoveEntitiesPacket(entityID.getNumericID());
}

EntityDestroyNMSPacket(EntityID entityID1, EntityID entityID2) {
this.rawPacket = new ClientboundRemoveEntitiesPacket(entityID1.getNumericID(), entityID2.getNumericID());
}

@Override
Packet<?> getRawPacket() {
return rawPacket;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.nms.v26_3;

import me.filoghost.holographicdisplays.nms.common.EntityID;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.network.syncher.SynchedEntityData;

import java.util.List;

class EntityMetadataNMSPacket extends VersionNMSPacket {

private final Packet<?> rawPacket;

private EntityMetadataNMSPacket(EntityID entityId, List<SynchedEntityData.DataValue<?>> watchers) {
this.rawPacket = new ClientboundSetEntityDataPacket(entityId.getNumericID(), watchers);
}

@Override
Packet<?> getRawPacket() {
return rawPacket;
}

public static DataWatcherPacketBuilder<EntityMetadataNMSPacket> builder(EntityID entityID) {
return new Builder(entityID);
}


private static class Builder extends DataWatcherPacketBuilder<EntityMetadataNMSPacket> {
public Builder(EntityID entityId) {
super(entityId);
}

@Override
EntityMetadataNMSPacket createPacket() {
return new EntityMetadataNMSPacket(entityId, watchers);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.nms.v26_3;

import me.filoghost.holographicdisplays.nms.common.EntityID;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket;

import java.lang.reflect.Constructor;

class EntityMountNMSPacket extends VersionNMSPacket {

private final Packet<?> rawPacket;

EntityMountNMSPacket(EntityID vehicleEntityID, EntityID passengerEntityID) {
PacketByteBuffer packetByteBuffer = PacketByteBuffer.get();

// We'll leave this as a byte buffer for now, since I think the ClientboundSetPassengersPacket constructor
// requires modifying the vehicle entity to have the passenger before we can create this packet
packetByteBuffer.writeVarInt(vehicleEntityID.getNumericID());
packetByteBuffer.writeVarIntArray(passengerEntityID.getNumericID());

try {
Constructor<ClientboundSetPassengersPacket> ctor =
ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class);
ctor.setAccessible(true);
this.rawPacket = ctor.newInstance(packetByteBuffer.getInternalSerializer());
} catch (Exception e) {
throw new RuntimeException("Failed to create EntityMountNMSPacket", e);
}
}

@Override
Packet<?> getRawPacket() {
return rawPacket;
}

}
Loading
Loading