Update to 1.16.1 (#3408)

Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>
Co-authored-by: md678685 <1917406+md678685@users.noreply.github.com>
Co-authored-by: pop4959 <pop4959@gmail.com>
This commit is contained in:
Josh Roy 2020-06-27 15:17:35 -04:00 committed by GitHub
parent edf2f295d1
commit 1ab1b5713e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 642 additions and 573 deletions

View File

@ -52,6 +52,12 @@
<groupId>com.github.milkbowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
@ -76,6 +82,12 @@
<groupId>net.ess3</groupId>
<artifactId>NMSReflectionProvider</artifactId>
<version>2.17.2</version>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
<dependency>
@ -90,5 +102,17 @@
</exclusions>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>1_8Provider</artifactId>
<version>2.17.2</version>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -356,17 +356,18 @@ public class AsyncTeleport implements IAsyncTeleport {
void respawnNow(IUser teleportee, TeleportCause cause, CompletableFuture<Boolean> future) {
final Player player = teleportee.getBase();
Location bed = player.getBedSpawnLocation();
if (bed != null) {
nowAsync(teleportee, new LocationTarget(bed), cause, future);
} else {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Could not find bed spawn, forcing respawn event.");
PaperLib.getBedSpawnLocationAsync(player, true).thenAccept(location -> {
if (location != null) {
nowAsync(teleportee, new LocationTarget(location), cause, future);
} else {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Could not find bed spawn, forcing respawn event.");
}
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
ess.getServer().getPluginManager().callEvent(pre);
nowAsync(teleportee, new LocationTarget(pre.getRespawnLocation()), cause, future);
}
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
ess.getServer().getPluginManager().callEvent(pre);
nowAsync(teleportee, new LocationTarget(pre.getRespawnLocation()), cause, future);
}
});
}
@Override

View File

@ -251,6 +251,15 @@ public class Enchantments {
}
} catch (IllegalArgumentException ignored) {}
try { // 1.16
Enchantment soulspeed = Enchantment.getByName("SOUL_SPEED");
if (soulspeed != null) {
ENCHANTMENTS.put("soulspeed", soulspeed);
ALIASENCHANTMENTS.put("soilspeed", soulspeed);
ALIASENCHANTMENTS.put("sandspeed", soulspeed);
}
} catch (IllegalArgumentException ignored) {}
try {
Class<?> namespacedKeyClass = Class.forName("org.bukkit.NamespacedKey");
Class<?> enchantmentClass = Class.forName("org.bukkit.enchantments.Enchantment");

View File

@ -122,15 +122,6 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
super(new JavaPluginLoader(server), new PluginDescriptionFile("Essentials", "", "com.earth2me.essentials.Essentials"), null, null);
}
@SuppressWarnings("unused")
public void forceLoadClasses() {
try {
Class.forName(OfflinePlayer.class.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
public ISettings getSettings() {
return settings;
@ -193,8 +184,6 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
}
}
forceLoadClasses();
try {
final EssentialsUpgrade upgrade = new EssentialsUpgrade(this);
upgrade.beforeSettings();

View File

@ -399,11 +399,14 @@ public class EssentialsPlayerListener implements Listener {
Location loc = user.getHome(user.getLocation());
if (loc == null) {
loc = user.getBase().getBedSpawnLocation();
}
if (loc != null) {
user.getBase().setCompassTarget(loc);
PaperLib.getBedSpawnLocationAsync(user.getBase(), false).thenAccept(location -> {
if (location != null) {
user.getBase().setCompassTarget(location);
}
});
return;
}
user.getBase().setCompassTarget(loc);
}
@EventHandler(priority = EventPriority.LOW)

View File

@ -3,8 +3,6 @@ package com.earth2me.essentials;
import com.earth2me.essentials.commands.IEssentialsCommand;
import com.earth2me.essentials.signs.EssentialsSign;
import com.earth2me.essentials.textreader.IText;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventPriority;
@ -93,7 +91,7 @@ public interface ISettings extends IConf {
String getNicknamePrefix();
ChatColor getOperatorColor() throws Exception;
String getOperatorColor() throws Exception;
boolean getPerWarpPermission();

View File

@ -23,7 +23,8 @@ public enum Mob {
GIANT("Giant", Enemies.ENEMY, EntityType.GIANT),
HORSE("Horse", Enemies.FRIENDLY, EntityType.HORSE),
PIG("Pig", Enemies.FRIENDLY, EntityType.PIG),
PIGZOMB("PigZombie", Enemies.NEUTRAL, EntityType.PIG_ZOMBIE),
PIGZOMB("PigZombie", Enemies.NEUTRAL, MobCompat.ZOMBIFIED_PIGLIN),
ZOMBIFIED_PIGLIN("ZombifiedPiglin", Enemies.NEUTRAL, MobCompat.ZOMBIFIED_PIGLIN),
SHEEP("Sheep", Enemies.FRIENDLY, "", EntityType.SHEEP),
SKELETON("Skeleton", Enemies.ENEMY, EntityType.SKELETON),
SLIME("Slime", Enemies.ENEMY, EntityType.SLIME),
@ -90,7 +91,12 @@ public enum Mob {
RAVAGER("Ravager", Enemies.ENEMY, "RAVAGER"),
TRADER_LLAMA("TraderLlama", Enemies.FRIENDLY, "TRADER_LLAMA"),
WANDERING_TRADER("WanderingTrader", Enemies.FRIENDLY, "WANDERING_TRADER"),
BEE("Bee", Enemies.NEUTRAL, "BEE")
BEE("Bee", Enemies.NEUTRAL, "BEE"),
STRAY("Stray", Enemies.ENEMY, "STRAY"),
HOGLIN("Hoglin", Enemies.ADULT_ENEMY, "HOGLIN"),
PIGLIN("Piglin", Enemies.ADULT_ENEMY, "PIGLIN"),
STRIDER("Strider", Enemies.FRIENDLY, "STRIDER"),
ZOGLIN("Zoglin", Enemies.ENEMY, "ZOGLIN"),
;
public static final Logger logger = Logger.getLogger("Essentials");
@ -154,7 +160,8 @@ public enum Mob {
public enum Enemies {
FRIENDLY("friendly"),
NEUTRAL("neutral"),
ENEMY("enemy");
ENEMY("enemy"),
ADULT_ENEMY("adult_enemy");
Enemies(final String type) {
this.type = type;

View File

@ -1,28 +1,42 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fox;
import org.bukkit.entity.Llama;
import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.Ocelot;
import org.bukkit.entity.Panda;
import org.bukkit.entity.Parrot;
import org.bukkit.entity.TropicalFish;
import org.bukkit.entity.Villager;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import static com.earth2me.essentials.utils.EnumUtil.getEntityType;
public class MobCompat {
// Constants for mob interfaces added in later versions
public static final Class RAIDER = ReflUtil.getClassCached("org.bukkit.entity.Raider");
// Constants for mobs added in later versions
public static final EntityType LLAMA = getEntityType("LLAMA");
public static final EntityType PARROT = getEntityType("PARROT");
public static final EntityType TROPICAL_FISH = getEntityType("TROPICAL_FISH");
public static final EntityType PANDA = getEntityType("PANDA");
public static final EntityType TRADER_LLAMA = getEntityType("TRADER_LLAMA");
public static final EntityType SHULKER = getEntityType("SHULKER");
public static final EntityType STRAY = getEntityType("STRAY");
public static final EntityType FOX = getEntityType("FOX");
public static final EntityType PHANTOM = getEntityType("PHANTOM");
// Constants for mobs that have changed since earlier versions
public static final EntityType CAT = getEntityType("CAT", "OCELOT");
public static final EntityType ZOMBIFIED_PIGLIN = getEntityType("ZOMBIFIED_PIGLIN", "PIG_ZOMBIE");
public enum CatType {
// These are (loosely) Mojang names for the cats
@ -64,7 +78,7 @@ public class MobCompat {
NITWIT("NITWIT", "NITWIT"),
SHEPHERD("FARMER", "SHEPHERD"),
TOOLSMITH("BLACKSMITH", "TOOL_SMITH", "TOOLSMITH"),
WEAPONSMITH("BLACKSMITH", "WEAPON_SMITH", "WEAPONSMITH")
WEAPONSMITH("BLACKSMITH", "WEAPON_SMITH", "WEAPONSMITH"),
;
private final String oldProfession;
@ -89,41 +103,33 @@ public class MobCompat {
}
// Older cats are Ocelots, whereas 1.14+ cats are Cats
private static final Class catClass = ReflUtil.getClassCached("org.bukkit.entity.Cat");
private static final Class catTypeClass = ReflUtil.getClassCached("org.bukkit.entity.Cat.Type");
private static final Method catSetTypeMethod = (catClass == null || catTypeClass == null) ? null : ReflUtil.getMethodCached(catClass, "setCatType", catTypeClass);
private static boolean isNewCat() {
return (catClass != null && catTypeClass != null && catSetTypeMethod != null);
}
public static void setCatType(final Entity entity, final CatType type) {
if (isNewCat()) {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
((Ocelot) entity).setCatType(Ocelot.Type.valueOf(type.ocelotTypeName));
} else {
Class cat = ReflUtil.getClassCached("org.bukkit.entity.Cat");
Class catType = ReflUtil.getClassCached("org.bukkit.entity.Cat$Type");
Method setCatType = ReflUtil.getMethodCached(cat, "setCatType", catType);
try {
catSetTypeMethod.invoke(entity, EnumUtil.valueOf(catTypeClass, type.catTypeName));
} catch (IllegalAccessException | InvocationTargetException e) {
setCatType.invoke(entity, EnumUtil.valueOf(catType, type.catTypeName));
} catch (Exception e) {
e.printStackTrace();
}
} else {
((Ocelot) entity).setCatType(Ocelot.Type.valueOf(type.ocelotTypeName));
}
}
// Older villagers have professions and careers, 1.14+ villagers only have professions
private static final Class villagerCareerClass = ReflUtil.getClassCached("org.bukkit.entity.Villager.Career");
private static final Method villagerSetCareerMethod = (villagerCareerClass == null) ? null : ReflUtil.getMethodCached(Villager.class, "setCareer", villagerCareerClass);
private static boolean isCareerVillager() {
return (villagerCareerClass != null && villagerSetCareerMethod != null);
}
public static void setVillagerProfession(final Entity entity, final VillagerProfession profession) {
if (!isCareerVillager()) {
((Villager) entity).setProfession(profession.asEnum());
} else {
((Villager) entity).setProfession(profession.asEnum());
if (!(entity instanceof Villager)) {
return;
}
Villager villager = (Villager) entity;
villager.setProfession(profession.asEnum());
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
Class villagerCareer = ReflUtil.getClassCached("org.bukkit.entity.Villager$Career");
Method setCareer = ReflUtil.getMethodCached(Villager.class, "setCareer", villagerCareer);
try {
villagerSetCareerMethod.invoke(entity, EnumUtil.valueOf(villagerCareerClass, profession.oldCareer));
setCareer.invoke(entity, EnumUtil.valueOf(villagerCareer, profession.oldCareer));
} catch (Exception e) {
e.printStackTrace();
}
@ -132,92 +138,77 @@ public class MobCompat {
// Only 1.14+ villagers have biome variants
public static void setVillagerType(final Entity entity, final String type) {
Class typeEnum = ReflUtil.getClassCached("org.bukkit.entity.Villager.Type");
if (typeEnum == null) return;
Method villagerSetTypeMethod = ReflUtil.getMethodCached(Villager.class, "setVillagerType", typeEnum);
try {
villagerSetTypeMethod.invoke(entity, EnumUtil.valueOf(typeEnum, type));
} catch (Exception e) {
e.printStackTrace();
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
return;
}
if (entity instanceof Villager) {
((Villager) entity).setVillagerType(Villager.Type.valueOf(type));
}
}
// Llamas only exist in 1.11+
public static void setLlamaColor(final Entity entity, final String color) {
Class llamaClass = ReflUtil.getClassCached("org.bukkit.entity.Llama");
if (llamaClass == null) return;
Class colorEnum = ReflUtil.getClassCached("org.bukkit.entity.Llama.Color");
Method setVariantMethod = ReflUtil.getMethodCached(llamaClass, "setColor");
try {
setVariantMethod.invoke(entity, EnumUtil.valueOf(colorEnum, color));
} catch (Exception e) {
e.printStackTrace();
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_11_R01)) {
return;
}
if (entity instanceof Llama) {
((Llama) entity).setColor(Llama.Color.valueOf(color));
}
}
// Parrots only exist in 1.12+
public static void setParrotVariant(final Entity entity, final String variant) {
Class parrotClass = ReflUtil.getClassCached("org.bukkit.entity.Parrot");
if (parrotClass == null) return;
Class variantEnum = ReflUtil.getClassCached("org.bukkit.entity.Parrot.Variant");
Method setVariantMethod = ReflUtil.getMethodCached(parrotClass, "setVariant");
try {
setVariantMethod.invoke(entity, EnumUtil.valueOf(variantEnum, variant));
} catch (Exception e) {
e.printStackTrace();
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_12_0_R01)) {
return;
}
if (entity instanceof Parrot) {
((Parrot) entity).setVariant(Parrot.Variant.valueOf(variant));
}
}
// Tropical fish only exist in 1.13+
public static void setTropicalFishPattern(final Entity entity, final String pattern) {
Class tropicalFishClass = ReflUtil.getClassCached("org.bukkit.entity.TropicalFish");
if (tropicalFishClass == null) return;
Class patternEnum = ReflUtil.getClassCached("org.bukkit.entity.TropicalFish.Pattern");
Method setPatternMethod = ReflUtil.getMethodCached(tropicalFishClass, "setPattern");
try {
setPatternMethod.invoke(entity, EnumUtil.valueOf(patternEnum, pattern));
} catch (Exception e) {
e.printStackTrace();
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_12_0_R01)) {
return;
}
if (entity instanceof TropicalFish) {
((TropicalFish) entity).setPattern(TropicalFish.Pattern.valueOf(pattern));
}
}
// Mushroom cow variant API only exists in 1.14+
public static void setMooshroomVariant(final Entity entity, final String variant) {
Class mushroomCowClass = ReflUtil.getClassCached("org.bukkit.entity.MushroomCow");
Class variantEnum = ReflUtil.getClassCached("org.bukkit.entity.MushroomCow.Variant");
if (mushroomCowClass == null || variantEnum == null) return;
Method setVariantMethod = ReflUtil.getMethodCached(mushroomCowClass, "setVariant");
try {
setVariantMethod.invoke(entity, EnumUtil.valueOf(variantEnum, variant));
} catch (Exception e) {
e.printStackTrace();
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
return;
}
if (entity instanceof MushroomCow) {
((MushroomCow) entity).setVariant(MushroomCow.Variant.valueOf(variant));
}
}
// Pandas only exists in 1.14+
public static void setPandaGene(final Entity entity, final String gene, final boolean mainGene) {
Class pandaClass = ReflUtil.getClassCached("org.bukkit.entity.Panda");
if (pandaClass == null) return;
Class geneEnum = ReflUtil.getClassCached("org.bukkit.entity.Panda.Gene");
Method setGeneMethod;
if (mainGene) {
setGeneMethod = ReflUtil.getMethodCached(pandaClass, "setMainGene");
} else {
setGeneMethod = ReflUtil.getMethodCached(pandaClass, "setHiddenGene");
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
return;
}
if (entity instanceof Panda) {
Panda panda = (Panda) entity;
Panda.Gene pandaGene = Panda.Gene.valueOf(gene);
if (mainGene) {
panda.setMainGene(pandaGene);
} else {
panda.setHiddenGene(pandaGene);
}
}
}
try {
setGeneMethod.invoke(entity, EnumUtil.valueOf(geneEnum, gene));
} catch (Exception e) {
e.printStackTrace();
// Foxes only exist in 1.14+
public static void setFoxType(final Entity entity, final String type) {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_R01)) {
return;
}
if (entity instanceof Fox) {
((Fox) entity).setFoxType(Fox.Type.valueOf(type));
}
}

View File

@ -12,6 +12,7 @@ import org.bukkit.material.Colorable;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import static com.earth2me.essentials.I18n.tl;
@ -32,7 +33,7 @@ public enum MobData {
TAMED_TAMEABLE("tamed", Tameable.class, Data.TAMED, true),
TAME_TAMEABLE("tame", Tameable.class, Data.TAMED, false),
RANDOM_SHEEP("random", EntityType.SHEEP, Data.COLORABLE, true),
COLORABLE_SHEEP("", StringUtil.joinList(DyeColor.values()).toLowerCase(Locale.ENGLISH), EntityType.SHEEP, Data.COLORABLE, true),
COLORABLE_SHEEP("", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH)).collect(Collectors.toList()), EntityType.SHEEP, Data.COLORABLE, true),
POLKA_HORSE("polka", EntityType.HORSE, Horse.Style.BLACK_DOTS, true),
SOOTY_HORSE("sooty", EntityType.HORSE, Horse.Style.BLACK_DOTS, false),
BLAZE_HORSE("blaze", EntityType.HORSE, Horse.Style.WHITE, true),
@ -113,8 +114,8 @@ public enum MobData {
SNOWY_VILLAGER("snowy", EntityType.VILLAGER, "villagertype:SNOWY", true),
SWAMP_VILLAGER("swamp", EntityType.VILLAGER, "villagertype:SWAMP", true),
TAIGA_VILLAGER("taiga", EntityType.VILLAGER, "villagertype:TAIGA", true),
SIZE_SLIME("", "<1-100>", EntityType.SLIME.getEntityClass(), Data.SIZE, true),
NUM_EXPERIENCE_ORB("", "<1-2000000000>", EntityType.EXPERIENCE_ORB, Data.EXP, true),
SIZE_SLIME("", Collections.singletonList("<1-100>"), EntityType.SLIME.getEntityClass(), Data.SIZE, true),
NUM_EXPERIENCE_ORB("", Collections.singletonList("<1-2000000000>"), EntityType.EXPERIENCE_ORB, Data.EXP, true),
RED_PARROT("red", MobCompat.PARROT, "parrot:RED", true),
GREEN_PARROT("green", MobCompat.PARROT, "parrot:GREEN", true),
BLUE_PARROT("blue", MobCompat.PARROT, "parrot:BLUE", true),
@ -153,7 +154,15 @@ public enum MobData {
CREAMY_TRADER_LLAMA("creamy", MobCompat.TRADER_LLAMA, "llama:CREAMY", true),
WHITE_TRADER_LLAMA("white", MobCompat.TRADER_LLAMA, "llama:WHITE", true),
BROWN_TRADER_LLAMA("brown", MobCompat.TRADER_LLAMA, "llama:BROWN", true),
GRAY_TRADER_LLAMA("gray", MobCompat.TRADER_LLAMA, "llama:GRAY", true)
GRAY_TRADER_LLAMA("gray", MobCompat.TRADER_LLAMA, "llama:GRAY", true),
RANDOM_SHULKER("random", MobCompat.SHULKER, Data.COLORABLE, true),
COLORABLE_SHULKER("", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH)).collect(Collectors.toList()), MobCompat.SHULKER, Data.COLORABLE, true),
RED_FOX("red", MobCompat.FOX, "fox:RED", true),
SNOW_FOX("snow", MobCompat.FOX, "fox:SNOW", true),
SIZE_PHANTOM("", Collections.singletonList("<1-100>"), MobCompat.PHANTOM, Data.SIZE, true),
RAID_LEADER("leader", MobCompat.RAIDER, Data.RAID_LEADER, true),
TROPICAL_FISH_BODY_COLOR("fish_body_color", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH) + "body").collect(Collectors.toList()), MobCompat.TROPICAL_FISH, Data.FISH_BODY_COLOR, true),
TROPICAL_FISH_PATTERN_COLOR("fish_pattern_color", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH) + "pattern").collect(Collectors.toList()), MobCompat.TROPICAL_FISH, Data.FISH_PATTERN_COLOR, true),
;
@ -170,43 +179,46 @@ public enum MobData {
TAMED,
COLORABLE,
EXP,
SIZE
SIZE,
RAID_LEADER,
FISH_BODY_COLOR,
FISH_PATTERN_COLOR,
}
public static final Logger logger = Logger.getLogger("Essentials");
MobData(String n, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.helpMessage = n;
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
MobData(String n, String h, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.helpMessage = h;
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
final private String nickname;
final private String helpMessage;
final private List<String> suggestions;
final private Object type;
final private Object value;
final private boolean isPublic;
private String matched;
MobData(String n, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.suggestions = Collections.singletonList(n);
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
MobData(String n, List<String> s, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.suggestions = s;
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
public static LinkedHashMap<String, MobData> getPossibleData(final Entity spawned, boolean publicOnly) {
LinkedHashMap<String, MobData> mobList = new LinkedHashMap<>();
for (MobData data : MobData.values()) {
if (data.type == null || (publicOnly && !data.isPublic)) continue;
if (data.type == null || (publicOnly && !data.isPublic)) {
continue;
}
if (data.type instanceof EntityType && spawned.getType().equals(data.type)) {
mobList.put(data.nickname.toLowerCase(Locale.ENGLISH), data);
} else if (data.type instanceof Class && ((Class) data.type).isAssignableFrom(spawned.getClass())) {
@ -222,7 +234,7 @@ public enum MobData {
LinkedHashMap<String, MobData> posData = getPossibleData(spawned, true);
for (MobData data : posData.values()) {
output.add(data.helpMessage);
output.add(StringUtil.joinList(data.suggestions));
}
return output;
}
@ -233,9 +245,11 @@ public enum MobData {
}
LinkedHashMap<String, MobData> posData = getPossibleData(spawned, false);
for (String data : posData.keySet()) {
if (name.contains(data)) {
return posData.get(data);
for (MobData data : posData.values()) {
for (String suggestion : data.suggestions) {
if (name.contains(suggestion)) {
return data;
}
}
}
return null;
@ -291,7 +305,12 @@ public enum MobData {
}
} else if (this.value.equals(Data.SIZE)) {
try {
((Slime) spawned).setSize(Integer.parseInt(rawData));
int size = Integer.parseInt(rawData);
if (spawned instanceof Slime) {
((Slime) spawned).setSize(size);
} else if (spawned.getType() == MobCompat.PHANTOM) {
((Phantom) spawned).setSize(size);
}
this.matched = rawData;
} catch (NumberFormatException e) {
throw new Exception(tl("slimeMalformedSize"), e);
@ -313,6 +332,26 @@ public enum MobData {
InventoryWorkaround.setItemInMainHand(invent, new ItemStack((Material) this.value, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
}
} else if (this.value.equals(Data.RAID_LEADER)) {
((Raider) spawned).setPatrolLeader(true);
} else if (this.value.equals(Data.FISH_BODY_COLOR)) {
for (String match : TROPICAL_FISH_BODY_COLOR.suggestions) {
if (rawData.contains(match)) {
this.matched = match;
final String color = match.substring(0, match.indexOf("body")).toUpperCase(Locale.ENGLISH);
((TropicalFish) spawned).setBodyColor(DyeColor.valueOf(color));
break;
}
}
} else if (this.value.equals(Data.FISH_PATTERN_COLOR)) {
for (String match : TROPICAL_FISH_PATTERN_COLOR.suggestions) {
if (rawData.contains(match)) {
this.matched = match;
final String color = match.substring(0, match.indexOf("pattern")).toUpperCase(Locale.ENGLISH);
((TropicalFish) spawned).setPatternColor(DyeColor.valueOf(color));
break;
}
}
} else if (this.value instanceof String) {
final String[] split = ((String) this.value).split(":");
switch (split[0]) {
@ -337,6 +376,9 @@ public enum MobData {
case "villagertype":
MobCompat.setVillagerType(spawned, split[1]);
break;
case "fox":
MobCompat.setFoxType(spawned, split[1]);
break;
}
} else {
logger.warning("Unknown mob data type: " + this.toString());

View File

@ -365,29 +365,37 @@ public class Settings implements net.ess3.api.ISettings {
return config.getBoolean("skip-used-one-time-kits-from-kit-list", false);
}
private ChatColor operatorColor = null;
private String operatorColor = null;
@Override
public ChatColor getOperatorColor() {
public String getOperatorColor() {
return operatorColor;
}
private ChatColor _getOperatorColor() {
private String _getOperatorColor() {
String colorName = config.getString("ops-name-color", null);
if (colorName == null) {
return ChatColor.DARK_RED;
}
if ("none".equalsIgnoreCase(colorName) || colorName.isEmpty()) {
return ChatColor.RED.toString();
} else if (colorName.equalsIgnoreCase("none") || colorName.isEmpty()) {
return null;
}
try {
return ChatColor.valueOf(colorName.toUpperCase(Locale.ENGLISH));
return FormatUtil.parseHexColor(colorName);
} catch (NumberFormatException ignored) {
}
try {
return ChatColor.valueOf(colorName.toUpperCase(Locale.ENGLISH)).toString();
} catch (IllegalArgumentException ignored) {
}
return ChatColor.getByChar(colorName);
ChatColor lastResort = ChatColor.getByChar(colorName);
if (lastResort != null) {
return lastResort.toString();
}
return null;
}
@Override

View File

@ -235,30 +235,20 @@ public class SpawnMob {
final EntityEquipment invent = ((LivingEntity) spawned).getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(Material.BOW, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.PIG_ZOMBIE) {
if (type == MobCompat.ZOMBIFIED_PIGLIN) {
final PigZombie zombie = ((PigZombie) spawned);
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(GOLDEN_SWORD, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.ZOMBIE) {
final Zombie zombie = ((Zombie) spawned);
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.HORSE) {

View File

@ -16,7 +16,6 @@ import net.ess3.api.events.JailStatusChangeEvent;
import net.ess3.api.events.MuteStatusChangeEvent;
import net.ess3.api.events.UserBalanceUpdateEvent;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@ -27,7 +26,13 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.math.BigDecimal;
import java.util.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -338,12 +343,15 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
if (this.getBase().isOp()) {
try {
final ChatColor opPrefix = ess.getSettings().getOperatorColor();
if (opPrefix != null && opPrefix.toString().length() > 0) {
prefix.insert(0, opPrefix.toString());
final String opPrefix = ess.getSettings().getOperatorColor();
if (opPrefix != null && !opPrefix.isEmpty()) {
prefix.insert(0, opPrefix);
suffix = "§r";
}
} catch (Exception ignored) {
} catch (Exception e) {
if (ess.getSettings().isDebug()) {
e.printStackTrace();
}
}
}

View File

@ -65,7 +65,7 @@ public class Commandspawnmob extends EssentialsCommand {
@Override
protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) {
if (args.length == 1) {
return Lists.newArrayList(SpawnMob.mobParts(args[0]));
return Lists.newArrayList(Mob.getMobList());
} else {
return Collections.emptyList();
}

View File

@ -1,11 +1,37 @@
package com.earth2me.essentials.craftbukkit;
import org.bukkit.*;
import org.bukkit.BlockChangeDelegate;
import org.bukkit.Chunk;
import org.bukkit.ChunkSnapshot;
import org.bukkit.Difficulty;
import org.bukkit.Effect;
import org.bukkit.FluidCollisionMode;
import org.bukkit.GameRule;
import org.bukkit.HeightMap;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.Raid;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.StructureType;
import org.bukkit.TreeType;
import org.bukkit.World;
import org.bukkit.WorldBorder;
import org.bukkit.WorldType;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.boss.DragonBattle;
import org.bukkit.entity.*;
import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Item;
import org.bukkit.entity.LightningStrike;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.inventory.ItemStack;
@ -140,45 +166,46 @@ public class FakeWorld implements World {
}
@Override
public boolean isChunkForceLoaded(int x, int z) {
throw new UnsupportedOperationException("Not supported yet.");
public boolean isChunkForceLoaded(int i, int i1) {
return false;
}
@Override
public void setChunkForceLoaded(int x, int z, boolean forced) {
throw new UnsupportedOperationException("Not supported yet.");
public void setChunkForceLoaded(int i, int i1, boolean b) {
}
@Override
public Collection<Chunk> getForceLoadedChunks() {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public boolean addPluginChunkTicket(int i, int i1, Plugin plugin) {
throw new UnsupportedOperationException("Not supported yet.");
return false;
}
@Override
public boolean removePluginChunkTicket(int i, int i1, Plugin plugin) {
throw new UnsupportedOperationException("Not supported yet.");
return false;
}
@Override
public void removePluginChunkTickets(Plugin plugin) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<Plugin> getPluginChunkTickets(int i, int i1) {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public Map<Plugin, Collection<Chunk>> getPluginChunkTickets() {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public Item dropItem(Location lctn, ItemStack is) {
throw new UnsupportedOperationException("Not supported yet.");
@ -195,7 +222,7 @@ public class FakeWorld implements World {
}
@Override
public <T extends AbstractArrow> T spawnArrow(Location location, Vector direction, float speed, float spread, Class<T> clazz) {
public <T extends AbstractArrow> T spawnArrow(Location location, Vector vector, float v, float v1, Class<T> aClass) {
throw new UnsupportedOperationException("Not supported yet.");
}
@ -378,20 +405,15 @@ public class FakeWorld implements World {
public boolean createExplosion(Location lctn, float f, boolean bln) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean createExplosion(double d, double d1, double d2, float f, boolean bln, boolean bln1, Entity entity) {
throw new UnsupportedOperationException("Not supported yet.");
public boolean createExplosion(Location location, float v, boolean b, boolean b1) {
return false;
}
@Override
public boolean createExplosion(Location lctn, float f, boolean bln, boolean bln1) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean createExplosion(Location lctn, float f, boolean bln, boolean bln1, Entity entity) {
throw new UnsupportedOperationException("Not supported yet.");
public boolean createExplosion(Location location, float v, boolean b, boolean b1, Entity entity) {
return false;
}
@Override
@ -451,22 +473,22 @@ public class FakeWorld implements World {
@Override
public int getHighestBlockYAt(int i, int i1, HeightMap heightMap) {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
public int getHighestBlockYAt(Location location, HeightMap heightMap) {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
public Block getHighestBlockAt(int i, int i1, HeightMap heightMap) {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public Block getHighestBlockAt(Location location, HeightMap heightMap) {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
@ -476,7 +498,7 @@ public class FakeWorld implements World {
@Override
public Biome getBiome(int i, int i1, int i2) {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
@ -486,7 +508,7 @@ public class FakeWorld implements World {
@Override
public double getTemperature(int i, int i1, int i2) {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
@ -496,7 +518,7 @@ public class FakeWorld implements World {
@Override
public double getHumidity(int i, int i1, int i2) {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
@ -576,12 +598,12 @@ public class FakeWorld implements World {
@Override
public boolean isHardcore() {
throw new UnsupportedOperationException("Not supported yet.");
return false;
}
@Override
public void setHardcore(boolean hardcore) {
throw new UnsupportedOperationException("Not supported yet.");
public void setHardcore(boolean b) {
}
@Override
@ -606,22 +628,32 @@ public class FakeWorld implements World {
@Override
public long getTicksPerWaterSpawns() {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
public void setTicksPerWaterSpawns(int i) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public long getTicksPerWaterAmbientSpawns() {
return 0;
}
@Override
public void setTicksPerWaterAmbientSpawns(int i) {
}
@Override
public long getTicksPerAmbientSpawns() {
throw new UnsupportedOperationException("Not supported yet.");
return 0;
}
@Override
public void setTicksPerAmbientSpawns(int i) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@ -671,7 +703,7 @@ public class FakeWorld implements World {
@Override
public void setBiome(int i, int i1, int i2, Biome biome) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@ -704,6 +736,16 @@ public class FakeWorld implements World {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getWaterAmbientSpawnLimit() {
return 0;
}
@Override
public void setWaterAmbientSpawnLimit(int i) {
}
@Override
public Entity spawnEntity(Location lctn, EntityType et) {
throw new UnsupportedOperationException("Not supported yet.");
@ -774,6 +816,11 @@ public class FakeWorld implements World {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean createExplosion(double v, double v1, double v2, float v3, boolean b, boolean b1, Entity entity) {
return false;
}
@Override
public WorldBorder getWorldBorder() {
throw new UnsupportedOperationException("Not supported yet.");
@ -855,18 +902,28 @@ public class FakeWorld implements World {
}
@Override
public Raid locateNearestRaid(Location location, int radius) {
throw new UnsupportedOperationException("Not supported yet.");
public int getViewDistance() {
return 0;
}
@Override
public Spigot spigot() {
return null;
}
@Override
public Raid locateNearestRaid(Location location, int i) {
return null;
}
@Override
public List<Raid> getRaids() {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public DragonBattle getEnderDragonBattle() {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
@ -875,58 +932,58 @@ public class FakeWorld implements World {
}
@Override
public Collection<Entity> getNearbyEntities(Location location, double x, double y, double z, Predicate<Entity> filter) {
throw new UnsupportedOperationException("Not supported yet.");
public Collection<Entity> getNearbyEntities(Location location, double v, double v1, double v2, Predicate<Entity> predicate) {
return null;
}
@Override
public Collection<Entity> getNearbyEntities(BoundingBox boundingBox) {
throw new UnsupportedOperationException("Not supported yet.");
return null;
}
@Override
public Collection<Entity> getNearbyEntities(BoundingBox boundingBox, Predicate<Entity> filter) {
throw new UnsupportedOperationException("Not supported yet.");
public Collection<Entity> getNearbyEntities(BoundingBox boundingBox, Predicate<Entity> predicate) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, double v1) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, Predicate<Entity> filter) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, Predicate<Entity> predicate) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize, Predicate<Entity> filter) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, double v1, Predicate<Entity> predicate) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode, boolean b) {
return null;
}
@Override
public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, Predicate<Entity> filter) {
throw new UnsupportedOperationException("Not supported yet.");
public RayTraceResult rayTrace(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode, boolean b, double v1, Predicate<Entity> predicate) {
return null;
}
@Override

View File

@ -3,6 +3,7 @@ package com.earth2me.essentials.utils;
import net.ess3.api.IUser;
import org.bukkit.ChatColor;
import java.awt.Color;
import java.util.EnumSet;
import java.util.Locale;
import java.util.Set;
@ -19,6 +20,8 @@ public class FormatUtil {
private static final Pattern STRIP_ALL_PATTERN = Pattern.compile("\u00a7+([0-9a-fk-orA-FK-OR])");
//Essentials '&' convention colour codes
private static final Pattern REPLACE_ALL_PATTERN = Pattern.compile("(&)?&([0-9a-fk-orA-FK-OR])");
private static final Pattern REPLACE_ALL_RGB_PATTERN = Pattern.compile("(&)?&#([0-9a-fA-F]{6})");
//Used to prepare xmpp output
private static final Pattern LOGCOLOR_PATTERN = Pattern.compile("\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]");
private static final Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-zA-Z]{2,3}(?:/\\S+)?)");
@ -57,28 +60,70 @@ public class FormatUtil {
if (input == null) {
return null;
}
return replaceColor(input, EnumSet.allOf(ChatColor.class));
return replaceColor(input, EnumSet.allOf(ChatColor.class), true);
}
static String replaceColor(final String input, final Set<ChatColor> supported) {
StringBuffer builder = new StringBuffer();
Matcher matcher = REPLACE_ALL_PATTERN.matcher(input);
searchLoop: while (matcher.find()) {
boolean isEscaped = (matcher.group(1) != null);
static String replaceColor(final String input, final Set<ChatColor> supported, boolean rgb) {
StringBuffer legacyBuilder = new StringBuffer();
Matcher legacyMatcher = REPLACE_ALL_PATTERN.matcher(input);
legacyLoop: while (legacyMatcher.find()) {
boolean isEscaped = (legacyMatcher.group(1) != null);
if (!isEscaped) {
char code = matcher.group(2).toLowerCase(Locale.ROOT).charAt(0);
char code = legacyMatcher.group(2).toLowerCase(Locale.ROOT).charAt(0);
for (ChatColor color : supported) {
if (color.getChar() == code) {
matcher.appendReplacement(builder, "\u00a7$2");
continue searchLoop;
legacyMatcher.appendReplacement(legacyBuilder, "\u00a7$2");
continue legacyLoop;
}
}
}
// Don't change & to section sign (or replace two &'s with one)
matcher.appendReplacement(builder, "&$2");
legacyMatcher.appendReplacement(legacyBuilder, "&$2");
}
matcher.appendTail(builder);
return builder.toString();
legacyMatcher.appendTail(legacyBuilder);
if (rgb) {
StringBuffer rgbBuilder = new StringBuffer();
Matcher rgbMatcher = REPLACE_ALL_RGB_PATTERN.matcher(legacyBuilder.toString());
while (rgbMatcher.find()) {
boolean isEscaped = (rgbMatcher.group(1) != null);
if (!isEscaped) {
try {
String hexCode = rgbMatcher.group(2);
rgbMatcher.appendReplacement(rgbBuilder, parseHexColor(hexCode));
continue;
} catch (NumberFormatException ignored) {
}
}
rgbMatcher.appendReplacement(rgbBuilder, "&#$2");
}
rgbMatcher.appendTail(rgbBuilder);
return rgbBuilder.toString();
}
return legacyBuilder.toString();
}
/**
* @throws NumberFormatException If the provided hex color code is invalid or if version is lower than 1.16.
*/
public static String parseHexColor(String hexColor) throws NumberFormatException {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_16_1_R01)) {
throw new NumberFormatException("Cannot use RGB colors in versions < 1.16");
}
if (hexColor.startsWith("#")) {
hexColor = hexColor.substring(1); //fuck you im reassigning this.
}
if (hexColor.length() != 6) {
throw new NumberFormatException("Invalid hex length");
}
Color.decode("#" + hexColor);
StringBuilder assembledColorCode = new StringBuilder();
assembledColorCode.append("\u00a7x");
for (char curChar : hexColor.toCharArray()) {
assembledColorCode.append("\u00a7").append(curChar);
}
return assembledColorCode.toString();
}
static String stripColor(final String input, final Set<ChatColor> strip) {
@ -134,8 +179,9 @@ public class FormatUtil {
}
EnumSet<ChatColor> strip = EnumSet.complementOf(supported);
if (!supported.isEmpty()) {
message = replaceColor(message, supported);
boolean rgb = user.isAuthorized(permBase + ".rgb");
if (!supported.isEmpty() || rgb) {
message = replaceColor(message, supported, rgb);
}
if (!strip.isEmpty()) {
message = stripColor(message, strip);

View File

@ -14,7 +14,9 @@ public class VersionUtil {
public static final BukkitVersion v1_8_8_R01 = BukkitVersion.fromString("1.8.8-R0.1-SNAPSHOT");
public static final BukkitVersion v1_9_R01 = BukkitVersion.fromString("1.9-R0.1-SNAPSHOT");
public static final BukkitVersion v1_9_4_R01 = BukkitVersion.fromString("1.9.4-R0.1-SNAPSHOT");
public static final BukkitVersion v1_10_R01 = BukkitVersion.fromString("1.10-R0.1-SNAPSHOT");
public static final BukkitVersion v1_10_2_R01 = BukkitVersion.fromString("1.10.2-R0.1-SNAPSHOT");
public static final BukkitVersion v1_11_R01 = BukkitVersion.fromString("1.11-R0.1-SNAPSHOT");
public static final BukkitVersion v1_11_2_R01 = BukkitVersion.fromString("1.11.2-R0.1-SNAPSHOT");
public static final BukkitVersion v1_12_0_R01 = BukkitVersion.fromString("1.12.0-R0.1-SNAPSHOT");
public static final BukkitVersion v1_12_2_R01 = BukkitVersion.fromString("1.12.2-R0.1-SNAPSHOT");
@ -23,10 +25,10 @@ public class VersionUtil {
public static final BukkitVersion v1_14_R01 = BukkitVersion.fromString("1.14-R0.1-SNAPSHOT");
public static final BukkitVersion v1_14_4_R01 = BukkitVersion.fromString("1.14.4-R0.1-SNAPSHOT");
public static final BukkitVersion v1_15_R01 = BukkitVersion.fromString("1.15-R0.1-SNAPSHOT");
public static final BukkitVersion v1_15_1_R01 = BukkitVersion.fromString("1.15.1-R0.1-SNAPSHOT");
public static final BukkitVersion v1_15_2_R01 = BukkitVersion.fromString("1.15.2-R0.1-SNAPSHOT");
public static final BukkitVersion v1_16_1_R01 = BukkitVersion.fromString("1.16.1-R0.1-SNAPSHOT");
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01);
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_1_R01);
private static BukkitVersion serverVersion = null;

View File

@ -23,6 +23,7 @@
############################################################
# A color code between 0-9 or a-f. Set to 'none' to disable.
# In 1.16+ you can use hex color codes here as well. (For example, #613e1d is brown).
ops-name-color: '4'
# The character(s) to prefix all nicknames, so that you know they are not true usernames.

View File

@ -741,6 +741,11 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Spigot spigot() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isPermissionSet(String name) {
throw new UnsupportedOperationException("Not supported yet.");
@ -893,6 +898,11 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getTicksPerWaterAmbientSpawns() {
return 0;
}
@Override
public int getTicksPerAmbientSpawns() {
throw new UnsupportedOperationException("Not supported yet.");
@ -978,6 +988,11 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getWaterAmbientSpawnLimit() {
return 0;
}
@Override
public boolean isPrimaryThread() {
return true; // Can be set to true or false, just needs to return for AFK status test to pass.
@ -1074,6 +1089,11 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Spigot spigot() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public BanList getBanList(BanList.Type arg0) {
throw new UnsupportedOperationException("Not supported yet.");

View File

@ -31,12 +31,6 @@
<includes>net.ess3:EssentialsXSpawn</includes>
</artifactSet>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>io.papermc.lib</pattern>
<shadedPattern>com.earth2me.essentials.paperlib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
@ -48,10 +42,5 @@
<artifactId>EssentialsX</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
</project>

View File

@ -44,7 +44,7 @@ class EssentialsSpawnPlayerListener implements Listener {
if (ess.getSettings().getRespawnAtHome()) {
Location home;
final Location bed = user.getBase().getBedSpawnLocation();
final Location bed = user.getBase().getBedSpawnLocation(); // cannot nuke this sync load due to the event being sync so it would hand either way.
if (bed != null) {
home = bed;
} else {

View File

@ -26,7 +26,7 @@ EssentialsX is almost a completely drop-in replacement for Essentials. However,
* **EssentialsX requires Java 8 or higher.** On older versions, the plugin may not work properly.
* **EssentialsX supports Minecraft versions 1.8.8, 1.9.4, 1.10.2, 1.11.2, 1.12.2, 1.13.2, 1.14.4, and 1.15.2.**
* **EssentialsX supports Minecraft versions 1.8.8, 1.9.4, 1.10.2, 1.11.2, 1.12.2, 1.13.2, 1.14.4, 1.15.2, and 1.16.1.**
Support

View File

@ -52,13 +52,14 @@
<module>providers/BaseProviders</module>
<module>providers/NMSReflectionProvider</module>
<module>providers/PaperProvider</module>
<module>providers/1_8Provider</module>
</modules>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>EssentialsXParent</artifactId>
<groupId>net.ess3</groupId>
<version>2.17.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>1_8Provider</artifactId>
<dependencies>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSReflectionProvider</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
</project>

View File

@ -1,8 +1,22 @@
package com.earth2me.essentials;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.*;
import org.bukkit.Achievement;
import org.bukkit.BanList;
import org.bukkit.Effect;
import org.bukkit.EntityEffect;
import org.bukkit.GameMode;
import org.bukkit.Instrument;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Note;
import org.bukkit.Particle;
import org.bukkit.Server;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.Statistic;
import org.bukkit.WeatherType;
import org.bukkit.World;
import org.bukkit.advancement.Advancement;
import org.bukkit.advancement.AdvancementProgress;
import org.bukkit.attribute.Attribute;
@ -10,33 +24,44 @@ import org.bukkit.attribute.AttributeInstance;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.PistonMoveReaction;
import org.bukkit.block.data.BlockData;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.entity.*;
import org.bukkit.entity.memory.MemoryKey;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Vehicle;
import org.bukkit.entity.Villager;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.*;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.InventoryView.Property;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MainHand;
import org.bukkit.inventory.Merchant;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.map.MapView;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.util.BoundingBox;
import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class OfflinePlayer implements Player {
private final transient Server server;
@ -45,7 +70,7 @@ public class OfflinePlayer implements Player {
private final transient org.bukkit.OfflinePlayer base;
private boolean allowFlight = false;
private boolean isFlying = false;
private String name = null;
private String name;
public OfflinePlayer(final UUID uuid, final Server server) {
this.server = server;
@ -110,15 +135,6 @@ public class OfflinePlayer implements Player {
public void setHealth(double d) {
}
@Override
public double getAbsorptionAmount() {
return 0;
}
@Override
public void setAbsorptionAmount(double v) {
}
@Override
public boolean isInsideVehicle() {
return false;
@ -144,12 +160,6 @@ public class OfflinePlayer implements Player {
return world;
}
@Override
public void setRotation(float yaw, float pitch) {
location.setYaw(yaw);
location.setPitch(pitch);
}
public void setLocation(Location loc) {
location = loc;
world = loc.getWorld();
@ -173,11 +183,6 @@ public class OfflinePlayer implements Player {
return null;
}
@Override
public Pose getPose() {
return null;
}
@Override
public boolean performCommand(String string) {
return false;
@ -214,6 +219,21 @@ public class OfflinePlayer implements Player {
public void updateInventory() {
}
@Override
public void awardAchievement(Achievement achievement) {
}
@Override
public void removeAchievement(Achievement achievement) {
}
@Override
public boolean hasAchievement(Achievement achievement) {
return false;
}
@Override
public void chat(String string) {
}
@ -243,26 +263,6 @@ public class OfflinePlayer implements Player {
return Collections.emptyList();
}
@Override
public Block getTargetBlockExact(int maxDistance) {
return null;
}
@Override
public Block getTargetBlockExact(int maxDistance, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(double maxDistance) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(double maxDistance, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public int getFireTicks() {
return 0;
@ -286,15 +286,6 @@ public class OfflinePlayer implements Player {
return server;
}
@Override
public boolean isPersistent() {
return false;
}
@Override
public void setPersistent(boolean persistent) {
}
public Vector getMomentum() {
return getVelocity();
}
@ -311,6 +302,16 @@ public class OfflinePlayer implements Player {
return new Vector(0, 0, 0);
}
@Override
public double getHeight() {
return 0;
}
@Override
public double getWidth() {
return 0;
}
@Override
public void damage(double d) {
}
@ -380,6 +381,21 @@ public class OfflinePlayer implements Player {
return false;
}
@Override
public List<Entity> getPassengers() {
return null;
}
@Override
public boolean addPassenger(Entity passenger) {
return false;
}
@Override
public boolean removePassenger(Entity passenger) {
return false;
}
@Override
public boolean isEmpty() {
return true;
@ -519,11 +535,6 @@ public class OfflinePlayer implements Player {
public void sendBlockChange(Location lctn, Material mtrl, byte b) {
}
@Override
public void sendBlockChange(Location loc, BlockData block) {
}
@Override
public void setLastDamageCause(EntityDamageEvent ede) {
}
@ -542,6 +553,11 @@ public class OfflinePlayer implements Player {
return true;
}
@Override
public void sendBlockChange(Location location, int i, byte b) {
}
@Override
public void playNote(Location lctn, Instrument i, Note note) {
}
@ -653,14 +669,6 @@ public class OfflinePlayer implements Player {
public void setTotalExperience(int i) {
}
@Override
public void sendExperienceChange(float v) {
}
@Override
public void sendExperienceChange(float v, int i) {
}
@Override
public float getExhaustion() {
return 0F;
@ -701,31 +709,6 @@ public class OfflinePlayer implements Player {
public void setPlayerListName(String name) {
}
@Override
public String getPlayerListHeader() {
return null;
}
@Override
public String getPlayerListFooter() {
return null;
}
@Override
public void setPlayerListHeader(String header) {
}
@Override
public void setPlayerListFooter(String footer) {
}
@Override
public void setPlayerListHeaderFooter(String header, String footer) {
}
@Override
public String getPlayerListName() {
return name;
@ -807,21 +790,6 @@ public class OfflinePlayer implements Player {
public void setBedSpawnLocation(Location lctn, boolean force) {
}
@Override
public boolean sleep(Location location, boolean force) {
return false;
}
@Override
public void wakeup(boolean setSpawnLocation) {
}
@Override
public Location getBedLocation() {
return null;
}
@Override
public void playEffect(EntityEffect ee) {
}
@ -870,7 +838,7 @@ public class OfflinePlayer implements Player {
}
@Override
public PotionEffect getPotionEffect(PotionEffectType potionEffectType) {
public PotionEffect getPotionEffect(PotionEffectType type) {
return null;
}
@ -927,12 +895,12 @@ public class OfflinePlayer implements Player {
}
@Override
public InventoryView openMerchant(Villager villager, boolean b) {
public InventoryView openMerchant(Villager trader, boolean force) {
return null;
}
@Override
public InventoryView openMerchant(Merchant merchant, boolean b) {
public InventoryView openMerchant(Merchant merchant, boolean force) {
return null;
}
@ -949,6 +917,21 @@ public class OfflinePlayer implements Player {
public void setItemOnCursor(ItemStack is) {
}
@Override
public boolean hasCooldown(Material material) {
return false;
}
@Override
public int getCooldown(Material material) {
return 0;
}
@Override
public void setCooldown(Material material, int ticks) {
}
@Override
public void setMetadata(String string, MetadataValue mv) {
}
@ -1019,28 +1002,23 @@ public class OfflinePlayer implements Player {
}
@Override
public float getAttackCooldown() {
return 0f;
public Entity getShoulderEntityLeft() {
return null;
}
@Override
public boolean discoverRecipe(NamespacedKey recipe) {
return false;
public void setShoulderEntityLeft(Entity entity) {
}
@Override
public int discoverRecipes(Collection<NamespacedKey> recipes) {
return 0;
public Entity getShoulderEntityRight() {
return null;
}
@Override
public boolean undiscoverRecipe(NamespacedKey recipe) {
return false;
}
public void setShoulderEntityRight(Entity entity) {
@Override
public int undiscoverRecipes(Collection<NamespacedKey> recipes) {
return 0;
}
@Override
@ -1078,7 +1056,7 @@ public class OfflinePlayer implements Player {
@Override
public MainHand getMainHand() {
return MainHand.RIGHT;
return null;
}
@Override
@ -1125,6 +1103,11 @@ public class OfflinePlayer implements Player {
public void setResourcePack(String s) {
}
@Override
public void setResourcePack(String url, byte[] hash) {
}
@Override
public void setMaxHealth(double i) {
}
@ -1152,7 +1135,8 @@ public class OfflinePlayer implements Player {
}
@Override
public void setGlowing(boolean b) {
public void setGlowing(boolean flag) {
}
@Override
@ -1161,7 +1145,8 @@ public class OfflinePlayer implements Player {
}
@Override
public void setInvulnerable(boolean b) {
public void setInvulnerable(boolean flag) {
}
@Override
@ -1175,7 +1160,8 @@ public class OfflinePlayer implements Player {
}
@Override
public void setSilent(boolean b) {
public void setSilent(boolean flag) {
}
@Override
@ -1184,7 +1170,8 @@ public class OfflinePlayer implements Player {
}
@Override
public void setGravity(boolean b) {
public void setGravity(boolean gravity) {
}
@Override
@ -1193,7 +1180,7 @@ public class OfflinePlayer implements Player {
}
@Override
public void setPortalCooldown(int i) {
public void setPortalCooldown(int cooldown) {
}
@ -1203,15 +1190,20 @@ public class OfflinePlayer implements Player {
}
@Override
public boolean addScoreboardTag(String s) {
public boolean addScoreboardTag(String tag) {
return false;
}
@Override
public boolean removeScoreboardTag(String s) {
public boolean removeScoreboardTag(String tag) {
return false;
}
@Override
public PistonMoveReaction getPistonMoveReaction() {
return null;
}
@Override
public void setPlayerWeather(WeatherType arg0) {
}
@ -1244,30 +1236,32 @@ public class OfflinePlayer implements Player {
}
@Override
public void playSound(Location location, Sound sound, SoundCategory soundCategory, float v, float v1) {
public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch) {
}
@Override
public void playSound(Location location, String s, SoundCategory soundCategory, float v, float v1) {
public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch) {
}
@Override
public void stopSound(Sound sound) {
}
@Override
public void stopSound(String s) {
}
@Override
public void stopSound(Sound sound, SoundCategory soundCategory) {
}
@Override
public void stopSound(String s, SoundCategory soundCategory) {
public void stopSound(String sound) {
}
@Override
public void stopSound(Sound sound, SoundCategory category) {
}
@Override
public void stopSound(String sound, SoundCategory category) {
}
@ -1282,7 +1276,7 @@ public class OfflinePlayer implements Player {
@Override
public void setHealthScale(double arg0) throws IllegalArgumentException {
}
@Override
@ -1315,26 +1309,13 @@ public class OfflinePlayer implements Player {
}
@Override
public void setGliding(boolean b) {
}
@Override
public boolean isSwimming() {
return false;
}
@Override
public void setSwimming(boolean swimming) {
public void setGliding(boolean gliding) {
}
@Override
public boolean isRiptiding() {
return false;
}
public void setAI(boolean ai) {
@Override
public void setAI(boolean b) {
}
@Override
@ -1343,39 +1324,15 @@ public class OfflinePlayer implements Player {
}
@Override
public void attack(Entity entity) {
public void setCollidable(boolean collidable) {
}
@Override
public void swingMainHand() {
}
@Override
public void swingOffHand() {
}
@Override
public void setCollidable(boolean b) {
}
@Override
public boolean isCollidable() {
return false;
}
@Override
public <T> T getMemory(MemoryKey<T> memoryKey) {
return null;
}
@Override
public <T> void setMemory(MemoryKey<T> memoryKey, T t) {
}
@Override
public <T extends Projectile> T launchProjectile(Class<? extends T> type, Vector vector) {
return null;
@ -1385,11 +1342,6 @@ public class OfflinePlayer implements Player {
public void sendSignChange(Location arg0, String[] arg1) throws IllegalArgumentException {
}
@Override
public void sendSignChange(Location loc, String[] lines, DyeColor dyeColor) throws IllegalArgumentException {
}
@Override
public Location getBedSpawnLocation() {
return null;
@ -1443,7 +1395,7 @@ public class OfflinePlayer implements Player {
}
try {
Method method = base.getClass().getDeclaredMethod("setBanned", boolean.class);
method.invoke(banned);
method.invoke(base, banned);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
// This will never happen in a normal CraftBukkit pre-1.12 instance
e.printStackTrace();
@ -1495,178 +1447,87 @@ public class OfflinePlayer implements Player {
}
@Override
public void spawnParticle(Particle particle, Location location, int i) {
public void spawnParticle(Particle particle, Location location, int count) {
}
@Override
public void spawnParticle(Particle particle, double v, double v1, double v2, int i) {
public void spawnParticle(Particle particle, double x, double y, double z, int count) {
}
@Override
public <T> void spawnParticle(Particle particle, Location location, int i, T t) {
public <T> void spawnParticle(Particle particle, Location location, int count, T data) {
}
@Override
public <T> void spawnParticle(Particle particle, double v, double v1, double v2, int i, T t) {
public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, T data) {
}
@Override
public void spawnParticle(Particle particle, Location location, int i, double v, double v1, double v2) {
public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ) {
}
@Override
public void spawnParticle(Particle particle, double v, double v1, double v2, int i, double v3, double v4, double v5) {
public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ) {
}
@Override
public <T> void spawnParticle(Particle particle, Location location, int i, double v, double v1, double v2, T t) {
public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, T data) {
}
@Override
public <T> void spawnParticle(Particle particle, double v, double v1, double v2, int i, double v3, double v4, double v5, T t) {
public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data) {
}
@Override
public void spawnParticle(Particle particle, Location location, int i, double v, double v1, double v2, double v3) {
public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra) {
}
@Override
public void spawnParticle(Particle particle, double v, double v1, double v2, int i, double v3, double v4, double v5, double v6) {
public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra) {
}
@Override
public <T> void spawnParticle(Particle particle, Location location, int i, double v, double v1, double v2, double v3, T t) {
public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) {
}
@Override
public <T> void spawnParticle(Particle particle, double v, double v1, double v2, int i, double v3, double v4, double v5, double v6, T t) {
public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) {
}
@Override
public void sendTitle(String title, String subtitle) {
}
@Override
public void sendTitle(String title, String subtitle, int fadeIn, int stay, int fadeOut) {
}
@Override
public AttributeInstance getAttribute(Attribute attribute) {
// GetAttribute is nullable as per CraftAttributeMap. This might need to be
// improved to support cases where dummy null instances should be returned.
return null;
}
@Override
public void setResourcePack(String s, byte[] bytes) {
}
@Override
public AdvancementProgress getAdvancementProgress(Advancement advancement) {
return null;
}
@Override
public int getClientViewDistance() {
return 0;
}
@Override
public String getLocale() {
return null;
}
@Override
public boolean hasCooldown(Material material) {
return false;
public void sendTitle(String title, String subtitle) {
}
@Override
public int getCooldown(Material material) {
return 0;
public void sendTitle(String title, String subtitle, int fadeIn, int stay, int fadeOut) {
}
@Override
public void setCooldown(Material material, int i) {
}
@Override
public Entity getShoulderEntityLeft() {
return null;
}
@Override
public void setShoulderEntityLeft(Entity entity) {
}
@Override
public Entity getShoulderEntityRight() {
return null;
}
@Override
public void setShoulderEntityRight(Entity entity) {
}
@Override
public double getHeight() {
return 0;
}
@Override
public double getWidth() {
return 0;
}
@Override
public BoundingBox getBoundingBox() {
return null;
}
@Override
public List<Entity> getPassengers() {
return null;
}
@Override
public boolean addPassenger(Entity entity) {
return false;
}
@Override
public boolean removePassenger(Entity entity) {
return false;
}
@Override
public PistonMoveReaction getPistonMoveReaction() {
return null;
}
@Override
public void updateCommands() {
}
@Override
public void openBook(ItemStack book) {
}
@Override
public PersistentDataContainer getPersistentDataContainer() {
public AttributeInstance getAttribute(Attribute attribute) {
return null;
}
}