From 08520493ed9f2dbe145985a54b2edeaa176b9e62 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:31:31 -0700 Subject: [PATCH] Handle record rename/delete/lock/favorite --- .../emu/nebula/game/tower/StarTowerBuild.java | 28 +++++++++- ...rTowerInstance.java => StarTowerGame.java} | 6 +-- .../nebula/game/tower/StarTowerManager.java | 53 ++++++++++++++----- .../HandlerStarTowerBuildDeleteReq.java | 35 ++++++++++++ .../HandlerStarTowerBuildLockUnlockReq.java | 30 +++++++++++ .../HandlerStarTowerBuildNameSetReq.java | 36 +++++++++++++ ...HandlerStarTowerBuildPreferenceSetReq.java | 43 +++++++++++++++ .../handlers/HandlerStarTowerInteractReq.java | 6 +-- 8 files changed, 217 insertions(+), 20 deletions(-) rename src/main/java/emu/nebula/game/tower/{StarTowerInstance.java => StarTowerGame.java} (98%) create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildDeleteReq.java create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildLockUnlockReq.java create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildNameSetReq.java create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildPreferenceSetReq.java diff --git a/src/main/java/emu/nebula/game/tower/StarTowerBuild.java b/src/main/java/emu/nebula/game/tower/StarTowerBuild.java index 8b06cb5..aa3a151 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerBuild.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerBuild.java @@ -3,6 +3,7 @@ package emu.nebula.game.tower; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Id; import dev.morphia.annotations.Indexed; +import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.database.GameDatabaseObject; import emu.nebula.proto.Public.ItemTpl; @@ -41,7 +42,7 @@ public class StarTowerBuild implements GameDatabaseObject { } - public StarTowerBuild(StarTowerInstance instance) { + public StarTowerBuild(StarTowerGame instance) { this.uid = Snowflake.newUid(); this.playerUid = instance.getPlayer().getUid(); this.name = ""; @@ -74,6 +75,25 @@ public class StarTowerBuild implements GameDatabaseObject { } } } + + public void setName(String newName) { + if (newName.length() > 32) { + newName = newName.substring(0, 31); + } + + this.name = newName; + Nebula.getGameDatabase().update(this, this.getUid(), "name", this.getName()); + } + + public void setLock(boolean state) { + this.lock = state; + Nebula.getGameDatabase().update(this, this.getUid(), "lock", this.isLock()); + } + + public void setPreference(boolean state) { + this.preference = state; + Nebula.getGameDatabase().update(this, this.getUid(), "preference", this.isPreference()); + } // Proto @@ -129,4 +149,10 @@ public class StarTowerBuild implements GameDatabaseObject { return proto; } + + // Database + + public void delete() { + Nebula.getGameDatabase().delete(this); + } } diff --git a/src/main/java/emu/nebula/game/tower/StarTowerInstance.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java similarity index 98% rename from src/main/java/emu/nebula/game/tower/StarTowerInstance.java rename to src/main/java/emu/nebula/game/tower/StarTowerGame.java index ea27262..80011b1 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerInstance.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -26,7 +26,7 @@ import lombok.SneakyThrows; @Getter @Entity(useDiscriminator = false) -public class StarTowerInstance { +public class StarTowerGame { private transient StarTowerManager manager; private transient StarTowerDef data; @@ -64,11 +64,11 @@ public class StarTowerInstance { private transient StarTowerBuild build; @Deprecated // Morphia only - public StarTowerInstance() { + public StarTowerGame() { } - public StarTowerInstance(StarTowerManager manager, StarTowerDef data, Formation formation, StarTowerApplyReq req) { + public StarTowerGame(StarTowerManager manager, StarTowerDef data, Formation formation, StarTowerApplyReq req) { this.manager = manager; this.data = data; diff --git a/src/main/java/emu/nebula/game/tower/StarTowerManager.java b/src/main/java/emu/nebula/game/tower/StarTowerManager.java index 070be76..73bbb7b 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerManager.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerManager.java @@ -6,10 +6,11 @@ import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.database.GameDatabaseObject; import emu.nebula.game.player.Player; +import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerManager; import emu.nebula.proto.StarTowerApply.StarTowerApplyReq; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import lombok.Getter; @Getter @@ -18,8 +19,13 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec @Id private int uid; - private transient Int2ObjectMap builds; - private transient StarTowerInstance instance; + // TODO add tower talents here + + // Tower game instance + private transient StarTowerGame game; + + // Tower builds + private transient Long2ObjectMap builds; private transient StarTowerBuild lastBuild; @Deprecated // Morphia only @@ -34,7 +40,7 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec this.save(); } - public Int2ObjectMap getBuilds() { + public Long2ObjectMap getBuilds() { if (this.builds == null) { this.loadFromDatabase(); } @@ -42,7 +48,11 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec return builds; } - public StarTowerInstance apply(StarTowerApplyReq req) { + public StarTowerBuild getBuildById(long id) { + return this.getBuilds().get(id); + } + + public StarTowerGame apply(StarTowerApplyReq req) { // Sanity checks var data = GameData.getStarTowerDataTable().get(req.getId()); if (data == null) { @@ -60,23 +70,23 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec return null; } - // Create instance - this.instance = new StarTowerInstance(this, data, formation, req); + // Create game + this.game = new StarTowerGame(this, data, formation, req); // Success - return this.instance; + return this.game; } - public StarTowerInstance giveUp() { + public StarTowerGame giveUp() { // Cache instance - var instance = this.instance; + var instance = this.game; if (instance != null) { // Set last build this.lastBuild = instance.getBuild(); // Clear instance - this.instance = null; + this.game = null; } return instance; @@ -112,10 +122,27 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec return true; } + // TODO give rewards to player + public PlayerChangeInfo deleteBuild(long buildId, PlayerChangeInfo changes) { + // Create change info + if (changes == null) { + changes = new PlayerChangeInfo(); + } + + // Get build + var build = this.getBuilds().remove(buildId); + + if (build != null) { + build.delete(); + } + + return changes; + } + // Database private void loadFromDatabase() { - this.builds = new Int2ObjectOpenHashMap<>(); + this.builds = new Long2ObjectOpenHashMap<>(); Nebula.getGameDatabase().getObjects(StarTowerBuild.class, "playerUid", getPlayerUid()).forEach(build -> { this.builds.put(build.getUid(), build); diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildDeleteReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildDeleteReq.java new file mode 100644 index 0000000..887569e --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildDeleteReq.java @@ -0,0 +1,35 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.StarTowerBuildDelete.StarTowerBuildDeleteReq; +import emu.nebula.proto.StarTowerBuildDelete.StarTowerBuildDeleteResp; +import emu.nebula.net.HandlerId; +import emu.nebula.game.player.PlayerChangeInfo; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.star_tower_build_delete_req) +public class HandlerStarTowerBuildDeleteReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = StarTowerBuildDeleteReq.parseFrom(message); + + // + var changes = new PlayerChangeInfo(); + + // Delete + for (var id : req.getBuildIds()) { + session.getPlayer().getStarTowerManager().deleteBuild(id, changes); + } + + // Build response + var rsp = StarTowerBuildDeleteResp.newInstance() + .setChange(changes.toProto()); + + // Encode packet + return this.encodeMsg(NetMsgId.star_tower_build_delete_succeed_ack, rsp); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildLockUnlockReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildLockUnlockReq.java new file mode 100644 index 0000000..b1c454d --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildLockUnlockReq.java @@ -0,0 +1,30 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.StarTowerBuildLockUnlock.StarTowerBuildLockUnlockReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.star_tower_build_lock_unlock_req) +public class HandlerStarTowerBuildLockUnlockReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = StarTowerBuildLockUnlockReq.parseFrom(message); + + // Get build + var build = session.getPlayer().getStarTowerManager().getBuildById(req.getBuildId()); + + if (build == null) { + return this.encodeMsg(NetMsgId.star_tower_build_lock_unlock_failed_ack); + } + + build.setLock(req.getLock()); + + // Encode packet + return this.encodeMsg(NetMsgId.star_tower_build_lock_unlock_succeed_ack); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildNameSetReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildNameSetReq.java new file mode 100644 index 0000000..40386e5 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildNameSetReq.java @@ -0,0 +1,36 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.StarTowerBuildNameSet.StarTowerBuildNameSetReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.star_tower_build_name_set_req) +public class HandlerStarTowerBuildNameSetReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = StarTowerBuildNameSetReq.parseFrom(message); + + // Sanity + if (req.getName() == null || req.getName().isEmpty()) { + return this.encodeMsg(NetMsgId.star_tower_build_name_set_failed_ack); + } + + // Get build + var build = session.getPlayer().getStarTowerManager().getBuildById(req.getBuildId()); + + if (build == null) { + return this.encodeMsg(NetMsgId.star_tower_build_name_set_failed_ack); + } + + // Set name + build.setName(req.getName()); + + // Encode packet + return this.encodeMsg(NetMsgId.star_tower_build_name_set_succeed_ack); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildPreferenceSetReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildPreferenceSetReq.java new file mode 100644 index 0000000..f80135c --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildPreferenceSetReq.java @@ -0,0 +1,43 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.StarTowerBuildPreferenceSet.StarTowerBuildPreferenceSetReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.star_tower_build_preference_set_req) +public class HandlerStarTowerBuildPreferenceSetReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = StarTowerBuildPreferenceSetReq.parseFrom(message); + + for (long id : req.getCheckInIds()) { + // Get build + var build = session.getPlayer().getStarTowerManager().getBuildById(id); + + if (build == null) { + continue; + } + + build.setPreference(true); + } + + for (long id : req.getCheckOutIds()) { + // Get build + var build = session.getPlayer().getStarTowerManager().getBuildById(id); + + if (build == null) { + continue; + } + + build.setPreference(false); + } + + // Encode packet + return this.encodeMsg(NetMsgId.star_tower_build_preference_set_succeed_ack); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerInteractReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerInteractReq.java index fa2cd69..763d1d8 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerInteractReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerInteractReq.java @@ -12,9 +12,9 @@ public class HandlerStarTowerInteractReq extends NetHandler { @Override public byte[] handle(GameSession session, byte[] message) throws Exception { // Get star tower instance - var instance = session.getPlayer().getStarTowerManager().getInstance(); + var game = session.getPlayer().getStarTowerManager().getGame(); - if (instance == null) { + if (game == null) { return this.encodeMsg(NetMsgId.star_tower_interact_failed_ack); } @@ -22,7 +22,7 @@ public class HandlerStarTowerInteractReq extends NetHandler { var req = StarTowerInteractReq.parseFrom(message); // Handle interaction - var rsp = instance.handleInteract(req); + var rsp = game.handleInteract(req); // Template return this.encodeMsg(NetMsgId.star_tower_interact_succeed_ack, rsp);