Commit v1.9.1

New version support.
This commit is contained in:
William Bergh 2020-09-13 12:28:40 +02:00
parent 560dc36667
commit c59cf5d3cb
9 changed files with 493 additions and 21 deletions

6
.idea/discord.xml Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
</component>
</project>

View file

@ -59,6 +59,15 @@
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/../../libs/Spigot-1.16.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="Gradle: com.destroystokyo.paper:paper-api:1.14-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" name="Gradle: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:1.3.9" level="project" />

View file

@ -55,6 +55,15 @@
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/../../libs/Spigot-1.16.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="Gradle: com.destroystokyo.paper:paper-api:1.14-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" name="Gradle: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />

View file

@ -2,20 +2,13 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="4038a6e9-7d52-4dd0-91ef-d9a12aa1c1b2" name="Default Changelist" comment="Added a fix to the new item name exploit that makes it possible to make clickable text and, made the chest patch work for all containers and so that books are cleared properly...">
<change afterPath="$PROJECT_DIR$/.idea/jarRepositories.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/libraries/Gradle__junit_junit_4_10.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/libraries/Gradle__junit_junit_4_10.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/libraries/Gradle__junit_junit_4_12.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/libraries/Gradle__junit_junit_4_12.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_1.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_1.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/discord.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules/VulnerabilityPatcher.main.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules/VulnerabilityPatcher.main.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules/VulnerabilityPatcher.test.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules/VulnerabilityPatcher.test.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules/me.cooljwb.vulnerabilitypatcher.VulnerabilityPatcher.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules/me.cooljwb.vulnerabilitypatcher.VulnerabilityPatcher.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" />
<change beforePath="$PROJECT_DIR$/gradle.properties" beforeDir="false" afterPath="$PROJECT_DIR$/gradle.properties" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/modifiers/NBTModifier_1_16.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/modifiers/NBTModifier_1_16.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/patches/Crash_Items.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/patches/Crash_Items.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/patches/Disconnect_Items.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/patches/Disconnect_Items.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/resources/plugin.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/plugin.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/modifiers/NBTModifier.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/modifiers/NBTModifier.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -83,7 +76,7 @@
<component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1565016144369" />
<property name="last_opened_file_path" value="$USER_HOME$/Desktop/TF/TF - Code/TFM 1.16/TotalFreedomMod" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/java/me/cooljwb/vulnerabilitypatcher/modifiers" />
<property name="project.structure.last.edited" value="Libraries" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.2" />
@ -91,6 +84,7 @@
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\DATA\Användare\Skrivbord\Programering\VulnerabilityPatcher\src\main\java\me\cooljwb\vulnerabilitypatcher\modifiers" />
<recent name="D:\DATA\Användare\Skrivbord\Programering\VulnerabilityPatcher\libs" />
</key>
</component>
@ -152,21 +146,25 @@
<option name="LAST_COMMIT_MESSAGE" value="Added a fix to the new item name exploit that makes it possible to make clickable text and, made the chest patch work for all containers and so that books are cleared properly..." />
</component>
<component name="WindowStateProjectService">
<state width="1877" height="234" key="GridCell.Tab.0.bottom" timestamp="1597494377255">
<state width="1877" height="234" key="GridCell.Tab.0.bottom" timestamp="1598297961156">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1877" height="234" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1597494377255" />
<state width="1877" height="234" key="GridCell.Tab.0.center" timestamp="1597494377254">
<state width="1877" height="234" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1598297961156" />
<state width="1877" height="234" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1597498022867" />
<state width="1877" height="234" key="GridCell.Tab.0.center" timestamp="1598297961156">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1877" height="234" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1597494377254" />
<state width="1877" height="234" key="GridCell.Tab.0.left" timestamp="1597494377254">
<state width="1877" height="234" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1598297961156" />
<state width="1877" height="234" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1597498022867" />
<state width="1877" height="234" key="GridCell.Tab.0.left" timestamp="1598297961156">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1877" height="234" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1597494377254" />
<state width="1877" height="234" key="GridCell.Tab.0.right" timestamp="1597494377255">
<state width="1877" height="234" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1598297961156" />
<state width="1877" height="234" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1597498022867" />
<state width="1877" height="234" key="GridCell.Tab.0.right" timestamp="1598297961156">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1877" height="234" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1597494377255" />
<state width="1877" height="234" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1598297961156" />
<state width="1877" height="234" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1597498022867" />
</component>
</project>

