mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-27 14:33:21 +08:00
Fix player fields not being set
line seps r weird
This commit is contained in:
parent
5e56b5e3a8
commit
06cbae31fa
@ -5,7 +5,7 @@ import emu.grasscutter.GameConstants;
|
|||||||
import emu.grasscutter.Grasscutter;
|
import emu.grasscutter.Grasscutter;
|
||||||
import emu.grasscutter.data.GameData;
|
import emu.grasscutter.data.GameData;
|
||||||
import emu.grasscutter.data.excels.PlayerLevelData;
|
import emu.grasscutter.data.excels.PlayerLevelData;
|
||||||
import emu.grasscutter.data.excels.WeatherData;
|
import emu.grasscutter.data.excels.world.WeatherData;
|
||||||
import emu.grasscutter.database.DatabaseHelper;
|
import emu.grasscutter.database.DatabaseHelper;
|
||||||
import emu.grasscutter.game.Account;
|
import emu.grasscutter.game.Account;
|
||||||
import emu.grasscutter.game.CoopRequest;
|
import emu.grasscutter.game.CoopRequest;
|
||||||
@ -15,6 +15,7 @@ import emu.grasscutter.game.activity.ActivityManager;
|
|||||||
import emu.grasscutter.game.avatar.Avatar;
|
import emu.grasscutter.game.avatar.Avatar;
|
||||||
import emu.grasscutter.game.avatar.AvatarStorage;
|
import emu.grasscutter.game.avatar.AvatarStorage;
|
||||||
import emu.grasscutter.game.battlepass.BattlePassManager;
|
import emu.grasscutter.game.battlepass.BattlePassManager;
|
||||||
|
import emu.grasscutter.game.entity.EntityAvatar;
|
||||||
import emu.grasscutter.game.entity.GameEntity;
|
import emu.grasscutter.game.entity.GameEntity;
|
||||||
import emu.grasscutter.game.expedition.ExpeditionInfo;
|
import emu.grasscutter.game.expedition.ExpeditionInfo;
|
||||||
import emu.grasscutter.game.friends.FriendsList;
|
import emu.grasscutter.game.friends.FriendsList;
|
||||||
@ -44,27 +45,26 @@ import emu.grasscutter.game.props.ClimateType;
|
|||||||
import emu.grasscutter.game.props.PlayerProperty;
|
import emu.grasscutter.game.props.PlayerProperty;
|
||||||
import emu.grasscutter.game.props.WatcherTriggerType;
|
import emu.grasscutter.game.props.WatcherTriggerType;
|
||||||
import emu.grasscutter.game.quest.QuestManager;
|
import emu.grasscutter.game.quest.QuestManager;
|
||||||
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||||
import emu.grasscutter.game.shop.ShopLimit;
|
import emu.grasscutter.game.shop.ShopLimit;
|
||||||
import emu.grasscutter.game.tower.TowerData;
|
import emu.grasscutter.game.tower.TowerData;
|
||||||
import emu.grasscutter.game.tower.TowerManager;
|
import emu.grasscutter.game.tower.TowerManager;
|
||||||
import emu.grasscutter.game.world.Scene;
|
import emu.grasscutter.game.world.Scene;
|
||||||
import emu.grasscutter.game.world.World;
|
import emu.grasscutter.game.world.World;
|
||||||
import emu.grasscutter.net.packet.BasePacket;
|
import emu.grasscutter.net.packet.BasePacket;
|
||||||
|
import emu.grasscutter.net.proto.*;
|
||||||
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
||||||
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
|
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
|
||||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||||
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
||||||
import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType;
|
import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType;
|
||||||
import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo;
|
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.PlayerLocationInfoOuterClass.PlayerLocationInfo;
|
||||||
import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass;
|
|
||||||
import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
|
import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
|
||||||
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
|
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.SocialDetailOuterClass.SocialDetail;
|
||||||
import emu.grasscutter.net.proto.SocialShowAvatarInfoOuterClass;
|
import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason;
|
||||||
import emu.grasscutter.scripts.data.SceneRegion;
|
import emu.grasscutter.scripts.data.SceneRegion;
|
||||||
import emu.grasscutter.server.event.player.PlayerJoinEvent;
|
import emu.grasscutter.server.event.player.PlayerJoinEvent;
|
||||||
import emu.grasscutter.server.event.player.PlayerQuitEvent;
|
import emu.grasscutter.server.event.player.PlayerQuitEvent;
|
||||||
@ -88,6 +88,7 @@ import java.time.ZoneId;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||||
|
|
||||||
@ -116,12 +117,13 @@ public class Player {
|
|||||||
@Getter @Setter private int sceneId;
|
@Getter @Setter private int sceneId;
|
||||||
@Getter @Setter private int regionId;
|
@Getter @Setter private int regionId;
|
||||||
@Getter private int mainCharacterId;
|
@Getter private int mainCharacterId;
|
||||||
@Setter private boolean godmode; // Getter is inGodmode
|
@Getter @Setter private boolean inGodMode;
|
||||||
private boolean stamina; // Getter is getUnlimitedStamina, Setter is setUnlimitedStamina
|
@Getter @Setter private boolean unlimitedStamina;
|
||||||
|
|
||||||
@Getter private Set<Integer> nameCardList;
|
@Getter private Set<Integer> nameCardList;
|
||||||
@Getter private Set<Integer> flyCloakList;
|
@Getter private Set<Integer> flyCloakList;
|
||||||
@Getter private Set<Integer> costumeList;
|
@Getter private Set<Integer> costumeList;
|
||||||
|
@Getter private Set<Integer> personalLineList;
|
||||||
@Getter @Setter private Set<Integer> rewardedLevels;
|
@Getter @Setter private Set<Integer> rewardedLevels;
|
||||||
@Getter @Setter private Set<Integer> homeRewardedLevels;
|
@Getter @Setter private Set<Integer> homeRewardedLevels;
|
||||||
@Getter @Setter private Set<Integer> realmList;
|
@Getter @Setter private Set<Integer> realmList;
|
||||||
@ -205,7 +207,11 @@ public class Player {
|
|||||||
@Getter @Setter private int nextResinRefresh;
|
@Getter @Setter private int nextResinRefresh;
|
||||||
@Getter @Setter private int resinBuyCount;
|
@Getter @Setter private int resinBuyCount;
|
||||||
@Getter @Setter private int lastDailyReset;
|
@Getter @Setter private int lastDailyReset;
|
||||||
@Getter private transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY; // TODO
|
@Getter private transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY;
|
||||||
|
@Getter private long playerGameTime = 0;
|
||||||
|
|
||||||
|
@Getter private PlayerProgress playerProgress;
|
||||||
|
@Getter private Set<Integer> activeQuestTimers;
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"}) // Morphia only!
|
@SuppressWarnings({"rawtypes", "unchecked"}) // Morphia only!
|
||||||
@ -250,6 +256,8 @@ public class Player {
|
|||||||
this.unlockedSceneAreas = new HashMap<>();
|
this.unlockedSceneAreas = new HashMap<>();
|
||||||
this.unlockedScenePoints = new HashMap<>();
|
this.unlockedScenePoints = new HashMap<>();
|
||||||
this.chatEmojiIdList = new ArrayList<>();
|
this.chatEmojiIdList = new ArrayList<>();
|
||||||
|
this.playerProgress = new PlayerProgress();
|
||||||
|
this.activeQuestTimers = new HashSet<>();
|
||||||
|
|
||||||
this.attackResults = new LinkedBlockingQueue<>();
|
this.attackResults = new LinkedBlockingQueue<>();
|
||||||
this.coopRequests = new Int2ObjectOpenHashMap<>();
|
this.coopRequests = new Int2ObjectOpenHashMap<>();
|
||||||
@ -316,6 +324,18 @@ public class Player {
|
|||||||
this.satiationManager = new SatiationManager(this);
|
this.satiationManager = new SatiationManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the player's game time if it has changed.
|
||||||
|
*
|
||||||
|
* @param gameTime The new game time.
|
||||||
|
*/
|
||||||
|
public void updatePlayerGameTime(long gameTime) {
|
||||||
|
if (this.playerGameTime == gameTime) return;
|
||||||
|
this.playerGameTime = gameTime;
|
||||||
|
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
public int getUid() {
|
public int getUid() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@ -456,6 +476,8 @@ public class Player {
|
|||||||
|
|
||||||
// Handle open state unlocks from level-up.
|
// Handle open state unlocks from level-up.
|
||||||
this.getProgressManager().tryUnlockOpenStates();
|
this.getProgressManager().tryUnlockOpenStates();
|
||||||
|
this.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_PLAYER_LEVEL_UP, level);
|
||||||
|
this.getQuestManager().queueEvent(QuestCond.QUEST_COND_PLAYER_LEVEL_EQUAL_GREATER, level);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -523,6 +545,7 @@ public class Player {
|
|||||||
public boolean setHomeCoin(int coin) {
|
public boolean setHomeCoin(int coin) {
|
||||||
return this.setProperty(PlayerProperty.PROP_PLAYER_HOME_COIN, coin);
|
return this.setProperty(PlayerProperty.PROP_PLAYER_HOME_COIN, coin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getExpRequired(int level) {
|
private int getExpRequired(int level) {
|
||||||
PlayerLevelData levelData = GameData.getPlayerLevelDataMap().get(level);
|
PlayerLevelData levelData = GameData.getPlayerLevelDataMap().get(level);
|
||||||
return levelData != null ? levelData.getExp() : 0;
|
return levelData != null ? levelData.getExp() : 0;
|
||||||
@ -596,11 +619,12 @@ public class Player {
|
|||||||
|
|
||||||
public void onEnterRegion(SceneRegion region) {
|
public void onEnterRegion(SceneRegion region) {
|
||||||
getQuestManager().forEachActiveQuest(quest -> {
|
getQuestManager().forEachActiveQuest(quest -> {
|
||||||
if (quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
|
if (quest.getTriggerData() != null && quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
|
||||||
// If trigger hasn't been fired yet
|
// 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());
|
//getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
|
||||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("ENTER_REGION_"+ region.config_id).getId(),0);
|
getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
|
||||||
|
quest.getTriggerData().get("ENTER_REGION_" + region.config_id).getId(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -613,7 +637,8 @@ public class Player {
|
|||||||
// If trigger hasn't been fired yet
|
// 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());
|
getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
|
||||||
getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("LEAVE_REGION_"+ region.config_id).getId(),0);
|
getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
|
||||||
|
quest.getTriggerData().get("LEAVE_REGION_" + region.config_id).getId(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -705,9 +730,7 @@ public class Player {
|
|||||||
} else {
|
} else {
|
||||||
moonCardDuration += 30;
|
moonCardDuration += 30;
|
||||||
}
|
}
|
||||||
if (!moonCardGetTimes.contains(moonCardStartTime)) {
|
|
||||||
moonCardGetTimes.add(moonCardStartTime);
|
moonCardGetTimes.add(moonCardStartTime);
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -776,18 +799,6 @@ public class Player {
|
|||||||
this.save();
|
this.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getUnlimitedStamina() {
|
|
||||||
return stamina;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUnlimitedStamina(boolean stamina) {
|
|
||||||
this.stamina = stamina;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean inGodmode() {
|
|
||||||
return godmode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasSentLoginPackets() {
|
public boolean hasSentLoginPackets() {
|
||||||
return hasSentLoginPackets;
|
return hasSentLoginPackets;
|
||||||
}
|
}
|
||||||
@ -819,6 +830,85 @@ public class Player {
|
|||||||
addAvatar(avatar, true);
|
addAvatar(avatar, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addAvatar(int avatarId) {
|
||||||
|
// I dont see why we cant do this lolz
|
||||||
|
addAvatar(new Avatar(avatarId), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Integer> getTrialAvatarParam (int trialAvatarId) {
|
||||||
|
if (GameData.getTrialAvatarCustomData().isEmpty()) { // use default data if custom data not available
|
||||||
|
if (GameData.getTrialAvatarDataMap().get(trialAvatarId) == null) return List.of();
|
||||||
|
|
||||||
|
return GameData.getTrialAvatarDataMap().get(trialAvatarId)
|
||||||
|
.getTrialAvatarParamList();
|
||||||
|
}
|
||||||
|
// use custom data
|
||||||
|
if (GameData.getTrialAvatarCustomData().get(trialAvatarId) == null) return List.of();
|
||||||
|
|
||||||
|
var trialCustomParams = GameData.getTrialAvatarCustomData().get(trialAvatarId).getTrialAvatarParamList();
|
||||||
|
return trialCustomParams.isEmpty() ? List.of() : Stream.of(trialCustomParams.get(0).split(";")).map(Integer::parseInt).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean addTrialAvatar(int trialAvatarId, GrantReason reason, int questMainId){
|
||||||
|
List<Integer> trialAvatarBasicParam = getTrialAvatarParam(trialAvatarId);
|
||||||
|
if (trialAvatarBasicParam.isEmpty()) return false;
|
||||||
|
|
||||||
|
Avatar avatar = new Avatar(trialAvatarBasicParam.get(0));
|
||||||
|
if (avatar.getAvatarData() == null || !hasSentLoginPackets()) return false;
|
||||||
|
|
||||||
|
avatar.setOwner(this);
|
||||||
|
// Add trial weapons and relics
|
||||||
|
avatar.setTrialAvatarInfo(trialAvatarBasicParam.get(1), trialAvatarId, reason, questMainId);
|
||||||
|
avatar.equipTrialItems();
|
||||||
|
// Recalc stats
|
||||||
|
avatar.recalcStats();
|
||||||
|
|
||||||
|
// Packet, mimic official server behaviour, add to player's bag but not saving to db
|
||||||
|
sendPacket(new PacketAvatarAddNotify(avatar, false));
|
||||||
|
// add to avatar to temporary trial team
|
||||||
|
getTeamManager().addAvatarToTrialTeam(avatar);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean addTrialAvatarForQuest(int trialAvatarId, int questMainId) {
|
||||||
|
// TODO: Find method for 'setupTrialAvatarTeamForQuest'.
|
||||||
|
getTeamManager().setupTrialAvatars(true);
|
||||||
|
if (!addTrialAvatar(
|
||||||
|
trialAvatarId,
|
||||||
|
GrantReason.GRANT_REASON_BY_QUEST,
|
||||||
|
questMainId)) return false;
|
||||||
|
getTeamManager().trialAvatarTeamPostUpdate();
|
||||||
|
// Packet, mimic official server behaviour, neccessary to stop player from modifying team
|
||||||
|
sendPacket(new PacketAvatarTeamUpdateNotify(this));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addTrialAvatarsForActivity(List<Integer> trialAvatarIds) {
|
||||||
|
getTeamManager().setupTrialAvatars(false);
|
||||||
|
trialAvatarIds.forEach(trialAvatarId -> addTrialAvatar(
|
||||||
|
trialAvatarId,
|
||||||
|
GrantReason.GRANT_REASON_BY_TRIAL_AVATAR_ACTIVITY,
|
||||||
|
0));
|
||||||
|
getTeamManager().trialAvatarTeamPostUpdate(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeTrialAvatarForQuest(int trialAvatarId) {
|
||||||
|
if (!getTeamManager().isUsingTrialTeam()) return false;
|
||||||
|
|
||||||
|
sendPacket(new PacketAvatarDelNotify(List.of(getTeamManager().getTrialAvatarGuid(trialAvatarId))));
|
||||||
|
getTeamManager().removeTrialAvatarTeam(trialAvatarId);
|
||||||
|
sendPacket(new PacketAvatarTeamUpdateNotify());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeTrialAvatarForActivity() {
|
||||||
|
if (!getTeamManager().isUsingTrialTeam()) return;
|
||||||
|
|
||||||
|
sendPacket(new PacketAvatarDelNotify(getTeamManager().getActiveTeam().stream()
|
||||||
|
.map(x -> x.getAvatar().getGuid()).toList()));
|
||||||
|
getTeamManager().removeTrialAvatarTeam();
|
||||||
|
}
|
||||||
|
|
||||||
public void addFlycloak(int flycloakId) {
|
public void addFlycloak(int flycloakId) {
|
||||||
this.getFlyCloakList().add(flycloakId);
|
this.getFlyCloakList().add(flycloakId);
|
||||||
this.sendPacket(new PacketAvatarGainFlycloakNotify(flycloakId));
|
this.sendPacket(new PacketAvatarGainFlycloakNotify(flycloakId));
|
||||||
@ -829,6 +919,11 @@ public class Player {
|
|||||||
this.sendPacket(new PacketAvatarGainCostumeNotify(costumeId));
|
this.sendPacket(new PacketAvatarGainCostumeNotify(costumeId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addPersonalLine(int personalLineId) {
|
||||||
|
this.getPersonalLineList().add(personalLineId);
|
||||||
|
session.getPlayer().getQuestManager().queueEvent(QuestCond.QUEST_COND_PERSONAL_LINE_UNLOCK, personalLineId);
|
||||||
|
}
|
||||||
|
|
||||||
public void addNameCard(int nameCardId) {
|
public void addNameCard(int nameCardId) {
|
||||||
this.getNameCardList().add(nameCardId);
|
this.getNameCardList().add(nameCardId);
|
||||||
this.sendPacket(new PacketUnlockNameCardNotify(nameCardId));
|
this.sendPacket(new PacketUnlockNameCardNotify(nameCardId));
|
||||||
@ -844,6 +939,11 @@ public class Player {
|
|||||||
this.sendPacket(new PacketSetNameCardRsp(nameCardId));
|
this.sendPacket(new PacketSetNameCardRsp(nameCardId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to this player.
|
||||||
|
*
|
||||||
|
* @param message The message to send.
|
||||||
|
*/
|
||||||
public void dropMessage(Object message) {
|
public void dropMessage(Object message) {
|
||||||
if (this.messageHandler != null) {
|
if (this.messageHandler != null) {
|
||||||
this.messageHandler.append(message.toString());
|
this.messageHandler.append(message.toString());
|
||||||
@ -853,6 +953,46 @@ public class Player {
|
|||||||
this.getServer().getChatSystem().sendPrivateMessageFromServer(getUid(), message.toString());
|
this.getServer().getChatSystem().sendPrivateMessageFromServer(getUid(), message.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAvatarsAbilityForScene(Scene scene) {
|
||||||
|
try {
|
||||||
|
var levelEntityConfig = scene.getSceneData().getLevelEntityConfig();
|
||||||
|
var config = GameData.getConfigLevelEntityDataMap().get(levelEntityConfig);
|
||||||
|
if (config == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> avatarIds = scene.getSceneData().getSpecifiedAvatarList();
|
||||||
|
List<EntityAvatar> specifiedAvatarList = getTeamManager().getActiveTeam();
|
||||||
|
|
||||||
|
if (avatarIds != null && avatarIds.size() > 0){
|
||||||
|
// certain scene could limit specifc avatars' entry
|
||||||
|
specifiedAvatarList.clear();
|
||||||
|
for (int id : avatarIds){
|
||||||
|
var avatar = getAvatars().getAvatarById(id);
|
||||||
|
if (avatar == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
specifiedAvatarList.add(new EntityAvatar(scene, avatar));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (EntityAvatar entityAvatar : specifiedAvatarList){
|
||||||
|
var avatarData = entityAvatar.getAvatar().getAvatarData();
|
||||||
|
if (avatarData == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
avatarData.buildEmbryo();
|
||||||
|
if (config.getAvatarAbilities() == null){
|
||||||
|
continue; // continue and not break because has to rebuild ability for the next avatar if any
|
||||||
|
}
|
||||||
|
for (var abilities : config.getAvatarAbilities()){
|
||||||
|
avatarData.getAbilities().add(Utils.abilityHash(abilities.getAbilityName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
Grasscutter.getLogger().error("Error applying level entity config for scene {}", scene.getSceneData().getId(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Sends a message to another player.
|
* Sends a message to another player.
|
||||||
*
|
*
|
||||||
@ -865,7 +1005,9 @@ public class Player {
|
|||||||
|
|
||||||
// ---------------------MAIL------------------------
|
// ---------------------MAIL------------------------
|
||||||
|
|
||||||
public List<Mail> getAllMail() { return this.getMailHandler().getMail(); }
|
public List<Mail> getAllMail() {
|
||||||
|
return this.getMailHandler().getMail();
|
||||||
|
}
|
||||||
|
|
||||||
public void sendMail(Mail message) {
|
public void sendMail(Mail message) {
|
||||||
this.getMailHandler().sendMail(message);
|
this.getMailHandler().sendMail(message);
|
||||||
@ -875,7 +1017,9 @@ public class Player {
|
|||||||
return this.getMailHandler().deleteMail(mailId);
|
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) {
|
public int getMailId(Mail message) {
|
||||||
return this.getMailHandler().getMailIndex(message);
|
return this.getMailHandler().getMailIndex(message);
|
||||||
@ -968,7 +1112,7 @@ public class Player {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SocialDetail.Builder social = SocialDetail.newBuilder()
|
return SocialDetail.newBuilder()
|
||||||
.setUid(this.getUid())
|
.setUid(this.getUid())
|
||||||
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
|
.setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
|
||||||
.setNickname(this.getNickname())
|
.setNickname(this.getNickname())
|
||||||
@ -982,7 +1126,6 @@ public class Player {
|
|||||||
.addAllShowNameCardIdList(this.getShowNameCardInfoList())
|
.addAllShowNameCardIdList(this.getShowNameCardInfoList())
|
||||||
.setFinishAchievementNum(this.getFinishedAchievementNum())
|
.setFinishAchievementNum(this.getFinishedAchievementNum())
|
||||||
.setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
|
.setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
|
||||||
return social;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getFinishedAchievementNum() {
|
public int getFinishedAchievementNum() {
|
||||||
@ -1121,6 +1264,8 @@ public class Player {
|
|||||||
|
|
||||||
// Home resources
|
// Home resources
|
||||||
this.getHome().updateHourlyResources(this);
|
this.getHome().updateHourlyResources(this);
|
||||||
|
|
||||||
|
this.getQuestManager().onTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void doDailyReset() {
|
private synchronized void doDailyReset() {
|
||||||
@ -1189,12 +1334,17 @@ public class Player {
|
|||||||
this.achievements = Achievements.getByPlayer(this);
|
this.achievements = Achievements.getByPlayer(this);
|
||||||
this.getAvatars().loadFromDatabase();
|
this.getAvatars().loadFromDatabase();
|
||||||
this.getInventory().loadFromDatabase();
|
this.getInventory().loadFromDatabase();
|
||||||
this.loadBattlePassManager(); // Call before avatar postLoad to avoid null pointer
|
|
||||||
this.getAvatars().postLoad(); // Needs to be called after inventory is handled
|
|
||||||
|
|
||||||
this.getFriendsList().loadFromDatabase();
|
this.getFriendsList().loadFromDatabase();
|
||||||
this.getMailHandler().loadFromDatabase();
|
this.getMailHandler().loadFromDatabase();
|
||||||
this.getQuestManager().loadFromDatabase();
|
this.getQuestManager().loadFromDatabase();
|
||||||
|
|
||||||
|
this.loadBattlePassManager();
|
||||||
|
this.getAvatars().postLoad(); // Needs to be called after inventory is handled
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerBorn() {
|
||||||
|
getQuestManager().onPlayerBorn();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onLogin() {
|
public void onLogin() {
|
||||||
@ -1274,7 +1424,8 @@ public class Player {
|
|||||||
session.setState(SessionState.ACTIVE);
|
session.setState(SessionState.ACTIVE);
|
||||||
|
|
||||||
// Call join event.
|
// 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.
|
if (event.isCanceled()) { // If event is not cancelled, continue.
|
||||||
session.close();
|
session.close();
|
||||||
return;
|
return;
|
||||||
@ -1313,7 +1464,8 @@ public class Player {
|
|||||||
this.getFriendsList().save();
|
this.getFriendsList().save();
|
||||||
|
|
||||||
// Call quit event.
|
// Call quit event.
|
||||||
PlayerQuitEvent event = new PlayerQuitEvent(this); event.call();
|
PlayerQuitEvent event = new PlayerQuitEvent(this);
|
||||||
|
event.call();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Grasscutter.getLogger().warn("Player (UID {}) save failure", getUid());
|
Grasscutter.getLogger().warn("Player (UID {}) save failure", getUid());
|
||||||
@ -1332,23 +1484,15 @@ public class Player {
|
|||||||
public int getLegendaryKey() {
|
public int getLegendaryKey() {
|
||||||
return this.getProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY);
|
return this.getProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void addLegendaryKey(int count) {
|
public synchronized void addLegendaryKey(int count) {
|
||||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() + count);
|
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() + count);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void useLegendaryKey(int count) {
|
public synchronized void useLegendaryKey(int count) {
|
||||||
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() - 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) {
|
public int getPropertyMin(PlayerProperty prop) {
|
||||||
if (prop.isDynamicRange()) {
|
if (prop.isDynamicRange()) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -1391,4 +1535,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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,8 @@ public class QuestManager extends BasePlayerManager {
|
|||||||
quest.checkProgress();
|
quest.checkProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getActivityManager().triggerActivityConditions();
|
if (this.player.getActivityManager() != null)
|
||||||
|
this.player.getActivityManager().triggerActivityConditions();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onTick(){
|
public void onTick(){
|
||||||
@ -144,6 +145,7 @@ public class QuestManager extends BasePlayerManager {
|
|||||||
|
|
||||||
this.lastDayCheck = currentDays;
|
this.lastDayCheck = currentDays;
|
||||||
this.lastHourCheck = currentHours;
|
this.lastHourCheck = currentHours;
|
||||||
|
|
||||||
player.getActiveQuestTimers().forEach(mainQuestId -> {
|
player.getActiveQuestTimers().forEach(mainQuestId -> {
|
||||||
if(checkHours) {
|
if(checkHours) {
|
||||||
queueEvent(QuestCond.QUEST_COND_TIME_VAR_GT_EQ, mainQuestId);
|
queueEvent(QuestCond.QUEST_COND_TIME_VAR_GT_EQ, mainQuestId);
|
||||||
|
@ -7,9 +7,9 @@ import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
|||||||
|
|
||||||
public class PacketPlayerSetPauseRsp extends BasePacket {
|
public class PacketPlayerSetPauseRsp extends BasePacket {
|
||||||
|
|
||||||
public PacketPlayerSetPauseRsp() {
|
public PacketPlayerSetPauseRsp(int clientSequence) {
|
||||||
super(PacketOpcodes.PlayerSetPauseRsp);
|
super(PacketOpcodes.PlayerSetPauseRsp);
|
||||||
|
|
||||||
this.setData(PlayerSetPauseRsp.newBuilder().setRetcode(Retcode.RET_SUCC_VALUE));
|
this.buildHeader(clientSequence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user