From efa69c007d6eb9d12a9b9d31554a8a04d0ee59bd Mon Sep 17 00:00:00 2001 From: AnimeGitB <AnimeGitB@bigblueball.in> Date: Tue, 16 Aug 2022 14:25:02 +0930 Subject: [PATCH] Change unlocked scenes from lists to sets --- .../command/commands/SetPropCommand.java | 22 ++++++------- .../emu/grasscutter/game/player/Player.java | 21 +++++++----- .../game/player/PlayerProgressManager.java | 32 +++---------------- .../packet/send/PacketGetSceneAreaRsp.java | 4 +-- .../packet/send/PacketGetScenePointRsp.java | 4 +-- .../send/PacketSceneAreaUnlockNotify.java | 4 +-- .../send/PacketScenePointUnlockNotify.java | 4 +-- 7 files changed, 31 insertions(+), 60 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SetPropCommand.java b/src/main/java/emu/grasscutter/command/commands/SetPropCommand.java index 078cb097..cefb25c5 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetPropCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetPropCommand.java @@ -1,6 +1,5 @@ package emu.grasscutter.command.commands; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -231,25 +230,22 @@ public final class SetPropCommand implements CommandHandler { return true; } + // List of map areas. Unfortunately, there is no readily available source for them in excels or bins. + final static private List<Integer> sceneAreas = List.of(1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20,21,22,23,24,25,29,100,101,102,103,200,210,300,400,401,402,403); private boolean unlockMap(Player targetPlayer) { // Unlock. - targetPlayer.setUnlockedScenePoints(new HashMap<>()); - targetPlayer.setUnlockedSceneAreas(new HashMap<>()); - for (int sceneId : GameData.getScenePointsPerScene().keySet()) { + GameData.getScenePointsPerScene().forEach((sceneId, scenePoints) -> { // Unlock trans points. - targetPlayer.getUnlockedScenePoints().put(sceneId, new ArrayList<>()); - targetPlayer.getUnlockedScenePoints().get(sceneId).addAll(GameData.getScenePointsPerScene().get(sceneId)); + targetPlayer.getUnlockedScenePoints(sceneId).addAll(scenePoints); - // Unlock map areas. Unfortunately, there is no readily available source for them in excels or bins. - targetPlayer.getUnlockedSceneAreas().put(sceneId, new ArrayList<>()); - targetPlayer.getUnlockedSceneAreas().get(sceneId).addAll(List.of(1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20,21,22,23,24,25,29,100,101,102,103,200,210,300,400,401,402,403)); - } + // Unlock map areas. + targetPlayer.getUnlockedSceneAreas(sceneId).addAll(sceneAreas); + }); // Send notify. int playerScene = targetPlayer.getSceneId(); - targetPlayer.sendPacket(new PacketScenePointUnlockNotify(playerScene, targetPlayer.getUnlockedScenePoints().get(playerScene))); - targetPlayer.sendPacket(new PacketSceneAreaUnlockNotify(playerScene, targetPlayer.getUnlockedSceneAreas().get(playerScene))); - + targetPlayer.sendPacket(new PacketScenePointUnlockNotify(playerScene, targetPlayer.getUnlockedScenePoints(playerScene))); + targetPlayer.sendPacket(new PacketSceneAreaUnlockNotify(playerScene, targetPlayer.getUnlockedSceneAreas(playerScene))); return true; } } diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index 03d5abb7..8cfb0b36 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -80,6 +80,7 @@ import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.util.*; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.LinkedBlockingQueue; @Entity(value = "players", useDiscriminator = false) @@ -111,7 +112,7 @@ public class Player { @Getter private Set<Integer> nameCardList; @Getter private Set<Integer> flyCloakList; @Getter private Set<Integer> costumeList; - @Getter private Set<Integer> rewardedLevels; + @Getter @Setter private Set<Integer> rewardedLevels; @Getter @Setter private Set<Integer> realmList; @Getter private Set<Integer> unlockedForgingBlueprints; @Getter private Set<Integer> unlockedCombines; @@ -120,10 +121,10 @@ public class Player { @Getter private Map<Long, ExpeditionInfo> expeditionInfo; @Getter private Map<Integer, Integer> unlockedRecipies; @Getter private List<ActiveForgeData> activeForges; - @Getter private Map<Integer,Integer> questGlobalVariables; + @Getter private Map<Integer, Integer> questGlobalVariables; @Getter private Map<Integer, Integer> openStates; - @Getter @Setter private Map<Integer, List<Integer>> unlockedSceneAreas; - @Getter @Setter private Map<Integer, List<Integer>> unlockedScenePoints; + @Getter @Setter private Map<Integer, Set<Integer>> unlockedSceneAreas; + @Getter @Setter private Map<Integer, Set<Integer>> unlockedScenePoints; @Transient private long nextGuid = 0; @Transient @Getter @Setter private int peerId; @@ -388,6 +389,14 @@ public class Player { return expeditionLimit; } + public Set<Integer> getUnlockedSceneAreas(int sceneId) { + return this.unlockedSceneAreas.computeIfAbsent(sceneId, i -> new CopyOnWriteArraySet<>()); + } + + public Set<Integer> getUnlockedScenePoints(int sceneId) { + return this.unlockedScenePoints.computeIfAbsent(sceneId, i -> new CopyOnWriteArraySet<>()); + } + public int getLevel() { return this.getProperty(PlayerProperty.PROP_PLAYER_LEVEL); } @@ -881,10 +890,6 @@ public class Player { return this.birthday.getDay() > 0; } - public void setRewardedLevels(Set<Integer> rewardedLevels) { - this.rewardedLevels = rewardedLevels; - } - public SocialDetail.Builder getSocialDetail() { List<SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo> socialShowAvatarInfoList = new ArrayList<>(); if (this.isOnline()) { diff --git a/src/main/java/emu/grasscutter/game/player/PlayerProgressManager.java b/src/main/java/emu/grasscutter/game/player/PlayerProgressManager.java index 9b6dbce5..1ad67800 100644 --- a/src/main/java/emu/grasscutter/game/player/PlayerProgressManager.java +++ b/src/main/java/emu/grasscutter/game/player/PlayerProgressManager.java @@ -44,19 +44,8 @@ public class PlayerProgressManager extends BasePlayerDataManager { // Auto-unlock the first statue and map area, until we figure out how to make // that particular statue interactable. - if (!this.player.getUnlockedScenePoints().containsKey(3)) { - this.player.getUnlockedScenePoints().put(3, new ArrayList<>()); - } - if (!this.player.getUnlockedScenePoints().get(3).contains(7)) { - this.player.getUnlockedScenePoints().get(3).add(7); - } - - if (!this.player.getUnlockedSceneAreas().containsKey(3)) { - this.player.getUnlockedSceneAreas().put(3, new ArrayList<>()); - } - if (!this.player.getUnlockedSceneAreas().get(3).contains(1)) { - this.player.getUnlockedSceneAreas().get(3).add(1); - } + this.player.getUnlockedScenePoints(3).add(7); + this.player.getUnlockedSceneAreas(3).add(1); } /****************************************************************************************************************** @@ -211,16 +200,13 @@ public class PlayerProgressManager extends BasePlayerDataManager { String key = sceneId + "_" + pointId; ScenePointEntry scenePointEntry = GameData.getScenePointEntries().get(key); - if (scenePointEntry == null || this.player.getUnlockedScenePoints().getOrDefault(sceneId, List.of()).contains(pointId)) { + if (scenePointEntry == null || this.player.getUnlockedScenePoints(sceneId).contains(pointId)) { this.player.sendPacket(new PacketUnlockTransPointRsp(Retcode.RET_FAIL)); return; } // Add the point to the list of unlocked points for its scene. - if (!this.player.getUnlockedScenePoints().containsKey(sceneId)) { - this.player.getUnlockedScenePoints().put(sceneId, new ArrayList<>()); - } - this.player.getUnlockedScenePoints().get(sceneId).add(pointId); + this.player.getUnlockedScenePoints(sceneId).add(pointId); // Give primogems and Adventure EXP for unlocking. var primos = new GameItem(GameData.getItemDataMap().get(201), 5); @@ -240,16 +226,8 @@ public class PlayerProgressManager extends BasePlayerDataManager { } public void unlockSceneArea(int sceneId, int areaId) { - // Check whether this area is already unlocked. - if (this.player.getUnlockedSceneAreas().getOrDefault(sceneId, List.of()).contains(areaId)) { - return; - } - // Add the area to the list of unlocked areas in its scene. - if (!this.player.getUnlockedSceneAreas().containsKey(sceneId)) { - this.player.getUnlockedSceneAreas().put(sceneId, new ArrayList<>()); - } - this.player.getUnlockedSceneAreas().get(sceneId).add(areaId); + this.player.getUnlockedSceneAreas(sceneId).add(areaId); // Send packet. this.player.sendPacket(new PacketSceneAreaUnlockNotify(sceneId, areaId)); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetSceneAreaRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetSceneAreaRsp.java index 77750bbb..2760a9f0 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetSceneAreaRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetSceneAreaRsp.java @@ -1,7 +1,5 @@ package emu.grasscutter.server.packet.send; -import java.util.List; - import emu.grasscutter.game.player.Player; import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; @@ -17,7 +15,7 @@ public class PacketGetSceneAreaRsp extends BasePacket { GetSceneAreaRsp p = GetSceneAreaRsp.newBuilder() .setSceneId(sceneId) - .addAllAreaIdList(player.getUnlockedSceneAreas().getOrDefault(sceneId, List.of())) + .addAllAreaIdList(player.getUnlockedSceneAreas(sceneId)) .addCityInfoList(CityInfo.newBuilder().setCityId(1).setLevel(1).build()) .addCityInfoList(CityInfo.newBuilder().setCityId(2).setLevel(1).build()) .addCityInfoList(CityInfo.newBuilder().setCityId(3).setLevel(1).build()) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetScenePointRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetScenePointRsp.java index 6f23f65c..d85730b1 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetScenePointRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetScenePointRsp.java @@ -1,7 +1,5 @@ package emu.grasscutter.server.packet.send; -import java.util.List; - import emu.grasscutter.data.GameData; import emu.grasscutter.game.player.Player; import emu.grasscutter.net.packet.BasePacket; @@ -21,7 +19,7 @@ public class PacketGetScenePointRsp extends BasePacket { p.addUnlockedPointList(i); } } else { - p.addAllUnlockedPointList(player.getUnlockedScenePoints().getOrDefault(sceneId, List.of())); + p.addAllUnlockedPointList(player.getUnlockedScenePoints(sceneId)); } for (int i = 1; i < 9; i++) { diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaUnlockNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaUnlockNotify.java index 2623aa95..848190ae 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaUnlockNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaUnlockNotify.java @@ -1,7 +1,5 @@ package emu.grasscutter.server.packet.send; -import java.util.List; - import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.SceneAreaUnlockNotifyOuterClass.SceneAreaUnlockNotify; @@ -17,7 +15,7 @@ public class PacketSceneAreaUnlockNotify extends BasePacket { this.setData(p); } - public PacketSceneAreaUnlockNotify(int sceneId, List<Integer> areaIds) { + public PacketSceneAreaUnlockNotify(int sceneId, Iterable<Integer> areaIds) { super(PacketOpcodes.SceneAreaUnlockNotify); SceneAreaUnlockNotify.Builder p = SceneAreaUnlockNotify.newBuilder() diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketScenePointUnlockNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketScenePointUnlockNotify.java index 86dcb730..c6e8c72e 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketScenePointUnlockNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketScenePointUnlockNotify.java @@ -1,7 +1,5 @@ package emu.grasscutter.server.packet.send; -import java.util.List; - import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.ScenePointUnlockNotifyOuterClass.ScenePointUnlockNotify; @@ -17,7 +15,7 @@ public class PacketScenePointUnlockNotify extends BasePacket { this.setData(p); } - public PacketScenePointUnlockNotify(int sceneId, List<Integer> pointIds) { + public PacketScenePointUnlockNotify(int sceneId, Iterable<Integer> pointIds) { super(PacketOpcodes.ScenePointUnlockNotify); ScenePointUnlockNotify.Builder p = ScenePointUnlockNotify.newBuilder() -- GitLab