From 98d76ad45ee513475db38a73fd3c5d4dba27ba09 Mon Sep 17 00:00:00 2001 From: P0nk Date: Mon, 16 Sep 2024 20:53:29 +0200 Subject: [PATCH] Prepare centralized chr creation --- .../java/client/creator/CharacterCreator.java | 44 +++++++++++++++++++ src/main/java/client/creator/JobType.java | 7 +++ .../java/client/creator/NewCharacterSpec.java | 20 +++++++++ .../handlers/login/CreateCharHandler.java | 25 +++++++++++ 4 files changed, 96 insertions(+) create mode 100644 src/main/java/client/creator/CharacterCreator.java create mode 100644 src/main/java/client/creator/JobType.java create mode 100644 src/main/java/client/creator/NewCharacterSpec.java diff --git a/src/main/java/client/creator/CharacterCreator.java b/src/main/java/client/creator/CharacterCreator.java new file mode 100644 index 0000000000..77bb7a5af1 --- /dev/null +++ b/src/main/java/client/creator/CharacterCreator.java @@ -0,0 +1,44 @@ +package client.creator; + +import client.inventory.Item; +import constants.id.ItemId; +import constants.id.MapId; +import database.character.CharacterSaver; + +public class CharacterCreator { + private final CharacterSaver chrSaver; + + public CharacterCreator(CharacterSaver chrSaver) { + this.chrSaver = chrSaver; + } + + public boolean createBeginner(NewCharacterSpec spec, int accountId, int worldId) { + int mapId = getStartingMap(spec.type()); + Item guide = getStarterGuide(spec.type()); + // TODO, save: + // - character + // - skills + // - equips + // - starter item + // - keymap + // - quickslots + return false; + } + + private int getStartingMap(JobType type) { + return switch (type) { + case ADVENTURER -> MapId.MUSHROOM_TOWN; + case KNIGHT_OF_CYGNUS -> MapId.ARAN_TUTORIAL_START; + case ARAN -> MapId.STARTING_MAP_NOBLESSE; + }; + } + + private Item getStarterGuide(JobType type) { + int itemId = switch (type) { + case ADVENTURER -> ItemId.BEGINNERS_GUIDE; + case KNIGHT_OF_CYGNUS -> ItemId.NOBLESSE_GUIDE; + case ARAN -> ItemId.LEGENDS_GUIDE; + }; + return new Item(itemId, (short) 0, (short) 1); + } +} diff --git a/src/main/java/client/creator/JobType.java b/src/main/java/client/creator/JobType.java new file mode 100644 index 0000000000..85a7e65904 --- /dev/null +++ b/src/main/java/client/creator/JobType.java @@ -0,0 +1,7 @@ +package client.creator; + +public enum JobType { + ADVENTURER, + KNIGHT_OF_CYGNUS, + ARAN +} diff --git a/src/main/java/client/creator/NewCharacterSpec.java b/src/main/java/client/creator/NewCharacterSpec.java new file mode 100644 index 0000000000..8292b3155a --- /dev/null +++ b/src/main/java/client/creator/NewCharacterSpec.java @@ -0,0 +1,20 @@ +package client.creator; + +import client.SkinColor; +import lombok.Builder; + +@Builder +public record NewCharacterSpec( + String name, + JobType type, + int face, + int hair, + int hairColor, + SkinColor skin, + int topItemId, + int bottomItemId, + int shoesItemId, + int weaponItemId, + byte gender +) { +} diff --git a/src/main/java/net/server/handlers/login/CreateCharHandler.java b/src/main/java/net/server/handlers/login/CreateCharHandler.java index 7fa14855c9..1280f24700 100644 --- a/src/main/java/net/server/handlers/login/CreateCharHandler.java +++ b/src/main/java/net/server/handlers/login/CreateCharHandler.java @@ -22,6 +22,7 @@ package net.server.handlers.login; import client.Client; +import client.creator.JobType; import client.creator.novice.BeginnerCreator; import client.creator.novice.LegendCreator; import client.creator.novice.NoblesseCreator; @@ -47,6 +48,21 @@ public final class CreateCharHandler extends AbstractPacketHandler { int weapon = p.readInt(); int gender = p.readByte(); + /* + NewCharacterSpec spec = NewCharacterSpec.builder() + .type(parseJobType(p.readInt())) + .face(p.readInt()) + .hair(p.readInt()) + .hairColor(p.readInt()) + .skin(p.readInt()) + .topItemId(p.readInt()) + .bottomItemId(p.readInt()) + .shoesItemId(p.readInt()) + .weaponItemId(p.readInt()) + .gender(p.readByte()) + .build(); + */ + int status; switch (job) { case 0: // Knights of Cygnus @@ -67,4 +83,13 @@ public final class CreateCharHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.deleteCharResponse(0, 9)); } } + + private static JobType parseJobType(int value) { + return switch (value) { + case 0 -> JobType.KNIGHT_OF_CYGNUS; + case 1 -> JobType.ADVENTURER; + case 2 -> JobType.ARAN; + default -> throw new IllegalArgumentException("Invalid job type: " + value); + }; + } }