View file

@ -26,6 +26,7 @@ dependencies {
compile files('libs/Spigot-1.14.jar')
compile files('libs/Spigot-1.15.jar')
compile files('libs/Spigot-1.16.jar')
compile files('libs/Spigot-1.16.2.jar')
}
import org.apache.tools.ant.filters.ReplaceTokens

View file

@ -1,2 +1,2 @@
pluginGroup=me.cooljwb.vulnerabilitypatcher
pluginVersion=v1.9
pluginVersion=v1.9.1

BIN
libs/Spigot-1.16.2.jar Normal file

Binary file not shown.

View file

@ -39,6 +39,7 @@ public class NBTModifier {
private NBTModifier_1_14 nbt_1_14 = new NBTModifier_1_14();
private NBTModifier_1_15 nbt_1_15 = new NBTModifier_1_15();
private NBTModifier_1_16 nbt_1_16 = new NBTModifier_1_16();
private NBTModifier_1_16_2 nbt_1_16_2 = new NBTModifier_1_16_2();
public static String getVersion() {
switch(Bukkit.getVersion().substring((Bukkit.getVersion().indexOf(":") + 1), Bukkit.getVersion().indexOf(")")).trim()) {
case "1.13.2":
@ -55,8 +56,10 @@ public class NBTModifier {
return "1.15";
case "1.16":
case "1.16.1":
case "1.16.2":
return "1.16";
case "1.16.2":
case "1.16.3":
return "1.16.2";
default:
return "";
}
@ -72,6 +75,8 @@ public class NBTModifier {
return nbt_1_15.itemToString(item);
case "1.16":
return nbt_1_16.itemToString(item);
case "1.16.2":
return nbt_1_16_2.itemToString(item);
default:
return "";
}
@ -87,6 +92,8 @@ public class NBTModifier {
return nbt_1_15.removePlayerdata(player);
case "1.16":
return nbt_1_16.removePlayerdata(player);
case "1.16.2":
return nbt_1_16_2.removePlayerdata(player);
}
return false;
}
@ -104,6 +111,9 @@ public class NBTModifier {
case "1.16":
nbt_1_16.resetMeta(player, item, mainhand);
break;
case "1.16.2":
nbt_1_16_2.resetMeta(player, item, mainhand);
break;
}
}
protected boolean isPlayer(ProjectileSource source) {
@ -116,6 +126,8 @@ public class NBTModifier {
return nbt_1_15.isPlayer(source);
case "1.16":
return nbt_1_16.isPlayer(source);
case "1.16.2":
return nbt_1_16_2.isPlayer(source);
default:
return false;
}
@ -130,6 +142,8 @@ public class NBTModifier {
return nbt_1_15.getArrowDamage(arrow);
case "1.16":
return nbt_1_16.getArrowDamage(arrow);
case "1.16.2":
return nbt_1_16_2.getArrowDamage(arrow);
default:
return 0;
}
@ -148,6 +162,9 @@ public class NBTModifier {
case "1.16":
nbt_1_16.setArrowDamage(arrow, amount);
break;
case "1.16.2":
nbt_1_16_2.setArrowDamage(arrow, amount);
break;
}
}
protected int getFireworkEffectSize(Firework firework) {
@ -160,6 +177,8 @@ public class NBTModifier {
return nbt_1_15.getFireworkEffectSize(firework);
case "1.16":
return nbt_1_16.getFireworkEffectSize(firework);
case "1.16.2":
return nbt_1_16_2.getFireworkEffectSize(firework);
default:
return 0;
}
@ -174,6 +193,8 @@ public class NBTModifier {
return nbt_1_15.hasFireworkLargeEffect(firework);
case "1.16":
return nbt_1_16.hasFireworkLargeEffect(firework);
case "1.16.2":
return nbt_1_16_2.hasFireworkLargeEffect(firework);
default:
return false;
}
@ -189,6 +210,8 @@ public class NBTModifier {
return nbt_1_15.isCrashItem(item);
case "1.16":
return nbt_1_16.isCrashItem(item);
case "1.16.2":
return nbt_1_16_2.isCrashItem(item);
default:
return false;
}
@ -203,6 +226,8 @@ public class NBTModifier {
return nbt_1_15.containsCrashItem(item);
case "1.16":
return nbt_1_16.containsCrashItem(item);
case "1.16.2":
return nbt_1_16_2.containsCrashItem(item);
default:
return false;
}
@ -218,6 +243,8 @@ public class NBTModifier {
return nbt_1_15.isDeathItem(item);
case "1.16":
return nbt_1_16.isDeathItem(item);
case "1.16.2":
return nbt_1_16_2.isDeathItem(item);
default:
return false;
}
@ -232,6 +259,8 @@ public class NBTModifier {
return nbt_1_15.containsDeathItem(item);
case "1.16":
return nbt_1_16.containsDeathItem(item);
case "1.16.2":
return nbt_1_16_2.containsDeathItem(item);
default:
return false;
}
@ -247,6 +276,8 @@ public class NBTModifier {
return nbt_1_15.isDisconnectItem(entity);
case "1.16":
return nbt_1_16.isDisconnectItem(entity);
case "1.16.2":
return nbt_1_16_2.isDisconnectItem(entity);
default:
return false;
}
@ -261,6 +292,8 @@ public class NBTModifier {
return nbt_1_15.isDisconnectItem(item);
case "1.16":
return nbt_1_16.isDisconnectItem(item);
case "1.16.2":
return nbt_1_16_2.isDisconnectItem(item);
default:
return false;
}
@ -275,6 +308,8 @@ public class NBTModifier {
return nbt_1_15.containsDisconnectItem(item);
case "1.16":
return nbt_1_16.containsDisconnectItem(item);
case "1.16.2":
return nbt_1_16_2.containsDisconnectItem(item);
default:
return false;
}
@ -292,6 +327,8 @@ public class NBTModifier {
break;
case "1.16":
nbt_1_16.removeInvalidValues(entity);
case "1.16.2":
nbt_1_16_2.removeInvalidValues(entity);
break;
}
}
@ -318,6 +355,11 @@ public class NBTModifier {
return true;
}
return nbt_1_16.isDangerousEgg(item);
case "1.16.2":
if(item != null && item.getItemMeta() instanceof SpawnEggMeta) {
return true;
}
return nbt_1_16_2.isDangerousEgg(item);
default:
return false;
}
@ -337,6 +379,9 @@ public class NBTModifier {
case "1.16":
nbt_1_16.isDangerousSkull(item);
break;
case "1.16.2":
nbt_1_16_2.isDangerousSkull(item);
break;
}
return false;
}

