Added ShadowJar plugin to Gradle. Added PacketEvents library. Added new CreativeInvPacketListeners class. Added new UseEntityPacketListener class. Made plugin properly unregister listeners on shutdown. Deprecated ProtocolLib classes and methods. Marked ProtocolLib classes and methods for removal. Changed EntityMountEvent to BukkitAPI import. Changed version to 2.10.0-SNAPSHOT-01.

This commit is contained in:
Loving11ish committed 2024-07-09 16:39:14 +01:00
1 parent ecdb5bac27
commit cc7d701913
11 files changed
+283 -27

No files matched your search

+21 -1
View File
@@ -4,6 +4,8 @@ plugins {
idea
eclipse
id("com.github.johnrengelman.shadow") version "7.1.0"
}
repositories {
@@ -20,6 +22,10 @@ repositories {
name = "PaperMC"
url = uri("https://repo.papermc.io/repository/maven-public/")
}
maven {
name = "PacketEvents"
url = uri("https://repo.codemc.io/repository/maven-releases/")
}
maven {
name = "ProtocolLib"
url = uri("https://repo.dmulloy2.net/nexus/repository/public/")
@@ -52,6 +58,7 @@ dependencies {
compileOnly("fr.minuskube.inv:smart-invs:1.2.7")
//compileOnly("com.github.CraftingStore.MinecraftPlugin:core:master-e366d322f8-1")
compileOnly("com.github.brcdev-minecraft:shopgui-api:3.0.0")
implementation("com.github.retrooper:packetevents-spigot:2.4.0")
}
the<JavaPluginExtension>().toolchain {
@@ -66,10 +73,23 @@ tasks.compileJava.configure {
options.release.set(8)
}
version = "2.9.12-SNAPSHOT-01"
version = "2.10.0-SNAPSHOT-01"
tasks.named<Copy>("processResources") {
filesMatching("plugin.yml") {
expand("version" to project.version)
}
}
// ShadowJar configuration
tasks.shadowJar {
// Optionally, relocate the PacketEvents package to avoid conflicts
relocate("com.github.retrooper.packetevents", "me.dniym.packetevents.api")
relocate("io.github.retrooper.packetevents", "me.dniym.packetevents.impl")
minimize()
}
// Build the ShadowJar
tasks.build {
dependsOn(tasks.shadowJar)
}
@@ -1,16 +1,20 @@
package main.java.me.dniym;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.PacketEventsAPI;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import main.java.me.dniym.commands.IllegalStackCommand;
import main.java.me.dniym.enums.Msg;
import main.java.me.dniym.enums.Protections;
import main.java.me.dniym.enums.ServerVersion;
import main.java.me.dniym.listeners.CreativeInvPacketListeners;
import main.java.me.dniym.listeners.Listener113;
import main.java.me.dniym.listeners.Listener114;
import main.java.me.dniym.listeners.Listener116;
import main.java.me.dniym.listeners.ProtectionListener;
import main.java.me.dniym.listeners.UseEntityPacketListener;
import main.java.me.dniym.listeners.fListener;
import main.java.me.dniym.listeners.mcMMOListener;
import main.java.me.dniym.listeners.pLisbListener;
import main.java.me.dniym.timers.fTimer;
import main.java.me.dniym.timers.sTimer;
import main.java.me.dniym.timers.syncTimer;
@@ -23,6 +27,7 @@ import org.bukkit.World;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -112,6 +117,16 @@ public class IllegalStack extends JavaPlugin {
CMI = cMI;
}
@Override
public void onLoad() {
// Load PacketEventsAPI
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this));
PacketEvents.getAPI().getSettings()
.checkForUpdates(false)
.debug(false);
PacketEvents.getAPI().load();
}
public static void ReloadConfig(Boolean wasCommand) {
if (!wasCommand) {
IllegalStack.getPlugin().writeConfig();
@@ -432,6 +447,13 @@ public class IllegalStack extends JavaPlugin {
@Override
public void onEnable() {
// Register PacketEvents listeners
LOGGER.info("Registering PacketEvents listeners...");
PacketEvents.getAPI().getEventManager().registerListeners(new CreativeInvPacketListeners(this));
PacketEvents.getAPI().getEventManager().registerListeners(new UseEntityPacketListener(this));
PacketEventsAPI<?> packetEventsAPI = PacketEvents.getAPI();
packetEventsAPI.init();
LOGGER.info("PacketEvents API {} has been initialized!", PacketEvents.getAPI().getVersion());
// new EntityRegistry(this);
this.setPlugin(this);
@@ -542,25 +564,6 @@ public class IllegalStack extends JavaPlugin {
}
}
if (this
.getServer()
.getPluginManager()
.getPlugin("ProtocolLib") != null && Protections.BlockBadItemsFromCreativeTab.isEnabled()) {
LOGGER.info(
"ProtocolLib was detected, creative inventory exploit detection enabled. NOTE* This protection ONLY needs to be turned on if you have regular (non op) players with access to /gmc");
new pLisbListener(this);
}
if (this.getServer().getPluginManager().getPlugin("ProtocolLib") == null && Protections.DisableChestsOnMobs.isEnabled()) {
LOGGER.warn(
"ProtocolLib NOT FOUND!!!! and DisableChestsOnMobs protection is turned on.. It may still be possible for players to dupe using horses/donkeys on your server using a hacked client. It is highly recommended that you install ProtocolLib for optimal protection!");
} else if (Protections.DisableChestsOnMobs.isEnabled()) {
new pLisbListener(this);
setHasProtocolLib(true);
}
this.getServer().getPluginManager().registerEvents(new fListener(this), this);
if (!fListener.is18()) {
@@ -1033,13 +1036,26 @@ public class IllegalStack extends JavaPlugin {
@Override
public void onDisable() {
// Signal plugin is now disabled
disable = true;
// Terminate PacketEvents
PacketEvents.getAPI().getEventManager().unregisterAllListeners();
PacketEvents.getAPI().terminate();
LOGGER.info("PacketEvents has been terminated successfully!");
// Unregister listeners
HandlerList.unregisterAll(this);
LOGGER.info("Listeners have unregistered successfully!");
// Cancel all tasks
if (hasAsyncScheduler) {
getServer().getAsyncScheduler().cancelTasks(this);
} else if (!isFoliaServer()){
Bukkit.getScheduler().cancelTasks(this);
}
// Save configuration
writeConfig();
}
@@ -1676,8 +1676,7 @@ public enum Protections {
public boolean isDisabledInWorld(World wld) {
return Protections.DisableInWorlds.isWhitelisted(wld.getName());
}
@Deprecated
public boolean isEnabled() {
if (this.getVersion().isEmpty()) //child node
return this.enabled;
@@ -0,0 +1,73 @@
package main.java.me.dniym.listeners;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientCreativeInventoryAction;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import main.java.me.dniym.IllegalStack;
import main.java.me.dniym.enums.Msg;
import main.java.me.dniym.enums.Protections;
import main.java.me.dniym.utils.Scheduler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.UUID;
public class CreativeInvPacketListeners extends PacketListenerAbstract {
private final IllegalStack plugin;
private static final Logger LOGGER = LogManager.getLogger("IllegalStack/" + CreativeInvPacketListeners.class.getSimpleName());
public CreativeInvPacketListeners(IllegalStack plugin) {
super(PacketListenerPriority.LOW);
this.plugin = plugin;
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() != PacketType.Play.Client.CREATIVE_INVENTORY_ACTION) {
return;
}
if (!Protections.BlockBadItemsFromCreativeTab.isEnabled()) {
return;
}
User user = event.getUser();
UUID uuid = user.getUUID();
Player player = plugin.getServer().getPlayer(uuid);
if (player == null) {
return;
}
if (player.isOp() || player.hasPermission("illegalstack.admin")) {
return;
}
WrapperPlayClientCreativeInventoryAction packetWrapper = new WrapperPlayClientCreativeInventoryAction(event);
try {
com.github.retrooper.packetevents.protocol.item.ItemStack wrapperItemStack = packetWrapper.getItemStack();
ItemStack stack = SpigotConversionUtil.toBukkitItemStack(wrapperItemStack);
if (stack != null && stack.hasItemMeta()) {
stack = new ItemStack(Material.AIR);
Scheduler.runTaskLater(plugin, player::updateInventory, 5L, player);
event.setCancelled(true);
Msg.StaffMsgCreativeBlock.getValue(player.getName());
}
} catch (IndexOutOfBoundsException ex) {
LOGGER.error(
"An error receiving a CREATIVE_INVENTORY_ACTION packet has occurred, you are probably using paper and have BlockBadItemsFromCreativeTab turned on. This setting is needed very rarely, and ONLY if you have regular non-op players with access to /gmc.");
}
}
}
@@ -0,0 +1,124 @@
package main.java.me.dniym.listeners;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import main.java.me.dniym.IllegalStack;
import main.java.me.dniym.enums.Msg;
import main.java.me.dniym.enums.Protections;
import main.java.me.dniym.timers.fTimer;
import main.java.me.dniym.utils.Scheduler;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Horse;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.UUID;
public class UseEntityPacketListener extends PacketListenerAbstract {
private final IllegalStack plugin;
private final HashMap<UUID, Long> messageDelay = new HashMap<>();
public UseEntityPacketListener(IllegalStack plugin) {
super(PacketListenerPriority.LOW);
this.plugin = plugin;
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() != PacketType.Play.Client.INTERACT_ENTITY) {
return;
}
if (!IllegalStack.hasChestedAnimals()) {
return;
}
if (!Protections.DisableChestsOnMobs.isEnabled()) {
return;
}
User user = event.getUser();
UUID uuid = user.getUUID();
Player player = plugin.getServer().getPlayer(uuid);
if (player == null) {
return;
}
if (player.isOp() || player.hasPermission("illegalstack.admin")) {
return;
}
WrapperPlayClientInteractEntity packetWrapper = new WrapperPlayClientInteractEntity(event);
World world = player.getWorld();
int entityId = packetWrapper.getEntityId();
if (entityId <= 0) {
return;
}
Scheduler.runTask(plugin, () -> {
Entity entity = world.getEntities().stream().filter(e -> e.getEntityId() == entityId).findFirst().orElse(null);
Scheduler.runTaskLater(plugin, () -> {
if (entity instanceof Horse && ((Horse) entity).isTamed()) {
ItemStack is = player.getInventory().getItemInMainHand();
if (!fListener.is18() && (is == null || is.getType() != Material.CHEST)) {
is = player.getInventory().getItemInOffHand();
}
if (is == null || is.getType() != Material.CHEST) {
return;
}
exploitMessage(player, entity);
event.setCancelled(true);
fTimer.getPunish().put(player, entity);
return;
}
if (entity instanceof ChestedHorse && ((ChestedHorse) entity).isTamed()) {
ItemStack is = player.getInventory().getItemInMainHand();
if (is == null || is.getType() != Material.CHEST) {
is = player.getInventory().getItemInOffHand();
}
if (is == null || is.getType() != Material.CHEST) {
return;
}
exploitMessage(player, entity);
event.setCancelled(true);
((ChestedHorse) entity).setCarryingChest(true);
((ChestedHorse) entity).setCarryingChest(false);
fTimer.getPunish().put(player, entity);
}
}, 1, entity);
}, player.getLocation());
}
private void exploitMessage(Player p, Entity ent) {
if (!messageDelay.containsKey(p.getUniqueId())) {
messageDelay.put(p.getUniqueId(), 0L);
}
if (System.currentTimeMillis() > messageDelay.get(p.getUniqueId())) {
p.sendMessage(Msg.PlayerDisabledHorseChestMsg.getValue());
fListener.getLog().append2(Msg.ChestPrevented.getValue(p, ent));
messageDelay.put(p.getUniqueId(), System.currentTimeMillis() + 2000L);
}
}
}
@@ -64,7 +64,6 @@ import org.bukkit.entity.Skeleton;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.TraderLlama;
import org.bukkit.entity.Vehicle;
import org.bukkit.entity.Vex;
import org.bukkit.entity.Zombie;
import org.bukkit.entity.minecart.HopperMinecart;
@@ -85,6 +84,7 @@ import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityMountEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.entity.EntityTargetEvent;
@@ -94,7 +94,6 @@ import org.bukkit.event.inventory.InventoryCreativeEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
@@ -120,7 +119,6 @@ import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import org.spigotmc.event.entity.EntityMountEvent;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -18,10 +18,13 @@ import org.bukkit.entity.Horse;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.ApiStatus;
import java.util.HashMap;
import java.util.UUID;
@Deprecated
@ApiStatus.ScheduledForRemoval
public class pLisbListener {
private static final Logger LOGGER = LogManager.getLogger("IllegalStack/" + pLisbListener.class.getSimpleName());
@@ -7,7 +7,10 @@ import com.comphenix.protocol.reflect.StructureModifier;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.ApiStatus;
@Deprecated
@ApiStatus.ScheduledForRemoval
public class BookCrashExploitCheck extends PacketAdapter {
public BookCrashExploitCheck(final Plugin plugin) {
@@ -8,11 +8,14 @@ import com.comphenix.protocol.events.PacketEvent;
import main.java.me.dniym.listeners.fListener;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.ApiStatus;
import java.util.HashMap;
import java.util.HashSet;
import java.util.UUID;
@Deprecated
@ApiStatus.ScheduledForRemoval
public class PacketAttack {
private static final Logger LOGGER = LogManager.getLogger("IllegalStack/" + PacketAttack.class.getSimpleName());
@@ -11,6 +11,7 @@ import net.md_5.bungee.api.chat.hover.content.Text;
import org.bukkit.entity.LivingEntity;
@SuppressWarnings("deprecation")
public class SpigotMethods {
public static BaseComponent makeParentText(Protections protections, String status, boolean children, int catId) {
+17 -1
View File
@@ -5,7 +5,23 @@ api-version: 1.13
folia-supported: true
description: Closes some dupe bugs still present in vanilla minecraft.
authors: [ dNiym, Loving11ish ]
softdepend: [Magic, Factions, NBTAPI, ProtocolLib, Slimefun, CraftingStore, DynamicShop, ClueScrolls, mcMMO, JetsMinions, SmartInvs, FactionsX]
softdepend:
- MagicFactions
- NBTAPI
- ProtocolLib
- ProtocolSupport
- ViaVersion
- ViaBackwards
- ViaRewind
- Geyser-Spigot
- Slimefun
- CraftingStore
- DynamicShop
- ClueScrolls
- mcMMO
- JetsMinions
- SmartInvs
- FactionsX
loadbefore: [MythicDrops]
website: https://www.spigotmc.org/resources/44411/
commands: