Remove Attribute system (#725)

* AirJump, Attribute continuation

* Remove AirJump

* Revert "Remove AirJump"

This reverts commit e6cf056bb746d70643931f523f163aea1738b482.

* Revert "AirJump, Attribute continuation"

This reverts commit b8198d7eaff34b089fb0ec1003e4b766503cb0ae.

* Remove Attribute to redesign
This commit is contained in:
Simplicitee 2017-02-10 22:53:47 -05:00 committed by Christopher Martin
parent 477d02c673
commit b2fcfc493a
11 changed files with 76 additions and 283 deletions

View file

@ -29,7 +29,6 @@ import com.projectkorra.projectkorra.util.MetricsLite;
import com.projectkorra.projectkorra.util.RevertChecker;
import com.projectkorra.projectkorra.util.TempBlock;
import com.projectkorra.projectkorra.util.Updater;
import com.projectkorra.projectkorra.util.attributes.AttributeModifiers;
import com.projectkorra.projectkorra.util.logging.PKLogHandler;
import com.projectkorra.projectkorra.waterbending.util.WaterbendingManager;
@ -70,7 +69,6 @@ public class ProjectKorra extends JavaPlugin {
CoreAbility.registerAbilities();
collisionInitializer.initializeDefaultCollisions(); // must be called after abilities have been registered
collisionManager.startCollisionDetection();
new AttributeModifiers();
Preset.loadExternalPresets();

View file

@ -40,7 +40,6 @@ import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.event.AbilityEndEvent;
import com.projectkorra.projectkorra.event.AbilityProgressEvent;
import com.projectkorra.projectkorra.event.AbilityStartEvent;
import com.projectkorra.projectkorra.util.Attribute.Attributable;
import sun.reflect.ReflectionFactory;
@ -492,11 +491,6 @@ public abstract class CoreAbility implements Ability {
AddonAbility addon = (AddonAbility) ability;
addon.load();
}
if (ability instanceof Attributable) {
Attributable att = (Attributable) ability;
att.registerAttributes();
}
}
catch (Exception e) {
}
@ -571,12 +565,6 @@ public abstract class CoreAbility implements Ability {
PassiveManager.getPassivesByElement().get(((SubElement) coreAbil.getElement()).getParentElement()).add(name);
}
}
if (coreAbil instanceof Attributable) {
Attributable att = (Attributable) coreAbil;
att.registerAttributes();
}
}
catch (Exception | Error e) {
plugin.getLogger().warning("The ability " + coreAbil.getName() + " was not able to load, if this message shows again please remove it!");

View file

@ -29,12 +29,10 @@ import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.ability.util.Collision;
import com.projectkorra.projectkorra.command.Commands;
import com.projectkorra.projectkorra.object.HorizontalVelocityTracker;
import com.projectkorra.projectkorra.util.Attribute;
import com.projectkorra.projectkorra.util.Attribute.Attributable;
import com.projectkorra.projectkorra.util.DamageHandler;
import com.projectkorra.projectkorra.util.Flight;
public class AirBlast extends AirAbility implements Attributable{
public class AirBlast extends AirAbility {
private static final int MAX_TICKS = 10000;
private static final Map<Player, Location> ORIGINS = new ConcurrentHashMap<>();
@ -46,9 +44,15 @@ public class AirBlast extends AirAbility implements Attributable{
private boolean isFromOtherOrigin;
private boolean showParticles;
private int ticks;
int particles;
long cooldown;
double speedFactor, range, pushFactor, pushFactorForOthers, damage, speed, radius;
private int particles;
private long cooldown;
private double speedFactor;
private double range;
private double pushFactor;
private double pushFactorForOthers;
private double damage;
private double speed;
private double radius;
private Location location;
private Location origin;
private Vector direction;
@ -56,14 +60,6 @@ public class AirBlast extends AirAbility implements Attributable{
private Random random;
private ArrayList<Block> affectedLevers;
private ArrayList<Entity> affectedEntities;
private static Attribute<Integer> particlesA;
private static Attribute<Long> cooldownA;
private static Attribute<Double> rangeA;
private static Attribute<Double> pushFactorA;
private static Attribute<Double> pushFactorForOthersA;
private static Attribute<Double> damageA;
private static Attribute<Double> speedA;
private static Attribute<Double> radiusA;
public AirBlast(Player player) {
super(player);
@ -115,18 +111,23 @@ public class AirBlast extends AirAbility implements Attributable{
this.canPressButtons = false;
this.canFlickLevers = false;
if (bPlayer.isAvatarState()) {
this.pushFactor = getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Entities");
this.pushFactorForOthers = getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Self");
}
start();
}
private void setFields() {
this.particles = particlesA.getModified(bPlayer);
this.cooldown = cooldownA.getModified(bPlayer);
this.range = rangeA.getModified(bPlayer);
this.damage = damageA.getModified(bPlayer);
this.speed = speedA.getModified(bPlayer);
this.radius = radiusA.getModified(bPlayer);
this.pushFactor = pushFactorA.getModified(bPlayer);
this.pushFactorForOthers = pushFactorForOthersA.getModified(bPlayer);
this.particles = getConfig().getInt("Abilities.Air.AirBlast.Particles");
this.cooldown = getConfig().getLong("Abilities.Air.AirBlast.Cooldown");
this.range = getConfig().getDouble("Abilities.Air.AirBlast.Range");
this.speed = getConfig().getDouble("Abilities.Air.AirBlast.Speed");
this.range = getConfig().getDouble("Abilities.Air.AirBlast.Range");
this.radius = getConfig().getDouble("Abilities.Air.AirBlast.Radius");
this.pushFactor = getConfig().getDouble("Abilities.Air.AirBlast.Push.Entities");
this.pushFactorForOthers = getConfig().getDouble("Abilities.Air.AirBlast.Push.Self");
this.canFlickLevers = getConfig().getBoolean("Abilities.Air.AirBlast.CanFlickLevers");
this.canOpenDoors = getConfig().getBoolean("Abilities.Air.AirBlast.CanOpenDoors");
this.canPressButtons = getConfig().getBoolean("Abilities.Air.AirBlast.CanPressButtons");
@ -638,16 +639,4 @@ public class AirBlast extends AirAbility implements Attributable{
return getConfig().getInt("Abilities.Air.AirBlast.SelectRange");
}
@Override
public void registerAttributes() {
particlesA = new Attribute<Integer>(this, "particles", getConfig().getInt("Abilities.Air.AirBlast.Particles"));
cooldownA = new Attribute<Long>(this, "cooldown", getConfig().getLong("Abilities.Air.AirBlast.Cooldown"));
rangeA = new Attribute<Double>(this, "range", getConfig().getDouble("Abilities.Air.AirBlast.Range"));
pushFactorA = new Attribute<Double>(this, "pushFactor", getConfig().getDouble("Abilities.Air.AirBlast.Push.Self"));
pushFactorForOthersA = new Attribute<Double>(this, "pushFactorForOthers", getConfig().getDouble("Abilities.Air.AirBlast.Push.Entities"));
damageA = new Attribute<Double>(this, "damage", getConfig().getDouble("Abilities.Air.AirBlast.Damage"));
speedA = new Attribute<Double>(this, "speed", getConfig().getDouble("Abilities.Air.AirBlast.Speed"));
radiusA = new Attribute<Double>(this, "radius", getConfig().getDouble("Abilities.Air.AirBlast.Radius"));
}
}

View file

@ -14,26 +14,22 @@ import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.Element;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.AirAbility;
import com.projectkorra.projectkorra.util.Attribute;
import com.projectkorra.projectkorra.util.Attribute.Attributable;
import com.projectkorra.projectkorra.waterbending.WaterManipulation;
public class AirBubble extends AirAbility implements Attributable{
public class AirBubble extends AirAbility {
private boolean waterBubble;
private double radius;
private double airRadius;
private double waterRadius;
private Map<Block, BlockState> waterOrigins;
private static Attribute<Double> airRadiusA;
private static Attribute<Double> waterRadiusA;
public AirBubble(Player player) {
super(player);
this.radius = 0;
this.airRadius = airRadiusA.getModified(bPlayer);
this.waterRadius = waterRadiusA.getModified(bPlayer);
this.airRadius = getConfig().getDouble("Abilities.Air.AirBubble.Radius");
this.waterRadius = getConfig().getDouble("Abilities.Water.WaterBubble.Radius");
this.waterOrigins = new ConcurrentHashMap<>();
start();
}
@ -210,10 +206,4 @@ public class AirBubble extends AirAbility implements Attributable{
return waterOrigins;
}
@Override
public void registerAttributes() {
airRadiusA = new Attribute<Double>(this, "airRadius", getConfig().getDouble("Abilities.Air.AirBubble.Radius"));
waterRadiusA = new Attribute<Double>(this, "waterRadius", getConfig().getDouble("Abilities.Water.WaterBubble.Radius"));
}
}

View file

@ -11,10 +11,8 @@ import org.bukkit.util.Vector;
import com.projectkorra.projectkorra.ProjectKorra;
import com.projectkorra.projectkorra.ability.AirAbility;
import com.projectkorra.projectkorra.util.Attribute;
import com.projectkorra.projectkorra.util.Attribute.Attributable;
public class AirBurst extends AirAbility implements Attributable{
public class AirBurst extends AirAbility {
private boolean isCharged;
private boolean isFallBurst;
@ -29,12 +27,6 @@ public class AirBurst extends AirAbility implements Attributable{
private double particlePercentage;
private ArrayList<AirBlast> blasts;
private ArrayList<Entity> affectedEntities;
private static Attribute<Long> chargeTimeA;
private static Attribute<Double> fallThresholdA;
private static Attribute<Double> pushFactorA;
private static Attribute<Double> damageA;
private static Attribute<Double> blastAngleThetaA;
private static Attribute<Double> blastAnglePhiA;
public AirBurst(Player player, boolean isFallBurst) {
super(player);
@ -51,17 +43,21 @@ public class AirBurst extends AirAbility implements Attributable{
this.isFallBurst = isFallBurst;
this.isCharged = false;
this.playerFallDistance = player.getFallDistance();
this.chargeTime = chargeTimeA.getModified(bPlayer);
this.fallThreshold = fallThresholdA.getModified(bPlayer);
this.pushFactor = pushFactorA.getModified(bPlayer);
this.damage = damageA.getModified(bPlayer);
this.blastAnglePhi = blastAnglePhiA.getModified(bPlayer);
this.blastAngleTheta = blastAngleThetaA.getModified(bPlayer);
this.chargeTime = getConfig().getLong("Abilities.Air.AirBurst.ChargeTime");
this.fallThreshold = getConfig().getDouble("Abilities.Air.AirBurst.FallThreshold");
this.pushFactor = getConfig().getDouble("Abilities.Air.AirBurst.PushFactor");
this.damage = getConfig().getDouble("Abilities.Air.AirBurst.Damage");
this.blastAnglePhi = getConfig().getDouble("Abilities.Air.AirBurst.AnglePhi");
this.blastAngleTheta = getConfig().getDouble("Abilities.Air.AirBurst.AngleTheta");
this.sneakParticles = getConfig().getInt("Abilities.Air.AirBurst.SneakParticles");
this.particlePercentage = getConfig().getDouble("Abilities.Air.AirBurst.ParticlePercentage");
this.blasts = new ArrayList<>();
this.affectedEntities = new ArrayList<>();
if (bPlayer.isAvatarState()) {
this.chargeTime = getConfig().getLong("Abilities.Avatar.AvatarState.Air.AirBurst.ChargeTime");
this.damage = getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBurst.Damage");
}
start();
}
@ -319,14 +315,4 @@ public class AirBurst extends AirAbility implements Attributable{
public ArrayList<Entity> getAffectedEntities() {
return affectedEntities;
}
@Override
public void registerAttributes() {
chargeTimeA = new Attribute<Long>(this, "chargeTime", getConfig().getLong("Abilities.Air.AirBurst.ChargeTime"));
fallThresholdA = new Attribute<Double>(this, "fallThreshold", getConfig().getDouble("Abilities.Air.AirBurst.FallThreshold"));
pushFactorA = new Attribute<Double>(this, "pushFactor", getConfig().getDouble("Abilities.Air.AirBurst.PushFactor"));
damageA = new Attribute<Double>(this, "damage", getConfig().getDouble("Abilities.Air.AirBurst.Damage"));
blastAngleThetaA = new Attribute<Double>(this, "blastAngleTheta", getConfig().getDouble("Abilities.Air.AirBlast.AngleTheta"));
blastAnglePhiA = new Attribute<Double>(this, "blastAnglePhi", getConfig().getDouble("Abilities.Air.AirBlast.AnglePhi"));
}
}

View file

@ -1,5 +1,6 @@
package com.projectkorra.projectkorra.airbending;
import java.util.ArrayList;
import java.util.Random;
import org.bukkit.Location;
@ -12,28 +13,22 @@ import org.bukkit.util.Vector;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.AirAbility;
import com.projectkorra.projectkorra.ability.WaterAbility;
import com.projectkorra.projectkorra.util.Attribute;
import com.projectkorra.projectkorra.util.Attribute.Attributable;
import com.projectkorra.projectkorra.util.Flight;
public class AirScooter extends AirAbility implements Attributable{
public class AirScooter extends AirAbility {
private double speed;
private double interval;
private double radius;
private long cooldown;
private double maxHeightFromGround;
private static Attribute<Double> speedA;
private static Attribute<Double> intervalA;
private static Attribute<Double> radiusA;
private static Attribute<Long> cooldownA;
private static Attribute<Double> heightA;
private Block floorblock;
private Random random;
private double phi = 0;
private ArrayList<Double> angles;
private boolean canFly;
private boolean hadFly;
private double phi = 0;
public AirScooter(Player player) {
super(player);
@ -47,12 +42,13 @@ public class AirScooter extends AirAbility implements Attributable{
else if (bPlayer.isOnCooldown(this))
return;
this.speed = speedA.getModified(bPlayer);
this.interval = intervalA.getModified(bPlayer);
this.radius = radiusA.getModified(bPlayer);
this.cooldown = cooldownA.getModified(bPlayer);
this.maxHeightFromGround = heightA.getModified(bPlayer);
this.speed = getConfig().getDouble("Abilities.Air.AirScooter.Speed");
this.interval = getConfig().getDouble("Abilities.Air.AirScooter.Interval");
this.radius = getConfig().getDouble("Abilities.Air.AirScooter.Radius");
this.cooldown = getConfig().getLong("Abilities.Air.AirScooter.Cooldown");
this.maxHeightFromGround = getConfig().getDouble("Abilities.Air.AirScooter.MaxHeightFromGround");
this.random = new Random();
this.angles = new ArrayList<>();
canFly = player.getAllowFlight();
hadFly = player.isFlying();
@ -62,7 +58,11 @@ public class AirScooter extends AirAbility implements Attributable{
player.setSprinting(false);
player.setSneaking(false);
for (int i = 0; i < 5; i++) {
angles.add((double) (60 * i));
}
start();
}
@ -109,7 +109,7 @@ public class AirScooter extends AirAbility implements Attributable{
}
Vector velocity = player.getEyeLocation().getDirection().clone().normalize();
velocity = velocity.multiply(speed);
velocity = velocity.clone().normalize().multiply(speed);
/*
* checks the players speed and ends the move if they are going too slow
*/
@ -125,10 +125,11 @@ public class AirScooter extends AirAbility implements Attributable{
* lowers the player based on their distance from the ground.
*/
double distance = player.getLocation().getY() - (double) floorblock.getY();
if (distance > 2.355) {
velocity.setY(-0.15);
} else if (distance < 1.9) {
velocity.setY(0.15);
double dx = Math.abs(distance - 2.4);
if (distance > 2.75) {
velocity.setY(-.40 * dx * dx);
} else if (distance < 2) {
velocity.setY(.40 * dx * dx);
} else {
velocity.setY(0);
}
@ -141,14 +142,17 @@ public class AirScooter extends AirAbility implements Attributable{
velocity.add(new Vector(0, 0.6, 0));
}
if (WaterAbility.isWater(player.getLocation().getBlock())) {
remove();
Location loc = player.getLocation();
if (!WaterAbility.isWater(player.getLocation().add(0, 2, 0).getBlock())) {
loc.setY((double) floorblock.getY() + 1.5);
} else {
return;
}
player.setSprinting(false);
player.removePotionEffect(PotionEffectType.SPEED);
player.setVelocity(velocity);
if (random.nextInt(4) == 0) {
playAirbendingSound(player.getLocation());
}
@ -164,10 +168,14 @@ public class AirScooter extends AirAbility implements Attributable{
player.setFlying(hadFly);
bPlayer.addCooldown(this);
}
/*
* The particles used for AirScooter phi = how many rings of particles the
* sphere has. theta = how dense the rings are. r = Radius of the sphere
*/
private void spinScooter() {
Location origin = player.getLocation().clone();
Location origin2 = player.getLocation().clone();
Location origin = player.getLocation();
Location origin2 = player.getLocation();
phi += Math.PI / 10 * 4;
for (double theta = 0; theta <= 2 * Math.PI; theta += Math.PI / 10) {
double r = 0.6;
@ -186,7 +194,7 @@ public class AirScooter extends AirAbility implements Attributable{
origin2.subtract(x, y, z);
playAirbendingParticles(origin2, 1, 0F, 0F, 0F);
origin2.add(x, y, z);
}
}
}
@Override
@ -262,13 +270,4 @@ public class AirScooter extends AirAbility implements Attributable{
public void setCooldown(long cooldown) {
this.cooldown = cooldown;
}
@Override
public void registerAttributes() {
speedA = new Attribute<Double>(this, "speed", getConfig().getDouble("Abilities.Air.AirScooter.Speed"));
intervalA = new Attribute<Double>(this, "interval", getConfig().getDouble("Abilities.Air.AirScooter.Interval"));
radiusA = new Attribute<Double>(this, "radius", getConfig().getDouble("Abilities.Air.AirScooter.Radius"));
heightA = new Attribute<Double>(this, "height", getConfig().getDouble("Abilities.Air.AirScooter.MaxHeightFromGround"));
cooldownA = new Attribute<Long>(this, "cooldown", getConfig().getLong("Abilities.Air.AirScooter.Cooldown"));
}
}

View file

@ -556,8 +556,8 @@ public class ConfigManager {
config.addDefault("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Entities", 4.5);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Self", 4.0);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirSpout.Height", 26);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirSuction.Push", 3.5);
config.addDefault("Abilities.Avatar.AvatarState.AirSpout.Height", 26);
config.addDefault("Abilities.Avatar.AvatarState.AirSuction.Push", 3.5);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirSwipe.Cooldown", 1000);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirSwipe.Damage", 4.5);
config.addDefault("Abilities.Avatar.AvatarState.Air.AirSwipe.Push", 1.0);

View file

@ -1,90 +0,0 @@
package com.projectkorra.projectkorra.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.ability.CoreAbility;
public class Attribute<TYPE> {
private static Map<CoreAbility, Map<String, Attribute<? extends Object>>> attributes = new HashMap<>();
public List<AttributeModifier<TYPE>> modifiers;
public CoreAbility ability;
public String name;
public TYPE value;
public Attribute(CoreAbility ability, String name, TYPE value) {
this(ability, name, value, new ArrayList<AttributeModifier<TYPE>>());
}
public Attribute(CoreAbility ability, String name, TYPE value, List<AttributeModifier<TYPE>> modifiers) {
this.ability = ability;
this.name = name;
this.value = value;
if (!attributes.containsKey(ability)) {
attributes.put(ability, new HashMap<String, Attribute<? extends Object>>());
}
attributes.get(ability).put(name.toLowerCase(), this);
this.modifiers = new ArrayList<AttributeModifier<TYPE>>(modifiers);
}
public List<AttributeModifier<TYPE>> getModifiers() {
return modifiers;
}
public void addModifier(AttributeModifier<TYPE> modifier) {
modifiers.add(modifier);
}
public CoreAbility getAbility() {
return ability;
}
public String getName() {
return name;
}
public TYPE getDefault() {
return value;
}
public TYPE getModified(BendingPlayer bPlayer) {
TYPE modified = value;
for (AttributeModifier<TYPE> modifier : modifiers) {
if (!modifier.canModify(bPlayer)) {
continue;
}
value = modifier.newValue(value);
}
return modified;
}
public static Attribute<? extends Object> get(CoreAbility ability, String name) {
Map<String, Attribute<? extends Object>> map = attributes.containsKey(ability) ? attributes.get(ability) : new HashMap<String, Attribute<? extends Object>>();
if (map.isEmpty()) {
return null;
}
if (map.containsKey(name.toLowerCase())) {
return map.get(name.toLowerCase());
}
return null;
}
public interface AttributeModifier<TYPE> {
public boolean canModify(BendingPlayer bPlayer);
public TYPE newValue(TYPE value);
}
public interface Attributable {
/**
* Registers the {@link Attribute} objects the ability has
*/
public void registerAttributes();
}
}

View file

@ -30,11 +30,11 @@ public enum ClickType {
*/
RIGHT_CLICK_BLOCK,
/**
* The shift key being released.
* The shift key being pressed.
*/
SHIFT_DOWN,
/**
* The shift key being pressed.
* The shift key being released.
*/
SHIFT_UP;
}

View file

@ -1,49 +0,0 @@
package com.projectkorra.projectkorra.util.attributes;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.airbending.AirBlast;
import com.projectkorra.projectkorra.airbending.AirBurst;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.util.Attribute;
public class AttributeModifiers {
public AttributeModifiers() {
load();
}
@SuppressWarnings("unchecked")
public void load() {
Attribute<Double> airBlastPushSelf = (Attribute<Double>) Attribute.get(CoreAbility.getAbility(AirBlast.class), "pushFactor");
airBlastPushSelf.addModifier(new AvatarStateModifier<Double>() {
@Override
public Double newValue(Double value) {
return ConfigManager.getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Self");
}
});
Attribute<Double> airBlastPushOthers = (Attribute<Double>) Attribute.get(CoreAbility.getAbility(AirBlast.class), "pushFactorForOthers");
airBlastPushOthers.addModifier(new AvatarStateModifier<Double>() {
@Override
public Double newValue(Double value) {
return ConfigManager.getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBlast.Push.Entities");
}
});
Attribute<Double> airBurstDamage = (Attribute<Double>) Attribute.get(CoreAbility.getAbility(AirBurst.class), "damage");
airBurstDamage.addModifier(new AvatarStateModifier<Double>() {
@Override
public Double newValue(Double value) {
return ConfigManager.getConfig().getDouble("Abilities.Avatar.AvatarState.Air.AirBurst.Damage");
}
});
Attribute<Long> airBurstChargetime = (Attribute<Long>) Attribute.get(CoreAbility.getAbility(AirBurst.class), "chargeTime");
airBurstChargetime.addModifier(new AvatarStateModifier<Long>() {
@Override
public Long newValue(Long value) {
return ConfigManager.getConfig().getLong("Abilities.Avatar.AvatarState.Air.AirBurst.ChargeTime");
}
});
}
}

View file

@ -1,18 +0,0 @@
package com.projectkorra.projectkorra.util.attributes;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.util.Attribute.AttributeModifier;
public class AvatarStateModifier<TYPE> implements AttributeModifier<TYPE>{
@Override
public boolean canModify(BendingPlayer bPlayer) {
return bPlayer.isAvatarState();
}
@Override
public TYPE newValue(TYPE value) {
return value;
}
}