diff --git a/src/main/java/emu/nebula/Nebula.java b/src/main/java/emu/nebula/Nebula.java index 4eb0061..127fada 100644 --- a/src/main/java/emu/nebula/Nebula.java +++ b/src/main/java/emu/nebula/Nebula.java @@ -227,7 +227,7 @@ public class Nebula { /** * Returns the current server time in seconds */ - public static long getCurrentTime() { + public static long getCurrentServerTime() { return System.currentTimeMillis() / 1000; } diff --git a/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java b/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java index 4f08530..95ae72c 100644 --- a/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java +++ b/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java @@ -2,6 +2,7 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; +import emu.nebula.util.Utils; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import lombok.Getter; @@ -9,10 +10,21 @@ import lombok.Getter; @ResourceType(name = "ScoreBossControl.json") public class ScoreBossControlDef extends BaseDef { private int Id; + private String StartTime; + private String EndTime; private IntOpenHashSet LevelGroup; + private transient long startDate; + private transient long endDate; + @Override public int getId() { return Id; } + + @Override + public void onLoad() { + this.startDate = Utils.dateToMilliseconds(this.StartTime) / 1000; + this.endDate = Utils.dateToMilliseconds(this.EndTime) / 1000; + } } diff --git a/src/main/java/emu/nebula/game/GameContext.java b/src/main/java/emu/nebula/game/GameContext.java index 0e6e143..735d2cc 100644 --- a/src/main/java/emu/nebula/game/GameContext.java +++ b/src/main/java/emu/nebula/game/GameContext.java @@ -119,6 +119,9 @@ public class GameContext implements Runnable { this.epochWeeks = Utils.getWeeks(this.epochDays); this.epochMonths = Utils.getMonths(this.epochDays); + // Update score boss season + this.getScoreBossModule().updateSeason(); + // Reset dailies for players this.resetDailies(); } diff --git a/src/main/java/emu/nebula/game/achievement/GameAchievement.java b/src/main/java/emu/nebula/game/achievement/GameAchievement.java index 1bb62a1..b19e912 100644 --- a/src/main/java/emu/nebula/game/achievement/GameAchievement.java +++ b/src/main/java/emu/nebula/game/achievement/GameAchievement.java @@ -92,7 +92,7 @@ public class GameAchievement { // Check if completed if (this.getCurProgress() >= this.getMaxProgress()) { this.curProgress = this.getMaxProgress(); - this.completed = Nebula.getCurrentTime(); + this.completed = Nebula.getCurrentServerTime(); return true; } diff --git a/src/main/java/emu/nebula/game/agent/Agent.java b/src/main/java/emu/nebula/game/agent/Agent.java index 564ba32..f345dd7 100644 --- a/src/main/java/emu/nebula/game/agent/Agent.java +++ b/src/main/java/emu/nebula/game/agent/Agent.java @@ -23,7 +23,7 @@ public class Agent { public Agent(AgentDef data, int duration, int[] charIds) { this.id = data.getId(); - this.start = Nebula.getCurrentTime(); + this.start = Nebula.getCurrentServerTime(); this.duration = duration; this.charIds = charIds; diff --git a/src/main/java/emu/nebula/game/character/CharacterContact.java b/src/main/java/emu/nebula/game/character/CharacterContact.java index 736a02e..a34f994 100644 --- a/src/main/java/emu/nebula/game/character/CharacterContact.java +++ b/src/main/java/emu/nebula/game/character/CharacterContact.java @@ -109,7 +109,7 @@ public class CharacterContact { chat.report(process, options, end); // Set trigger time - this.triggerTime = Nebula.getCurrentTime(); + this.triggerTime = Nebula.getCurrentServerTime(); // Add next chat this.addNextChat(); diff --git a/src/main/java/emu/nebula/game/character/GameCharacter.java b/src/main/java/emu/nebula/game/character/GameCharacter.java index a110982..d4058d4 100644 --- a/src/main/java/emu/nebula/game/character/GameCharacter.java +++ b/src/main/java/emu/nebula/game/character/GameCharacter.java @@ -92,7 +92,7 @@ public class GameCharacter implements GameDatabaseObject { this.talents = new Bitset(); this.gemPresets = new ArrayList<>(); this.gemSlots = new CharacterGemSlot[GameConstants.CHARACTER_MAX_GEM_SLOTS]; - this.createTime = Nebula.getCurrentTime(); + this.createTime = Nebula.getCurrentServerTime(); this.contact = new CharacterContact(this); } diff --git a/src/main/java/emu/nebula/game/character/GameDisc.java b/src/main/java/emu/nebula/game/character/GameDisc.java index 7b895b0..ad5b246 100644 --- a/src/main/java/emu/nebula/game/character/GameDisc.java +++ b/src/main/java/emu/nebula/game/character/GameDisc.java @@ -58,7 +58,7 @@ public class GameDisc implements GameDatabaseObject { this.data = data; this.discId = data.getId(); this.level = 1; - this.createTime = Nebula.getCurrentTime(); + this.createTime = Nebula.getCurrentServerTime(); } public void setPlayer(Player player) { diff --git a/src/main/java/emu/nebula/game/gacha/GachaHistoryLog.java b/src/main/java/emu/nebula/game/gacha/GachaHistoryLog.java index c365cbe..4268ea1 100644 --- a/src/main/java/emu/nebula/game/gacha/GachaHistoryLog.java +++ b/src/main/java/emu/nebula/game/gacha/GachaHistoryLog.java @@ -22,7 +22,7 @@ public class GachaHistoryLog { public GachaHistoryLog(int type, int gachaId, IntList results) { this.type = type; this.gid = gachaId; - this.time = Nebula.getCurrentTime(); + this.time = Nebula.getCurrentServerTime(); this.ids = results; } diff --git a/src/main/java/emu/nebula/game/mail/GameMail.java b/src/main/java/emu/nebula/game/mail/GameMail.java index 128a8b9..a9fb588 100644 --- a/src/main/java/emu/nebula/game/mail/GameMail.java +++ b/src/main/java/emu/nebula/game/mail/GameMail.java @@ -37,7 +37,7 @@ public class GameMail { this.author = author; this.subject = subject; this.desc = desc; - this.time = Nebula.getCurrentTime(); + this.time = Nebula.getCurrentServerTime(); this.expiry = this.time + TimeUnit.DAYS.toSeconds(30); } diff --git a/src/main/java/emu/nebula/game/player/Player.java b/src/main/java/emu/nebula/game/player/Player.java index 8d081d0..ccb889c 100644 --- a/src/main/java/emu/nebula/game/player/Player.java +++ b/src/main/java/emu/nebula/game/player/Player.java @@ -146,7 +146,7 @@ public class Player implements GameDatabaseObject { // Set basic info this.accountUid = account.getUid(); - this.createTime = Nebula.getCurrentTime(); + this.createTime = Nebula.getCurrentServerTime(); this.name = name; this.signature = ""; @@ -532,7 +532,7 @@ public class Player implements GameDatabaseObject { public int getEnergy() { // Cache time - long time = Nebula.getCurrentTime(); + long time = Nebula.getCurrentServerTime(); // Calculate time diff double diff = time - this.energyLastUpdate; @@ -819,7 +819,7 @@ public class Player implements GameDatabaseObject { public PlayerInfo toProto() { PlayerInfo proto = PlayerInfo.newInstance() - .setServerTs(Nebula.getCurrentTime()) + .setServerTs(Nebula.getCurrentServerTime()) .setSigninIndex(this.getSignInIndex()) .setTowerTicket(this.getProgress().getTowerTickets()) .setDailyShopRewardStatus(this.getQuestManager().hasDailyReward()) @@ -1023,7 +1023,7 @@ public class Player implements GameDatabaseObject { } public Energy getEnergyProto() { - long nextDuration = Math.max(GameConstants.ENERGY_REGEN_TIME - (Nebula.getCurrentTime() - getEnergyLastUpdate()), 1); + long nextDuration = Math.max(GameConstants.ENERGY_REGEN_TIME - (Nebula.getCurrentServerTime() - getEnergyLastUpdate()), 1); var proto = Energy.newInstance() .setUpdateTime(this.getEnergyLastUpdate()) diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossModule.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossModule.java index d9ebfe2..a0e07bc 100644 --- a/src/main/java/emu/nebula/game/scoreboss/ScoreBossModule.java +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossModule.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import emu.nebula.Nebula; +import emu.nebula.data.GameData; import emu.nebula.game.GameContext; import emu.nebula.game.GameContextModule; import emu.nebula.proto.ScoreBossRank.ScoreBossRankData; @@ -11,6 +12,8 @@ import lombok.Getter; @Getter public class ScoreBossModule extends GameContextModule { + private int seasonId; + private long lastUpdate; private long nextUpdate; private List ranking; @@ -21,9 +24,25 @@ public class ScoreBossModule extends GameContextModule { this.ranking = new ArrayList<>(); } - // TODO calculate from bin data public int getControlId() { - return 2; + return this.seasonId; + } + + public void updateSeason() { + int season = 1; + long time = Nebula.getCurrentServerTime(); + + for (var data : GameData.getScoreBossControlDataTable()) { + if (data.getId() <= season) { + continue; + } + + if (time >= data.getStartDate()) { + season = data.getId(); + } + } + + this.seasonId = season; } private long getRefreshTime() { @@ -56,6 +75,6 @@ public class ScoreBossModule extends GameContextModule { } this.nextUpdate = System.currentTimeMillis() + this.getRefreshTime(); - this.lastUpdate = Nebula.getCurrentTime(); + this.lastUpdate = Nebula.getCurrentServerTime(); } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerGachaSpinReq.java b/src/main/java/emu/nebula/server/handlers/HandlerGachaSpinReq.java index 4a7bb4c..8aa9704 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerGachaSpinReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerGachaSpinReq.java @@ -31,7 +31,7 @@ public class HandlerGachaSpinReq extends NetHandler { // Build response var rsp = GachaSpinResp.newInstance() - .setTime(Nebula.getCurrentTime()) + .setTime(Nebula.getCurrentServerTime()) .setAMissTimes(result.getInfo().getMissTimesA()) .setAupMissTimes(result.getInfo().getMissTimesA()) .setTotalTimes(result.getInfo().getTotal()) diff --git a/src/main/java/emu/nebula/server/handlers/HandlerIkeReq.java b/src/main/java/emu/nebula/server/handlers/HandlerIkeReq.java index 24949a1..a892635 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerIkeReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerIkeReq.java @@ -44,7 +44,7 @@ public class HandlerIkeReq extends NetHandler { var rsp = IKEResp.newInstance() .setToken(session.getToken()) .setCipher(session.getEncryptMethod()) - .setServerTs(Nebula.getCurrentTime()) + .setServerTs(Nebula.getCurrentServerTime()) .setPubKey(session.getServerPublicKey()); /* diff --git a/src/main/java/emu/nebula/server/handlers/HandlerMallShopListReq.java b/src/main/java/emu/nebula/server/handlers/HandlerMallShopListReq.java index 8169bc4..1b16f8e 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerMallShopListReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerMallShopListReq.java @@ -19,7 +19,7 @@ public class HandlerMallShopListReq extends NetHandler { public byte[] handle(GameSession session, byte[] message) throws Exception { var rsp = MallShopProductList.newInstance(); - long refreshTime = Nebula.getCurrentTime() + TimeUnit.DAYS.toSeconds(30); + long refreshTime = Nebula.getCurrentServerTime() + TimeUnit.DAYS.toSeconds(30); for (var data : GameData.getMallShopDataTable()) { if (data.getStock() <= 0) { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerPlayerPingReq.java b/src/main/java/emu/nebula/server/handlers/HandlerPlayerPingReq.java index cd0eea2..98c5577 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerPlayerPingReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerPlayerPingReq.java @@ -14,7 +14,7 @@ public class HandlerPlayerPingReq extends NetHandler { public byte[] handle(GameSession session, byte[] message) throws Exception { // Create response var rsp = Pong.newInstance() - .setServerTs(Nebula.getCurrentTime()); + .setServerTs(Nebula.getCurrentServerTime()); return session.encodeMsg(NetMsgId.player_ping_succeed_ack, rsp); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java index cb64b16..d92bd31 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java @@ -14,7 +14,7 @@ public class HandlerScoreBossRankReq extends NetHandler { public byte[] handle(GameSession session, byte[] message) throws Exception { // Build response var rsp = ScoreBossRankInfo.newInstance() - .setLastRefreshTime(Nebula.getCurrentTime()); + .setLastRefreshTime(Nebula.getCurrentServerTime()); // Get self var self = session.getPlayer().getScoreBossManager().getRankEntry(); diff --git a/src/main/java/emu/nebula/util/Utils.java b/src/main/java/emu/nebula/util/Utils.java index 25a4934..8c5382f 100644 --- a/src/main/java/emu/nebula/util/Utils.java +++ b/src/main/java/emu/nebula/util/Utils.java @@ -6,6 +6,7 @@ import java.net.InetSocketAddress; import java.net.ServerSocket; import java.time.Instant; import java.time.LocalDate; +import java.time.OffsetDateTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -88,10 +89,6 @@ public class Utils { return new File(path).mkdirs(); } - public static long getCurrentSeconds() { - return Math.floorDiv(System.currentTimeMillis(), 1000); - } - public static int getMinAdvanceForLevel(int level) { return Math.max(Math.min((int) ((level - 1) / 10D), 8), 0); } @@ -336,4 +333,9 @@ public class Utils { .atZone(GameConstants.UTC_ZONE) .format(DateTimeFormatter.ofPattern(pattern)); } + + public static long dateToMilliseconds(String dateString) { + var offsetDateTime = OffsetDateTime.parse(dateString, DateTimeFormatter.ISO_OFFSET_DATE_TIME); + return offsetDateTime.toInstant().toEpochMilli(); + } }