Skip to content

Commit

Permalink
Command Tag Implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
TreemanKing committed May 12, 2024
1 parent ae33016 commit 60737d1
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ private void registerTags() {
this.tagRegistry.registerTag(new CooldownTag());
this.tagRegistry.registerTag(new TriggerBlockTag());
this.tagRegistry.registerTag(new PermissionTag());
this.tagRegistry.registerTag(new CommandTag());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
import com.sekwah.advancedportals.core.tags.activation.CommandTag;

import java.util.UUID;

Expand Down Expand Up @@ -37,4 +38,6 @@ public interface PlayerContainer extends EntityContainer {
boolean sendPacket(String channel, byte[] bytes);

void playSound(String sound, float volume, float pitch);

void performCommand(String string, CommandTag.CommandLevel commandLevel);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.sekwah.advancedportals.core.tags.activation;

import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
import com.sekwah.advancedportals.core.registry.TagTarget;
import com.sekwah.advancedportals.core.util.Lang;
import com.sekwah.advancedportals.core.warphandler.ActivationData;
import com.sekwah.advancedportals.core.warphandler.Tag;
import javax.annotation.Nullable;

public class CommandTag implements Tag.Activation, Tag.Split{

public static String TAG_NAME = "command";

private final TagType[] tagTypes = new TagType[]{ TagType.PORTAL };

@Override
public TagType[] getTagTypes() {
return tagTypes;
}

@Override
public String getName() {
return TAG_NAME;
}

@Nullable
@Override
public String[] getAliases() {
return null;
}

@Override
public String description() {
return Lang.translate("tag.command.description");
}

@Nullable
@Override
public String splitString() {
return ",";
}

@Override
public boolean preActivated(TagTarget target, PlayerContainer player, ActivationData activeData, String[] argData) {
return true;
}
//TODO: Check if its worth autocompleting an existing command in the command tag by
// grabbing all commands in the server

//TODO: Add a warning in console if op/* command is used and tell them to use console instead
@Override
public void postActivated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
if(activationData.hasActivated()) {
for (String command : argData) {

String formattedCommand = command.replaceAll("@player", player.getName());
char executionCommand = formattedCommand.charAt(0);

switch (executionCommand) {
case '!':
player.performCommand(formattedCommand.substring(1),CommandLevel.OP);
break;
case '#':
player.performCommand(formattedCommand.substring(1), CommandLevel.CONSOLE);
break;
case '^':
player.performCommand(formattedCommand.substring(1), CommandLevel.STAR);
break;
default:
player.performCommand(formattedCommand, CommandLevel.PLAYER);
break;
}
}
}
}

@Override
public boolean activated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
return true;
}

public enum CommandLevel{
OP,
STAR,
CONSOLE,
PLAYER
}
}
6 changes: 3 additions & 3 deletions lang/src/main/resources/lang/en_GB.lang
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ items.interact.right=Right Click
tag.permission.description=Sets the permission of a portal
tag.desti.description=Sets the destination of the portal
tag.name.error.nospaces= The name cannot contain spaces.
tag.triggerblock.description=Sets the trigger block/s of the portal. Comma seperated or multi tag.

tag.cooldown.fail= The cooldown must be a number.
tag.triggerblock.description=Sets the trigger block/s of the portal. Comma separated or multi tag.
tag.command.description=Sets a command on the post activation of the portal. Comma separated or multi tag.

tag.cooldown.fail= The cooldown must be a number.
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@
import com.google.inject.Inject;
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
import com.sekwah.advancedportals.core.tags.activation.CommandTag;
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.spigot.reflection.MinecraftCustomPayload;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.permissions.PermissionAttachment;

import java.util.Arrays;
import java.util.UUID;
Expand Down Expand Up @@ -106,4 +108,42 @@ public Player getPlayer() {
public void playSound(String sound, float volume, float pitch) {
this.player.playSound(this.player.getLocation(), sound, volume, pitch);
}

@Override
public void performCommand(String command, CommandTag.CommandLevel commandLevel) {
Server server = this.player.getServer();
switch (commandLevel) {
case CONSOLE:
server.dispatchCommand(server.getConsoleSender(), command);
break;
case PLAYER:
server.dispatchCommand(this.getPlayer(), command);
break;
case OP, STAR:
executeCommandWithPermission(server, command, commandLevel);
break;
}
}

private void executeCommandWithPermission (Server server, String command, CommandTag.CommandLevel commandLevel) {
switch (commandLevel) {
case STAR:
PermissionAttachment permissionAttachment = player.addAttachment(server.getPluginManager().getPlugin("AdvancedPortals"));
try {
permissionAttachment.setPermission("*", true);
server.dispatchCommand(player, command);
} finally {
player.removeAttachment(permissionAttachment);
}
break;
case OP:
try {
player.setOp(true);
server.dispatchCommand(player, command);
} finally {
player.setOp(false);
}
break;
}
}
}

0 comments on commit 60737d1

Please sign in to comment.