View file

@ -0,0 +1,404 @@
package me.cooljwb.vulnerabilitypatcher.modifiers;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import me.cooljwb.vulnerabilitypatcher.Variables;
import me.cooljwb.vulnerabilitypatcher.VulnerabilityPatcher;
import me.cooljwb.vulnerabilitypatcher.patches.Patches;
import net.minecraft.server.v1_16_R2.MojangsonParser;
import net.minecraft.server.v1_16_R2.NBTBase;
import net.minecraft.server.v1_16_R2.NBTTagCompound;
import net.minecraft.server.v1_16_R2.NBTTagList;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftItem;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.SpawnEggMeta;
import org.bukkit.projectiles.ProjectileSource;
import java.io.File;
import java.util.HashMap;
import java.util.logging.*;
import java.util.regex.Pattern;
/*
* Copyright 2019 CoolJWB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
/**
* This class is a function port to 1.15
* Date: 2020-06-13
* @author CoolJWB
*/
public class NBTModifier_1_16_2 {
private Logger log = Logger.getLogger("Minecraft");
/* Misc */
public void log(Level level, String message) {
log.log(level, String.format("[%s] %s", VulnerabilityPatcher.pluginName, message));
}
private void fired_countermeasure(String reason) {
if(Patches.devmode) {
log(Level.INFO, String.format("Fired countermeasure in %s reason: %s", getClass().getName(), reason));
}
}
private NBTTagCompound getItemNBT(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack != null) {
return nmsItemStack.getTag();
}
}
return null;
}
private NBTTagCompound getEntityNBT(Entity entity) {
net.minecraft.server.v1_16_R2.Entity nmsEntity = ((CraftEntity)entity).getHandle();
NBTTagCompound tag = new NBTTagCompound();
nmsEntity.save(tag);
return tag;
}
private void setEntityNBT(Entity entity, NBTTagCompound nbtTagCompound) {
net.minecraft.server.v1_16_R2.Entity nmsEntity = ((CraftEntity)entity).getHandle();
nmsEntity.save(nbtTagCompound);
}
public NBTTagList getAttributeList(ItemStack item) {
NBTTagCompound itemtag = getItemNBT(item);
if(item != null && itemtag != null && itemtag.hasKey("AttributeModifiers")) {
return getItemNBT(item).getList("AttributeModifiers", 10);
}
return null;
}
String itemToString(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack.hasTag()) {
return nmsItemStack.getTag().toString();
}
}
return "";
}
boolean removePlayerdata(String player) {
if(Bukkit.getPlayer(player) != null) {
((CraftEntity) Bukkit.getPlayer(player)).getHandle().save(new NBTTagCompound());
return true;
}
else if(Bukkit.getOfflinePlayer(player) != null) {
File file = new File(Bukkit.getServer().getWorldContainer() + "/world/playerdata/" + Bukkit.getOfflinePlayer(player).getUniqueId().toString() + ".dat");
return file.delete();
}
return false;
}
void resetMeta(Player player, ItemStack item, boolean mainhand) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack.hasTag() && nmsItemStack.getTag().hasKey("pages")) {
String pages = nmsItemStack.getTag().getList("pages", 8).toString();
if (pages.contains("clickEvent") || pages.contains("hoverEvent")) {
BookMeta meta = (BookMeta) item.getItemMeta();
ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
meta.setPages(meta.getPages());
book.setItemMeta(meta);
if (mainhand) {
player.getInventory().setItemInMainHand(book);
}
else {
player.getInventory().setItemInOffHand(book);
}
}
}
}
boolean isPlayer(ProjectileSource source) {
return source instanceof CraftPlayer;
}
double getArrowDamage(Arrow arrow) {
return getEntityNBT(arrow).hasKey("damage") ? getEntityNBT(arrow).getDouble("damage") : 0;
}
void setArrowDamage(Arrow arrow, double amount) {
NBTTagCompound tag = getEntityNBT(arrow);
if(tag.hasKey("damage")) {
tag.setDouble("damage", amount);
setEntityNBT(arrow, tag);
}
}
int getFireworkEffectSize(Firework firework) {
NBTTagCompound tag = getEntityNBT(firework);
if(tag.hasKey("FireworksItem") && tag.getCompound("FireworksItem").hasKey("tag") && tag.getCompound("FireworksItem").getCompound("tag").hasKey("Fireworks") && tag.getCompound("FireworksItem").getCompound("tag").getCompound("Fireworks").hasKey("Explosions")) {
return tag.getCompound("FireworksItem").getCompound("tag").getCompound("Fireworks").getList("Explosions", 10).size();
}
return 0;
}
boolean hasFireworkLargeEffect(Firework firework) {
NBTTagCompound tag = getEntityNBT(firework);
if(tag.hasKey("FireworksItem") && tag.getCompound("FireworksItem").hasKey("tag") && tag.getCompound("FireworksItem").getCompound("tag").hasKey("Fireworks") && tag.getCompound("FireworksItem").getCompound("tag").getCompound("Fireworks").hasKey("Explosions")) {
NBTTagList explosions = tag.getCompound("FireworksItem").getCompound("tag").getCompound("Fireworks").getList("Explosions", 10);
for(int x = 0; x <= (explosions.size() - 1); x++) {
if(explosions.getCompound(x).getInt("Type") == 1 || explosions.getCompound(x).getInt("Type") == 3) {
return true;
}
}
}
return false;
}
boolean isCrashItem(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack.getTag() != null) {
NBTTagCompound itemtag = nmsItemStack.getTag();
if(itemtag.toString().contains("translation.test.invalid")) {
fired_countermeasure("isCrashItem");
return true;
}
}
}
return false;
}
boolean containsCrashItem(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack.getTag() != null) {
Pattern pattern = Pattern.compile("([^a-z0-9/._-])");
NBTTagCompound blockentitytag = nmsItemStack.getTag().getCompound("BlockEntityTag");
NBTTagList itemlist = blockentitytag.getList("Items", 10);
for(int a = 0; a <= itemlist.size(); a++) {
NBTTagCompound itemtag = itemlist.getCompound(a).getCompound("tag");
if(itemtag.toString().contains("translation.test.invalid") || pattern.matcher(blockentitytag.getString("LootTable")).find()) {
fired_countermeasure("containsCrashItem");
return true;
}
}
}
}
return false;
}
boolean isDeathItem(ItemStack item) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack != null && nmsItemStack.hasTag()) {
return isDeathItem(nmsItemStack.getTag());
}
return false;
}
private boolean isDeathItem(NBTTagCompound item) {
if(item != null) {
NBTTagList attrlist = item.getList("AttributeModifiers", 10);
if(attrlist != null) {
for(int i = 0; i < attrlist.size(); i++) {
NBTTagCompound compound = (NBTTagCompound)attrlist.get(i);
if((compound.getString("Name").equalsIgnoreCase("MAX_HEALTH") || compound.getString("AttributeName").equalsIgnoreCase("generic.max_health")) && compound.getDouble("Amount") <= 0) {
fired_countermeasure("isDeathItem");
return true;
}
}
}
}
return false;
}
boolean containsDeathItem(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack.getTag() != null) {
NBTTagCompound blockentitytag = nmsItemStack.getTag().getCompound("BlockEntityTag");
NBTTagList itemlist = blockentitytag.getList("Items", 10);
for(int a = 0; a <= itemlist.size(); a++) {
NBTTagList attrlist = itemlist.getCompound(a).getCompound("tag").getList("AttributeModifiers", 10);
for(int b = 0; b <= attrlist.size(); b++) {
String attribute_name = attrlist.getCompound(b).getString("AttributeName");
String name = attrlist.getCompound(b).getString("Name");
Double amount = attrlist.getCompound(b).getDouble("Amount");
if((name.equalsIgnoreCase("MAX_HEALTH") || attribute_name.equalsIgnoreCase("generic.max_health")) && amount <= 0) {
fired_countermeasure("containsDeathItem");
return true;
}
}
}
}
}
return false;
}
boolean isDisconnectItem(ItemStack item) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack != null && nmsItemStack.hasTag()) {
return isDisconnectItem(nmsItemStack.getTag());
}
return false;
}
boolean isDisconnectItem(Entity entity) {
if(entity instanceof CraftItem) {
return isDisconnectItem((CraftItem) entity);
}
return false;
}
private boolean isDisconnectItem(NBTTagCompound item) {
if(item != null) {
if(item.hasKey("CustomPotionColor") && item.getInt("CustomPotionColor") < 0) {
fired_countermeasure("isCustomPotionColorDisconnectItem");
return true;
}
else if((item.getCompound("display").hasKey("color") && item.getCompound("display").getInt("color") < 0)) {
fired_countermeasure("isDisplayColorDisconnectItem");
return true;
}
else if(item.getCompound("BlockEntityTag").hasKey("Patterns")) {
NBTTagList patterns = item.getCompound("BlockEntityTag").getList("Patterns", 10);
for(int x = 0; x <= (patterns.size() - 1); x++) {
if(patterns.get(x).getTypeId() == 10) {
if(patterns.getCompound(x).hasKey("Color") && patterns.getCompound(x).getInt("Color") < 0)
return true;
}
}
for(NBTBase base : item.getCompound("BlockEntityTag").getList("Patterns", 10)) {
if(base.asString().contains("Color:-1")) {
fired_countermeasure("isDisplayBannedColorDisconnectItem");
return true;
}
}
}
else if(item.toString().length() > 262140) {
fired_countermeasure("isLargeNBTDisconnectItem");
return true;
}
else if(isMovementDisconnectItem(item) /*|| isInvalidAttributeName(item)*/) {
return true;
}
}
return false;
}
boolean containsDisconnectItem(ItemStack item) {
if(item != null) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
if(nmsItemStack != null && nmsItemStack.getTag() != null) {
NBTTagList items = nmsItemStack.getTag().getCompound("BlockEntityTag").getList("Items", 10);
if(items != null) {
for (int x = 0; x <= (items.size() - 1); x++) {
NBTTagCompound nmsitem = items.getCompound(x);
return isDisconnectItem(nmsitem.getCompound("tag"));
}
}
}
}
return false;
}
private boolean isMovementDisconnectItem(NBTTagCompound tag) {
if(tag != null) {
NBTTagList attrlist = tag.getList("AttributeModifiers", 10);
if(attrlist != null) {
HashMap<String, Float> attributes = new HashMap<>();
for(int a = 0; a <= attrlist.size(); a++) {
NBTTagCompound attribute = attrlist.getCompound(a);
if(attribute.getString("AttributeName").equalsIgnoreCase("generic.movement_speed") && attributes.containsKey(attribute.getString("AttributeName").toLowerCase()) && !Float.isFinite(attribute.getFloat("Amount"))) {
fired_countermeasure("isMovementDisconnectItem");
return true;
}
attributes.put(attribute.getString("AttributeName").toLowerCase(), attribute.getFloat("Amount"));
}
}
}
return false;
}
/**
* Does not have any use as this is patched in newer versions and only causes issues.
*/
@Deprecated
private boolean isInvalidAttributeName(NBTTagCompound tag) {
if(tag != null) {
NBTTagList attrlist = tag.getList("AttributeModifiers", 10);
if(attrlist != null) {
for(int a = 0; a <= attrlist.size(); a++) {
NBTTagCompound attribute = attrlist.getCompound(a);
if(attribute != null && attribute.getString("AttributeName").toLowerCase() != "") {
if(!Variables.Attributes.liststr.contains(attribute.getString("AttributeName").toLowerCase())) {
fired_countermeasure("isInvalidAttributeNameDisconnectItem");
return true;
}
}
}
}
}
return false;
}
void removeInvalidValues(Entity entity) {
NBTTagCompound tag = getEntityNBT(entity);
if(tag.asString().contains("Color:-")) {
try {
setEntityNBT(entity, MojangsonParser.parse(tag.asString().replaceAll("Color:-", "")));
} catch (CommandSyntaxException e) {
e.printStackTrace();
}
}
}
boolean isDangerousEgg(ItemStack item) {
if(item != null && item.getItemMeta() instanceof SpawnEggMeta) {
net.minecraft.server.v1_16_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item);
return nmsItemStack.hasTag() && VulnerabilityPatcher.main.getConfig().getStringList("BlockedEntityTags").contains(nmsItemStack.getTag().getCompound("EntityTag").getString("id").replaceAll("minecraft:", ""));
}
return false;
}
boolean isDangerousSkull(ItemStack item) {
if(item != null && item.hasItemMeta()) {
NBTTagCompound tag = CraftItemStack.asNMSCopy(item).getTag();
if (tag != null && tag.hasKey("SkullOwner") && tag.getString("SkullOwner").trim().equals("")) {
return true;
}
}
return false;
}
}