mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-27 19:05:09 +00:00
sanity check
This commit is contained in:
parent
6350d83ad0
commit
25111ed907
@ -1,7 +1,5 @@
|
|||||||
package emu.grasscutter.game;
|
package emu.grasscutter.game;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import dev.morphia.annotations.*;
|
import dev.morphia.annotations.*;
|
||||||
import emu.grasscutter.GenshinConstants;
|
import emu.grasscutter.GenshinConstants;
|
||||||
import emu.grasscutter.Grasscutter;
|
import emu.grasscutter.Grasscutter;
|
||||||
@ -23,7 +21,6 @@ import emu.grasscutter.game.props.ActionReason;
|
|||||||
import emu.grasscutter.game.props.PlayerProperty;
|
import emu.grasscutter.game.props.PlayerProperty;
|
||||||
import emu.grasscutter.net.packet.GenshinPacket;
|
import emu.grasscutter.net.packet.GenshinPacket;
|
||||||
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
||||||
import emu.grasscutter.net.proto.BirthdayOuterClass.Birthday;
|
|
||||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||||
import emu.grasscutter.net.proto.HeadImageOuterClass.HeadImage;
|
import emu.grasscutter.net.proto.HeadImageOuterClass.HeadImage;
|
||||||
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
|
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
|
||||||
@ -35,34 +32,13 @@ import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
|||||||
import emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo;
|
import emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo;
|
||||||
import emu.grasscutter.server.game.GameServer;
|
import emu.grasscutter.server.game.GameServer;
|
||||||
import emu.grasscutter.server.game.GameSession;
|
import emu.grasscutter.server.game.GameSession;
|
||||||
import emu.grasscutter.server.packet.send.PacketAbilityInvocationsNotify;
|
import emu.grasscutter.server.packet.send.*;
|
||||||
import emu.grasscutter.server.packet.send.PacketAvatarAddNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketAvatarDataNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketAvatarGainCostumeNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketAvatarGainFlycloakNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketClientAbilityInitFinishNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketCombatInvocationsNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketOpenStateUpdateNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpResultNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerDataNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerPropNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerStoreNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPrivateChatNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketPlayerLevelRewardUpdateNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketSetNameCardRsp;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketStoreWeightLimitNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketUnlockNameCardNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketWorldPlayerLocationNotify;
|
|
||||||
import emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify;
|
|
||||||
import emu.grasscutter.utils.Position;
|
import emu.grasscutter.utils.Position;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@Entity(value = "players", useDiscriminator = false)
|
@Entity(value = "players", useDiscriminator = false)
|
||||||
public class GenshinPlayer {
|
public class GenshinPlayer {
|
||||||
@Id private int id;
|
@Id private int id;
|
||||||
@ -115,7 +91,8 @@ public class GenshinPlayer {
|
|||||||
@Transient private final InvokeHandler<AbilityInvokeEntry> abilityInvokeHandler;
|
@Transient private final InvokeHandler<AbilityInvokeEntry> abilityInvokeHandler;
|
||||||
@Transient private final InvokeHandler<AbilityInvokeEntry> clientAbilityInitFinishHandler;
|
@Transient private final InvokeHandler<AbilityInvokeEntry> clientAbilityInitFinishHandler;
|
||||||
|
|
||||||
@Deprecated @SuppressWarnings({ "rawtypes", "unchecked" }) // Morphia only!
|
@Deprecated
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"}) // Morphia only!
|
||||||
public GenshinPlayer() {
|
public GenshinPlayer() {
|
||||||
this.inventory = new Inventory(this);
|
this.inventory = new Inventory(this);
|
||||||
this.avatars = new AvatarStorage(this);
|
this.avatars = new AvatarStorage(this);
|
||||||
@ -584,7 +561,8 @@ public class GenshinPlayer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a message to another player.
|
* Sends a message to another player.
|
||||||
* @param sender The sender of the message.
|
*
|
||||||
|
* @param sender The sender of the message.
|
||||||
* @param message The message to send.
|
* @param message The message to send.
|
||||||
*/
|
*/
|
||||||
public void sendMessage(GenshinPlayer sender, Object message) {
|
public void sendMessage(GenshinPlayer sender, Object message) {
|
||||||
@ -633,13 +611,13 @@ public class GenshinPlayer {
|
|||||||
|
|
||||||
public OnlinePlayerInfo getOnlinePlayerInfo() {
|
public OnlinePlayerInfo getOnlinePlayerInfo() {
|
||||||
OnlinePlayerInfo.Builder onlineInfo = OnlinePlayerInfo.newBuilder()
|
OnlinePlayerInfo.Builder onlineInfo = OnlinePlayerInfo.newBuilder()
|
||||||
.setUid(this.getUid())
|
.setUid(this.getUid())
|
||||||
.setNickname(this.getNickname())
|
.setNickname(this.getNickname())
|
||||||
.setPlayerLevel(this.getLevel())
|
.setPlayerLevel(this.getLevel())
|
||||||
.setMpSettingType(this.getMpSetting())
|
.setMpSettingType(this.getMpSetting())
|
||||||
.setNameCardId(this.getNameCardId())
|
.setNameCardId(this.getNameCardId())
|
||||||
.setSignature(this.getSignature())
|
.setSignature(this.getSignature())
|
||||||
.setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage()));
|
.setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage()));
|
||||||
|
|
||||||
if (this.getWorld() != null) {
|
if (this.getWorld() != null) {
|
||||||
onlineInfo.setCurPlayerNumInWorld(this.getWorld().getPlayers().indexOf(this) + 1);
|
onlineInfo.setCurPlayerNumInWorld(this.getWorld().getPlayers().indexOf(this) + 1);
|
||||||
@ -650,7 +628,7 @@ public class GenshinPlayer {
|
|||||||
return onlineInfo.build();
|
return onlineInfo.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerBirthday getBirthday(){
|
public PlayerBirthday getBirthday() {
|
||||||
return this.birthday;
|
return this.birthday;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -659,6 +637,10 @@ public class GenshinPlayer {
|
|||||||
this.updateProfile();
|
this.updateProfile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasBirthday() {
|
||||||
|
return this.birthday.getDay() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
public Set<Integer> getRewardedLevels() {
|
public Set<Integer> getRewardedLevels() {
|
||||||
return rewardedLevels;
|
return rewardedLevels;
|
||||||
}
|
}
|
||||||
@ -668,34 +650,16 @@ public class GenshinPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public SocialDetail.Builder getSocialDetail() {
|
public SocialDetail.Builder getSocialDetail() {
|
||||||
SocialDetail.Builder social = SocialDetail.newBuilder()
|
SocialDetail.Builder social = SocialDetail.newBuilder().setUid(this.getUid()).setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage())).setNickname(this.getNickname()).setSignature(this.getSignature()).setLevel(this.getLevel()).setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty()).setWorldLevel(this.getWorldLevel()).setUnk1(1).setUnk3(1).setNameCardId(this.getNameCardId()).setFinishAchievementNum(0);
|
||||||
.setUid(this.getUid())
|
|
||||||
.setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage()))
|
|
||||||
.setNickname(this.getNickname())
|
|
||||||
.setSignature(this.getSignature())
|
|
||||||
.setLevel(this.getLevel())
|
|
||||||
.setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty())
|
|
||||||
.setWorldLevel(this.getWorldLevel())
|
|
||||||
.setUnk1(1)
|
|
||||||
.setUnk3(1)
|
|
||||||
.setNameCardId(this.getNameCardId())
|
|
||||||
.setFinishAchievementNum(0);
|
|
||||||
return social;
|
return social;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldPlayerLocationInfo getWorldPlayerLocationInfo() {
|
public WorldPlayerLocationInfo getWorldPlayerLocationInfo() {
|
||||||
return WorldPlayerLocationInfo.newBuilder()
|
return WorldPlayerLocationInfo.newBuilder().setSceneId(this.getSceneId()).setPlayerLoc(this.getPlayerLocationInfo()).build();
|
||||||
.setSceneId(this.getSceneId())
|
|
||||||
.setPlayerLoc(this.getPlayerLocationInfo())
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerLocationInfo getPlayerLocationInfo() {
|
public PlayerLocationInfo getPlayerLocationInfo() {
|
||||||
return PlayerLocationInfo.newBuilder()
|
return PlayerLocationInfo.newBuilder().setUid(this.getUid()).setPos(this.getPos().toProto()).setRot(this.getRotation().toProto()).build();
|
||||||
.setUid(this.getUid())
|
|
||||||
.setPos(this.getPos().toProto())
|
|
||||||
.setRot(this.getRotation().toProto())
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void onTick() {
|
public synchronized void onTick() {
|
||||||
@ -745,7 +709,8 @@ public class GenshinPlayer {
|
|||||||
// Make sure these exist
|
// Make sure these exist
|
||||||
if (this.getTeamManager() == null) {
|
if (this.getTeamManager() == null) {
|
||||||
this.teamManager = new TeamManager(this);
|
this.teamManager = new TeamManager(this);
|
||||||
} if (this.getProfile().getUid() == 0) {
|
}
|
||||||
|
if (this.getProfile().getUid() == 0) {
|
||||||
this.getProfile().syncWithCharacter(this);
|
this.getProfile().syncWithCharacter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -810,7 +775,7 @@ public class GenshinPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum SceneLoadState {
|
public enum SceneLoadState {
|
||||||
NONE (0), LOADING (1), INIT (2), LOADED (3);
|
NONE(0), LOADING(1), INIT(2), LOADED(3);
|
||||||
|
|
||||||
private final int value;
|
private final int value;
|
||||||
|
|
||||||
|
@ -11,23 +11,57 @@ import emu.grasscutter.server.packet.send.PacketSetPlayerBirthdayRsp;
|
|||||||
|
|
||||||
@Opcodes(PacketOpcodes.SetPlayerBirthdayReq)
|
@Opcodes(PacketOpcodes.SetPlayerBirthdayReq)
|
||||||
public class HandlerSetPlayerBirthdayReq extends PacketHandler {
|
public class HandlerSetPlayerBirthdayReq extends PacketHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
SetPlayerBirthdayReq req = SetPlayerBirthdayReq.parseFrom(payload);
|
SetPlayerBirthdayReq req = SetPlayerBirthdayReq.parseFrom(payload);
|
||||||
|
|
||||||
if (req.getBirthday().getDay() > 0 && req.getBirthday().getMonth() > 0) {
|
// RET_BIRTHDAY_CANNOT_BE_SET_TWICE = 7009
|
||||||
int day = req.getBirthday().getDay();
|
if (session.getPlayer().hasBirthday()) {
|
||||||
int month = req.getBirthday().getMonth();
|
session.send(new PacketSetPlayerBirthdayRsp(7009));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Update birthday value
|
int month = req.getBirthday().getMonth();
|
||||||
session.getPlayer().setBirthday(day, month);
|
int day = req.getBirthday().getDay();
|
||||||
|
|
||||||
// Save birthday month and day
|
// RET_BIRTHDAY_FORMAT_ERROR = 7022
|
||||||
session.getPlayer().save();
|
if (!isValidBirthday(month, day)) {
|
||||||
SocialDetail.Builder detail = session.getPlayer().getSocialDetail();
|
session.send(new PacketSetPlayerBirthdayRsp(7022));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update birthday value
|
||||||
|
session.getPlayer().setBirthday(day, month);
|
||||||
|
|
||||||
|
// Save birthday month and day
|
||||||
|
session.getPlayer().save();
|
||||||
|
SocialDetail.Builder detail = session.getPlayer().getSocialDetail();
|
||||||
|
|
||||||
|
session.send(new PacketSetPlayerBirthdayRsp(session.getPlayer()));
|
||||||
|
session.send(new PacketGetPlayerSocialDetailRsp(detail));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidBirthday(int month, int day) {
|
||||||
|
|
||||||
|
switch (month) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
case 10:
|
||||||
|
case 12:
|
||||||
|
return day > 0 & day <= 31;
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 9:
|
||||||
|
case 11:
|
||||||
|
return day > 0 && day <= 30;
|
||||||
|
case 2:
|
||||||
|
return day > 0 & day <= 29;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
session.send(new PacketSetPlayerBirthdayRsp(session.getPlayer()));
|
|
||||||
session.send(new PacketGetPlayerSocialDetailRsp(detail));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,24 @@ import emu.grasscutter.net.packet.PacketOpcodes;
|
|||||||
import emu.grasscutter.net.proto.SetPlayerBirthdayRspOuterClass.SetPlayerBirthdayRsp;
|
import emu.grasscutter.net.proto.SetPlayerBirthdayRspOuterClass.SetPlayerBirthdayRsp;
|
||||||
|
|
||||||
public class PacketSetPlayerBirthdayRsp extends GenshinPacket {
|
public class PacketSetPlayerBirthdayRsp extends GenshinPacket {
|
||||||
public PacketSetPlayerBirthdayRsp(GenshinPlayer player) {
|
|
||||||
super(PacketOpcodes.SetPlayerBirthdayRsp);
|
|
||||||
|
|
||||||
SetPlayerBirthdayRsp proto = SetPlayerBirthdayRsp.newBuilder()
|
public PacketSetPlayerBirthdayRsp(int retCode) {
|
||||||
.setBirthday(player.getBirthday().toProto())
|
super(PacketOpcodes.SetPlayerBirthdayRsp);
|
||||||
.build();
|
|
||||||
|
|
||||||
this.setData(proto);
|
SetPlayerBirthdayRsp proto = SetPlayerBirthdayRsp.newBuilder()
|
||||||
}
|
.setRetcode(retCode)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
this.setData(proto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketSetPlayerBirthdayRsp(GenshinPlayer player) {
|
||||||
|
super(PacketOpcodes.SetPlayerBirthdayRsp);
|
||||||
|
|
||||||
|
SetPlayerBirthdayRsp proto = SetPlayerBirthdayRsp.newBuilder()
|
||||||
|
.setBirthday(player.getBirthday().toProto())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
this.setData(proto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user