mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-04-07 08:22:27 +02:00
Run IntelliJ IDEA code formatter
This commit is contained in:
@@ -5,7 +5,8 @@ import lombok.NonNull;
|
||||
public abstract class BasePlayerDataManager {
|
||||
protected transient Player player;
|
||||
|
||||
public BasePlayerDataManager() {}
|
||||
public BasePlayerDataManager() {
|
||||
}
|
||||
|
||||
public BasePlayerDataManager(@NonNull Player player) {
|
||||
this.player = player;
|
||||
|
||||
@@ -1,60 +1,61 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType;
|
||||
|
||||
public class InvokeHandler<T> {
|
||||
private final List<T> entryListForwardAll;
|
||||
private final List<T> entryListForwardAllExceptCur;
|
||||
private final List<T> entryListForwardHost;
|
||||
private final Class<? extends BasePacket> packetClass;
|
||||
|
||||
public InvokeHandler(Class<? extends BasePacket> packetClass) {
|
||||
this.entryListForwardAll = new ArrayList<>();
|
||||
this.entryListForwardAllExceptCur = new ArrayList<>();
|
||||
this.entryListForwardHost = new ArrayList<>();
|
||||
this.packetClass = packetClass;
|
||||
}
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public synchronized void addEntry(ForwardType forward, T entry) {
|
||||
switch (forward) {
|
||||
case FORWARD_TYPE_TO_ALL -> entryListForwardAll.add(entry);
|
||||
case FORWARD_TYPE_TO_ALL_EXCEPT_CUR, FORWARD_TYPE_TO_ALL_EXIST_EXCEPT_CUR -> entryListForwardAllExceptCur.add(entry);
|
||||
case FORWARD_TYPE_TO_HOST -> entryListForwardHost.add(entry);
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void update(Player player) {
|
||||
if (player.getWorld() == null || player.getScene() == null) {
|
||||
this.entryListForwardAll.clear();
|
||||
this.entryListForwardAllExceptCur.clear();
|
||||
this.entryListForwardHost.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (entryListForwardAll.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAll);
|
||||
player.getScene().broadcastPacket(packet);
|
||||
this.entryListForwardAll.clear();
|
||||
}
|
||||
if (entryListForwardAllExceptCur.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAllExceptCur);
|
||||
player.getScene().broadcastPacketToOthers(player, packet);
|
||||
this.entryListForwardAllExceptCur.clear();
|
||||
}
|
||||
if (entryListForwardHost.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardHost);
|
||||
player.getWorld().getHost().sendPacket(packet);
|
||||
this.entryListForwardHost.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
public class InvokeHandler<T> {
|
||||
private final List<T> entryListForwardAll;
|
||||
private final List<T> entryListForwardAllExceptCur;
|
||||
private final List<T> entryListForwardHost;
|
||||
private final Class<? extends BasePacket> packetClass;
|
||||
|
||||
public InvokeHandler(Class<? extends BasePacket> packetClass) {
|
||||
this.entryListForwardAll = new ArrayList<>();
|
||||
this.entryListForwardAllExceptCur = new ArrayList<>();
|
||||
this.entryListForwardHost = new ArrayList<>();
|
||||
this.packetClass = packetClass;
|
||||
}
|
||||
|
||||
public synchronized void addEntry(ForwardType forward, T entry) {
|
||||
switch (forward) {
|
||||
case FORWARD_TYPE_TO_ALL -> entryListForwardAll.add(entry);
|
||||
case FORWARD_TYPE_TO_ALL_EXCEPT_CUR, FORWARD_TYPE_TO_ALL_EXIST_EXCEPT_CUR ->
|
||||
entryListForwardAllExceptCur.add(entry);
|
||||
case FORWARD_TYPE_TO_HOST -> entryListForwardHost.add(entry);
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void update(Player player) {
|
||||
if (player.getWorld() == null || player.getScene() == null) {
|
||||
this.entryListForwardAll.clear();
|
||||
this.entryListForwardAllExceptCur.clear();
|
||||
this.entryListForwardHost.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (entryListForwardAll.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAll);
|
||||
player.getScene().broadcastPacket(packet);
|
||||
this.entryListForwardAll.clear();
|
||||
}
|
||||
if (entryListForwardAllExceptCur.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAllExceptCur);
|
||||
player.getScene().broadcastPacketToOthers(player, packet);
|
||||
this.entryListForwardAllExceptCur.clear();
|
||||
}
|
||||
if (entryListForwardHost.size() > 0) {
|
||||
BasePacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardHost);
|
||||
player.getWorld().getHost().sendPacket(packet);
|
||||
this.entryListForwardHost.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,29 +15,30 @@ import emu.grasscutter.game.activity.ActivityManager;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.avatar.AvatarStorage;
|
||||
import emu.grasscutter.game.battlepass.BattlePassManager;
|
||||
import emu.grasscutter.game.entity.*;
|
||||
import emu.grasscutter.game.home.GameHome;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.expedition.ExpeditionInfo;
|
||||
import emu.grasscutter.game.friends.FriendsList;
|
||||
import emu.grasscutter.game.friends.PlayerProfile;
|
||||
import emu.grasscutter.game.gacha.PlayerGachaInfo;
|
||||
import emu.grasscutter.game.home.GameHome;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.inventory.Inventory;
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.game.mail.MailHandler;
|
||||
import emu.grasscutter.game.managers.cooking.ActiveCookCompoundData;
|
||||
import emu.grasscutter.game.managers.cooking.CookingCompoundManager;
|
||||
import emu.grasscutter.game.managers.cooking.CookingManager;
|
||||
import emu.grasscutter.game.managers.FurnitureManager;
|
||||
import emu.grasscutter.game.managers.ResinManager;
|
||||
import emu.grasscutter.game.managers.SatiationManager;
|
||||
import emu.grasscutter.game.managers.SotSManager;
|
||||
import emu.grasscutter.game.managers.cooking.ActiveCookCompoundData;
|
||||
import emu.grasscutter.game.managers.cooking.CookingCompoundManager;
|
||||
import emu.grasscutter.game.managers.cooking.CookingManager;
|
||||
import emu.grasscutter.game.managers.deforestation.DeforestationManager;
|
||||
import emu.grasscutter.game.managers.energy.EnergyManager;
|
||||
import emu.grasscutter.game.managers.forging.ActiveForgeData;
|
||||
import emu.grasscutter.game.managers.forging.ForgingManager;
|
||||
import emu.grasscutter.game.managers.mapmark.*;
|
||||
import emu.grasscutter.game.managers.mapmark.MapMark;
|
||||
import emu.grasscutter.game.managers.mapmark.MapMarksManager;
|
||||
import emu.grasscutter.game.managers.stamina.StaminaManager;
|
||||
import emu.grasscutter.game.managers.SotSManager;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.game.props.ClimateType;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
@@ -50,17 +51,20 @@ import emu.grasscutter.game.tower.TowerManager;
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.proto.*;
|
||||
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
||||
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
|
||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
||||
import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType;
|
||||
import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo;
|
||||
import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass;
|
||||
import emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo;
|
||||
import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass;
|
||||
import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
|
||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
||||
import emu.grasscutter.net.proto.ShowAvatarInfoOuterClass;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.net.proto.SocialShowAvatarInfoOuterClass;
|
||||
import emu.grasscutter.scripts.data.SceneRegion;
|
||||
import emu.grasscutter.server.event.player.PlayerJoinEvent;
|
||||
import emu.grasscutter.server.event.player.PlayerQuitEvent;
|
||||
@@ -69,16 +73,14 @@ import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.game.GameSession.SessionState;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
import emu.grasscutter.utils.DateHelper;
|
||||
import emu.grasscutter.utils.Position;
|
||||
import emu.grasscutter.utils.MessageHandler;
|
||||
import emu.grasscutter.utils.Position;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.*;
|
||||
|
||||
import java.time.DayOfWeek;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
@@ -87,120 +89,239 @@ import java.util.*;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||
|
||||
@Entity(value = "players", useDiscriminator = false)
|
||||
public class Player {
|
||||
@Id private int id;
|
||||
@Indexed(options = @IndexOptions(unique = true)) private String accountId;
|
||||
@Setter private transient Account account;
|
||||
@Getter @Setter private transient GameSession session;
|
||||
|
||||
@Getter private String nickname;
|
||||
@Getter private String signature;
|
||||
@Getter private int headImage;
|
||||
@Getter private int nameCardId = 210001;
|
||||
@Getter private Position position;
|
||||
@Getter @Setter private Position prevPos;
|
||||
@Getter private Position rotation;
|
||||
@Getter private PlayerBirthday birthday;
|
||||
@Getter private PlayerCodex codex;
|
||||
@Getter @Setter private boolean showAvatars;
|
||||
@Getter @Setter private List<Integer> showAvatarList;
|
||||
@Getter @Setter private List<Integer> showNameCardList;
|
||||
@Getter private Map<Integer, Integer> properties;
|
||||
@Getter @Setter private int currentRealmId;
|
||||
@Getter @Setter private int widgetId;
|
||||
@Getter @Setter private int sceneId;
|
||||
@Getter @Setter private int regionId;
|
||||
@Getter private int mainCharacterId;
|
||||
@Setter private boolean godmode; // Getter is inGodmode
|
||||
private boolean stamina; // Getter is getUnlimitedStamina, Setter is setUnlimitedStamina
|
||||
|
||||
@Getter private Set<Integer> nameCardList;
|
||||
@Getter private Set<Integer> flyCloakList;
|
||||
@Getter private Set<Integer> costumeList;
|
||||
@Getter @Setter private Set<Integer> rewardedLevels;
|
||||
@Getter @Setter private Set<Integer> homeRewardedLevels;
|
||||
@Getter @Setter private Set<Integer> realmList;
|
||||
@Getter @Setter private Set<Integer> seenRealmList;
|
||||
@Getter private Set<Integer> unlockedForgingBlueprints;
|
||||
@Getter private Set<Integer> unlockedCombines;
|
||||
@Getter private Set<Integer> unlockedFurniture;
|
||||
@Getter private Set<Integer> unlockedFurnitureSuite;
|
||||
@Getter private Map<Long, ExpeditionInfo> expeditionInfo;
|
||||
@Getter private Map<Integer, Integer> unlockedRecipies;
|
||||
@Getter private List<ActiveForgeData> activeForges;
|
||||
@Getter private Map<Integer, ActiveCookCompoundData> activeCookCompounds;
|
||||
@Getter private Map<Integer, Integer> questGlobalVariables;
|
||||
@Getter private Map<Integer, Integer> openStates;
|
||||
@Getter @Setter private Map<Integer, Set<Integer>> unlockedSceneAreas;
|
||||
@Getter @Setter private Map<Integer, Set<Integer>> unlockedScenePoints;
|
||||
@Getter @Setter private List<Integer> chatEmojiIdList;
|
||||
|
||||
@Transient private long nextGuid = 0;
|
||||
@Transient @Getter @Setter private int peerId;
|
||||
@Transient private World world; // Synchronized getter and setter
|
||||
@Transient private Scene scene; // Synchronized getter and setter
|
||||
@Transient @Getter private int weatherId = 0;
|
||||
@Transient @Getter private ClimateType climate = ClimateType.CLIMATE_SUNNY;
|
||||
|
||||
// Player managers go here
|
||||
@Getter private transient AvatarStorage avatars;
|
||||
@Getter private transient Inventory inventory;
|
||||
@Getter private transient FriendsList friendsList;
|
||||
@Getter private transient MailHandler mailHandler;
|
||||
@Getter @Setter private transient MessageHandler messageHandler;
|
||||
@Getter private transient AbilityManager abilityManager;
|
||||
@Getter @Setter private transient QuestManager questManager;
|
||||
@Getter private transient TowerManager towerManager;
|
||||
@Getter private transient SotSManager sotsManager;
|
||||
@Getter private transient MapMarksManager mapMarksManager;
|
||||
@Getter private transient StaminaManager staminaManager;
|
||||
@Getter private transient EnergyManager energyManager;
|
||||
@Getter private transient ResinManager resinManager;
|
||||
@Getter private transient ForgingManager forgingManager;
|
||||
@Getter private transient DeforestationManager deforestationManager;
|
||||
@Getter private transient FurnitureManager furnitureManager;
|
||||
@Getter private transient BattlePassManager battlePassManager;
|
||||
@Getter private transient CookingManager cookingManager;
|
||||
@Getter private transient CookingCompoundManager cookingCompoundManager;
|
||||
@Getter private transient ActivityManager activityManager;
|
||||
@Getter private transient PlayerBuffManager buffManager;
|
||||
@Getter private transient PlayerProgressManager progressManager;
|
||||
@Getter private transient SatiationManager satiationManager;
|
||||
|
||||
// Manager data (Save-able to the database)
|
||||
@Getter private transient Achievements achievements;
|
||||
private PlayerProfile playerProfile; // Getter has null-check
|
||||
@Getter private TeamManager teamManager;
|
||||
private TowerData towerData; // Getter has null-check
|
||||
@Getter private PlayerGachaInfo gachaInfo;
|
||||
private PlayerCollectionRecords collectionRecordStore; // Getter has null-check
|
||||
@Getter private ArrayList<ShopLimit> shopLimit;
|
||||
|
||||
@Getter private transient GameHome home;
|
||||
|
||||
@Setter private boolean moonCard; // Getter is inMoonCard
|
||||
@Getter @Setter private Date moonCardStartTime;
|
||||
@Getter @Setter private int moonCardDuration;
|
||||
@Getter @Setter private Set<Date> moonCardGetTimes;
|
||||
|
||||
@Transient @Getter private boolean paused;
|
||||
@Transient @Getter @Setter private int enterSceneToken;
|
||||
@Transient @Getter @Setter private SceneLoadState sceneLoadState = SceneLoadState.NONE;
|
||||
@Transient private boolean hasSentLoginPackets;
|
||||
@Transient private long nextSendPlayerLocTime = 0;
|
||||
|
||||
private transient final Int2ObjectMap<CoopRequest> coopRequests; // Synchronized getter
|
||||
@Getter private transient final Queue<AttackResult> attackResults;
|
||||
@Getter private transient final InvokeHandler<CombatInvokeEntry> combatInvokeHandler;
|
||||
@Getter private transient final InvokeHandler<AbilityInvokeEntry> abilityInvokeHandler;
|
||||
@Getter private transient final InvokeHandler<AbilityInvokeEntry> clientAbilityInitFinishHandler;
|
||||
|
||||
@Getter @Setter private long springLastUsed;
|
||||
@Getter
|
||||
private transient final Queue<AttackResult> attackResults;
|
||||
@Getter
|
||||
private transient final InvokeHandler<CombatInvokeEntry> combatInvokeHandler;
|
||||
@Getter
|
||||
private transient final InvokeHandler<AbilityInvokeEntry> abilityInvokeHandler;
|
||||
@Getter
|
||||
private transient final InvokeHandler<AbilityInvokeEntry> clientAbilityInitFinishHandler;
|
||||
@Id
|
||||
private int id;
|
||||
@Indexed(options = @IndexOptions(unique = true))
|
||||
private String accountId;
|
||||
@Setter
|
||||
private transient Account account;
|
||||
@Getter
|
||||
@Setter
|
||||
private transient GameSession session;
|
||||
@Getter
|
||||
private String nickname;
|
||||
@Getter
|
||||
private String signature;
|
||||
@Getter
|
||||
private int headImage;
|
||||
@Getter
|
||||
private int nameCardId = 210001;
|
||||
@Getter
|
||||
private final Position position;
|
||||
@Getter
|
||||
@Setter
|
||||
private Position prevPos;
|
||||
@Getter
|
||||
private final Position rotation;
|
||||
@Getter
|
||||
private PlayerBirthday birthday;
|
||||
@Getter
|
||||
private PlayerCodex codex;
|
||||
@Getter
|
||||
@Setter
|
||||
private boolean showAvatars;
|
||||
@Getter
|
||||
@Setter
|
||||
private List<Integer> showAvatarList;
|
||||
@Getter
|
||||
@Setter
|
||||
private List<Integer> showNameCardList;
|
||||
@Getter
|
||||
private final Map<Integer, Integer> properties;
|
||||
@Getter
|
||||
@Setter
|
||||
private int currentRealmId;
|
||||
@Getter
|
||||
@Setter
|
||||
private int widgetId;
|
||||
@Getter
|
||||
@Setter
|
||||
private int sceneId;
|
||||
@Getter
|
||||
@Setter
|
||||
private int regionId;
|
||||
@Getter
|
||||
private int mainCharacterId;
|
||||
@Setter
|
||||
private boolean godmode; // Getter is inGodmode
|
||||
private boolean stamina; // Getter is getUnlimitedStamina, Setter is setUnlimitedStamina
|
||||
@Getter
|
||||
private final Set<Integer> nameCardList;
|
||||
@Getter
|
||||
private final Set<Integer> flyCloakList;
|
||||
@Getter
|
||||
private final Set<Integer> costumeList;
|
||||
@Getter
|
||||
@Setter
|
||||
private Set<Integer> rewardedLevels;
|
||||
@Getter
|
||||
@Setter
|
||||
private Set<Integer> homeRewardedLevels;
|
||||
@Getter
|
||||
@Setter
|
||||
private Set<Integer> realmList;
|
||||
@Getter
|
||||
@Setter
|
||||
private Set<Integer> seenRealmList;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedForgingBlueprints;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedCombines;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedFurniture;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedFurnitureSuite;
|
||||
@Getter
|
||||
private final Map<Long, ExpeditionInfo> expeditionInfo;
|
||||
@Getter
|
||||
private final Map<Integer, Integer> unlockedRecipies;
|
||||
@Getter
|
||||
private final List<ActiveForgeData> activeForges;
|
||||
@Getter
|
||||
private final Map<Integer, ActiveCookCompoundData> activeCookCompounds;
|
||||
@Getter
|
||||
private final Map<Integer, Integer> questGlobalVariables;
|
||||
@Getter
|
||||
private final Map<Integer, Integer> openStates;
|
||||
@Getter
|
||||
@Setter
|
||||
private Map<Integer, Set<Integer>> unlockedSceneAreas;
|
||||
@Getter
|
||||
@Setter
|
||||
private Map<Integer, Set<Integer>> unlockedScenePoints;
|
||||
@Getter
|
||||
@Setter
|
||||
private List<Integer> chatEmojiIdList;
|
||||
@Transient
|
||||
private long nextGuid = 0;
|
||||
@Transient
|
||||
@Getter
|
||||
@Setter
|
||||
private int peerId;
|
||||
@Transient
|
||||
private World world; // Synchronized getter and setter
|
||||
@Transient
|
||||
private Scene scene; // Synchronized getter and setter
|
||||
@Transient
|
||||
@Getter
|
||||
private int weatherId = 0;
|
||||
@Transient
|
||||
@Getter
|
||||
private ClimateType climate = ClimateType.CLIMATE_SUNNY;
|
||||
// Player managers go here
|
||||
@Getter
|
||||
private final transient AvatarStorage avatars;
|
||||
@Getter
|
||||
private final transient Inventory inventory;
|
||||
@Getter
|
||||
private final transient FriendsList friendsList;
|
||||
@Getter
|
||||
private final transient MailHandler mailHandler;
|
||||
@Getter
|
||||
@Setter
|
||||
private transient MessageHandler messageHandler;
|
||||
@Getter
|
||||
private final transient AbilityManager abilityManager;
|
||||
@Getter
|
||||
@Setter
|
||||
private transient QuestManager questManager;
|
||||
@Getter
|
||||
private final transient TowerManager towerManager;
|
||||
@Getter
|
||||
private transient SotSManager sotsManager;
|
||||
@Getter
|
||||
private transient MapMarksManager mapMarksManager;
|
||||
@Getter
|
||||
private transient StaminaManager staminaManager;
|
||||
@Getter
|
||||
private transient EnergyManager energyManager;
|
||||
@Getter
|
||||
private transient ResinManager resinManager;
|
||||
@Getter
|
||||
private transient ForgingManager forgingManager;
|
||||
@Getter
|
||||
private transient DeforestationManager deforestationManager;
|
||||
@Getter
|
||||
private transient FurnitureManager furnitureManager;
|
||||
@Getter
|
||||
private transient BattlePassManager battlePassManager;
|
||||
@Getter
|
||||
private transient CookingManager cookingManager;
|
||||
@Getter
|
||||
private transient CookingCompoundManager cookingCompoundManager;
|
||||
@Getter
|
||||
private transient ActivityManager activityManager;
|
||||
@Getter
|
||||
private final transient PlayerBuffManager buffManager;
|
||||
@Getter
|
||||
private transient PlayerProgressManager progressManager;
|
||||
@Getter
|
||||
private transient SatiationManager satiationManager;
|
||||
// Manager data (Save-able to the database)
|
||||
@Getter
|
||||
private transient Achievements achievements;
|
||||
private PlayerProfile playerProfile; // Getter has null-check
|
||||
@Getter
|
||||
private TeamManager teamManager;
|
||||
private TowerData towerData; // Getter has null-check
|
||||
@Getter
|
||||
private final PlayerGachaInfo gachaInfo;
|
||||
private PlayerCollectionRecords collectionRecordStore; // Getter has null-check
|
||||
@Getter
|
||||
private final ArrayList<ShopLimit> shopLimit;
|
||||
@Getter
|
||||
private transient GameHome home;
|
||||
@Setter
|
||||
private boolean moonCard; // Getter is inMoonCard
|
||||
@Getter
|
||||
@Setter
|
||||
private Date moonCardStartTime;
|
||||
@Getter
|
||||
@Setter
|
||||
private int moonCardDuration;
|
||||
@Getter
|
||||
@Setter
|
||||
private Set<Date> moonCardGetTimes;
|
||||
@Transient
|
||||
@Getter
|
||||
private boolean paused;
|
||||
@Transient
|
||||
@Getter
|
||||
@Setter
|
||||
private int enterSceneToken;
|
||||
@Transient
|
||||
@Getter
|
||||
@Setter
|
||||
private SceneLoadState sceneLoadState = SceneLoadState.NONE;
|
||||
@Transient
|
||||
private boolean hasSentLoginPackets;
|
||||
@Transient
|
||||
private long nextSendPlayerLocTime = 0;
|
||||
@Getter
|
||||
@Setter
|
||||
private long springLastUsed;
|
||||
private HashMap<String, MapMark> mapMarks; // Getter makes an empty hashmap - maybe do this elsewhere?
|
||||
@Getter @Setter private int nextResinRefresh;
|
||||
@Getter @Setter private int lastDailyReset;
|
||||
@Getter private transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY; // TODO
|
||||
@Getter
|
||||
@Setter
|
||||
private int nextResinRefresh;
|
||||
@Getter
|
||||
@Setter
|
||||
private int lastDailyReset;
|
||||
@Getter
|
||||
private final transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY; // TODO
|
||||
|
||||
@Deprecated
|
||||
@SuppressWarnings({"rawtypes", "unchecked"}) // Morphia only!
|
||||
@@ -237,7 +358,7 @@ public class Player {
|
||||
this.unlockedCombines = new HashSet<>();
|
||||
this.unlockedFurniture = new HashSet<>();
|
||||
this.unlockedFurnitureSuite = new HashSet<>();
|
||||
this.activeCookCompounds=new HashMap<>();
|
||||
this.activeCookCompounds = new HashMap<>();
|
||||
this.activeForges = new ArrayList<>();
|
||||
this.unlockedRecipies = new HashMap<>();
|
||||
this.questGlobalVariables = new HashMap<>();
|
||||
@@ -271,7 +392,7 @@ public class Player {
|
||||
this.progressManager = new PlayerProgressManager(this);
|
||||
this.furnitureManager = new FurnitureManager(this);
|
||||
this.cookingManager = new CookingManager(this);
|
||||
this.cookingCompoundManager=new CookingCompoundManager(this);
|
||||
this.cookingCompoundManager = new CookingCompoundManager(this);
|
||||
this.satiationManager = new SatiationManager(this);
|
||||
}
|
||||
|
||||
@@ -307,7 +428,7 @@ public class Player {
|
||||
this.progressManager = new PlayerProgressManager(this);
|
||||
this.furnitureManager = new FurnitureManager(this);
|
||||
this.cookingManager = new CookingManager(this);
|
||||
this.cookingCompoundManager=new CookingCompoundManager(this);
|
||||
this.cookingCompoundManager = new CookingCompoundManager(this);
|
||||
this.satiationManager = new SatiationManager(this);
|
||||
}
|
||||
|
||||
@@ -518,6 +639,7 @@ public class Player {
|
||||
public boolean setHomeCoin(int coin) {
|
||||
return this.setProperty(PlayerProperty.PROP_PLAYER_HOME_COIN, coin);
|
||||
}
|
||||
|
||||
private int getExpRequired(int level) {
|
||||
PlayerLevelData levelData = GameData.getPlayerLevelDataMap().get(level);
|
||||
return levelData != null ? levelData.getExp() : 0;
|
||||
@@ -559,14 +681,14 @@ public class Player {
|
||||
|
||||
int newWorldLevel =
|
||||
(currentLevel >= 55) ? 8 :
|
||||
(currentLevel >= 50) ? 7 :
|
||||
(currentLevel >= 45) ? 6 :
|
||||
(currentLevel >= 40) ? 5 :
|
||||
(currentLevel >= 35) ? 4 :
|
||||
(currentLevel >= 30) ? 3 :
|
||||
(currentLevel >= 25) ? 2 :
|
||||
(currentLevel >= 20) ? 1 :
|
||||
0;
|
||||
(currentLevel >= 50) ? 7 :
|
||||
(currentLevel >= 45) ? 6 :
|
||||
(currentLevel >= 40) ? 5 :
|
||||
(currentLevel >= 35) ? 4 :
|
||||
(currentLevel >= 30) ? 3 :
|
||||
(currentLevel >= 25) ? 2 :
|
||||
(currentLevel >= 20) ? 1 :
|
||||
0;
|
||||
|
||||
if (newWorldLevel != currentWorldLevel) {
|
||||
this.setWorldLevel(newWorldLevel);
|
||||
@@ -591,11 +713,11 @@ public class Player {
|
||||
|
||||
public void onEnterRegion(SceneRegion region) {
|
||||
getQuestManager().forEachActiveQuest(quest -> {
|
||||
if (quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
|
||||
if (quest.getTriggers().containsKey("ENTER_REGION_" + region.config_id)) {
|
||||
// If trigger hasn't been fired yet
|
||||
if (!Boolean.TRUE.equals(quest.getTriggers().put("ENTER_REGION_"+ region.config_id, true))) {
|
||||
if (!Boolean.TRUE.equals(quest.getTriggers().put("ENTER_REGION_" + region.config_id, true))) {
|
||||
//getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
|
||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("ENTER_REGION_"+ region.config_id).getId(),0);
|
||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("ENTER_REGION_" + region.config_id).getId(), 0);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -604,11 +726,11 @@ public class Player {
|
||||
|
||||
public void onLeaveRegion(SceneRegion region) {
|
||||
getQuestManager().forEachActiveQuest(quest -> {
|
||||
if (quest.getTriggers().containsKey("LEAVE_REGION_"+ region.config_id)) {
|
||||
if (quest.getTriggers().containsKey("LEAVE_REGION_" + region.config_id)) {
|
||||
// If trigger hasn't been fired yet
|
||||
if (!Boolean.TRUE.equals(quest.getTriggers().put("LEAVE_REGION_"+ region.config_id, true))) {
|
||||
if (!Boolean.TRUE.equals(quest.getTriggers().put("LEAVE_REGION_" + region.config_id, true))) {
|
||||
getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
|
||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("LEAVE_REGION_"+ region.config_id).getId(),0);
|
||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("LEAVE_REGION_" + region.config_id).getId(), 0);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -700,9 +822,7 @@ public class Player {
|
||||
} else {
|
||||
moonCardDuration += 30;
|
||||
}
|
||||
if (!moonCardGetTimes.contains(moonCardStartTime)) {
|
||||
moonCardGetTimes.add(moonCardStartTime);
|
||||
}
|
||||
moonCardGetTimes.add(moonCardStartTime);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -860,7 +980,9 @@ public class Player {
|
||||
|
||||
// ---------------------MAIL------------------------
|
||||
|
||||
public List<Mail> getAllMail() { return this.getMailHandler().getMail(); }
|
||||
public List<Mail> getAllMail() {
|
||||
return this.getMailHandler().getMail();
|
||||
}
|
||||
|
||||
public void sendMail(Mail message) {
|
||||
this.getMailHandler().sendMail(message);
|
||||
@@ -870,7 +992,9 @@ public class Player {
|
||||
return this.getMailHandler().deleteMail(mailId);
|
||||
}
|
||||
|
||||
public Mail getMail(int index) { return this.getMailHandler().getMailById(index); }
|
||||
public Mail getMail(int index) {
|
||||
return this.getMailHandler().getMailById(index);
|
||||
}
|
||||
|
||||
public int getMailId(Mail message) {
|
||||
return this.getMailHandler().getMailIndex(message);
|
||||
@@ -904,13 +1028,13 @@ public class Player {
|
||||
|
||||
public OnlinePlayerInfo getOnlinePlayerInfo() {
|
||||
OnlinePlayerInfo.Builder onlineInfo = OnlinePlayerInfo.newBuilder()
|
||||
.setUid(this.getUid())
|
||||
.setNickname(this.getNickname())
|
||||
.setPlayerLevel(this.getLevel())
|
||||
.setMpSettingType(this.getMpSetting())
|
||||
.setNameCardId(this.getNameCardId())
|
||||
.setSignature(this.getSignature())
|
||||
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()));
|
||||
.setUid(this.getUid())
|
||||
.setNickname(this.getNickname())
|
||||
.setPlayerLevel(this.getLevel())
|
||||
.setMpSettingType(this.getMpSetting())
|
||||
.setNameCardId(this.getNameCardId())
|
||||
.setSignature(this.getSignature())
|
||||
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()));
|
||||
|
||||
if (this.getWorld() != null) {
|
||||
onlineInfo.setCurPlayerNumInWorld(getWorld().getPlayerCount());
|
||||
@@ -936,12 +1060,12 @@ public class Player {
|
||||
if (this.getShowAvatarList() != null) {
|
||||
for (int avatarId : this.getShowAvatarList()) {
|
||||
socialShowAvatarInfoList.add(
|
||||
socialShowAvatarInfoList.size(),
|
||||
SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
|
||||
.setAvatarId(avatarId)
|
||||
.setLevel(getAvatars().getAvatarById(avatarId).getLevel())
|
||||
.setCostumeId(getAvatars().getAvatarById(avatarId).getCostume())
|
||||
.build()
|
||||
socialShowAvatarInfoList.size(),
|
||||
SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
|
||||
.setAvatarId(avatarId)
|
||||
.setLevel(getAvatars().getAvatarById(avatarId).getLevel())
|
||||
.setCostumeId(getAvatars().getAvatarById(avatarId).getCostume())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -952,31 +1076,31 @@ public class Player {
|
||||
if (showAvatarList != null) {
|
||||
for (int avatarId : showAvatarList) {
|
||||
socialShowAvatarInfoList.add(
|
||||
socialShowAvatarInfoList.size(),
|
||||
SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
|
||||
.setAvatarId(avatarId)
|
||||
.setLevel(avatars.getAvatarById(avatarId).getLevel())
|
||||
.setCostumeId(avatars.getAvatarById(avatarId).getCostume())
|
||||
.build()
|
||||
socialShowAvatarInfoList.size(),
|
||||
SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
|
||||
.setAvatarId(avatarId)
|
||||
.setLevel(avatars.getAvatarById(avatarId).getLevel())
|
||||
.setCostumeId(avatars.getAvatarById(avatarId).getCostume())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SocialDetail.Builder social = SocialDetail.newBuilder()
|
||||
.setUid(this.getUid())
|
||||
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
|
||||
.setNickname(this.getNickname())
|
||||
.setSignature(this.getSignature())
|
||||
.setLevel(this.getLevel())
|
||||
.setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty())
|
||||
.setWorldLevel(this.getWorldLevel())
|
||||
.setNameCardId(this.getNameCardId())
|
||||
.setIsShowAvatar(this.isShowAvatars())
|
||||
.addAllShowAvatarInfoList(socialShowAvatarInfoList)
|
||||
.addAllShowNameCardIdList(this.getShowNameCardInfoList())
|
||||
.setFinishAchievementNum(this.getFinishedAchievementNum())
|
||||
.setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
|
||||
.setUid(this.getUid())
|
||||
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
|
||||
.setNickname(this.getNickname())
|
||||
.setSignature(this.getSignature())
|
||||
.setLevel(this.getLevel())
|
||||
.setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty())
|
||||
.setWorldLevel(this.getWorldLevel())
|
||||
.setNameCardId(this.getNameCardId())
|
||||
.setIsShowAvatar(this.isShowAvatars())
|
||||
.addAllShowAvatarInfoList(socialShowAvatarInfoList)
|
||||
.addAllShowNameCardIdList(this.getShowNameCardInfoList())
|
||||
.setFinishAchievementNum(this.getFinishedAchievementNum())
|
||||
.setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
|
||||
return social;
|
||||
}
|
||||
|
||||
@@ -1020,17 +1144,17 @@ public class Player {
|
||||
|
||||
public PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo getWorldPlayerLocationInfo() {
|
||||
return PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo.newBuilder()
|
||||
.setSceneId(this.getSceneId())
|
||||
.setPlayerLoc(this.getPlayerLocationInfo())
|
||||
.build();
|
||||
.setSceneId(this.getSceneId())
|
||||
.setPlayerLoc(this.getPlayerLocationInfo())
|
||||
.build();
|
||||
}
|
||||
|
||||
public PlayerLocationInfo getPlayerLocationInfo() {
|
||||
return PlayerLocationInfo.newBuilder()
|
||||
.setUid(this.getUid())
|
||||
.setPos(this.getPosition().toProto())
|
||||
.setRot(this.getRotation().toProto())
|
||||
.build();
|
||||
.setUid(this.getUid())
|
||||
.setPos(this.getPosition().toProto())
|
||||
.setRot(this.getRotation().toProto())
|
||||
.build();
|
||||
}
|
||||
|
||||
public void loadBattlePassManager() {
|
||||
@@ -1040,7 +1164,7 @@ public class Player {
|
||||
}
|
||||
|
||||
public PlayerCollectionRecords getCollectionRecordStore() {
|
||||
if (this.collectionRecordStore==null) {
|
||||
if (this.collectionRecordStore == null) {
|
||||
this.collectionRecordStore = new PlayerCollectionRecords();
|
||||
}
|
||||
return collectionRecordStore;
|
||||
@@ -1266,7 +1390,8 @@ public class Player {
|
||||
session.setState(SessionState.ACTIVE);
|
||||
|
||||
// Call join event.
|
||||
PlayerJoinEvent event = new PlayerJoinEvent(this); event.call();
|
||||
PlayerJoinEvent event = new PlayerJoinEvent(this);
|
||||
event.call();
|
||||
if (event.isCanceled()) { // If event is not cancelled, continue.
|
||||
session.close();
|
||||
return;
|
||||
@@ -1305,11 +1430,12 @@ public class Player {
|
||||
this.getFriendsList().save();
|
||||
|
||||
// Call quit event.
|
||||
PlayerQuitEvent event = new PlayerQuitEvent(this); event.call();
|
||||
}catch (Throwable e) {
|
||||
PlayerQuitEvent event = new PlayerQuitEvent(this);
|
||||
event.call();
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
Grasscutter.getLogger().warn("Player (UID {}) save failure", getUid());
|
||||
}finally {
|
||||
} finally {
|
||||
removeFromServer();
|
||||
}
|
||||
}
|
||||
@@ -1324,23 +1450,15 @@ public class Player {
|
||||
public int getLegendaryKey() {
|
||||
return this.getProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY);
|
||||
}
|
||||
|
||||
public synchronized void addLegendaryKey(int count) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() + count);
|
||||
}
|
||||
|
||||
public synchronized void useLegendaryKey(int count) {
|
||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() - count);
|
||||
}
|
||||
|
||||
public enum SceneLoadState {
|
||||
NONE(0), LOADING(1), INIT(2), LOADED(3);
|
||||
|
||||
@Getter private final int value;
|
||||
|
||||
SceneLoadState(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int getPropertyMin(PlayerProperty prop) {
|
||||
if (prop.isDynamicRange()) {
|
||||
return 0;
|
||||
@@ -1383,4 +1501,15 @@ public class Player {
|
||||
}
|
||||
}
|
||||
|
||||
public enum SceneLoadState {
|
||||
NONE(0), LOADING(1), INIT(2), LOADED(3);
|
||||
|
||||
@Getter
|
||||
private final int value;
|
||||
|
||||
SceneLoadState(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,63 +8,62 @@ public class PlayerBirthday {
|
||||
private int day;
|
||||
private int month;
|
||||
|
||||
public PlayerBirthday(){
|
||||
public PlayerBirthday() {
|
||||
this.day = 0;
|
||||
this.month = 0;
|
||||
}
|
||||
|
||||
public PlayerBirthday(int day, int month){
|
||||
public PlayerBirthday(int day, int month) {
|
||||
this.day = day;
|
||||
this.month = month;
|
||||
}
|
||||
|
||||
public PlayerBirthday set(PlayerBirthday birth){
|
||||
public PlayerBirthday set(PlayerBirthday birth) {
|
||||
this.day = birth.day;
|
||||
this.month = birth.month;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public PlayerBirthday set(int d, int m){
|
||||
public PlayerBirthday set(int d, int m) {
|
||||
this.day = d;
|
||||
this.month = m;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public PlayerBirthday setDay(int value){
|
||||
public int getDay() {
|
||||
return this.day;
|
||||
}
|
||||
|
||||
public PlayerBirthday setDay(int value) {
|
||||
this.day = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PlayerBirthday setMonth(int value){
|
||||
public int getMonth() {
|
||||
return this.month;
|
||||
}
|
||||
|
||||
public PlayerBirthday setMonth(int value) {
|
||||
this.month = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getDay(){
|
||||
return this.day;
|
||||
}
|
||||
|
||||
public int getMonth(){
|
||||
return this.month;
|
||||
}
|
||||
|
||||
public Birthday toProto(){
|
||||
public Birthday toProto() {
|
||||
return Birthday.newBuilder()
|
||||
.setDay(this.getDay())
|
||||
.setMonth(this.getMonth())
|
||||
.build();
|
||||
.setDay(this.getDay())
|
||||
.setMonth(this.getMonth())
|
||||
.build();
|
||||
}
|
||||
|
||||
public Birthday.Builder getFilledProtoWhenNotEmpty(){
|
||||
if(this.getDay() > 0)
|
||||
{
|
||||
public Birthday.Builder getFilledProtoWhenNotEmpty() {
|
||||
if (this.getDay() > 0) {
|
||||
return Birthday.newBuilder()
|
||||
.setDay(this.getDay())
|
||||
.setMonth(this.getMonth());
|
||||
.setDay(this.getDay())
|
||||
.setMonth(this.getMonth());
|
||||
}
|
||||
|
||||
return Birthday.newBuilder();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
|
||||
@@ -14,17 +9,19 @@ import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.proto.ServerBuffChangeNotifyOuterClass.ServerBuffChangeNotify.ServerBuffChangeType;
|
||||
import emu.grasscutter.net.proto.ServerBuffOuterClass.ServerBuff;
|
||||
import emu.grasscutter.server.packet.send.PacketServerBuffChangeNotify;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public class PlayerBuffManager extends BasePlayerManager {
|
||||
private int nextBuffUid;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class PlayerBuffManager extends BasePlayerManager {
|
||||
private final List<PlayerBuff> pendingBuffs;
|
||||
private final Int2ObjectMap<PlayerBuff> buffs; // Server buffs
|
||||
private int nextBuffUid;
|
||||
|
||||
public PlayerBuffManager(Player player) {
|
||||
super(player);
|
||||
@@ -34,6 +31,7 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Gets a new uid for a server buff
|
||||
*
|
||||
* @return New integer buff uid
|
||||
*/
|
||||
private int getNextBuffUid() {
|
||||
@@ -42,6 +40,7 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Returns true if the player has a buff with this group id
|
||||
*
|
||||
* @param groupId Buff group id
|
||||
* @return True if a buff with this group id exists
|
||||
*/
|
||||
@@ -64,6 +63,7 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Adds a server buff to the player.
|
||||
*
|
||||
* @param buffId Server buff id
|
||||
* @return True if a buff was added
|
||||
*/
|
||||
@@ -73,7 +73,8 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Adds a server buff to the player.
|
||||
* @param buffId Server buff id
|
||||
*
|
||||
* @param buffId Server buff id
|
||||
* @param duration Duration of the buff in seconds. Set to 0 for an infinite buff.
|
||||
* @return True if a buff was added
|
||||
*/
|
||||
@@ -83,9 +84,10 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Adds a server buff to the player.
|
||||
* @param buffId Server buff id
|
||||
*
|
||||
* @param buffId Server buff id
|
||||
* @param duration Duration of the buff in seconds. Set to 0 for an infinite buff.
|
||||
* @param target Target avatar
|
||||
* @param target Target avatar
|
||||
* @return True if a buff was added
|
||||
*/
|
||||
public synchronized boolean addBuff(int buffId, float duration, Avatar target) {
|
||||
@@ -102,7 +104,7 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
.map(onAdded -> {
|
||||
|
||||
var s = false;
|
||||
for (var a: onAdded) {
|
||||
for (var a : onAdded) {
|
||||
Grasscutter.getLogger().debug("onAdded exists");
|
||||
if (Objects.requireNonNull(a.type) == AbilityModifierAction.Type.HealHP) {
|
||||
Grasscutter.getLogger().debug("Attempting heal");
|
||||
@@ -144,6 +146,7 @@ public class PlayerBuffManager extends BasePlayerManager {
|
||||
|
||||
/**
|
||||
* Removes a buff by its group id
|
||||
*
|
||||
* @param buffGroupId Server buff group id
|
||||
* @return True if a buff was remove
|
||||
*/
|
||||
|
||||
@@ -15,17 +15,26 @@ import java.util.*;
|
||||
|
||||
@Entity
|
||||
public class PlayerCodex {
|
||||
@Transient private Player player;
|
||||
@Transient
|
||||
private Player player;
|
||||
|
||||
//itemId is not codexId!
|
||||
@Getter private Set<Integer> unlockedWeapon;
|
||||
@Getter private Map<Integer, Integer> unlockedAnimal;
|
||||
@Getter private Set<Integer> unlockedMaterial;
|
||||
@Getter private Set<Integer> unlockedBook;
|
||||
@Getter private Set<Integer> unlockedTip;
|
||||
@Getter private Set<Integer> unlockedView;
|
||||
@Getter private Set<Integer> unlockedReliquary;
|
||||
@Getter private Set<Integer> unlockedReliquarySuitCodex;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedWeapon;
|
||||
@Getter
|
||||
private final Map<Integer, Integer> unlockedAnimal;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedMaterial;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedBook;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedTip;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedView;
|
||||
@Getter
|
||||
private Set<Integer> unlockedReliquary;
|
||||
@Getter
|
||||
private final Set<Integer> unlockedReliquarySuitCodex;
|
||||
|
||||
public PlayerCodex() {
|
||||
this.unlockedWeapon = new HashSet<>();
|
||||
@@ -73,15 +82,17 @@ public class PlayerCodex {
|
||||
}
|
||||
});
|
||||
}
|
||||
default -> {}
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
case ITEM_RELIQUARY -> {
|
||||
val reliquaryId = (itemId/10) * 10; // Normalize to 0-substat form
|
||||
val reliquaryId = (itemId / 10) * 10; // Normalize to 0-substat form
|
||||
if (this.getUnlockedReliquary().add(reliquaryId))
|
||||
checkUnlockedSuits(reliquaryId);
|
||||
}
|
||||
default -> {}
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +129,7 @@ public class PlayerCodex {
|
||||
private void fixReliquaries() {
|
||||
// Migrate older database entries which were using non-canonical forms of itemIds
|
||||
val newReliquaries = new HashSet<Integer>();
|
||||
this.unlockedReliquary.forEach(i -> newReliquaries.add((i/10)*10));
|
||||
this.unlockedReliquary.forEach(i -> newReliquaries.add((i / 10) * 10));
|
||||
this.unlockedReliquary = newReliquaries;
|
||||
|
||||
GameData.getCodexReliquaryArrayList().stream()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import dev.morphia.annotations.Entity;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import dev.morphia.annotations.Entity;
|
||||
|
||||
@Entity(useDiscriminator = false)
|
||||
public class PlayerCollectionRecords {
|
||||
private Map<Integer, CollectionRecord> records;
|
||||
@@ -49,7 +49,8 @@ public class PlayerCollectionRecords {
|
||||
private long expiredTime;
|
||||
|
||||
@Deprecated // Morphia
|
||||
public CollectionRecord() {}
|
||||
public CollectionRecord() {
|
||||
}
|
||||
|
||||
public CollectionRecord(int configId, long expiredTime) {
|
||||
this.configId = configId;
|
||||
|
||||
@@ -1,36 +1,50 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import dev.morphia.annotations.Entity;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.binout.ScenePointEntry;
|
||||
import emu.grasscutter.data.excels.OpenStateData;
|
||||
import emu.grasscutter.data.excels.OpenStateData.OpenStateCondType;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
import emu.grasscutter.game.quest.enums.QuestState;
|
||||
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.server.packet.send.PacketOpenStateChangeNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketOpenStateUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSceneAreaUnlockNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketScenePointUnlockNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSetOpenStateRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketUnlockTransPointRsp;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
// @Entity
|
||||
public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
/******************************************************************************************************************
|
||||
******************************************************************************************************************
|
||||
* OPEN STATES
|
||||
******************************************************************************************************************
|
||||
*****************************************************************************************************************/
|
||||
|
||||
// Set of open states that are never unlocked, whether they fulfill the conditions or not.
|
||||
public static final Set<Integer> BLACKLIST_OPEN_STATES = Set.of(
|
||||
48 // blacklist OPEN_STATE_LIMIT_REGION_GLOBAL to make Meledy happy. =D Remove this as soon as quest unlocks are fully implemented.
|
||||
);
|
||||
// Set of open states that are set per default for all accounts. Can be overwritten by an entry in `map`.
|
||||
public static final Set<Integer> DEFAULT_OPEN_STATES = GameData.getOpenStateList().stream()
|
||||
.filter(s ->
|
||||
s.isDefaultState() // Actual default-opened states.
|
||||
// All states whose unlock we don't handle correctly yet.
|
||||
|| (s.getCond().stream().filter(c -> c.getCondType() == OpenStateCondType.OPEN_STATE_COND_PLAYER_LEVEL).count() == 0)
|
||||
// Always unlock OPEN_STATE_PAIMON, otherwise the player will not have a working chat.
|
||||
|| s.getId() == 1
|
||||
)
|
||||
.filter(s -> !BLACKLIST_OPEN_STATES.contains(s.getId())) // Filter out states in the blacklist.
|
||||
.map(s -> s.getId())
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
public PlayerProgressManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
/**********
|
||||
Handler for player login.
|
||||
**********/
|
||||
Handler for player login.
|
||||
**********/
|
||||
public void onPlayerLogin() {
|
||||
// Try unlocking open states on player login. This handles accounts where unlock conditions were
|
||||
// already met before certain open state unlocks were implemented.
|
||||
@@ -49,33 +63,9 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************************************************
|
||||
******************************************************************************************************************
|
||||
* OPEN STATES
|
||||
******************************************************************************************************************
|
||||
*****************************************************************************************************************/
|
||||
|
||||
// Set of open states that are never unlocked, whether they fulfill the conditions or not.
|
||||
public static final Set<Integer> BLACKLIST_OPEN_STATES = Set.of(
|
||||
48 // blacklist OPEN_STATE_LIMIT_REGION_GLOBAL to make Meledy happy. =D Remove this as soon as quest unlocks are fully implemented.
|
||||
);
|
||||
|
||||
// Set of open states that are set per default for all accounts. Can be overwritten by an entry in `map`.
|
||||
public static final Set<Integer> DEFAULT_OPEN_STATES = GameData.getOpenStateList().stream()
|
||||
.filter(s ->
|
||||
s.isDefaultState() // Actual default-opened states.
|
||||
// All states whose unlock we don't handle correctly yet.
|
||||
|| (s.getCond().stream().filter(c -> c.getCondType() == OpenStateCondType.OPEN_STATE_COND_PLAYER_LEVEL).count() == 0)
|
||||
// Always unlock OPEN_STATE_PAIMON, otherwise the player will not have a working chat.
|
||||
|| s.getId() == 1
|
||||
)
|
||||
.filter(s -> !BLACKLIST_OPEN_STATES.contains(s.getId())) // Filter out states in the blacklist.
|
||||
.map(s -> s.getId())
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
/**********
|
||||
Direct getters and setters for open states.
|
||||
**********/
|
||||
Direct getters and setters for open states.
|
||||
**********/
|
||||
public int getOpenState(int openState) {
|
||||
return this.player.getOpenStates().getOrDefault(openState, 0);
|
||||
}
|
||||
@@ -91,13 +81,14 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setOpenState(int openState, int value) {
|
||||
this.setOpenState(openState, value, true);
|
||||
}
|
||||
|
||||
/**********
|
||||
Condition checking for setting open states.
|
||||
**********/
|
||||
Condition checking for setting open states.
|
||||
**********/
|
||||
private boolean areConditionsMet(OpenStateData openState) {
|
||||
// Check all conditions and test if at least one of them is violated.
|
||||
for (var condition : openState.getCond()) {
|
||||
@@ -106,17 +97,13 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
if (this.player.getLevel() < condition.getParam()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_COND_QUEST) {
|
||||
} else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_COND_QUEST) {
|
||||
// ToDo: Implement.
|
||||
}
|
||||
else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_COND_PARENT_QUEST) {
|
||||
} else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_COND_PARENT_QUEST) {
|
||||
// ToDo: Implement.
|
||||
}
|
||||
else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_OFFERING_LEVEL) {
|
||||
} else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_OFFERING_LEVEL) {
|
||||
// ToDo: Implement.
|
||||
}
|
||||
else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_CITY_REPUTATION_LEVEL) {
|
||||
} else if (condition.getCondType() == OpenStateCondType.OPEN_STATE_CITY_REPUTATION_LEVEL) {
|
||||
// ToDo: Implement.
|
||||
}
|
||||
}
|
||||
@@ -126,8 +113,8 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
}
|
||||
|
||||
/**********
|
||||
Setting open states from the client (via `SetOpenStateReq`).
|
||||
**********/
|
||||
Setting open states from the client (via `SetOpenStateReq`).
|
||||
**********/
|
||||
public void setOpenStateFromClient(int openState, int value) {
|
||||
// Get the data for this open state.
|
||||
OpenStateData data = GameData.getOpenStateDataMap().get(openState);
|
||||
@@ -149,8 +136,8 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
}
|
||||
|
||||
/**********
|
||||
Triggered unlocking of open states (unlock states whose conditions have been met.)
|
||||
**********/
|
||||
Triggered unlocking of open states (unlock states whose conditions have been met.)
|
||||
**********/
|
||||
public void tryUnlockOpenStates(boolean sendNotify) {
|
||||
// Get list of open states that are not yet unlocked.
|
||||
var lockedStates = GameData.getOpenStateList().stream().filter(s -> this.player.getOpenStates().getOrDefault(s, 0) == 0).toList();
|
||||
@@ -166,6 +153,7 @@ public class PlayerProgressManager extends BasePlayerDataManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void tryUnlockOpenStates() {
|
||||
this.tryUnlockOpenStates(true);
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import dev.morphia.annotations.Entity;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.proto.AvatarTeamOuterClass.AvatarTeam;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||
|
||||
@Entity
|
||||
public class TeamInfo {
|
||||
private String name;
|
||||
private List<Integer> avatars;
|
||||
private final List<Integer> avatars;
|
||||
|
||||
public TeamInfo() {
|
||||
this.name = "";
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
package emu.grasscutter.game.player;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.*;
|
||||
|
||||
import java.util.*;
|
||||
import dev.morphia.annotations.Entity;
|
||||
import dev.morphia.annotations.Transient;
|
||||
import emu.grasscutter.GameConstants;
|
||||
@@ -22,22 +19,7 @@ import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState;
|
||||
import emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.server.event.player.PlayerTeamDeathEvent;
|
||||
import emu.grasscutter.server.packet.send.PacketAddBackupAvatarTeamRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarDieAnimationEndRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarSatiationDataNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarTeamAllDataNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarTeamUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketChangeAvatarRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketChangeTeamNameRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketChooseCurAvatarTeamRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketDelBackupAvatarTeamRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSceneTeamUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSetUpAvatarTeamRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketWorldPlayerDieNotify;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
import emu.grasscutter.utils.Position;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
@@ -48,22 +30,42 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||
|
||||
@Entity
|
||||
public class TeamManager extends BasePlayerDataManager {
|
||||
@Transient
|
||||
private final List<EntityAvatar> avatars;
|
||||
@Transient
|
||||
@Getter
|
||||
private final Set<EntityBaseGadget> gadgets;
|
||||
@Transient
|
||||
@Getter
|
||||
private final IntSet teamResonances;
|
||||
@Transient
|
||||
@Getter
|
||||
private final IntSet teamResonancesConfig;
|
||||
// This needs to be a LinkedHashMap to guarantee insertion order.
|
||||
@Getter private LinkedHashMap<Integer, TeamInfo> teams;
|
||||
@Getter
|
||||
private LinkedHashMap<Integer, TeamInfo> teams;
|
||||
private int currentTeamIndex;
|
||||
@Getter @Setter private int currentCharacterIndex;
|
||||
|
||||
@Transient @Getter @Setter private TeamInfo mpTeam;
|
||||
@Transient @Getter @Setter private int entityId;
|
||||
@Transient private final List<EntityAvatar> avatars;
|
||||
@Transient @Getter private final Set<EntityBaseGadget> gadgets;
|
||||
@Transient @Getter private final IntSet teamResonances;
|
||||
@Transient @Getter private final IntSet teamResonancesConfig;
|
||||
|
||||
@Transient private int useTemporarilyTeamIndex = -1;
|
||||
@Transient private List<TeamInfo> temporaryTeam; // Temporary Team for tower
|
||||
@Getter
|
||||
@Setter
|
||||
private int currentCharacterIndex;
|
||||
@Transient
|
||||
@Getter
|
||||
@Setter
|
||||
private TeamInfo mpTeam;
|
||||
@Transient
|
||||
@Getter
|
||||
@Setter
|
||||
private int entityId;
|
||||
@Transient
|
||||
private int useTemporarilyTeamIndex = -1;
|
||||
@Transient
|
||||
private List<TeamInfo> temporaryTeam; // Temporary Team for tower
|
||||
|
||||
public TeamManager() {
|
||||
this.mpTeam = new TeamInfo();
|
||||
@@ -454,6 +456,7 @@ public class TeamManager extends BasePlayerDataManager {
|
||||
this.temporaryTeam = null;
|
||||
this.updateTeamEntities(null);
|
||||
}
|
||||
|
||||
public synchronized void setCurrentTeam(int teamId) {
|
||||
//
|
||||
if (this.getPlayer().isInMultiplayer()) {
|
||||
@@ -630,7 +633,7 @@ public class TeamManager extends BasePlayerDataManager {
|
||||
try {
|
||||
this.getPlayer().sendPacket(new PacketPlayerEnterSceneNotify(this.getPlayer(), EnterType.ENTER_TYPE_SELF, EnterReason.Revival, player.getSceneId(), getRespawnPosition()));
|
||||
player.getPosition().set(getRespawnPosition());
|
||||
}catch (Exception e) {
|
||||
} catch (Exception e) {
|
||||
this.getPlayer().sendPacket(new PacketPlayerEnterSceneNotify(this.getPlayer(), EnterType.ENTER_TYPE_SELF, EnterReason.Revival, 3, GameConstants.START_POSITION));
|
||||
player.getPosition().set(GameConstants.START_POSITION); // If something goes wrong, the resurrection is here
|
||||
}
|
||||
@@ -638,6 +641,7 @@ public class TeamManager extends BasePlayerDataManager {
|
||||
// Packets
|
||||
this.getPlayer().sendPacket(new BasePacket(PacketOpcodes.WorldPlayerReviveRsp));
|
||||
}
|
||||
|
||||
public Position getRespawnPosition() {
|
||||
var deathPos = this.getPlayer().getPosition();
|
||||
int sceneId = this.getPlayer().getSceneId();
|
||||
@@ -650,6 +654,7 @@ public class TeamManager extends BasePlayerDataManager {
|
||||
|
||||
return respawnPoint.get().getPointData().getTranPos();
|
||||
}
|
||||
|
||||
public void saveAvatars() {
|
||||
// Save all avatars from active team
|
||||
for (EntityAvatar entity : this.getActiveTeam()) {
|
||||
@@ -671,7 +676,7 @@ public class TeamManager extends BasePlayerDataManager {
|
||||
// The id of the new custom team is the lowest id in [5,MAX_TEAMS] that is not yet taken.
|
||||
int id = -1;
|
||||
for (int i = 5; i <= GameConstants.MAX_TEAMS; i++) {
|
||||
if (!this.teams.keySet().contains(i)) {
|
||||
if (!this.teams.containsKey(i)) {
|
||||
id = i;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user