diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index ce7d432b..408a63b2 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -38,6 +38,7 @@ import com.massivecraft.massivecore.command.type.RegistryType; import com.massivecraft.massivecore.engine.EngineMassiveCoreChestGui; import com.massivecraft.massivecore.engine.EngineMassiveCoreCollTick; import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration; +import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandSet; import com.massivecraft.massivecore.engine.EngineMassiveCoreDatabase; import com.massivecraft.massivecore.engine.EngineMassiveCoreDestination; import com.massivecraft.massivecore.engine.EngineMassiveCoreGank; @@ -302,6 +303,7 @@ public class MassiveCore extends MassivePlugin EngineMassiveCoreChestGui.class, EngineMassiveCoreCollTick.class, EngineMassiveCoreCommandRegistration.class, + EngineMassiveCoreCommandSet.class, EngineMassiveCoreDatabase.class, EngineMassiveCoreDestination.class, EngineMassiveCoreGank.class, diff --git a/src/com/massivecraft/massivecore/command/MassiveCommandSetSharding.java b/src/com/massivecraft/massivecore/command/MassiveCommandSetSharding.java new file mode 100644 index 00000000..d4f4d48c --- /dev/null +++ b/src/com/massivecraft/massivecore/command/MassiveCommandSetSharding.java @@ -0,0 +1,84 @@ +package com.massivecraft.massivecore.command; + +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.command.type.Type; +import com.massivecraft.massivecore.command.type.sender.TypeSenderId; +import com.massivecraft.massivecore.event.EventMassiveCoreCommandSet; +import com.massivecraft.massivecore.mixin.MixinEvent; +import com.massivecraft.massivecore.util.IdUtil; +import com.massivecraft.massivecore.util.PermissionUtil; + +import java.io.Serializable; +import java.util.List; + +public abstract class MassiveCommandSetSharding extends MassiveCommand +{ + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + private final Type type; + public Type getType() { return this.type; } + + private String permSetOther; + public String getPermSetOther() { return permSetOther; } + public void setPermSetOther(String permSetOther) { this.permSetOther = permSetOther; } + public boolean hasPermSetOther() { return this.getPermSetOther() != null; } + + private PlayerValue playerValue; + public PlayerValue getPlayerValue() { return playerValue; } + public void setPlayerValue(PlayerValue playerValue) { this.playerValue = playerValue; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public MassiveCommandSetSharding(Type type) + { + this(type, TypeSenderId.get()); + } + + public MassiveCommandSetSharding(Type type, Type typeSenderId) + { + this.type = type; + + // Parameters + this.addParameter(type); + this.addParameter(typeSenderId, "player", "you"); + } + + // -------------------------------------------- // + // NAME + // -------------------------------------------- // + + public String getName() + { + List aliases = this.getAliases(); + return aliases.get(aliases.size() - 1); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public void perform() throws MassiveException + { + // Args + T after = this.readArg(); + + String senderId = IdUtil.getId(sender); + String targetId = this.readArg(senderId); + boolean other = !targetId.equals(senderId); + + // Check other + if (other && this.hasPermSetOther()) + { + if (!PermissionUtil.hasPermission(sender, this.getPermSetOther(), true)) return; + } + + EventMassiveCoreCommandSet event = new EventMassiveCoreCommandSet(senderId, targetId, after, this.getPlayerValue(), this.getName()); + MixinEvent.get().distribute(event, true); + } + +} diff --git a/src/com/massivecraft/massivecore/command/PlayerValue.java b/src/com/massivecraft/massivecore/command/PlayerValue.java new file mode 100644 index 00000000..e9a3f3bb --- /dev/null +++ b/src/com/massivecraft/massivecore/command/PlayerValue.java @@ -0,0 +1,12 @@ +package com.massivecraft.massivecore.command; + +import com.massivecraft.massivecore.MassiveException; +import org.bukkit.entity.Player; + +import java.io.Serializable; + +public interface PlayerValue extends Serializable +{ + T getValue(Player player) throws MassiveException; + void setValue(T value, Player player) throws MassiveException; +} diff --git a/src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandSet.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandSet.java new file mode 100644 index 00000000..bb6d8de6 --- /dev/null +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandSet.java @@ -0,0 +1,94 @@ +package com.massivecraft.massivecore.engine; + +import com.massivecraft.massivecore.Engine; +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.command.PlayerValue; +import com.massivecraft.massivecore.command.type.RegistryType; +import com.massivecraft.massivecore.command.type.Type; +import com.massivecraft.massivecore.event.EventMassiveCoreCommandSet; +import com.massivecraft.massivecore.mixin.MixinDisplayName; +import com.massivecraft.massivecore.mixin.MixinMessage; +import com.massivecraft.massivecore.util.IdUtil; +import com.massivecraft.massivecore.util.Txt; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.io.Serializable; + +public class EngineMassiveCoreCommandSet extends Engine +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineMassiveCoreCommandSet i = new EngineMassiveCoreCommandSet(); + public static EngineMassiveCoreCommandSet get() { return i; } + + // -------------------------------------------- // + // RUN + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.NORMAL) + public void setValueListener(EventMassiveCoreCommandSet event) + { + try + { + this.setValue(event); + } + catch (MassiveException e) + { + MixinMessage.get().messageOne(event.getSenderId(), e.getMessages()); + } + } + + + public void setValue(EventMassiveCoreCommandSet event) throws MassiveException + { + String senderId = event.getSenderId(); + String targetId = event.getTargetId(); + T after = event.getValue(); + PlayerValue playerValue = event.getPlayerValue(); + String name = event.getName(); + + Player player = IdUtil.getPlayer(targetId); + if (player == null) return; + + T before = playerValue.getValue(player); + + Type type = (Type) RegistryType.getType(after.getClass()); + String afterDesc = type.getVisual(after); + String targetDesc = this.getTargetDesc(targetId, senderId, name); + + // NoChange + if (after == before) + { + throw new MassiveException().addMsg("%s is already %s.", targetDesc, afterDesc); + } + + // Apply + playerValue.setValue(after, player); + + // Inform + MixinMessage.get().msgOne(senderId, "%s is now %s.", targetDesc, afterDesc); + + // Inform target + if (!targetId.equals(senderId)) + { + MixinMessage.get().msgOne(targetId, "%s is now %s.", getTargetDesc(targetId, targetId, name), afterDesc); + } + } + + public String getTargetDesc(String targetId, String watcherId, String name) + { + if (targetId.equals(watcherId)) + { + return Txt.parse("Your %s", name); + } + else + { + return Txt.parse("%s of %s", Txt.upperCaseFirst(name), MixinDisplayName.get().getDisplayName(targetId, watcherId)); + } + } + +} diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCoreCommandSet.java b/src/com/massivecraft/massivecore/event/EventMassiveCoreCommandSet.java new file mode 100644 index 00000000..db594aae --- /dev/null +++ b/src/com/massivecraft/massivecore/event/EventMassiveCoreCommandSet.java @@ -0,0 +1,50 @@ +package com.massivecraft.massivecore.event; + +import com.massivecraft.massivecore.command.PlayerValue; +import org.bukkit.event.HandlerList; + +import java.io.Serializable; + +public class EventMassiveCoreCommandSet extends EventMassiveCore implements Serializable +{ + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + private final String senderId; + public String getSenderId() { return senderId; } + + private final String targetId; + public String getTargetId() { return targetId; } + + private final T value; + public T getValue() { return value; } + + private final PlayerValue playerValue; + public PlayerValue getPlayerValue() { return playerValue; } + + private final String name; + public String getName() { return name; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public EventMassiveCoreCommandSet(String senderId, String targetId, T value, PlayerValue playerValue, String name) + { + this.senderId = senderId; + this.targetId = targetId; + this.value = value; + this.playerValue = playerValue; + this.name = name; + } + +} diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java index 73955555..17ee1cba 100644 --- a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java +++ b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java @@ -85,6 +85,11 @@ public class EventMassiveCorePlayerUpdate extends EventMassiveCore EventMassiveCorePlayerUpdate event = new EventMassiveCorePlayerUpdate(player, current); event.run(); + + // If fly allowed is false, then fly active may not be true. + // Because fly active uses current=true and everything else current=false + // Then fly allowed might be reset when fly active doesn't get reset. That we do here. + if (!event.isFlyAllowed()) event.setFlyActive(false); setMaxHealth(player, event.getMaxHealth()); setFlyAllowed(player, event.isFlyAllowed());