Skip to content

Commit

Permalink
Merge pull request #9 from TTE-DevTeam/sign-rework
Browse files Browse the repository at this point in the history
Sign rework test
  • Loading branch information
DerToaster98 authored Sep 5, 2024
2 parents 93d346a + 92141d4 commit 98415fd
Show file tree
Hide file tree
Showing 35 changed files with 2,683 additions and 1,181 deletions.
66 changes: 49 additions & 17 deletions Movecraft/src/main/java/net/countercraft/movecraft/Movecraft.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public class Movecraft extends JavaPlugin {
private WorldHandler worldHandler;
private SmoothTeleport smoothTeleport;
private AsyncManager asyncManager;
private AbstractSignListener abstractSignListener;
private WreckManager wreckManager;

public static synchronized Movecraft getInstance() {
Expand Down Expand Up @@ -132,6 +133,12 @@ public void onEnable() {
getLogger().warning("Falling back to bukkit teleportation provider.");
}
}

final Class<?> signListenerClass = Class.forName("net.countercraft.movecraft.compat." + WorldHandler.getPackageName(minecraftVersion) + ".SignListener");
if (AbstractSignListener.class.isAssignableFrom(signListenerClass)) {
abstractSignListener = (AbstractSignListener) signListenerClass.getConstructor().newInstance();
getServer().getPluginManager().registerEvents(abstractSignListener, this);
}
}
catch (final Exception e) {
e.printStackTrace();
Expand Down Expand Up @@ -209,37 +216,60 @@ public void onEnable() {
getCommand("crafttype").setExecutor(new CraftTypeCommand());
getCommand("craftinfo").setExecutor(new CraftInfoCommand());

// Naming scheme: If it has parameters, append a double colon except if it is a subcraft
// Parameters follow on the following lines
getServer().getPluginManager().registerEvents(new BlockListener(), this);
getServer().getPluginManager().registerEvents(new PlayerListener(), this);
getServer().getPluginManager().registerEvents(new ChunkManager(), this);
getServer().getPluginManager().registerEvents(new AscendSign(), this);
getServer().getPluginManager().registerEvents(new CraftSign(), this);
getServer().getPluginManager().registerEvents(new CruiseSign(), this);
getServer().getPluginManager().registerEvents(new DescendSign(), this);
getServer().getPluginManager().registerEvents(new HelmSign(), this);
getServer().getPluginManager().registerEvents(new MoveSign(), this);
getServer().getPluginManager().registerEvents(new NameSign(), this);
getServer().getPluginManager().registerEvents(new PilotSign(), this);
getServer().getPluginManager().registerEvents(new RelativeMoveSign(), this);
getServer().getPluginManager().registerEvents(new ReleaseSign(), this);
getServer().getPluginManager().registerEvents(new RemoteSign(), this);
getServer().getPluginManager().registerEvents(new SpeedSign(), this);
getServer().getPluginManager().registerEvents(new SubcraftRotateSign(), this);
getServer().getPluginManager().registerEvents(new TeleportSign(), this);
getServer().getPluginManager().registerEvents(new ScuttleSign(), this);
//getServer().getPluginManager().registerEvents(new AscendSign(), this);
AbstractMovecraftSign.register("Ascend:", new AscendSign());
//getServer().getPluginManager().registerEvents(new CruiseSign(), this);
AbstractMovecraftSign.register("Cruise:", new CruiseSign());
//getServer().getPluginManager().registerEvents(new DescendSign(), this);
AbstractMovecraftSign.register("Descend:", new DescendSign());
//getServer().getPluginManager().registerEvents(new HelmSign(), this);
AbstractMovecraftSign.register("[Helm]", new HelmSign());
AbstractMovecraftSign.register(HelmSign.PRETTY_HEADER, new HelmSign());
//getServer().getPluginManager().registerEvents(new MoveSign(), this);
AbstractMovecraftSign.register("Move:", new MoveSign());
//getServer().getPluginManager().registerEvents(new NameSign(), this);
AbstractMovecraftSign.register("Name:", new NameSign());
//getServer().getPluginManager().registerEvents(new PilotSign(), this);
AbstractMovecraftSign.register("Pilot:", new PilotSign());
//getServer().getPluginManager().registerEvents(new RelativeMoveSign(), this);
AbstractMovecraftSign.register("RMove:", new RelativeMoveSign());
//getServer().getPluginManager().registerEvents(new ReleaseSign(), this);
AbstractMovecraftSign.register("Release", new ReleaseSign());
//getServer().getPluginManager().registerEvents(new RemoteSign(), this);
AbstractMovecraftSign.register("Remote Sign", new RemoteSign());
//getServer().getPluginManager().registerEvents(new SpeedSign(), this);
AbstractMovecraftSign.register("Speed:", new SpeedSign());
AbstractMovecraftSign.register("Status:", new StatusSign());
AbstractMovecraftSign.register("Contacts:", new ContactsSign());
//getServer().getPluginManager().registerEvents(new SubcraftRotateSign(), this);
AbstractMovecraftSign.register("Subcraft Rotate", new SubcraftRotateSign(CraftManager.getInstance()::getCraftTypeFromString, Movecraft::getInstance));
//getServer().getPluginManager().registerEvents(new TeleportSign(), this);
AbstractMovecraftSign.register("Teleport:", new TeleportSign());
//getServer().getPluginManager().registerEvents(new ScuttleSign(), this);
AbstractMovecraftSign.register("Scuttle", new ScuttleSign());
getServer().getPluginManager().registerEvents(new CraftPilotListener(), this);
getServer().getPluginManager().registerEvents(new CraftReleaseListener(), this);
// Moved to compat section!
//getServer().getPluginManager().registerEvents(new SignListener(), this);

AbstractMovecraftSign.registerCraftPilotSigns(CraftManager.getInstance().getCraftTypes(), CraftPilotSign::new);

var contactsManager = new ContactsManager();
contactsManager.runTaskTimerAsynchronously(this, 0, 20);
getServer().getPluginManager().registerEvents(contactsManager, this);
getServer().getPluginManager().registerEvents(new ContactsSign(), this);
//getServer().getPluginManager().registerEvents(new ContactsSign(), this);
getServer().getPluginManager().registerEvents(new CraftTypeListener(), this);
getCommand("contacts").setExecutor(new ContactsCommand());

var statusManager = new StatusManager();
statusManager.runTaskTimerAsynchronously(this, 0, 1);
getServer().getPluginManager().registerEvents(statusManager, this);
getServer().getPluginManager().registerEvents(new StatusSign(), this);
//getServer().getPluginManager().registerEvents(new StatusSign(), this);

logger.info("[V " + getDescription().getVersion() + "] has been enabled.");
}
Expand Down Expand Up @@ -337,6 +367,8 @@ public AsyncManager getAsyncManager() {
return asyncManager;
}

public AbstractSignListener getAbstractSignListener() {return abstractSignListener;}

public @NotNull WreckManager getWreckManager(){
return wreckManager;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import net.countercraft.movecraft.Movecraft;
import net.countercraft.movecraft.craft.CraftManager;
import net.countercraft.movecraft.localisation.I18nSupport;
import net.countercraft.movecraft.sign.AbstractMovecraftSign;
import net.countercraft.movecraft.sign.CraftPilotSign;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,107 +3,94 @@
import net.countercraft.movecraft.MovecraftLocation;
import net.countercraft.movecraft.craft.Craft;
import net.countercraft.movecraft.craft.type.CraftType;
import net.countercraft.movecraft.events.CraftDetectEvent;
import net.countercraft.movecraft.events.SignTranslateEvent;
import org.bukkit.ChatColor;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import net.countercraft.movecraft.sign.AbstractInformationSign;
import net.countercraft.movecraft.sign.AbstractSignListener;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.Style;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class ContactsSign implements Listener {
private static final String HEADER = "Contacts:";
import java.util.List;

@EventHandler
public void onCraftDetect(@NotNull CraftDetectEvent event) {
World world = event.getCraft().getWorld();
for (MovecraftLocation location : event.getCraft().getHitBox()) {
var block = location.toBukkit(world).getBlock();
if (!Tag.SIGNS.isTagged(block.getType()))
continue;
public class ContactsSign extends AbstractInformationSign {

BlockState state = block.getState();
if (!(state instanceof Sign sign))
continue;
protected final int MAX_DISTANCE_COLOR_RED = 64 * 64;
protected final int MAX_DISTANCE_COLOR_YELLOW = 128 * 128;

if (!ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase(HEADER))
continue;

sign.setLine(1, "");
sign.setLine(2, "");
sign.setLine(3, "");
sign.update();
}
}

@EventHandler
public final void onSignTranslateEvent(@NotNull SignTranslateEvent event) {
if (!ChatColor.stripColor(event.getLine(0)).equalsIgnoreCase(HEADER))
return;
protected @NotNull Component contactsLine(@NotNull Craft base, @NotNull Craft target) {
MovecraftLocation baseCenter = base.getHitBox().getMidPoint();
MovecraftLocation targetCenter = target.getHitBox().getMidPoint();
int distanceSquared = baseCenter.distanceSquared(targetCenter);

Craft base = event.getCraft();
int line = 1;
for (Craft target : base.getDataTag(Craft.CONTACTS)) {
if (line > 3)
break;
String craftTypeName = target.getType().getStringProperty(CraftType.NAME);
if (craftTypeName.length() > 9)
craftTypeName = craftTypeName.substring(0, 7);

event.setLine(line++, contactsLine(base, target));
Style style = STYLE_COLOR_GREEN;
if (distanceSquared <= MAX_DISTANCE_COLOR_RED) {
style = STYLE_COLOR_RED;
}
while (line <= 3) {
event.setLine(line++, "");
else if (distanceSquared <= MAX_DISTANCE_COLOR_YELLOW) {
style = STYLE_COLOR_YELLOW;
}
}

private static @NotNull String contactsLine(@NotNull Craft base, @NotNull Craft target) {
MovecraftLocation baseCenter = base.getHitBox().getMidPoint();
MovecraftLocation targetCenter = target.getHitBox().getMidPoint();
int distanceSquared = baseCenter.distanceSquared(targetCenter);

String result = ChatColor.BLUE + target.getType().getStringProperty(CraftType.NAME);
if (result.length() > 9)
result = result.substring(0, 7);
Component result = Component.text(craftTypeName + " ").style(style);

result += " " + (int) Math.sqrt(distanceSquared);
int diffX = baseCenter.getX() - targetCenter.getX();
int diffZ = baseCenter.getZ() - targetCenter.getZ();
String directionStr = "" + (int) Math.sqrt(distanceSquared);
if (Math.abs(diffX) > Math.abs(diffZ)) {
if (diffX<0) {
result +=" E";
directionStr +=" E";
} else {
result +=" W";
directionStr +=" W";
}
} else {
if (diffZ<0) {
result +=" S";
directionStr +=" S";
} else {
result +=" N";
directionStr +=" N";
}
}
result = result.append(Component.text(directionStr).style(STYLE_COLOR_WHITE));
return result;
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onSignClickEvent(@NotNull PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
return;
@Override
protected boolean internalProcessSignWithCraft(Action clickType, AbstractSignListener.SignWrapper sign, Craft craft, Player player) {
player.performCommand("contacts");

return true;
}

@Override
protected @Nullable Component getUpdateString(int lineIndex, Component oldData, Craft craft) {
Craft contact = null;
List<Craft> contacts = craft.getDataTag(Craft.CONTACTS);
if (contacts.isEmpty() || contacts.size() < lineIndex) {
return EMPTY;
}
contact = contacts.get(lineIndex);

Block block = event.getClickedBlock();
if (block == null)
return;
if (!(block.getState() instanceof Sign sign))
return;
return contactsLine(craft, contact);
}

@Override
protected @Nullable Component getDefaultString(int lineIndex, Component oldComponent) {
return EMPTY;
}

@Override
protected void performUpdate(Component[] newComponents, AbstractSignListener.SignWrapper sign, REFRESH_CAUSE refreshCause) {
if (refreshCause != REFRESH_CAUSE.SIGN_MOVED_BY_CRAFT && sign.block() != null) {
sign.block().update();
}
}

if (!ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase(HEADER))
return;
@Override
protected void onCraftIsBusy(Player player, Craft craft) {

event.setCancelled(true);
event.getPlayer().performCommand("contacts");
}
}
Loading

0 comments on commit 98415fd

Please sign in to comment.