From b266854c72276735cadf702af9ec71bddfda2d27 Mon Sep 17 00:00:00 2001
From: GanyusLeftHorn <1244229+GanyusLeftHorn@users.noreply.github.com>
Date: Mon, 18 Jul 2022 20:58:35 -0700
Subject: [PATCH] Handle existing players who might already have passed a
 level.

---
 src/main/java/emu/grasscutter/game/player/Player.java     | 6 +++++-
 .../grasscutter/game/player/PlayerOpenStateManager.java   | 8 +++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java
index 8f1d2ceb..d4be0f3a 100644
--- a/src/main/java/emu/grasscutter/game/player/Player.java
+++ b/src/main/java/emu/grasscutter/game/player/Player.java
@@ -463,7 +463,7 @@ public class Player {
 			this.updateProfile();
 
 			// Handle OpenState unlocks from level-up.
-			this.getOpenStateManager().onPlayerLevelUp();
+			this.getOpenStateManager().unlockLevelDependentStates();
 
 			return true;
 		}
@@ -1535,7 +1535,11 @@ public class Player {
 		this.forgingManager.sendForgeDataNotify();
 		this.resinManager.onPlayerLogin();
 		this.cookingManager.sendCookDataNofity();
+
+		// Unlock in case this is an existing user that reached a level before we implemented unlocking.
+		this.openStateManager.unlockLevelDependentStates();
         this.openStateManager.onPlayerLogin();
+
 		getTodayMoonCard(); // The timer works at 0:0, some users log in after that, use this method to check if they have received a reward today or not. If not, send the reward.
 
 		// Battle Pass trigger
diff --git a/src/main/java/emu/grasscutter/game/player/PlayerOpenStateManager.java b/src/main/java/emu/grasscutter/game/player/PlayerOpenStateManager.java
index ae569106..7d18f059 100644
--- a/src/main/java/emu/grasscutter/game/player/PlayerOpenStateManager.java
+++ b/src/main/java/emu/grasscutter/game/player/PlayerOpenStateManager.java
@@ -55,11 +55,9 @@ public class PlayerOpenStateManager {
     
     public void setOpenState(OpenState openState, Integer value) {
         Integer previousValue = this.map.getOrDefault(openState.getValue(),0);
-        if(!(value == previousValue)) {
+        if(value != previousValue) {
             this.map.put(openState.getValue(), value);
             player.getSession().send(new PacketOpenStateChangeNotify(openState.getValue(),value));
-        } else {
-            Grasscutter.getLogger().debug("Warning: OpenState {} is already set to {}!", openState, value);
         }
     }
 
@@ -73,9 +71,9 @@ public class PlayerOpenStateManager {
         player.getSession().send(new PacketOpenStateUpdateNotify(this));
     }
 
-    public void onPlayerLevelUp() {
+    public void unlockLevelDependentStates() {
         Stream.of(OpenState.values())
-            .filter(s -> s.getUnlockLevel() == this.player.getLevel())
+            .filter(s -> s.getUnlockLevel() > 1 && s.getUnlockLevel() <= this.player.getLevel())
             .forEach(s -> this.setOpenState(s, 1));
     }
 }
\ No newline at end of file
-- 
GitLab