Commit ada68a1c authored by Ash's avatar Ash
Browse files

Renamed project to MythicCosmetics

`+` Plugin is now a Mythic add-on and depends on MythicMobs

`+` Updated to support 1.21.3 and 1.21.4 (emotes currently broken, though)

`+` Dropped support for all versions before 1.21.3

`+` Updated to use ModelEngine 4

`+` Added support to load cosmetics from Mythic packs using folder structure `PACK/cosmetics/hats` etc

`+` Added support for Crucible implicit generation for hats and other equippabless
parent 048c3a5f
<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>
<artifactId>MCCosmetics-v1_20_R1</artifactId>
<artifactId>MythicCosmetics-v1_21_R3</artifactId>
<parent>
<groupId>io.lumine</groupId>
<artifactId>MCCosmetics-Plugin</artifactId>
<artifactId>MythicCosmetics-Plugin</artifactId>
<version>${mccosmetics.version}</version>
</parent>
......@@ -13,7 +13,7 @@
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.3</version>
<version>2.0.3</version>
<executions>
<execution>
<phase>package</phase>
......@@ -22,9 +22,9 @@
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
<srgIn>org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
<remappedDependencies>org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>true</remappedArtifactAttached>
<remappedClassifierName>remapped-obf</remappedClassifierName>
</configuration>
......@@ -37,8 +37,8 @@
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
<srgIn>org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
......@@ -91,15 +91,21 @@
<dependencies>
<!-- Modules -->
<dependency>
<groupId>io.lumine</groupId>
<artifactId>Mythic-Dist</artifactId>
<version>${mythic.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.lumine</groupId>
<artifactId>LumineUtils</artifactId>
<version>${lumineutils.version}</version>
<scope>provided</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.lumine</groupId>
<artifactId>MCCosmetics</artifactId>
<artifactId>MythicCosmetics</artifactId>
<version>${project.parent.version}</version>
<scope>provided</scope>
</dependency>
......@@ -114,7 +120,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<version>1.21.4-R0.1-SNAPSHOT</version>
<classifier>shaded</classifier>
<scope>provided</scope>
</dependency>
......@@ -123,7 +129,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<version>1.21.4-R0.1-SNAPSHOT</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope>
<exclusions>
......
......@@ -11,27 +11,27 @@ import io.lumine.cosmetics.managers.hats.Hat;
import io.lumine.cosmetics.managers.offhand.Offhand;
import io.lumine.cosmetics.managers.sprays.Spray;
import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
import io.lumine.cosmetics.nms.v1_20_R1.NMSFields;
import io.lumine.cosmetics.nms.v1_20_R1.cosmetic.*;
import io.lumine.cosmetics.nms.v1_20_R1.network.VolatileChannelHandler;
import io.lumine.cosmetics.nms.v1_20_R1.wardrobe.MannequinEntity;
import io.lumine.cosmetics.nms.v1_20_R1.cosmetic.*;
import io.lumine.utils.reflection.Reflector;
import io.lumine.cosmetics.nms.v1_21_R3.cosmetic.*;
import io.lumine.cosmetics.nms.v1_21_R3.cosmetic.*;
import io.lumine.cosmetics.nms.v1_21_R3.network.VolatileChannelHandler;
import io.lumine.cosmetics.nms.v1_21_R3.wardrobe.MannequinEntity;
import io.lumine.mythic.bukkit.utils.reflection.Reflector;
import io.lumine.mythic.core.volatilecode.v1_21_R3.VolatileFields;
import lombok.Getter;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.server.network.ServerCommonPacketListenerImpl;
import net.minecraft.world.level.entity.LevelEntityGetter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
......@@ -40,14 +40,14 @@ import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
public class VolatileCodeEnabled_v1_21_R3 implements VolatileCodeHandler {
@Getter private final MCCosmeticsPlugin plugin;
private final Map<Class<? extends Cosmetic>, VolatileCosmeticHelper> cosmeticHelpers = Maps.newConcurrentMap();
private Method entityGetter;
public VolatileCodeEnabled_v1_20_R1(MCCosmeticsPlugin plugin) {
public VolatileCodeEnabled_v1_21_R3(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
cosmeticHelpers.put(Hat.class, new VolatileHatImpl(plugin, this));
cosmeticHelpers.put(BackAccessory.class, new VolatileBackImpl(plugin, this));
......@@ -73,8 +73,8 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
return cosmeticHelpers.values();
}
private Reflector<ServerGamePacketListenerImpl> refConnection
= new Reflector<ServerGamePacketListenerImpl>(ServerGamePacketListenerImpl.class, NMSFields.PLAYER_CONNECTION);
private Reflector<ServerCommonPacketListenerImpl> refConnection
= new Reflector<>(ServerCommonPacketListenerImpl.class, VolatileFields.PLAYER_CONNECTION);
@Override
public void injectPlayer(Player player) {
......@@ -82,7 +82,7 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
VolatileChannelHandler cdh = new VolatileChannelHandler(player, this);
var listener = ((CraftPlayer) player).getHandle().connection;
var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
var pipeline = connection.channel.pipeline();
for (String name : pipeline.toMap().keySet()) {
......@@ -96,7 +96,7 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
@Override
public void removePlayer(Player player) {
var listener = ((CraftPlayer) player).getHandle().connection;
var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
var channel = connection.channel;
channel.eventLoop().submit(() -> {
channel.pipeline().remove("mc_cosmetics_packet_handler");
......
package io.lumine.cosmetics.nms.v1_21_R3;
public class NMSFields {
public static final String EQUIPMENT_SLOTS = "d";
}
package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
......@@ -8,7 +9,7 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
import io.lumine.cosmetics.managers.back.BackAccessory;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
import io.lumine.cosmetics.players.Profile;
import io.netty.buffer.Unpooled;
......@@ -18,24 +19,26 @@ import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.*;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.PositionMoveRotation;
import net.minecraft.world.entity.Relative;
import net.minecraft.world.entity.decoration.ArmorStand;
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
import net.minecraft.world.phys.Vec3;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Map;
import java.util.*;
public class VolatileBackImpl implements VolatileEquipmentHelper {
@Getter
private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
private final Map<Player, ArmorStand> activeProfile = Maps.newConcurrentMap();
private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
......@@ -64,18 +67,20 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
if(stand == null) {
playerTracker.put(player.getEntityId(), player);
stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
stand.setMarker(true);
stand.setInvisible(true);
stand.setSilent(true);
activeProfile.put(player, stand);
var mobPacket = new ClientboundAddEntityPacket(stand);
var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
var passengersPacket = createPassengerPacket(player.getEntityId(), stand.getId());
nmsHandler.broadcastAroundAndSelf(player, mobPacket, dataPacket, passengersPacket);
final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket);
final var bundlePacket = new ClientboundBundlePacket(packets);
nmsHandler.broadcastAroundAndSelf(player, bundlePacket);
}
stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
......@@ -111,25 +116,23 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
mannequin.removeExtraEntity(BackAccessory.class);
var stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY() + stand.getMyRidingOffset(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
stand.setMarker(true);
stand.setInvisible(true);
stand.setSilent(true);
stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
mannequin.addExtraEntity(BackAccessory.class, stand.getId());
var mobPacket = new ClientboundAddEntityPacket(stand);
var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
var passengersPacket = createPassengerPacket(entityId, stand.getId());
nmsHandler.broadcast(player, mobPacket, dataPacket, passengersPacket);
stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
nmsHandler.broadcast(player, equipmentPacket);
}
final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket, equipmentPacket);
final var bundlePacket = new ClientboundBundlePacket(packets);
nmsHandler.broadcast(player, bundlePacket);
}
@Override
public void unequipMannequin(Mannequin mannequin) {
......@@ -157,8 +160,12 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
@Override
public List<Object> write(Player receiver, Object packet) {
if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
int id = playerPacket.getEntityId();
if(packet instanceof ClientboundAddEntityPacket playerPacket) {
if(playerPacket.getType() != EntityType.PLAYER) {
return null;
}
int id = playerPacket.getId();
if(playerTracker.containsKey(id)) {
final var spawnedPlayer = playerTracker.get(id);
final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
......@@ -212,13 +219,13 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
}
private List<Object> handleSpawn(Profile profile) {
if(!hasBack(profile))
if(!hasBack(profile)) {
return null;
}
final var wearer = profile.getPlayer();
final var stand = activeProfile.get(wearer);
var mobPacket = new ClientboundAddEntityPacket(stand);
var mobPacket = new ClientboundAddEntityPacket(stand, 0, stand.blockPosition());
ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, stand.getItemBySlot(EquipmentSlot.HEAD))));
ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(wearer.getEntityId(), stand.getId());
......@@ -248,36 +255,53 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
moveEntityPacket.getXa(),
moveEntityPacket.getYa(),
moveEntityPacket.getZa(),
moveEntityPacket.getyRot(),
moveEntityPacket.getxRot(),
encodeRot(moveEntityPacket.getyRot()),
encodeRot(moveEntityPacket.getxRot()),
false);
}else if(moveEntityPacket.hasPosition()) {
} else if(moveEntityPacket.hasPosition()) {
move = new ClientboundMoveEntityPacket.Pos(
stand.getId(),
moveEntityPacket.getXa(),
moveEntityPacket.getYa(),
moveEntityPacket.getZa(),
false);
}else {
} else {
move = new ClientboundMoveEntityPacket.Rot(
stand.getId(),
moveEntityPacket.getyRot(),
moveEntityPacket.getxRot(),
encodeRot(moveEntityPacket.getyRot()),
encodeRot(moveEntityPacket.getxRot()),
false);
}
return List.of(move);
}
protected byte encodeRot(float rot) {
return (byte) (rot / 360f * 255);
}
private List<Object> handleTeleport(Profile profile) {
if(!hasBack(profile))
if(!hasBack(profile)) {
return null;
}
final var wearer = profile.getPlayer();
final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
final var stand = activeProfile.get(wearer);
stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
return List.of(new ClientboundTeleportEntityPacket(stand));
final var x = nmsPlayer.getX();
final var y = nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y();
final var z = nmsPlayer.getZ();
stand.moveTo(x, y, z, nmsPlayer.getYRot(), 0);
final Set<Relative> set = new HashSet<>();
final var delta = new Vec3(0,0,0);
final var positionMoveRotation = new PositionMoveRotation(new Vec3(x,y,z), delta, 0, nmsPlayer.getXRot());
final var packet = new ClientboundTeleportEntityPacket(stand.getId(), positionMoveRotation, set, false);
return List.of(packet);
}
private boolean hasBack(Profile profile) {
......@@ -292,7 +316,7 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
bb.writeVarInt(mount);
bb.writeVarIntArray(driver);
return new ClientboundSetPassengersPacket(bb);
return ClientboundSetPassengersPacket.STREAM_CODEC.decode(bb);
}
}
\ No newline at end of file
package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.manager.HideableCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.managers.gestures.Gesture;
import io.lumine.cosmetics.managers.gestures.GestureManager;
import io.lumine.cosmetics.managers.gestures.QuitMethod;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
import io.lumine.cosmetics.players.Profile;
import io.netty.buffer.Unpooled;
import lombok.Getter;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.*;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.animal.horse.Horse;
import net.minecraft.world.item.ItemStack;
import org.bukkit.attribute.Attribute;
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R3.attribute.CraftAttributeMap;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_21_R3.attribute.CraftAttribute;
import org.bukkit.craftbukkit.v1_21_R3.attribute.CraftAttributeMap;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.util.ArrayList;
......@@ -42,19 +34,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
@Getter
private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
private final Set<Player> activeProfile = Sets.newConcurrentHashSet();
private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
private Horse horse;
public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
@Override
public void apply(CosmeticProfile profile) {
/*
if (profile == null)
return;
Player player = profile.getPlayer();
......@@ -84,10 +77,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
}
ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), empty);
nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
*/
}
@Override
public void unapply(CosmeticProfile profile) {
/*
if (profile == null)
return;
Player player = profile.getPlayer();
......@@ -112,25 +108,32 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
continue;
hide.show(profile);
}
*/
}
private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
/*
FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
bb.writeVarInt(mount);
bb.writeVarIntArray(driver);
return new ClientboundSetPassengersPacket(bb);
*/
return null;
}
private void getHorsed(Player player) {
/*
final var nmsPlayer = ((CraftPlayer) player).getHandle();
if(horse == null) {
horse = new Horse(EntityType.HORSE, ((CraftWorld) player.getWorld()).getHandle());
horse.setInvisible(true);
horse.setHealth(0);
horse.getAttribute(CraftAttributeMap.toMinecraft(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0);
horse.getAttribute(CraftAttribute.bukkitToMinecraft(Attribute.MAX_HEALTH)).setBaseValue(0);
}
horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - horse.getPassengersRidingOffset() - nmsPlayer.getMyRidingOffset(), nmsPlayer.getZ());
horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - nmsPlayer.getMyRidingOffset(horse), nmsPlayer.getZ());
var mobPacket = new ClientboundAddEntityPacket(horse);
var dataPacket = new ClientboundSetEntityDataPacket(horse.getId(), horse.getEntityData().getNonDefaultValues());
......@@ -138,17 +141,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
var passengersPacket = createPassengerPacket(horse.getId(), nmsPlayer.getId());
nmsHandler.broadcast(player, mobPacket, dataPacket, attributesPacket, passengersPacket);
*/
}
@Override
public boolean read(Player sender, Object packet, boolean isCanceled) {
/*
if(!plugin.getGestureManager().getTicking().containsKey(sender)) {
return true;
}
if(packet instanceof ServerboundPlayerInputPacket inputPacket) {
final var manager = (GestureManager) plugin.getGestureManager();
if(inputPacket.isShiftKeyDown())
if(inputPacket.input() == ServerboundPlayerInputPacket.)
manager.quit(sender, QuitMethod.SNEAK);
if(inputPacket.isJumping())
manager.quit(sender, QuitMethod.JUMP);
......@@ -159,11 +165,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
return false;
}
}
*/
return true;
}
@Override
public List<Object> write(Player receiver, Object packet) {
/*
if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
int id = equipmentPacket.getEntity();
final var spawnedPlayer = playerTracker.get(id);
......@@ -173,6 +181,7 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
if(profile != null)
return List.of(new ClientboundSetEquipmentPacket(id, empty));
}
*/
return null;
}
}
package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
import com.google.common.collect.Maps;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
......@@ -8,22 +7,18 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
import io.lumine.cosmetics.managers.hats.Hat;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
import io.lumine.cosmetics.nms.v1_21_R3.NMSFields;
import io.lumine.cosmetics.players.Profile;
import io.lumine.utils.logging.Log;
import io.lumine.utils.reflection.Reflector;
import io.netty.buffer.Unpooled;
import io.lumine.mythic.bukkit.utils.reflection.Reflector;
import lombok.Getter;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
import net.minecraft.world.entity.EquipmentSlot;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
......@@ -31,10 +26,10 @@ import java.util.List;
public class VolatileHatImpl implements VolatileEquipmentHelper {
@Getter private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
//private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
......@@ -158,7 +153,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
}
private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
final var maybeEquipped = profile.getEquipped(Hat.class);
......@@ -192,7 +187,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
}
refEq.set(packet, "c", newSlots);
refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
}
}
package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
import com.google.common.collect.Maps;
import com.mojang.datafixers.util.Pair;
......@@ -7,20 +7,17 @@ import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
import io.lumine.cosmetics.managers.hats.Hat;
import io.lumine.cosmetics.managers.offhand.Offhand;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
import io.lumine.cosmetics.nms.v1_21_R3.NMSFields;
import io.lumine.cosmetics.players.Profile;
import io.lumine.utils.reflection.Reflector;
import io.netty.buffer.Unpooled;
import io.lumine.mythic.bukkit.utils.reflection.Reflector;
import lombok.Getter;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.world.entity.EquipmentSlot;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import java.util.ArrayList;
......@@ -30,10 +27,10 @@ import java.util.Map;
public class VolatileOffhandImpl implements VolatileEquipmentHelper {
@Getter private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
......@@ -134,10 +131,10 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
}
private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
final var maybeEquipped = profile.getEquipped(Hat.class);
final var maybeEquipped = profile.getEquipped(Offhand.class);
if(maybeEquipped.isEmpty()) {
return;
}
......@@ -157,7 +154,7 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
for(var pair : slots) {
final EquipmentSlot slot = pair.getFirst();
if(slot == EquipmentSlot.HEAD) {
if(slot == EquipmentSlot.OFFHAND) {
foundHead = true;
newSlots.add(Pair.of(pair.getFirst(), nmsItem));
} else {
......@@ -165,9 +162,9 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
}
}
if(!foundHead) {
newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
newSlots.add(Pair.of(EquipmentSlot.OFFHAND, nmsItem));
}
refEq.set(packet, "c", newSlots);
refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
}
}
package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.managers.sprays.Spray;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
import lombok.Getter;
import net.minecraft.core.BlockPos;
......@@ -11,21 +11,22 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.world.level.saveddata.maps.MapId;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.MapMeta;
public class VolatileSprayImpl implements VolatileSprayHelper {
@Getter private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
......@@ -60,7 +61,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
frame.setInvisible(true);
frame.setRotation(rotation);
var packetAdd = new ClientboundAddEntityPacket(frame, dir);
var packetAdd = new ClientboundAddEntityPacket(frame, dir, pos);
var packetData = new ClientboundSetEntityDataPacket(frame.getId(), frame.getEntityData().getNonDefaultValues());
var packetMap = constructMapPacket(image.getMapNumber(), image.getPixels());
......@@ -78,7 +79,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
private ClientboundMapItemDataPacket constructMapPacket(int id, byte[] pixels) {
var mapData = constructMapData(startX, startY, mapWidth, mapHeight, pixels);
var packet = new ClientboundMapItemDataPacket(id, mapScale, mapLocked, null, mapData);
var packet = new ClientboundMapItemDataPacket(new MapId(id), mapScale, mapLocked, null, mapData);
return packet;
}
......
package io.lumine.cosmetics.nms.v1_18_R2.network;
package io.lumine.cosmetics.nms.v1_21_R3.network;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
......@@ -12,10 +12,10 @@ import java.util.List;
public class VolatileChannelHandler extends ChannelDuplexHandler {
private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
@Getter private final Player player;
public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
this.player = player;
this.nmsHandler = nmsHandler;
}
......
package io.lumine.cosmetics.nms.v1_19_R2.wardrobe;
package io.lumine.cosmetics.nms.v1_21_R3.wardrobe;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import io.lumine.mythic.bukkit.MythicBukkit;
import io.netty.buffer.Unpooled;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.protocol.game.*;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.GameType;
import net.minecraft.world.phys.Vec3;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import com.google.common.collect.Lists;
......@@ -17,70 +25,62 @@ import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
import io.netty.buffer.Unpooled;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
import lombok.Getter;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.EquipmentSlot;
public class MannequinEntity implements Mannequin {
private final VolatileCodeEnabled_v1_19_R2 handler;
private final VolatileCodeEnabled_v1_21_R3 handler;
@Getter private final WardrobeTracker tracker;
@Getter private final UUID uniqueId;
@Getter private final Player player;
@Getter private final Location location;
@Getter private float rotation;
@Getter private ServerPlayer fakePlayer;
@Getter private int fakePlayerId;
private Map<Class<? extends Cosmetic>,Integer> extraEntities = Maps.newConcurrentMap();
public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_19_R2 handler, Player player, Location location) {
public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_21_R3 handler, Player player, Location location) {
this.tracker = tracker;
this.handler = handler;
this.player = player;
this.location = location;
this.fakePlayerId = MythicBukkit.inst().getVolatileCodeHandler().getEntityHandler().getNextEntityId();
this.uniqueId = UUID.randomUUID();
var serverPlayer = ((CraftPlayer) player).getHandle();
var level = ((CraftWorld) location.getWorld()).getHandle();
this.rotation = serverPlayer.getYRot() + 180;
if(rotation > 180) {
if(rotation > 180) {
rotation = rotation - 360;
}
var gameProfile = serverPlayer.getGameProfile();
gameProfile = new GameProfile(uniqueId, "Wardrobe");
gameProfile.getProperties().putAll(serverPlayer.getGameProfile().getProperties());
this.fakePlayer = new ServerPlayer(level.getServer(), level, gameProfile);
var spawn = new FriendlyByteBuf(Unpooled.buffer());
spawn.writeVarInt(fakePlayer.getId());
spawn.writeUUID(fakePlayer.getUUID());
spawn.writeDouble(location.getX());
spawn.writeDouble(location.getY());
spawn.writeDouble(location.getZ());
spawn.writeByte((byte)(int)(serverPlayer.getYRot() * 256.0F / 360.0F));
spawn.writeByte((byte)(int)(serverPlayer.getXRot() * 256.0F / 360.0F));
var packetPlayerInfo = new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, fakePlayer);
var packetAddPlayer = new ClientboundAddPlayerPacket(spawn);
var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayer.getId(),
final var buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), RegistryAccess.EMPTY);
final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actionSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER);
buf.writeEnumSet(actionSet, ClientboundPlayerInfoUpdatePacket.Action.class);
var fakePlayerEntry = List.of(new ClientboundPlayerInfoUpdatePacket.Entry(uniqueId, gameProfile, false, 0, GameType.CREATIVE, null, true, 0, null));
buf.writeCollection(fakePlayerEntry, (var0x, var1) -> {
var0x.writeUUID(var1.profileId());
GameProfile var2 = (GameProfile) Objects.requireNonNull(var1.profile());
var0x.writeUtf(var2.getName(), 16);
ByteBufCodecs.GAME_PROFILE_PROPERTIES.encode(var0x, var2.getProperties());
});
var packetPlayerInfo = ClientboundPlayerInfoUpdatePacket.STREAM_CODEC.decode(buf);
var packetAddPlayer = new ClientboundAddEntityPacket(fakePlayerId, uniqueId, location.getX(), location.getY(), location.getZ(), serverPlayer.getXRot(), serverPlayer.getYRot(), EntityType.PLAYER, 0, Vec3.ZERO, serverPlayer.getYHeadRot());
var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayerId,
List.of(Pair.of(EquipmentSlot.HEAD, serverPlayer.getItemBySlot(EquipmentSlot.HEAD)),
Pair.of(EquipmentSlot.CHEST, serverPlayer.getItemBySlot(EquipmentSlot.CHEST)),
Pair.of(EquipmentSlot.LEGS, serverPlayer.getItemBySlot(EquipmentSlot.LEGS)),
......@@ -89,20 +89,27 @@ public class MannequinEntity implements Mannequin {
Pair.of(EquipmentSlot.OFFHAND, serverPlayer.getItemBySlot(EquipmentSlot.OFFHAND))));
var head = (byte)(int)(rotation * 256.0F / 360.0F);
var rotatePacket = new ClientboundRotateHeadPacket(fakePlayer, head);
var swingPacket = new ClientboundAnimatePacket(fakePlayer, 0);
var rotateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
rotateByteBuf.writeVarInt(fakePlayerId);
rotateByteBuf.writeByte(head);
var rotatePacket = ClientboundRotateHeadPacket.STREAM_CODEC.decode(rotateByteBuf);
var animateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
animateByteBuf.writeVarInt(fakePlayerId);
animateByteBuf.writeByte(ClientboundAnimatePacket.SWING_MAIN_HAND);
var swingPacket = ClientboundAnimatePacket.STREAM_CODEC.decode(animateByteBuf);
handler.broadcast(player, packetPlayerInfo, packetAddPlayer, equipmentPacket, rotatePacket, swingPacket);
for(var eq : handler.getPlugin().getProfiles().getProfile(player).getEquipped().values()) {
eq.getCosmetic().getManager().equipMannequin(this, eq);
}
}
public void despawn() {
var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(fakePlayer.getUUID()));
var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayer.getId());
var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(uniqueId));
var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayerId);
handler.broadcast(player, packetPlayerInfo, packetRemovePlayer);
......@@ -126,7 +133,7 @@ public class MannequinEntity implements Mannequin {
}
public int getEntityId() {
return fakePlayer.getId();
return fakePlayerId;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment