Add back compat for attribute

This commit is contained in:
fullwall 2024-10-29 20:35:25 +08:00
parent 1579aa0e9e
commit 8878c238c0
7 changed files with 41 additions and 35 deletions

View File

@ -26,10 +26,10 @@ import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Registry;
import org.bukkit.Rotation; import org.bukkit.Rotation;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.attribute.Attribute;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -420,12 +420,13 @@ public class NPCCommands {
public void attribute(CommandContext args, CommandSender sender, NPC npc, public void attribute(CommandContext args, CommandSender sender, NPC npc,
@Arg(value = 1, completionsProvider = OptionalAttributeCompletions.class) String attribute, @Arg(value = 1, completionsProvider = OptionalAttributeCompletions.class) String attribute,
@Arg(2) Double value) { @Arg(2) Double value) {
AttributeTrait trait = npc.getOrAddTrait(AttributeTrait.class); AttributeTrait trait = npc.getOrAddTrait(AttributeTrait.class);
if (value == null) { if (value == null) {
trait.setDefaultAttribute(Attribute.valueOf(attribute)); trait.setDefaultAttribute(Registry.ATTRIBUTE.get(SpigotUtil.getKey(attribute)));
Messaging.sendTr(sender, Messages.ATTRIBUTE_RESET, attribute); Messaging.sendTr(sender, Messages.ATTRIBUTE_RESET, attribute);
} else { } else {
trait.setAttributeValue(Attribute.valueOf(attribute), value); trait.setAttributeValue(Registry.ATTRIBUTE.get(SpigotUtil.getKey(attribute)), value);
Messaging.sendTr(sender, Messages.ATTRIBUTE_SET, attribute, value); Messaging.sendTr(sender, Messages.ATTRIBUTE_SET, attribute, value);
} }
} }

View File

@ -9,7 +9,7 @@ import java.util.function.Consumer;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.attribute.Attribute; import org.bukkit.Registry;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -45,6 +45,7 @@ import net.citizensnpcs.api.trait.trait.MobType;
import net.citizensnpcs.api.trait.trait.Spawned; import net.citizensnpcs.api.trait.trait.Spawned;
import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.api.util.SpigotUtil;
import net.citizensnpcs.npc.ai.CitizensNavigator; import net.citizensnpcs.npc.ai.CitizensNavigator;
import net.citizensnpcs.npc.skin.SkinnableEntity; import net.citizensnpcs.npc.skin.SkinnableEntity;
import net.citizensnpcs.trait.AttributeTrait; import net.citizensnpcs.trait.AttributeTrait;
@ -398,8 +399,8 @@ public class CitizensNPC extends AbstractNPC {
entity.setRemoveWhenFarAway(false); entity.setRemoveWhenFarAway(false);
if (type == EntityType.PLAYER || Util.isHorse(type)) { if (type == EntityType.PLAYER || Util.isHorse(type)) {
if (SUPPORT_ATTRIBUTES && !hasTrait(AttributeTrait.class) if (SUPPORT_ATTRIBUTES && !hasTrait(AttributeTrait.class) || !getTrait(AttributeTrait.class)
|| !getTrait(AttributeTrait.class).hasAttribute(Attribute.GENERIC_STEP_HEIGHT)) { .hasAttribute(Registry.ATTRIBUTE.get(SpigotUtil.getKey("step_height")))) {
NMS.setStepHeight(entity, 1); NMS.setStepHeight(entity, 1);
} }
} }

View File

@ -15,7 +15,7 @@ import net.citizensnpcs.api.trait.TraitName;
@TraitName("attributetrait") @TraitName("attributetrait")
public class AttributeTrait extends Trait { public class AttributeTrait extends Trait {
@Persist(keyType = Attribute.class) @Persist(keyType = Attribute.class)
private final Map<Attribute, Double> attributes = Maps.newEnumMap(Attribute.class); private final Map<Attribute, Double> attributes = Maps.newHashMap();
public AttributeTrait() { public AttributeTrait() {
super("attributetrait"); super("attributetrait");

View File

@ -38,7 +38,6 @@ public class Controllable extends Trait {
private BuiltInControls controls; private BuiltInControls controls;
@Persist @Persist
private boolean enabled = true; private boolean enabled = true;
private ControllableInput input;
@Persist("owner_required") @Persist("owner_required")
private boolean ownerRequired; private boolean ownerRequired;
@ -132,7 +131,7 @@ public class Controllable extends Trait {
if (npc.getNavigator().isNavigating() || passengers.size() == 0 || !(passengers.get(0) instanceof Player)) if (npc.getNavigator().isNavigating() || passengers.size() == 0 || !(passengers.get(0) instanceof Player))
return; return;
Player player = (Player) passengers.get(0); Player player = (Player) passengers.get(0);
input = new ControllableInput(); ControllableInput input = new ControllableInput();
if (SUPPORTS_PLAYER_INPUT_EVENT) { if (SUPPORTS_PLAYER_INPUT_EVENT) {
input.forward = player.getCurrentInput().isForward() ? 1 : player.getCurrentInput().isBackward() ? -1 : 0; input.forward = player.getCurrentInput().isForward() ? 1 : player.getCurrentInput().isBackward() ? -1 : 0;
input.horizontal = player.getCurrentInput().isLeft() ? 1 : player.getCurrentInput().isRight() ? -1 : 0; input.horizontal = player.getCurrentInput().isLeft() ? 1 : player.getCurrentInput().isRight() ? -1 : 0;
@ -404,10 +403,8 @@ public class Controllable extends Trait {
yaw = Math.toRadians(yaw); yaw = Math.toRadians(yaw);
Vector vel = handle.getVelocity(); Vector vel = handle.getVelocity();
double oldSpeed = Math.sqrt(vel.getX() * vel.getX() + vel.getZ() * vel.getZ()); double oldSpeed = Math.sqrt(vel.getX() * vel.getX() + vel.getZ() * vel.getZ());
double nxsin = -Math.sin(yaw);
double xcos = Math.cos(yaw);
if (input.forward > 0) { if (input.forward > 0) {
vel = vel.setX(nxsin * speed * speedMod).setZ(xcos * speed * speedMod); vel = vel.setX(-Math.sin(yaw) * speed * speedMod).setZ(Math.cos(yaw) * speed * speedMod);
} }
vel.add(new Vector(Math.sin(yaw + Math.PI / 2), 0D, -Math.cos(yaw + Math.PI / 2)) vel.add(new Vector(Math.sin(yaw + Math.PI / 2), 0D, -Math.cos(yaw + Math.PI / 2))
.multiply(speedMod * Setting.CONTROLLABLE_GROUND_DIRECTION_MODIFIER.asDouble() * input.horizontal)); .multiply(speedMod * Setting.CONTROLLABLE_GROUND_DIRECTION_MODIFIER.asDouble() * input.horizontal));

View File

@ -17,7 +17,7 @@ import org.bukkit.Color;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle; import org.bukkit.Particle;
import org.bukkit.attribute.Attribute; import org.bukkit.Registry;
import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeInstance;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.AreaEffectCloud;
@ -918,7 +918,8 @@ public class HologramTrait extends Trait {
disp.setBackgroundColor(color); disp.setBackgroundColor(color);
} }
if (SpigotUtil.getVersion()[1] >= 21 && base.getEntity() instanceof LivingEntity) { if (SpigotUtil.getVersion()[1] >= 21 && base.getEntity() instanceof LivingEntity) {
AttributeInstance inst = ((LivingEntity) base.getEntity()).getAttribute(Attribute.GENERIC_SCALE); AttributeInstance inst = ((LivingEntity) base.getEntity())
.getAttribute(Registry.ATTRIBUTE.get(SpigotUtil.getKey("scale")));
if (inst != null) { if (inst != null) {
Transformation tf = disp.getTransformation(); Transformation tf = disp.getTransformation();
tf.getScale().set(inst.getValue()); tf.getScale().set(inst.getValue());

View File

@ -5,7 +5,7 @@ import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.attribute.Attribute; import org.bukkit.Registry;
import org.bukkit.boss.BarColor; import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle; import org.bukkit.boss.BarStyle;
@ -33,6 +33,7 @@ import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName; import net.citizensnpcs.api.trait.TraitName;
import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.api.util.Placeholders; import net.citizensnpcs.api.util.Placeholders;
import net.citizensnpcs.api.util.SpigotUtil;
import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util; import net.citizensnpcs.util.Util;
@ -142,11 +143,8 @@ public class BossBarTrait extends Trait {
LivingEntity entity = (LivingEntity) npc.getEntity(); LivingEntity entity = (LivingEntity) npc.getEntity();
double maxHealth = entity.getMaxHealth(); double maxHealth = entity.getMaxHealth();
if (SUPPORT_ATTRIBUTES) { if (SUPPORT_ATTRIBUTES) {
try { maxHealth = entity.getAttribute(Registry.ATTRIBUTE.get(SpigotUtil.getKey("max_health")))
maxHealth = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); .getValue();
} catch (Throwable t) {
SUPPORT_ATTRIBUTES = false;
}
} }
bar.setProgress(entity.getHealth() / maxHealth); bar.setProgress(entity.getHealth() / maxHealth);
} }
@ -277,4 +275,11 @@ public class BossBarTrait extends Trait {
} }
private static boolean SUPPORT_ATTRIBUTES = true; private static boolean SUPPORT_ATTRIBUTES = true;
static {
try {
Class.forName("org.bukkit.attribute.Attribute");
} catch (ClassNotFoundException e) {
SUPPORT_ATTRIBUTES = false;
}
}
} }

View File

@ -18,9 +18,9 @@ import java.util.stream.Collectors;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Registry;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attributable;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeInstance;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -61,6 +61,7 @@ import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.util.BoundingBox; import net.citizensnpcs.api.util.BoundingBox;
import net.citizensnpcs.api.util.EntityDim; import net.citizensnpcs.api.util.EntityDim;
import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.api.util.SpigotUtil;
import net.citizensnpcs.api.util.SpigotUtil.InventoryViewAPI; import net.citizensnpcs.api.util.SpigotUtil.InventoryViewAPI;
import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator;
import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator;
@ -128,9 +129,9 @@ public class NMS {
Consumer<NPCKnockbackEvent> cb) { Consumer<NPCKnockbackEvent> cb) {
if (npc.getEntity() == null) if (npc.getEntity() == null)
return; return;
if (SUPPORT_KNOCKBACK_RESISTANCE && npc.getEntity() instanceof Attributable) { if (SUPPORTS_ATTRIBUTABLE && npc.getEntity() instanceof Attributable) {
AttributeInstance attribute = ((Attributable) npc.getEntity()) AttributeInstance attribute = ((Attributable) npc.getEntity())
.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE); .getAttribute(Registry.ATTRIBUTE.get(SpigotUtil.getKey("knockback_resistance")));
if (attribute != null) { if (attribute != null) {
strength *= 1 - attribute.getValue(); strength *= 1 - attribute.getValue();
} }
@ -506,6 +507,10 @@ public class NMS {
return null; return null;
} }
public static float getForwardBackwardMovement(org.bukkit.entity.Entity bukkitEntity) {
return BRIDGE.getForwardBackwardMovement(bukkitEntity);
}
public static MethodHandle getGetter(Class<?> clazz, String name) { public static MethodHandle getGetter(Class<?> clazz, String name) {
return getGetter(clazz, name, true); return getGetter(clazz, name, true);
} }
@ -528,10 +533,6 @@ public class NMS {
return BRIDGE.getHeadYaw(entity); return BRIDGE.getHeadYaw(entity);
} }
public static float getForwardBackwardMovement(org.bukkit.entity.Entity bukkitEntity) {
return BRIDGE.getForwardBackwardMovement(bukkitEntity);
}
public static float getJumpPower(NPC npc, float original) { public static float getJumpPower(NPC npc, float original) {
if (npc == null) if (npc == null)
return original; return original;
@ -674,10 +675,6 @@ public class NMS {
return BRIDGE.getVehicle(entity); return BRIDGE.getVehicle(entity);
} }
public static float getXZMovement(org.bukkit.entity.Entity bukkitEntity) {
return BRIDGE.getXZMovement(bukkitEntity);
}
public static Collection<Player> getViewingPlayers(org.bukkit.entity.Entity entity) { public static Collection<Player> getViewingPlayers(org.bukkit.entity.Entity entity) {
return BRIDGE.getViewingPlayers(entity); return BRIDGE.getViewingPlayers(entity);
} }
@ -686,6 +683,10 @@ public class NMS {
return BRIDGE.getWidth(entity); return BRIDGE.getWidth(entity);
} }
public static float getXZMovement(org.bukkit.entity.Entity bukkitEntity) {
return BRIDGE.getXZMovement(bukkitEntity);
}
public static float getYaw(Entity entity) { public static float getYaw(Entity entity) {
return BRIDGE.getYaw(entity); return BRIDGE.getYaw(entity);
} }
@ -1047,7 +1048,7 @@ public class NMS {
private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
private static Field MODIFIERS_FIELD; private static Field MODIFIERS_FIELD;
private static boolean PAPER_KNOCKBACK_EVENT_EXISTS = true; private static boolean PAPER_KNOCKBACK_EVENT_EXISTS = true;
private static boolean SUPPORT_KNOCKBACK_RESISTANCE = true; private static boolean SUPPORTS_ATTRIBUTABLE = true;
private static boolean SUPPORTS_FIND_PROFILES_BY_NAME = true; private static boolean SUPPORTS_FIND_PROFILES_BY_NAME = true;
private static MethodHandle UNSAFE_FIELD_OFFSET; private static MethodHandle UNSAFE_FIELD_OFFSET;
private static MethodHandle UNSAFE_PUT_BOOLEAN; private static MethodHandle UNSAFE_PUT_BOOLEAN;
@ -1065,9 +1066,9 @@ public class NMS {
PAPER_KNOCKBACK_EVENT_EXISTS = false; PAPER_KNOCKBACK_EVENT_EXISTS = false;
} }
try { try {
Class.forName("org.bukkit.attribute.Attribute").getField("GENERIC_KNOCKBACK_RESISTANCE"); Class.forName("org.bukkit.attribute.Attributable");
} catch (Exception e) { } catch (ClassNotFoundException e) {
SUPPORT_KNOCKBACK_RESISTANCE = false; SUPPORTS_ATTRIBUTABLE = false;
} }
try { try {
GameProfileRepository.class.getMethod("findProfilesByNames", String[].class, ProfileLookupCallback.class); GameProfileRepository.class.getMethod("findProfilesByNames", String[].class, ProfileLookupCallback.class);