diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 4bd1585..c857ca8 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -132,6 +132,7 @@ public class GameData { // ===== Infinity Tower ===== @Getter private static DataTable InfinityTowerLevelDataTable = new DataTable<>(); + @Getter private static DataTable InfinityTowerDifficultyDataTable = new DataTable<>(); // ===== Vampire Survivor ===== @Getter private static DataTable VampireSurvivorDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/InfinityTowerDifficultyDef.java b/src/main/java/emu/nebula/data/resources/InfinityTowerDifficultyDef.java new file mode 100644 index 0000000..00ec60f --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/InfinityTowerDifficultyDef.java @@ -0,0 +1,19 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; + +import lombok.Getter; + +@Getter +@ResourceType(name = "InfinityTowerDifficulty.json") +public class InfinityTowerDifficultyDef extends BaseDef { + private int Id; + private int TowerId; + + @Override + public int getId() { + return Id; + } + +} diff --git a/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java b/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java index b2af36e..e1f97b0 100644 --- a/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java +++ b/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import emu.nebula.data.BaseDef; +import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.game.inventory.ItemParamMap; import emu.nebula.game.inventory.ItemRewardParam; @@ -25,8 +26,13 @@ public class InfinityTowerLevelDef extends BaseDef { return Id; } - public int getEnergyConsume() { - return 0; + public int getTowerId() { + var diff = GameData.getInfinityTowerDifficultyDataTable().get(this.DifficultyId); + if (diff == null) { + return 0; + } + + return diff.getTowerId(); } public ItemParamMap generateRewards() { diff --git a/src/main/java/emu/nebula/game/infinitytower/InfinityTowerManager.java b/src/main/java/emu/nebula/game/infinitytower/InfinityTowerManager.java index b10ac97..88329e2 100644 --- a/src/main/java/emu/nebula/game/infinitytower/InfinityTowerManager.java +++ b/src/main/java/emu/nebula/game/infinitytower/InfinityTowerManager.java @@ -6,7 +6,7 @@ import emu.nebula.game.achievement.AchievementCondition; import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerManager; - +import emu.nebula.game.player.PlayerProgress; import lombok.Getter; @Getter @@ -18,6 +18,10 @@ public class InfinityTowerManager extends PlayerManager { public InfinityTowerManager(Player player) { super(player); } + + private PlayerProgress getProgress() { + return this.getPlayer().getProgress(); + } public int getBountyLevel() { return 0; @@ -59,7 +63,8 @@ public class InfinityTowerManager extends PlayerManager { } // Check logs if the player has completed the level already - if (this.getPlayer().getProgress().getInfinityArenaLog().containsKey(this.getLevelId())) { + int highestLevel = this.getProgress().getInfinityTowerLog().get(this.getLevelData().getTowerId()); + if (highestLevel >= this.getLevelId()) { return change; } @@ -73,7 +78,7 @@ public class InfinityTowerManager extends PlayerManager { change.setExtraData(rewards); // Log in player progress - this.getPlayer().getProgress().addInfinityArenaLog(this.getLevelId()); + this.getPlayer().getProgress().addInfinityTowerLog(this.getLevelData()); // Trigger achievement this.getPlayer().trigger(AchievementCondition.InfinityTowerClearSpecificFloor, 10, this.getLevelId(), 0); diff --git a/src/main/java/emu/nebula/game/player/PlayerProgress.java b/src/main/java/emu/nebula/game/player/PlayerProgress.java index 1408725..3e9b31b 100644 --- a/src/main/java/emu/nebula/game/player/PlayerProgress.java +++ b/src/main/java/emu/nebula/game/player/PlayerProgress.java @@ -8,6 +8,7 @@ import dev.morphia.annotations.Id; import dev.morphia.annotations.PostLoad; import emu.nebula.Nebula; import emu.nebula.data.GameData; +import emu.nebula.data.resources.InfinityTowerLevelDef; import emu.nebula.database.GameDatabaseObject; import emu.nebula.game.tutorial.TutorialLevelLog; import emu.nebula.game.vampire.VampireSurvivorLog; @@ -44,7 +45,8 @@ public class PlayerProgress extends PlayerManager implements GameDatabaseObject private Int2IntMap weekBossLog; // Infinite Arena - private Int2IntMap infinityArenaLog; + private Int2IntMap infinityTowerLog; + @Deprecated private Int2IntMap infinityArenaLog; // Vampire Survivors private Map vampireLog; @@ -76,8 +78,8 @@ public class PlayerProgress extends PlayerManager implements GameDatabaseObject this.charGemLog = new Int2IntOpenHashMap(); this.weekBossLog = new Int2IntOpenHashMap(); - // Infinity Arena - this.infinityArenaLog = new Int2IntOpenHashMap(); + // Infinity Tower + this.infinityTowerLog = new Int2IntOpenHashMap(); // Vampire Survivor this.vampireLog = new HashMap<>(); @@ -156,17 +158,22 @@ public class PlayerProgress extends PlayerManager implements GameDatabaseObject Nebula.getGameDatabase().update(this, this.getUid(), "towerTickets", this.towerTickets); } - public void addInfinityArenaLog(int levelId) { - // Calculate arena id - int id = (int) Math.floor(levelId / 10000D); + public void addInfinityTowerLog(InfinityTowerLevelDef level) { + // Calculate tower id + int towerId = level.getTowerId(); + int levelId = level.getId(); + + if (towerId <= 0) { + return; + } // Check highest clear - int highestClearId = this.getInfinityArenaLog().get(id); + int highestClearId = this.getInfinityTowerLog().get(towerId); // Add & Save to database if (levelId > highestClearId) { - this.getInfinityArenaLog().put(id, levelId); - Nebula.getGameDatabase().update(this, this.getUid(), "infinityArenaLog." + id, levelId); + this.getInfinityTowerLog().put(towerId, levelId); + Nebula.getGameDatabase().update(this, this.getUid(), "infinityArenaLog." + towerId, levelId); } } @@ -295,8 +302,43 @@ public class PlayerProgress extends PlayerManager implements GameDatabaseObject @PostLoad public void postLoad() { + boolean shouldSave = false; + + // Fix missing star tower growth if (this.starTowerGrowth == null) { this.starTowerGrowth = new int[1]; + shouldSave = true; + } + + // Fix missing infinity tower log + if (this.infinityTowerLog == null) { + this.infinityTowerLog = new Int2IntOpenHashMap(); + shouldSave = true; + } + + // Carry over infinity tower progress + if (this.infinityArenaLog != null) { + for (int levelId : this.infinityArenaLog.values()) { + var data = GameData.getInfinityTowerLevelDataTable().get(levelId); + if (data == null) { + continue; + } + + int towerId = data.getTowerId(); + + if (towerId > 0) { + this.infinityTowerLog.put(data.getTowerId(), levelId); + } + } + + // Clear old infinity tower logs when done + this.infinityArenaLog = null; + shouldSave = true; + } + + // Update in database if anything changed + if (shouldSave) { + this.save(); } } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerInfinityTowerInfoReq.java b/src/main/java/emu/nebula/server/handlers/HandlerInfinityTowerInfoReq.java index 2706655..04392b6 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerInfinityTowerInfoReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerInfinityTowerInfoReq.java @@ -17,7 +17,7 @@ public class HandlerInfinityTowerInfoReq extends NetHandler { .setBountyLevel(session.getPlayer().getInfinityTowerManager().getBountyLevel()); // Get infinite arena log from player progress - for (var entry : session.getPlayer().getProgress().getInfinityArenaLog().int2IntEntrySet()) { + for (var entry : session.getPlayer().getProgress().getInfinityTowerLog().int2IntEntrySet()) { var info = InfinityTowerLevelInfo.newInstance() .setId(entry.getIntKey()) .setLevelId(entry.getIntValue());