From 3ad2cd7841da1d3c35ef0f4810ce42cb5fbaee3d Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 1 Nov 2023 12:45:47 -0700 Subject: [PATCH] Add `/scene` command --- .../command/commands/SceneCommand.java | 64 +++++++++++++++++++ .../lunarcore/data/excel/MazePlaneExcel.java | 1 + .../emu/lunarcore/game/player/Player.java | 19 +++--- .../java/emu/lunarcore/util/Handbook.java | 1 + 4 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 src/main/java/emu/lunarcore/command/commands/SceneCommand.java diff --git a/src/main/java/emu/lunarcore/command/commands/SceneCommand.java b/src/main/java/emu/lunarcore/command/commands/SceneCommand.java new file mode 100644 index 0000000..49d8b4a --- /dev/null +++ b/src/main/java/emu/lunarcore/command/commands/SceneCommand.java @@ -0,0 +1,64 @@ +package emu.lunarcore.command.commands; + +import emu.lunarcore.command.Command; +import emu.lunarcore.command.CommandArgs; +import emu.lunarcore.command.CommandHandler; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.config.AnchorInfo; +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.excel.MazePlaneExcel; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.util.Utils; + +@Command(label = "scene", aliases = {"sc"}, permission = "player.scene", desc = "/scene [scene id] [floor id]. Teleports the player to the specified scene.") +public class SceneCommand implements CommandHandler { + + @Override + public void execute(Player sender, CommandArgs args) { + // Check target + if (args.getTarget() == null) { + this.sendMessage(sender, "Error: Targeted player not found or offline"); + return; + } + + // Get arguments + int planeId = Utils.parseSafeInt(args.get(0)); + int floorId = Utils.parseSafeInt(args.get(1)); + + // Get maze plane + MazePlaneExcel excel = GameData.getMazePlaneExcelMap().get(planeId); + if (excel == null) { + this.sendMessage(sender, "Error: Maze plane not found"); + return; + } + + if (floorId <= 0) { + floorId = excel.getStartFloorID(); + } + + // Get floor info + FloorInfo floor = GameData.getFloorInfo(planeId, floorId); + if (floor == null) { + this.sendMessage(sender, "Error: Floor info not found"); + return; + } + + int startGroup = floor.getStartGroupID(); + int anchorId = floor.getStartAnchorID(); + + AnchorInfo anchor = floor.getAnchorInfo(startGroup, anchorId); + if (anchor == null) { + this.sendMessage(sender, "Error: Floor info not found"); + return; + } + + // Move player to scene + boolean success = args.getTarget().loadScene(planeId, floorId, 0, anchor.getPos(), anchor.getRot(), true); + + // Send packet + if (success) { + this.sendMessage(sender, "Teleported player to " + planeId); + } + } + +} diff --git a/src/main/java/emu/lunarcore/data/excel/MazePlaneExcel.java b/src/main/java/emu/lunarcore/data/excel/MazePlaneExcel.java index c752477..b6faf18 100644 --- a/src/main/java/emu/lunarcore/data/excel/MazePlaneExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/MazePlaneExcel.java @@ -12,6 +12,7 @@ import lombok.Getter; public class MazePlaneExcel extends GameResource { private int PlaneID; private int WorldID; + private int StartFloorID; private long PlaneName; @SerializedName(value = "PlaneType") diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java index 6c0c2db..e7c363e 100644 --- a/src/main/java/emu/lunarcore/game/player/Player.java +++ b/src/main/java/emu/lunarcore/game/player/Player.java @@ -462,18 +462,10 @@ public class Player { if (anchor == null) return false; // Move player to scene - boolean success = this.loadScene(entry.getPlaneID(), entry.getFloorID(), entry.getId(), anchor.getPos(), anchor.getRot()); - - // Send packet - if (success && sendPacket) { - this.sendPacket(new PacketEnterSceneByServerScNotify(this)); - } - - // Success - return success; + return this.loadScene(entry.getPlaneID(), entry.getFloorID(), entry.getId(), anchor.getPos(), anchor.getRot(), sendPacket); } - private boolean loadScene(int planeId, int floorId, int entryId, Position pos, Position rot) { + public boolean loadScene(int planeId, int floorId, int entryId, Position pos, Position rot, boolean sendPacket) { // Get maze plane excel MazePlaneExcel planeExcel = GameData.getMazePlaneExcelMap().get(planeId); if (planeExcel == null) return false; @@ -517,6 +509,11 @@ public class Player { this.scene = nextScene; this.scene.setEntryId(entryId); + // Send packet + if (sendPacket) { + this.sendPacket(new PacketEnterSceneByServerScNotify(this)); + } + // Done, return success return true; } @@ -563,7 +560,7 @@ public class Player { } // Load into saved scene (should happen after everything else loads) - this.loadScene(planeId, floorId, entryId, this.getPos(), this.getRot()); + this.loadScene(planeId, floorId, entryId, this.getPos(), this.getRot(), false); // Unstuck check in case we couldn't load the scene if (this.getScene() == null) { diff --git a/src/main/java/emu/lunarcore/util/Handbook.java b/src/main/java/emu/lunarcore/util/Handbook.java index 35dd46f..3657204 100644 --- a/src/main/java/emu/lunarcore/util/Handbook.java +++ b/src/main/java/emu/lunarcore/util/Handbook.java @@ -117,6 +117,7 @@ public class Handbook { MazePlaneExcel excel = GameData.getMazePlaneExcelMap().get(id); writer.print(excel.getId()); writer.print(" : "); + writer.print("[" + excel.getPlaneType() + "] "); writer.println(textMap.getOrDefault(excel.getPlaneName(), "null")); } } catch (IOException e) {