Don't fly if not allowed and sharding command set

This commit is contained in:
Magnus Ulf Jørgensen 2017-04-05 13:30:48 +02:00
parent 3e520e7e9f
commit d3fc83386d
6 changed files with 247 additions and 0 deletions

View File

@ -38,6 +38,7 @@ import com.massivecraft.massivecore.command.type.RegistryType;
import com.massivecraft.massivecore.engine.EngineMassiveCoreChestGui; import com.massivecraft.massivecore.engine.EngineMassiveCoreChestGui;
import com.massivecraft.massivecore.engine.EngineMassiveCoreCollTick; import com.massivecraft.massivecore.engine.EngineMassiveCoreCollTick;
import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration; import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration;
import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandSet;
import com.massivecraft.massivecore.engine.EngineMassiveCoreDatabase; import com.massivecraft.massivecore.engine.EngineMassiveCoreDatabase;
import com.massivecraft.massivecore.engine.EngineMassiveCoreDestination; import com.massivecraft.massivecore.engine.EngineMassiveCoreDestination;
import com.massivecraft.massivecore.engine.EngineMassiveCoreGank; import com.massivecraft.massivecore.engine.EngineMassiveCoreGank;
@ -302,6 +303,7 @@ public class MassiveCore extends MassivePlugin
EngineMassiveCoreChestGui.class, EngineMassiveCoreChestGui.class,
EngineMassiveCoreCollTick.class, EngineMassiveCoreCollTick.class,
EngineMassiveCoreCommandRegistration.class, EngineMassiveCoreCommandRegistration.class,
EngineMassiveCoreCommandSet.class,
EngineMassiveCoreDatabase.class, EngineMassiveCoreDatabase.class,
EngineMassiveCoreDestination.class, EngineMassiveCoreDestination.class,
EngineMassiveCoreGank.class, EngineMassiveCoreGank.class,

View File

@ -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<T extends Serializable> extends MassiveCommand
{
// -------------------------------------------- //
// FIELD
// -------------------------------------------- //
private final Type<T> type;
public Type<T> 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<T> playerValue;
public PlayerValue<T> getPlayerValue() { return playerValue; }
public void setPlayerValue(PlayerValue<T> playerValue) { this.playerValue = playerValue; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public MassiveCommandSetSharding(Type<T> type)
{
this(type, TypeSenderId.get());
}
public MassiveCommandSetSharding(Type<T> type, Type<String> typeSenderId)
{
this.type = type;
// Parameters
this.addParameter(type);
this.addParameter(typeSenderId, "player", "you");
}
// -------------------------------------------- //
// NAME
// -------------------------------------------- //
public String getName()
{
List<String> 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<T>(senderId, targetId, after, this.getPlayerValue(), this.getName());
MixinEvent.get().distribute(event, true);
}
}

View File

@ -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<T extends Serializable> extends Serializable
{
T getValue(Player player) throws MassiveException;
void setValue(T value, Player player) throws MassiveException;
}

View File

@ -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 <T extends Serializable> void setValueListener(EventMassiveCoreCommandSet<T> event)
{
try
{
this.setValue(event);
}
catch (MassiveException e)
{
MixinMessage.get().messageOne(event.getSenderId(), e.getMessages());
}
}
public <T extends Serializable> void setValue(EventMassiveCoreCommandSet<T> event) throws MassiveException
{
String senderId = event.getSenderId();
String targetId = event.getTargetId();
T after = event.getValue();
PlayerValue<T> playerValue = event.getPlayerValue();
String name = event.getName();
Player player = IdUtil.getPlayer(targetId);
if (player == null) return;
T before = playerValue.getValue(player);
Type<T> type = (Type<T>) 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<i> is already <h>%s<i>.", targetDesc, afterDesc);
}
// Apply
playerValue.setValue(after, player);
// Inform
MixinMessage.get().msgOne(senderId, "%s<i> is now <h>%s<i>.", targetDesc, afterDesc);
// Inform target
if (!targetId.equals(senderId))
{
MixinMessage.get().msgOne(targetId, "%s<i> is now <h>%s<i>.", getTargetDesc(targetId, targetId, name), afterDesc);
}
}
public String getTargetDesc(String targetId, String watcherId, String name)
{
if (targetId.equals(watcherId))
{
return Txt.parse("<i>Your <h>%s", name);
}
else
{
return Txt.parse("<h>%s <i>of %s", Txt.upperCaseFirst(name), MixinDisplayName.get().getDisplayName(targetId, watcherId));
}
}
}

View File

@ -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<T extends Serializable> 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<T> playerValue;
public PlayerValue<T> getPlayerValue() { return playerValue; }
private final String name;
public String getName() { return name; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public EventMassiveCoreCommandSet(String senderId, String targetId, T value, PlayerValue<T> playerValue, String name)
{
this.senderId = senderId;
this.targetId = targetId;
this.value = value;
this.playerValue = playerValue;
this.name = name;
}
}

View File

@ -85,6 +85,11 @@ public class EventMassiveCorePlayerUpdate extends EventMassiveCore
EventMassiveCorePlayerUpdate event = new EventMassiveCorePlayerUpdate(player, current); EventMassiveCorePlayerUpdate event = new EventMassiveCorePlayerUpdate(player, current);
event.run(); 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()); setMaxHealth(player, event.getMaxHealth());
setFlyAllowed(player, event.isFlyAllowed()); setFlyAllowed(player, event.isFlyAllowed());