mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-16 17:05:20 +01:00
Merge remote-tracking branch 'upstream/development' into dev-mail
This commit is contained in:
@@ -35,7 +35,30 @@ import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo;
|
||||
import emu.grasscutter.server.game.GameServer;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
import emu.grasscutter.server.packet.send.PacketAbilityInvocationsNotify;
|
||||
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.server.packet.send.PacketMailChangeNotify;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
@@ -75,6 +98,7 @@ public class GenshinPlayer {
|
||||
private MpSettingType mpSetting = MpSettingType.MpSettingEnterAfterApply;
|
||||
private boolean showAvatar;
|
||||
private ArrayList<AvatarProfileData> shownAvatars;
|
||||
private Set<Integer> rewardedLevels;
|
||||
private ArrayList<Mail> mail;
|
||||
|
||||
private int sceneId;
|
||||
@@ -125,6 +149,7 @@ public class GenshinPlayer {
|
||||
this.clientAbilityInitFinishHandler = new InvokeHandler(PacketClientAbilityInitFinishNotify.class);
|
||||
|
||||
this.birthday = new PlayerBirthday();
|
||||
this.rewardedLevels = new HashSet<>();
|
||||
}
|
||||
|
||||
// On player creation
|
||||
@@ -648,6 +673,14 @@ public class GenshinPlayer {
|
||||
this.updateProfile();
|
||||
}
|
||||
|
||||
public Set<Integer> getRewardedLevels() {
|
||||
return rewardedLevels;
|
||||
}
|
||||
|
||||
public void setRewardedLevels(Set<Integer> rewardedLevels) {
|
||||
this.rewardedLevels = rewardedLevels;
|
||||
}
|
||||
|
||||
public SocialDetail.Builder getSocialDetail() {
|
||||
SocialDetail.Builder social = SocialDetail.newBuilder()
|
||||
.setUid(this.getUid())
|
||||
@@ -765,6 +798,7 @@ public class GenshinPlayer {
|
||||
session.send(new PacketAvatarDataNotify(this));
|
||||
|
||||
session.send(new PacketPlayerEnterSceneNotify(this)); // Enter game world
|
||||
session.send(new PacketPlayerLevelRewardUpdateNotify(rewardedLevels));
|
||||
session.send(new PacketOpenStateUpdateNotify());
|
||||
|
||||
// First notify packets sent
|
||||
|
||||
@@ -89,6 +89,12 @@ public class GenshinAvatar {
|
||||
private int flyCloak;
|
||||
private int costume;
|
||||
private int bornTime;
|
||||
|
||||
private int fetterLevel = 1;
|
||||
private int fetterExp;
|
||||
|
||||
private int nameCardRewardId;
|
||||
private int nameCardId;
|
||||
|
||||
public GenshinAvatar() {
|
||||
// Morhpia only!
|
||||
@@ -107,6 +113,8 @@ public class GenshinAvatar {
|
||||
public GenshinAvatar(AvatarData data) {
|
||||
this();
|
||||
this.avatarId = data.getId();
|
||||
this.nameCardRewardId = data.getNameCardRewardId();
|
||||
this.nameCardId = data.getNameCardId();
|
||||
this.data = data;
|
||||
this.bornTime = (int) (System.currentTimeMillis() / 1000);
|
||||
this.flyCloak = 140001;
|
||||
@@ -169,6 +177,14 @@ public class GenshinAvatar {
|
||||
this.satiation = satiation;
|
||||
}
|
||||
|
||||
public int getNameCardRewardId() {
|
||||
return nameCardRewardId;
|
||||
}
|
||||
|
||||
public void setNameCardRewardId(int nameCardRewardId) {
|
||||
this.nameCardRewardId = nameCardRewardId;
|
||||
}
|
||||
|
||||
public int getSatiationPenalty() {
|
||||
return satiationPenalty;
|
||||
}
|
||||
@@ -281,6 +297,30 @@ public class GenshinAvatar {
|
||||
return fetters;
|
||||
}
|
||||
|
||||
public int getFetterLevel() {
|
||||
return fetterLevel;
|
||||
}
|
||||
|
||||
public void setFetterLevel(int fetterLevel) {
|
||||
this.fetterLevel = fetterLevel;
|
||||
}
|
||||
|
||||
public int getFetterExp() {
|
||||
return fetterExp;
|
||||
}
|
||||
|
||||
public void setFetterExp(int fetterExp) {
|
||||
this.fetterExp = fetterExp;
|
||||
}
|
||||
|
||||
public int getNameCardId() {
|
||||
return nameCardId;
|
||||
}
|
||||
|
||||
public void setNameCardId(int nameCardId) {
|
||||
this.nameCardId = nameCardId;
|
||||
}
|
||||
|
||||
public float getCurrentHp() {
|
||||
return currentHp;
|
||||
}
|
||||
@@ -403,6 +443,8 @@ public class GenshinAvatar {
|
||||
|
||||
// Fetters
|
||||
this.setFetterList(data.getFetters());
|
||||
this.setNameCardRewardId(data.getNameCardRewardId());
|
||||
this.setNameCardId(data.getNameCardId());
|
||||
|
||||
// Get hp percent, set to 100% if none
|
||||
float hpPercent = this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) <= 0 ? 1f : this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) / this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP);
|
||||
@@ -702,8 +744,8 @@ public class GenshinAvatar {
|
||||
|
||||
public AvatarInfo toProto() {
|
||||
AvatarFetterInfo.Builder avatarFetter = AvatarFetterInfo.newBuilder()
|
||||
.setExpLevel(10)
|
||||
.setExpNumber(6325); // Highest Level
|
||||
.setExpLevel(this.getFetterLevel())
|
||||
.setExpNumber(this.getFetterExp());
|
||||
|
||||
if (this.getFetterList() != null) {
|
||||
for (int i = 0; i < this.getFetterList().size(); i++) {
|
||||
@@ -715,6 +757,13 @@ public class GenshinAvatar {
|
||||
}
|
||||
}
|
||||
|
||||
int rewardId = this.getNameCardRewardId();
|
||||
int cardId = this.getNameCardId();
|
||||
|
||||
if (this.getPlayer().getNameCardList().contains(cardId)) {
|
||||
avatarFetter.addRewardedFetterLevelList(rewardId);
|
||||
}
|
||||
|
||||
AvatarInfo.Builder avatarInfo = AvatarInfo.newBuilder()
|
||||
.setAvatarId(this.getAvatarId())
|
||||
.setGuid(this.getGuid())
|
||||
|
||||
@@ -90,7 +90,7 @@ public class GenshinItem {
|
||||
|
||||
// Equip data
|
||||
if (getItemType() == ItemType.ITEM_WEAPON) {
|
||||
this.level = 1;
|
||||
this.level = this.count > 1 ? this.count : 1;
|
||||
this.affixes = new ArrayList<>(2);
|
||||
if (getItemData().getSkillAffix() != null) {
|
||||
for (int skillAffix : getItemData().getSkillAffix()) {
|
||||
|
||||
@@ -711,6 +711,31 @@ public class InventoryManager {
|
||||
player.sendPacket(new PacketAvatarUpgradeRsp(avatar, oldLevel, oldPropMap));
|
||||
}
|
||||
|
||||
public void upgradeAvatarFetterLevel(GenshinPlayer player, GenshinAvatar avatar, int expGain) {
|
||||
// May work. Not test.
|
||||
int maxLevel = 10; // Keep it until I think of a more "elegant" way
|
||||
int level = avatar.getFetterLevel();
|
||||
int exp = avatar.getFetterExp();
|
||||
int reqExp = GenshinData.getAvatarFetterLevelExpRequired(level);
|
||||
|
||||
while (expGain > 0 && reqExp > 0 && level < maxLevel) {
|
||||
int toGain = Math.min(expGain, reqExp - exp);
|
||||
exp += toGain;
|
||||
expGain -= toGain;
|
||||
if (exp >= reqExp) {
|
||||
exp = 0;
|
||||
level += 1;
|
||||
reqExp = GenshinData.getAvatarFetterLevelExpRequired(level);
|
||||
}
|
||||
}
|
||||
|
||||
avatar.setFetterLevel(level);
|
||||
avatar.setFetterExp(exp);
|
||||
avatar.save();
|
||||
|
||||
player.sendPacket(new PacketAvatarPropNotify(avatar));
|
||||
}
|
||||
|
||||
public void upgradeAvatarSkill(GenshinPlayer player, long guid, int skillId) {
|
||||
// Sanity checks
|
||||
GenshinAvatar avatar = player.getAvatars().getAvatarByGuid(guid);
|
||||
|
||||
Reference in New Issue
Block a user