Commit b9c3cb26 authored by Ticxo's avatar Ticxo
Browse files

back stuff

parent a142cd71
......@@ -7,13 +7,15 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
public interface CosmeticInventory {
public void initialize(CosmeticProfile profile);
void initialize(CosmeticProfile profile);
public Collection<String> getUnlocked(String type);
Collection<String> getUnlocked(String type);
public Optional<Cosmetic> getCustomEquipped(String type);
Optional<Cosmetic> getCustomEquipped(String type);
public Optional<Cosmetic> getEquippedHat();
Optional<Cosmetic> getEquippedHat();
Optional<Cosmetic> getEquippedBack();
public void equip(Cosmetic cosmetic);
void equip(Cosmetic cosmetic);
}
package io.lumine.cosmetics.nms;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import org.bukkit.entity.Player;
public class VolatileCodeDisabled implements VolatileCodeHandler {
......@@ -9,6 +11,11 @@ public class VolatileCodeDisabled implements VolatileCodeHandler {
return null;
}
@Override
public VolatileBackHelper getBackHelper() {
return null;
}
@Override
public void injectPlayer(Player player) {
......
package io.lumine.cosmetics.nms;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import org.bukkit.entity.Player;
public interface VolatileCodeHandler {
public VolatileHatHelper getHatHelper();
VolatileHatHelper getHatHelper();
VolatileBackHelper getBackHelper();
void injectPlayer(Player player);
void removePlayer(Player player);
......
package io.lumine.cosmetics.nms.cosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
public interface VolatileBackHelper {
void applyBackPacket(CosmeticProfile profile);
}
package io.lumine.cosmetics.nms;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.players.Profile;
public interface VolatileHatHelper {
public void applyHatPacket(CosmeticProfile profile);
}
package io.lumine.cosmetics.nms.cosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.players.Profile;
public interface VolatileHatHelper {
public void applyHatPacket(CosmeticProfile profile);
}
......@@ -12,6 +12,7 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.api.players.CosmeticInventory;
import io.lumine.cosmetics.managers.back.BackAccessory;
import io.lumine.cosmetics.managers.hats.Hat;
import io.lumine.utils.serialize.Optl;
import lombok.Getter;
......@@ -21,6 +22,7 @@ public class DigitalInventory implements CosmeticInventory {
@Getter private transient CosmeticProfile profile;
private transient Optl<Hat> equippedHat;
private transient Optl<BackAccessory> equippedBack;
private transient final Map<String,Cosmetic> equippedCustom = Maps.newConcurrentMap();
@Getter private Map<String,List<String>> unlockedCosmetics = Maps.newConcurrentMap();
......@@ -71,6 +73,11 @@ public class DigitalInventory implements CosmeticInventory {
return Optional.ofNullable(equippedHat.orElseGet(null));
}
@Override
public Optional<Cosmetic> getEquippedBack() {
return Optional.ofNullable(equippedBack.orElseGet(null));
}
@Override
public Collection<String> getUnlocked(String type) {
return unlockedCosmetics.getOrDefault(type, Lists.newArrayList());
......
package io.lumine.cosmetics.nms;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import io.lumine.cosmetics.nms.v1_18_R1.cosmetic.VolatileBackImpl;
import io.lumine.cosmetics.nms.v1_18_R1.network.VolatileChannelHandler;
import io.lumine.cosmetics.nms.v1_18_R1.VolatileHatImpl;
import io.lumine.cosmetics.nms.v1_18_R1.cosmetic.VolatileHatImpl;
import io.netty.channel.Channel;
import io.netty.channel.ChannelPipeline;
import lombok.Getter;
......@@ -15,10 +18,12 @@ public class VolatileCodeEnabled_v1_18_R1 implements VolatileCodeHandler {
@Getter private final MCCosmeticsPlugin plugin;
@Getter private final VolatileHatHelper hatHelper;
@Getter private final VolatileBackHelper backHelper;
public VolatileCodeEnabled_v1_18_R1(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
this.hatHelper = new VolatileHatImpl(plugin);
this.backHelper = new VolatileBackImpl(plugin);
}
@Override
......
package io.lumine.cosmetics.nms.v1_18_R1.cosmetic;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import lombok.Getter;
public class VolatileBackImpl implements VolatileBackHelper {
@Getter private final MCCosmeticsPlugin plugin;
public VolatileBackImpl(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
}
@Override
public void applyBackPacket(CosmeticProfile profile) {
}
}
package io.lumine.cosmetics.nms.v1_18_R1;
import java.util.List;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.nms.VolatileHatHelper;
import io.lumine.cosmetics.players.Profile;
import io.lumine.utils.protocol.Protocol;
import lombok.Getter;
import net.minecraft.world.entity.EquipmentSlot;
public class VolatileHatImpl implements VolatileHatHelper {
@Getter private final MCCosmeticsPlugin plugin;
public VolatileHatImpl(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
}
@Override
public void applyHatPacket(CosmeticProfile profile) {
if(profile == null) {
return;
}
final var player = profile.getPlayer();
final var packet = Protocol.manager().createPacket(PacketType.Play.Server.ENTITY_EQUIPMENT);
packet.getEntityModifier(player.getWorld()).write(0, player);
/*
if(profile.getHat().isPresent()) {
profile.setHatIsActive(true);
writeHeadItem(packet, profile.getEquippedHat());
Protocol.broadcastPacket(packet);
} else if(profile.getHatIsActive()) {
writeHeadItem(packet, player.getInventory().getHelmet());
Protocol.broadcastPacket(packet);
}*/
}
public boolean writeHeadItem(PacketContainer packet, ItemStack item) {
List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getModifier().read(1);
List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = Lists.newArrayList();
boolean foundHead = false;
for(Pair<EquipmentSlot,net.minecraft.world.item.ItemStack> pair : slots) {
final EquipmentSlot slot = pair.getFirst();
if(slot == EquipmentSlot.HEAD) {
foundHead = true;
newSlots.add(Pair.of(pair.getFirst(), CraftItemStack.asNMSCopy(item)));
} else {
newSlots.add(pair);
}
}
if(!foundHead) {
newSlots.add(Pair.of(EquipmentSlot.HEAD, CraftItemStack.asNMSCopy(item)));
}
packet.getModifier().write(1, newSlots);
return true;
}
}
package io.lumine.cosmetics.nms.v1_18_R1.cosmetic;
import java.util.List;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import io.lumine.utils.protocol.Protocol;
import lombok.Getter;
import net.minecraft.world.entity.EquipmentSlot;
public class VolatileHatImpl implements VolatileHatHelper {
@Getter private final MCCosmeticsPlugin plugin;
public VolatileHatImpl(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
}
@Override
public void applyHatPacket(CosmeticProfile profile) {
if(profile == null) {
return;
}
final var player = profile.getPlayer();
final var packet = Protocol.manager().createPacket(PacketType.Play.Server.ENTITY_EQUIPMENT);
packet.getEntityModifier(player.getWorld()).write(0, player);
/*
if(profile.getHat().isPresent()) {
profile.setHatIsActive(true);
writeHeadItem(packet, profile.getEquippedHat());
Protocol.broadcastPacket(packet);
} else if(profile.getHatIsActive()) {
writeHeadItem(packet, player.getInventory().getHelmet());
Protocol.broadcastPacket(packet);
}*/
}
public boolean writeHeadItem(PacketContainer packet, ItemStack item) {
List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getModifier().read(1);
List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = Lists.newArrayList();
boolean foundHead = false;
for(Pair<EquipmentSlot,net.minecraft.world.item.ItemStack> pair : slots) {
final EquipmentSlot slot = pair.getFirst();
if(slot == EquipmentSlot.HEAD) {
foundHead = true;
newSlots.add(Pair.of(pair.getFirst(), CraftItemStack.asNMSCopy(item)));
} else {
newSlots.add(pair);
}
}
if(!foundHead) {
newSlots.add(Pair.of(EquipmentSlot.HEAD, CraftItemStack.asNMSCopy(item)));
}
packet.getModifier().write(1, newSlots);
return true;
}
}
package io.lumine.cosmetics.nms;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import io.lumine.cosmetics.nms.v1_18_R2.cosmetic.VolatileBackImpl;
import io.lumine.cosmetics.nms.v1_18_R2.cosmetic.VolatileHatImpl;
import io.lumine.cosmetics.nms.v1_18_R2.network.VolatileChannelHandler;
import io.lumine.utils.reflection.Reflector;
......@@ -23,12 +26,14 @@ public class VolatileCodeEnabled_v1_18_R2 implements VolatileCodeHandler {
@Getter private final MCCosmeticsPlugin plugin;
@Getter private final VolatileHatHelper hatHelper;
@Getter private final VolatileBackHelper backHelper;
private Reflector<ServerLevel> refServerLevel = new Reflector<>(ServerLevel.class, "O");
public VolatileCodeEnabled_v1_18_R2(MCCosmeticsPlugin plugin) {
this.plugin = plugin;
this.hatHelper = new VolatileHatImpl(plugin, this);
this.backHelper = new VolatileBackImpl(plugin, this);
}
@Override
......
package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
import com.mojang.datafixers.util.Pair;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
import io.lumine.cosmetics.nms.cosmetic.VolatileBackHelper;
import io.netty.buffer.EmptyByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Getter;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundAddMobPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.decoration.ArmorStand;
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class VolatileBackImpl implements VolatileBackHelper {
@Getter private final MCCosmeticsPlugin plugin;
private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
private final Map<Player, ArmorStand> activeProfile = new HashMap<>();
public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
this.plugin = plugin;
this.nmsHandler = nmsHandler;
}
@Override
public void applyBackPacket(CosmeticProfile profile) {
if (profile == null)
return;
Player player = profile.getPlayer();
Optional<Cosmetic> cosmetic = profile.getCosmeticInventory().getEquippedBack();
if (cosmetic.isEmpty() || !(cosmetic.get() instanceof ItemCosmetic back))
return;
var nmsBack = CraftItemStack.asNMSCopy(back.getCosmetic());
ArmorStand stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
stand.setMarker(true);
stand.setInvisible(true);
stand.setSilent(true);
stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
activeProfile.put(player, stand);
ClientboundAddMobPacket mobPacket = new ClientboundAddMobPacket(stand);
ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
bb.writeVarInt(player.getEntityId());
bb.writeVarIntArray(new int[] { stand.getId() });
ClientboundSetPassengersPacket passengersPacket = new ClientboundSetPassengersPacket(bb);
nmsHandler.broadcast(player.getWorld(), mobPacket, equipmentPacket, passengersPacket);
}
}
......@@ -6,10 +6,8 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
import io.lumine.cosmetics.nms.VolatileHatHelper;
import io.lumine.cosmetics.nms.cosmetic.VolatileHatHelper;
import io.lumine.cosmetics.players.Profile;
import io.lumine.utils.Events;
import io.lumine.utils.Schedulers;
import lombok.Getter;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
......
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