Code Patterns

Copy-paste examples for common plugin tasks. Commands, events, ECS, GUI, and more.

← Back to Patterns
command

Traitor Chat Command

/t command using AbstractAsyncCommand

Example Code

java
package dev.myplugin.example;

// import dev.myplugin.example.PlayerGameModeInfo;  // Anonymized
// import dev.myplugin.example.PlayerRole;  // Anonymized
// import dev.myplugin.example.MessageId;  // Anonymized
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncCommand;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import org.checkerframework.checker.nullness.compatqual.NonNullDecl;

import java.util.concurrent.CompletableFuture;

import static ar.ncode.plugin.ui.hud.PlayerCurrentRoleHud.TRAITOR_COLOR;

public class ExampleCommand extends AbstractAsyncCommand {

	RequiredArg<String> message = this.withRequiredArg(
			"message", MessageId.TRAITORS_CHAT_COMMAND_DESCRIPTION.get(),
			ArgTypes.STRING
	);

	public ExampleCommand() {
		super("t", "description");
	}

	@NonNullDecl
	@Override
	protected CompletableFuture<Void> executeAsync(@NonNullDecl CommandContext commandContext) {
		return CompletableFuture.runAsync(() -> executeSync(commandContext));
	}

	protected void executeSync(@NonNullDecl CommandContext ctx) {
		if (!ctx.isPlayer() || ctx.senderAsPlayerRef() == null) {
			ctx.sendMessage(Message.raw("Command can only be used by players."));
			return;
		}

		World world = ctx.senderAs(Player.class).getWorld();
		Ref<EntityStore> ref = ctx.senderAsPlayerRef();
		Player player = ctx.senderAs(Player.class);

		world.execute(() -> {
			PlayerGameModeInfo playerInfo = ref.getStore().getComponent(ref, PlayerGameModeInfo.componentType);

			if (player == null || playerInfo == null) {
				return;
			}

			if (!PlayerRole.TRAITOR.equals(playerInfo.getRole())) {
				ctx.sendMessage(Message.translation(MessageId.TRAITORS_CHAT_ONLY_FOR_TRAITORS.get()));
				return;
			}

			String chatMessage = ctx.get(this.message);

			if (player.getWorld() == null) {
				ctx.sendMessage(Message.translation(MessageId.TRAITORS_CHAT_ONLY_FOR_TRAITORS.get()));
				return;
			}

			for (PlayerRef playerRef : player.getWorld().getPlayerRefs()) {
				Ref<EntityStore> targetRef = playerRef.getReference();
				if (targetRef == null || !targetRef.isValid()) {
					continue;
				}

				PlayerGameModeInfo targetPlayerInfo = targetRef.getStore().getComponent(targetRef, PlayerGameModeInfo.componentType);
				PlayerRef targetPlayerRef = targetRef.getStore().getComponent(targetRef, PlayerRef.getComponentType());
				Player targetPlayer = targetRef.getStore().getComponent(targetRef, Player.getComponentType());

				if (targetPlayerInfo == null || targetPlayerRef == null || targetPlayer == null ||
						!PlayerRole.TRAITOR.equals(targetPlayerInfo.getCurrentRoundRole())) {
					continue;
				}

				targetPlayerRef.sendMessage(
						Message.join(
								Message.translation(MessageId.TRAITORS_CHAT_PREFIX.get())
										.color(TRAITOR_COLOR),
								Message.raw(" - " + player.getDisplayName() + ": " + chatMessage)
						)
				);
			}
		});
	}

}