Skip to content

Commit

Permalink
Don't send custom enchantments to client
Browse files Browse the repository at this point in the history
  • Loading branch information
Sylfare committed May 30, 2024
1 parent 353d2fd commit 25cb458
Show file tree
Hide file tree
Showing 4 changed files with 219 additions and 6 deletions.
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ subprojects {
version = "1.14.0"

repositories() {
mavenLocal()
mavenCentral()
maven("https://papermc.io/repo/repository/maven-public/")
maven("https://repo.dmulloy2.net/nexus/repository/public/")
Expand Down Expand Up @@ -60,7 +61,7 @@ configure(subprojects.filter {
build {
dependsOn("reobfJar")
}
}
}
}

// All Projects except proxies and annotations.
Expand All @@ -85,7 +86,7 @@ configure(subprojects.filter {
}

dependencies {
implementation(group = "com.comphenix.protocol", name = "ProtocolLib", version = "5.2.0-SNAPSHOT")
implementation(group = "com.comphenix.protocol", name = "ProtocolLib", version = "5.2.1-SNAPSHOT")

compileOnly(project(":vane-annotations"))
annotationProcessor(project(path = ":vane-annotations", configuration = "reobf"))
Expand Down
5 changes: 4 additions & 1 deletion vane-core/src/main/java/org/oddlama/vane/core/Core.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.oddlama.vane.annotation.VaneModule;
import org.oddlama.vane.annotation.config.ConfigBoolean;
import org.oddlama.vane.annotation.lang.LangMessage;
import org.oddlama.vane.core.enchantments.CustomEnchantmentFixer;
import org.oddlama.vane.core.enchantments.EnchantmentManager;
import org.oddlama.vane.core.functional.Consumer1;
import org.oddlama.vane.core.item.CustomItemRegistry;
Expand All @@ -47,7 +48,6 @@
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.enchantment.Enchantment;

@VaneModule(name = "core", bstats = 8637, config_version = 6, lang_version = 4, storage_version = 1)
Expand Down Expand Up @@ -79,6 +79,8 @@ public static Core instance() {

public final ResourcePackDistributor resource_pack_distributor;

public final CustomEnchantmentFixer custom_enchantment_fixer;

public void register_module(Module<?> module) {
vane_modules.add(module);
}
Expand Down Expand Up @@ -137,6 +139,7 @@ public Core() {
new org.oddlama.vane.core.commands.Enchant(this);
menu_manager = new MenuManager(this);
resource_pack_distributor = new ResourcePackDistributor(this);
custom_enchantment_fixer = new CustomEnchantmentFixer(this);
new CommandHider(this);
model_data_registry = new CustomModelDataRegistry();
item_registry = new CustomItemRegistry();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package org.oddlama.vane.core.enchantments;

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

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryCreativeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.oddlama.vane.core.Core;
import org.oddlama.vane.core.Listener;
import org.oddlama.vane.core.module.Context;
import org.oddlama.vane.util.Nms;

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.EnumWrappers;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket;
import net.minecraft.network.syncher.EntityDataSerializer;
import net.minecraft.network.syncher.SynchedEntityData.DataValue;
import net.minecraft.world.item.crafting.RecipeHolder;

public class CustomEnchantmentFixer extends Listener<Core> {

ArrayList<PacketAdapter> containerAdapters = new ArrayList<PacketAdapter>();

public CustomEnchantmentFixer(Context<Core> context) {
super(context);

}

@Override
protected void on_enable() {
super.on_enable();
for (var type : new PacketType[] {
PacketType.Play.Server.WINDOW_ITEMS,
PacketType.Play.Server.ENTITY_METADATA,
PacketType.Play.Server.ENTITY_EQUIPMENT,
PacketType.Play.Server.SET_SLOT,
}) {
var a = new ContainerAdapter(type);
get_module().protocol_manager.addPacketListener(a);
containerAdapters.add(a);
}

var recipeAdapter = new RecipeAdapter();
get_module().protocol_manager.addPacketListener(recipeAdapter);
}

@EventHandler(priority = EventPriority.HIGHEST)
public void onCreativeItemMove(InventoryCreativeEvent event) {
Optional<Enchantment> vaneEnchantment = event.getCurrentItem().getEnchantments().keySet().stream()
.filter((enchantment) -> enchantment.getKey().getNamespace().startsWith("vane"))
.findFirst();
if(vaneEnchantment.isPresent()) {
event.setCancelled(true);
event.getView().getPlayer().sendMessage(Component.text("Moving items with Vane enchantments in creative mode is temporarily inactive.", NamedTextColor.GOLD));
}
}

public static ItemStack removeVaneEnchants(ItemStack item) {
if (item == null || item.getType() == null || item.getType() == Material.AIR)
return item;
ItemStack itemCopy = item.clone();

itemCopy.getEnchantments().forEach((enchantment, level) -> {
if (enchantment.getKey().getNamespace().startsWith("vane")) {
itemCopy.removeEnchantment(enchantment);
}
});

// also remove stored enchantments for enchanted books
if (itemCopy.getItemMeta() instanceof EnchantmentStorageMeta) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) itemCopy.getItemMeta();
meta.getStoredEnchants().forEach((enchantment, level) -> {
if (enchantment.getKey().getNamespace().startsWith("vane")) {
meta.removeStoredEnchant(enchantment);
}
});
itemCopy.setItemMeta(meta);
}

return itemCopy;
}

class ContainerAdapter extends PacketAdapter {
private PacketType type;

public ContainerAdapter(PacketType type) {
super(
CustomEnchantmentFixer.this.get_module(),
ListenerPriority.HIGHEST,
type);
this.type = type;
}

@Override
public void onPacketSending(PacketEvent event) {
if (event.getPacket().getHandle() instanceof ClientboundSetEntityDataPacket edp) {
var newlist = edp.packedItems().stream().map(x -> {
if (x.value() instanceof net.minecraft.world.item.ItemStack itemStack) {
var bukkititem = CustomEnchantmentFixer.removeVaneEnchants(itemStack.asBukkitCopy());
var newitem = Nms.item_handle(bukkititem);
return new DataValue<net.minecraft.world.item.ItemStack>(x.id(),
(EntityDataSerializer<net.minecraft.world.item.ItemStack>) x.serializer(), newitem);
}
return x;
}).toList();
var newPacket = new ClientboundSetEntityDataPacket(edp.id(), newlist);
event.setPacket(PacketContainer.fromPacket(newPacket));
}
try {
var mods = event.getPacket().getItemListModifier();
for (int i = 0; i < mods.size(); ++i) {
try {
var slots = mods.readSafely(i);
List<ItemStack> newSlots = slots.stream()
.map((item) -> CustomEnchantmentFixer.removeVaneEnchants(item)).toList();
mods.writeSafely(i, newSlots);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
try {
var mods = event.getPacket().getItemArrayModifier();
for (int i = 0; i < mods.size(); ++i) {
try {
var slots = mods.readSafely(i);
var newSlots = (ItemStack[]) Arrays.stream(slots)
.map((item) -> CustomEnchantmentFixer.removeVaneEnchants(item)).toArray();
mods.writeSafely(i, newSlots);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
try {
var mods = event.getPacket().getSlotStackPairLists();
for (int i = 0; i < mods.size(); ++i) {
try {
var slots = mods.readSafely(i);
var newSlots = slots.stream()
.map((pair) -> new com.comphenix.protocol.wrappers.Pair<EnumWrappers.ItemSlot, ItemStack>(
pair.getFirst(),
CustomEnchantmentFixer.removeVaneEnchants(pair.getSecond())))
.toList();
mods.writeSafely(i, newSlots);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
try {
var mods = event.getPacket().getItemModifier();
for (int i = 0; i < mods.size(); ++i) {
try {
var item = mods.readSafely(i);
item = CustomEnchantmentFixer.removeVaneEnchants(item);
mods.writeSafely(i, item);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
}
}
class RecipeAdapter extends PacketAdapter {
public RecipeAdapter() {
super(CustomEnchantmentFixer.this.get_module(),
ListenerPriority.HIGHEST,
PacketType.Play.Server.RECIPE_UPDATE);
}

@Override
public void onPacketSending(PacketEvent event) {
if(event.getPacketType().getCurrentId() != 0x77) {
return;
}
var packet = (ClientboundUpdateRecipesPacket) event.getPacket().getHandle();

var newRecipes = new ArrayList<RecipeHolder<?>>();
for (RecipeHolder<?> recipe : packet.getRecipes()) {
if(recipe.id().getNamespace().startsWith("vane_enchantment")) continue;
newRecipes.add(recipe);
}

var newPacket = new PacketContainer(PacketType.Play.Server.RECIPE_UPDATE, new ClientboundUpdateRecipesPacket(newRecipes));

event.setPacket(newPacket);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.oddlama.vane.core.lang.TranslatedMessage;
import org.oddlama.vane.core.module.Context;
import org.oddlama.vane.core.enchantments.CustomEnchantment;
import org.oddlama.vane.core.enchantments.CustomEnchantmentFixer;
import org.oddlama.vane.enchantments.Enchantments;
import org.oddlama.vane.util.StorageUtil;

Expand Down Expand Up @@ -140,7 +141,7 @@ public void on_player_drop_item(final PlayerDropItemEvent event) {
var meta = dropped_item.getItemMeta();
drop_cooldown.clear(dropped_item.getItemMeta());
dropped_item.setItemMeta(meta);
lang_dropped_notification.send(event.getPlayer(), dropped_item.displayName());
lang_dropped_notification.send(event.getPlayer(), CustomEnchantmentFixer.removeVaneEnchants(dropped_item).displayName());
return;
}
final var inventory = event.getPlayer().getInventory();
Expand All @@ -149,7 +150,7 @@ public void on_player_drop_item(final PlayerDropItemEvent event) {
event.setCancelled(true);
lang_drop_lock_warning.send_action_bar(
event.getPlayer(),
event.getItemDrop().getItemStack().displayName()
CustomEnchantmentFixer.removeVaneEnchants(event.getItemDrop().getItemStack()).displayName()
);
} else {
// Inventory is full (e.g. when exiting crafting table with soulbound item in it)
Expand Down Expand Up @@ -177,7 +178,7 @@ public void on_player_drop_item(final PlayerDropItemEvent event) {
final var player = event.getPlayer();
inventory.setItem(non_soulbound_item_slot, dropped_item);
player.getLocation().getWorld().dropItem(player.getLocation(), non_soulbound_item);
lang_drop_lock_warning.send_action_bar(player, event.getItemDrop().getItemStack().displayName());
lang_drop_lock_warning.send_action_bar(player, CustomEnchantmentFixer.removeVaneEnchants(event.getItemDrop().getItemStack()).displayName());
event.setCancelled(true);
}
}
Expand Down

0 comments on commit 25cb458

Please sign in to comment.