mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-14 16:04:40 +01:00
Better SceneTags (#2361)
* Add scene tag handling * Move warns to debug * Move to PlayerProgressManager * Add success message * Inline check * Improve per-scene handling * Update src/main/java/emu/grasscutter/command/commands/SetSceneTagCommand.java Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> * Update src/main/java/emu/grasscutter/command/commands/SetSceneTagCommand.java Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> * Fix types * Small fix * Update ScriptLib.java --------- Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
This commit is contained in:
@@ -116,6 +116,7 @@ public class Player implements PlayerHook, FieldFetch {
|
||||
@Getter private Map<Integer, ActiveCookCompoundData> activeCookCompounds;
|
||||
@Getter private Map<Integer, Integer> questGlobalVariables;
|
||||
@Getter private Map<Integer, Integer> openStates;
|
||||
@Getter private Map<Integer, Set<Integer>> sceneTags;
|
||||
@Getter @Setter private Map<Integer, Set<Integer>> unlockedSceneAreas;
|
||||
@Getter @Setter private Map<Integer, Set<Integer>> unlockedScenePoints;
|
||||
@Getter @Setter private List<Integer> chatEmojiIdList;
|
||||
@@ -244,6 +245,7 @@ public class Player implements PlayerHook, FieldFetch {
|
||||
this.unlockedRecipies = new HashMap<>();
|
||||
this.questGlobalVariables = new HashMap<>();
|
||||
this.openStates = new HashMap<>();
|
||||
this.sceneTags = new HashMap<>();
|
||||
this.unlockedSceneAreas = new HashMap<>();
|
||||
this.unlockedScenePoints = new HashMap<>();
|
||||
this.chatEmojiIdList = new ArrayList<>();
|
||||
@@ -295,6 +297,7 @@ public class Player implements PlayerHook, FieldFetch {
|
||||
this.codex = new PlayerCodex(this);
|
||||
|
||||
this.applyProperties();
|
||||
this.applyStartingSceneTags();
|
||||
this.getFlyCloakList().add(140001);
|
||||
this.getNameCardList().add(210001);
|
||||
|
||||
@@ -587,6 +590,20 @@ public class Player implements PlayerHook, FieldFetch {
|
||||
this.getProperty(PlayerProperty.PROP_DIVE_MAX_STAMINA));
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies all default scenetags to the player.
|
||||
*/
|
||||
private void applyStartingSceneTags() {
|
||||
GameData.getSceneTagDataMap().values().stream()
|
||||
.filter(sceneTag -> sceneTag.isDefaultValid())
|
||||
.forEach(sceneTag -> {
|
||||
if (this.getSceneTags().get(sceneTag.getSceneId()) == null) {
|
||||
this.getSceneTags().put(sceneTag.getSceneId(), new HashSet<>());
|
||||
}
|
||||
this.getSceneTags().get(sceneTag.getSceneId()).add(sceneTag.getId());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies a property to the player if it doesn't exist in the database.
|
||||
*
|
||||
@@ -1384,6 +1401,10 @@ public class Player implements PlayerHook, FieldFetch {
|
||||
}
|
||||
*/
|
||||
|
||||
// Ensure the player has valid scenetags, allows old accounts to work
|
||||
if (this.getSceneTags().isEmpty() || this.getSceneTags() == null) {
|
||||
this.applyStartingSceneTags();
|
||||
}
|
||||
|
||||
if (GameHome.HOME_SCENE_IDS.contains(this.getSceneId())) {
|
||||
this.setSceneId(this.prevScene <= 0 ? 3 : this.prevScene); // if the player in home, make the player go back.
|
||||
|
||||
@@ -12,6 +12,8 @@ import emu.grasscutter.game.quest.enums.*;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.scripts.data.ScriptArgs;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -313,4 +315,28 @@ public final class PlayerProgressManager extends BasePlayerDataManager {
|
||||
player.save();
|
||||
player.getQuestManager().queueEvent(QuestCond.QUEST_COND_HISTORY_GOT_ANY_ITEM, id, newCount);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************
|
||||
******************************************************************************************************************
|
||||
* SCENETAGS
|
||||
******************************************************************************************************************
|
||||
*****************************************************************************************************************/
|
||||
public void addSceneTag(int sceneId, int sceneTagId) {
|
||||
player.getSceneTags().computeIfAbsent(sceneId, k -> new HashSet<>()).add(sceneTagId);
|
||||
player.sendPacket(new PacketPlayerWorldSceneInfoListNotify(player));
|
||||
}
|
||||
|
||||
public void delSceneTag(int sceneId, int sceneTagId) {
|
||||
// Sanity check
|
||||
if (player.getSceneTags().get(sceneId) == null) {
|
||||
// Can't delete something that doesn't exist
|
||||
return;
|
||||
}
|
||||
player.getSceneTags().get(sceneId).remove(sceneTagId);
|
||||
player.sendPacket(new PacketPlayerWorldSceneInfoListNotify(player));
|
||||
}
|
||||
|
||||
public boolean checkSceneTag(int sceneId, int sceneTagId) {
|
||||
return player.getSceneTags().get(sceneId).contains(sceneTagId);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user