105 lines
3.4 KiB
Java
105 lines
3.4 KiB
Java
package client.creator;
|
|
|
|
import client.CharacterStats;
|
|
import client.Job;
|
|
import client.inventory.Item;
|
|
import constants.id.ItemId;
|
|
import constants.id.MapId;
|
|
import database.PgDatabaseConnection;
|
|
import database.character.CharacterRepository;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@Slf4j
|
|
public class CharacterCreator {
|
|
private final PgDatabaseConnection connection;
|
|
private final CharacterRepository chrRepository;
|
|
|
|
public CharacterCreator(PgDatabaseConnection connection, CharacterRepository chrRepository) {
|
|
this.connection = connection;
|
|
this.chrRepository = chrRepository;
|
|
}
|
|
|
|
public boolean createNew(NewCharacterSpec spec, int accountId, int worldId) {
|
|
CharacterStats stats = getStarterStats(spec, accountId, worldId);
|
|
|
|
try {
|
|
connection.getHandle().useTransaction(h -> {
|
|
chrRepository.insert(h, stats);
|
|
});
|
|
} catch (Exception e) {
|
|
log.warn("Failed to create new character in PG", e);
|
|
}
|
|
Item guide = getStarterGuide(spec.type());
|
|
// TODO, save:
|
|
// - character
|
|
// - skills
|
|
// - equips
|
|
// - starter item
|
|
// - keymap
|
|
// - quickslots
|
|
return false;
|
|
}
|
|
|
|
private CharacterStats getStarterStats(NewCharacterSpec spec, int accountId, int worldId) {
|
|
return CharacterStats.builder()
|
|
.account(accountId)
|
|
.world(worldId)
|
|
.name(spec.name())
|
|
.job(getJob(spec.type()).getId())
|
|
.gender(spec.gender())
|
|
.skin(spec.skin().getId())
|
|
.hair(spec.hair() + spec.hairColor())
|
|
.face(spec.face())
|
|
.mapId(getStartingMap(spec.type()))
|
|
.spawnPortal(0)
|
|
.level(StarterStats.LEVEL)
|
|
.exp(0)
|
|
.str(StarterStats.STR)
|
|
.dex(StarterStats.DEX)
|
|
.int_(StarterStats.INT)
|
|
.luk(StarterStats.LUK)
|
|
.maxHp(StarterStats.HP)
|
|
.hp(StarterStats.HP)
|
|
.maxMp(StarterStats.MP)
|
|
.mp(StarterStats.MP)
|
|
.fame(0)
|
|
.ap(0)
|
|
.sp(0)
|
|
.buddyCapacity(StarterStats.BUDDY_CAPACITY)
|
|
.equipSlots(StarterStats.INVENTORY_SLOTS)
|
|
.useSlots(StarterStats.INVENTORY_SLOTS)
|
|
.setupSlots(StarterStats.INVENTORY_SLOTS)
|
|
.etcSlots(StarterStats.INVENTORY_SLOTS)
|
|
.gmLevel(StarterStats.GM_LEVEL)
|
|
.gachaExp(0)
|
|
.hpMpApUsed(0)
|
|
.party(null)
|
|
.build();
|
|
}
|
|
|
|
private Job getJob(JobType type) {
|
|
return switch (type) {
|
|
case ADVENTURER -> Job.BEGINNER;
|
|
case KNIGHT_OF_CYGNUS -> Job.NOBLESSE;
|
|
case ARAN -> Job.LEGEND;
|
|
};
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|