mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-15 00:15:33 +01:00
Teapot Implementations & Fixes (#2032)
* Add realm switching
Fix realm unlock items
* Implement exiting teapot
* Implement home level rewards
* Fix small issues
* Fix call issue
* Add 'seen unlock' packets
* Fix Sumeru Main House bricking accounts
This is only for the house, not the full realm
* Fixed realm 5
Main house needs to be placed manually for Sumeru realm (module 5) as the resources for defaults in Sumeru realm are missing. Sumeru main house cannot be exited from the door, issue due to the same missing res.
* Fix Grass main house bricking accounts
* Remove references
* Formatting change (web editor)
* Whitespace & Formatting
* Whitespace
* Make 'seen' status persistent
* Fix misnamed field
* Revert "Fix misnamed field"
This reverts commit 21ef404e14.
* Implement gaining trust (realm exp)
Add gaining trust by crafting
Add gaining trust via `/give`
Show trust in djinn menu
* Interior check for prevScene
* Correct positions & rotations
Return to front of main house when exiting from inside
* Update HandlerBackMyWorldReq.java
---------
Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
Co-authored-by: GanyusLeftHorn <1244229+GanyusLeftHorn@users.noreply.github.com>
This commit is contained in:
@@ -69,8 +69,11 @@ public class GameHome {
|
||||
if (defaultItem != null) {
|
||||
Grasscutter.getLogger().info("Set player {} home {} to initial setting", ownerUid, sceneId);
|
||||
return HomeSceneItem.parseFrom(defaultItem, sceneId);
|
||||
} else {
|
||||
// Realm res missing bricks account, use default realm data to allow main house
|
||||
defaultItem = GameData.getHomeworldDefaultSaveData().get(2001);
|
||||
return HomeSceneItem.parseFrom(defaultItem, sceneId);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -85,6 +88,11 @@ public class GameHome {
|
||||
player.getSession().send(new PacketHomeAllUnlockedBgmIdListNotify(player));
|
||||
}
|
||||
|
||||
// Tell the client the reward is claimed or realm unlocked
|
||||
public void onClaimReward(Player player){
|
||||
player.getSession().send(new PacketPlayerHomeCompInfoNotify(player));
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
if (this.player == null)
|
||||
this.player = Grasscutter.getGameServer().getPlayerByUid((int) this.ownerUid, true);
|
||||
@@ -123,4 +131,27 @@ public class GameHome {
|
||||
.map(Int2ObjectMap.Entry::getIntKey)
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
// Same as Player.java addExpDirectly
|
||||
public void addExp(Player player, int count) {
|
||||
exp += count;
|
||||
int reqExp = getExpRequired(level);
|
||||
|
||||
while (exp >= reqExp && reqExp > 0) {
|
||||
exp -= reqExp;
|
||||
level += 1;
|
||||
reqExp = getExpRequired(level);
|
||||
|
||||
// Update client level and exp
|
||||
player.getSession().send(new PacketHomeBasicInfoNotify(player, false));
|
||||
}
|
||||
|
||||
// Update client home
|
||||
onOwnerLogin(player);
|
||||
}
|
||||
|
||||
private int getExpRequired(int level) {
|
||||
HomeWorldLevelData levelData = GameData.getHomeWorldLevelDataMap().get(level);
|
||||
return levelData != null ? levelData.getExp() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,8 +265,10 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
|
||||
);
|
||||
case 106 -> // Resin
|
||||
this.player.getResinManager().addResin(count);
|
||||
case 107 -> // Legendary Key
|
||||
case 107 -> // Legendary Key
|
||||
this.player.addLegendaryKey(count);
|
||||
case 121 -> // Home exp
|
||||
this.player.getHome().addExp(this.player, count);
|
||||
case 201 -> // Primogem
|
||||
this.player.setPrimogems(this.player.getPrimogems() + count);
|
||||
case 202 -> // Mora
|
||||
|
||||
@@ -4,6 +4,7 @@ import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.game.home.FurnitureMakeSlotItem;
|
||||
import emu.grasscutter.game.player.BasePlayerManager;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
@@ -124,6 +125,9 @@ public class FurnitureManager extends BasePlayerManager {
|
||||
player.getInventory().addItem(makeData.getFurnitureItemID(), makeData.getCount());
|
||||
player.getHome().getFurnitureMakeSlotItemList().remove(slotItem.get());
|
||||
|
||||
// Should be for first craft, but until first craft check exists add exp for each item crafted
|
||||
player.getInventory().addItem(121, makeData.getExp(), ActionReason.FurnitureMakeTake);
|
||||
|
||||
player.getSession().send(new PacketTakeFurnitureMakeRsp(Retcode.RET_SUCC_VALUE, makeId,
|
||||
List.of(ItemParamOuterClass.ItemParam.newBuilder()
|
||||
.setItemId(makeData.getFurnitureItemID())
|
||||
|
||||
@@ -97,6 +97,7 @@ public class Player {
|
||||
@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;
|
||||
@@ -116,7 +117,9 @@ public class Player {
|
||||
@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;
|
||||
@@ -208,6 +211,7 @@ public class Player {
|
||||
this.questManager = new QuestManager(this);
|
||||
this.buffManager = new PlayerBuffManager(this);
|
||||
this.position = new Position(GameConstants.START_POSITION);
|
||||
this.prevPos = new Position();
|
||||
this.rotation = new Position(0, 307, 0);
|
||||
this.sceneId = 3;
|
||||
this.regionId = 1;
|
||||
@@ -246,6 +250,8 @@ public class Player {
|
||||
|
||||
this.birthday = new PlayerBirthday();
|
||||
this.rewardedLevels = new HashSet<>();
|
||||
this.homeRewardedLevels = new HashSet<>();
|
||||
this.seenRealmList = new HashSet<>();
|
||||
this.moonCardGetTimes = new HashSet<>();
|
||||
this.codex = new PlayerCodex(this);
|
||||
this.progressManager = new PlayerProgressManager(this);
|
||||
@@ -386,6 +392,21 @@ public class Player {
|
||||
return;
|
||||
}
|
||||
this.realmList.add(realmId);
|
||||
|
||||
// Tell the client the realm is unlocked
|
||||
if (realmId > 3) { // Realms 3 and below are default 'unlocked'
|
||||
this.sendPacket(new PacketHomeModuleUnlockNotify(realmId));
|
||||
this.getHome().onClaimReward(this);
|
||||
}
|
||||
}
|
||||
|
||||
public void addSeenRealmList(int seenId) {
|
||||
if (this.seenRealmList == null) {
|
||||
this.seenRealmList = new HashSet<>();
|
||||
} else if (this.seenRealmList.contains(seenId)) {
|
||||
return;
|
||||
}
|
||||
this.seenRealmList.add(seenId);
|
||||
}
|
||||
|
||||
public int getExpeditionLimit() {
|
||||
|
||||
@@ -14,6 +14,12 @@ public class ItemUseUnlockHomeModule extends ItemUseInt {
|
||||
|
||||
@Override
|
||||
public boolean useItem(UseItemParams params) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean postUseItem(UseItemParams params){
|
||||
params.player.addRealmList(this.i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketBackMyWorldRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.BackMyWorldReq)
|
||||
public class HandlerBackMyWorldReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
Scene scene = session.getPlayer().getScene();
|
||||
int prevScene = scene.getPrevScene();
|
||||
|
||||
// Sanity check for switching between teapot realms
|
||||
if (prevScene >= 2000 && prevScene <= 2400) {
|
||||
prevScene = 3;
|
||||
}
|
||||
|
||||
session.getPlayer().getWorld().transferPlayerToScene(
|
||||
session.getPlayer(),
|
||||
prevScene,
|
||||
TeleportType.WAYPOINT,
|
||||
session.getPlayer().getPrevPos());
|
||||
|
||||
session.send(new PacketBackMyWorldRsp());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.common.ItemParamData;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetHomeLevelUpRewardRsp;
|
||||
import emu.grasscutter.net.proto.GetHomeLevelUpRewardReqOuterClass.GetHomeLevelUpRewardReq;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetHomeLevelUpRewardReq)
|
||||
public class HandlerGetHomeLevelUpRewardReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// Replica of TakePlayerLevelReward for adv rank rewards
|
||||
Player pl = session.getPlayer();
|
||||
synchronized (pl) {
|
||||
GetHomeLevelUpRewardReq req = GetHomeLevelUpRewardReq.parseFrom(payload);
|
||||
int level = req.getLevel();
|
||||
Set<Integer> homeRewardedLevels = session.getPlayer().getHomeRewardedLevels();
|
||||
if (!homeRewardedLevels.contains(level)) {// No duplicated reward
|
||||
int rewardId = GameData.getHomeWorldLevelDataMap().get(level).getRewardId();
|
||||
if (rewardId != 0) {
|
||||
List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
|
||||
pl.getInventory().addItemParamDatas(rewardItems, ActionReason.GetHomeLevelupReward);
|
||||
homeRewardedLevels.add(level);
|
||||
pl.setHomeRewardedLevels(homeRewardedLevels);
|
||||
pl.save();
|
||||
pl.getHome().onClaimReward(pl);
|
||||
session.send(new PacketGetHomeLevelUpRewardRsp(level, rewardId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeChangeModuleReqOuterClass;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeChangeModuleRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeComfortInfoNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerHomeCompInfoNotify;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeChangeModuleReq)
|
||||
public class HandlerHomeChangeModuleReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
HomeChangeModuleReqOuterClass.HomeChangeModuleReq req =
|
||||
HomeChangeModuleReqOuterClass.HomeChangeModuleReq.parseFrom(payload);
|
||||
session.getPlayer().setCurrentRealmId(req.getTargetModuleId());
|
||||
session.send(new PacketHomeChangeModuleRsp(req.getTargetModuleId()));
|
||||
session.send(new PacketPlayerHomeCompInfoNotify(session.getPlayer()));
|
||||
session.send(new PacketHomeComfortInfoNotify(session.getPlayer()));
|
||||
|
||||
int realmId = 2000 + req.getTargetModuleId();
|
||||
|
||||
Scene scene = session.getPlayer().getWorld().getSceneById(realmId);
|
||||
Position pos = scene.getScriptManager().getConfig().born_pos;
|
||||
|
||||
session.getPlayer().getWorld().transferPlayerToScene(
|
||||
session.getPlayer(), realmId,
|
||||
TeleportType.WAYPOINT, pos
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeModuleSeenReqOuterClass.HomeModuleSeenReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeModuleSeenRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerHomeCompInfoNotify;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeModuleSeenReq)
|
||||
public class HandlerHomeModuleSeenReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = HomeModuleSeenReq.parseFrom(payload);
|
||||
var seen = req.getSeenModuleIdListList();
|
||||
|
||||
// As multiple may be seen at once, add each
|
||||
for (int i : seen) {
|
||||
session.getPlayer().addSeenRealmList(i);
|
||||
}
|
||||
|
||||
session.send(new PacketPlayerHomeCompInfoNotify(session.getPlayer()));
|
||||
session.send(new PacketHomeModuleSeenRsp(seen));
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,15 @@ public class HandlerHomeSceneJumpReq extends PacketHandler {
|
||||
|
||||
Scene scene = session.getPlayer().getWorld().getSceneById(req.getIsEnterRoomScene() ? homeScene.getRoomSceneId() : realmId);
|
||||
Position pos = scene.getScriptManager().getConfig().born_pos;
|
||||
Position rot = home.getSceneMap().get(scene.getId()).getBornRot();
|
||||
|
||||
// Make player face correct direction when entering or exiting
|
||||
session.getPlayer().getRotation().set(rot);
|
||||
|
||||
// Make player exit to front of main house
|
||||
if (!req.getIsEnterRoomScene()) {
|
||||
pos = home.getSceneMap().get(realmId).getBornPos();
|
||||
}
|
||||
|
||||
session.getPlayer().getWorld().transferPlayerToScene(
|
||||
session.getPlayer(),
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BackMyWorldRspOuterClass;
|
||||
|
||||
public class PacketBackMyWorldRsp extends BasePacket {
|
||||
|
||||
public PacketBackMyWorldRsp() {
|
||||
super(PacketOpcodes.BackMyWorldRsp);
|
||||
|
||||
var proto = BackMyWorldRspOuterClass.BackMyWorldRsp.newBuilder();
|
||||
|
||||
this.setData(proto.build());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetHomeLevelUpRewardRspOuterClass.GetHomeLevelUpRewardRsp;
|
||||
|
||||
public class PacketGetHomeLevelUpRewardRsp extends BasePacket {
|
||||
|
||||
public PacketGetHomeLevelUpRewardRsp(int level, int rewardId) {
|
||||
super(PacketOpcodes.GetHomeLevelUpRewardRsp);
|
||||
|
||||
int retcode = 0;
|
||||
|
||||
if (rewardId == 0) {
|
||||
retcode = 1;
|
||||
}
|
||||
|
||||
GetHomeLevelUpRewardRsp proto = GetHomeLevelUpRewardRsp.newBuilder()
|
||||
.setLevel(level)
|
||||
.setRetcode(retcode)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ public class PacketHomeBasicInfoNotify extends BasePacket {
|
||||
.setCurRoomSceneId(homeScene.getRoomSceneId())
|
||||
.setIsInEditMode(editMode)
|
||||
.setHomeOwnerUid(player.getUid())
|
||||
.setExp(player.getHome().getExp())
|
||||
.setLevel(player.getHome().getLevel())
|
||||
.setOwnerNickName(player.getNickname())
|
||||
// TODO limit shop
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeChangeModuleRspOuterClass;
|
||||
|
||||
public class PacketHomeChangeModuleRsp extends BasePacket {
|
||||
|
||||
public PacketHomeChangeModuleRsp(int targetModuleId) {
|
||||
super(PacketOpcodes.HomeChangeModuleRsp);
|
||||
|
||||
HomeChangeModuleRspOuterClass.HomeChangeModuleRsp proto = HomeChangeModuleRspOuterClass.HomeChangeModuleRsp.newBuilder()
|
||||
.setRetcode(0)
|
||||
.setTargetModuleId(targetModuleId)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeModuleSeenRspOuterClass.HomeModuleSeenRsp;
|
||||
|
||||
public class PacketHomeModuleSeenRsp extends BasePacket {
|
||||
|
||||
public PacketHomeModuleSeenRsp(List<Integer> seen) {
|
||||
super(PacketOpcodes.HomeModuleSeenRsp);
|
||||
|
||||
HomeModuleSeenRsp proto = HomeModuleSeenRsp.newBuilder()
|
||||
.addAllSeenModuleIdList(seen)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeModuleUnlockNotifyOuterClass.HomeModuleUnlockNotify;
|
||||
|
||||
public class PacketHomeModuleUnlockNotify extends BasePacket {
|
||||
|
||||
public PacketHomeModuleUnlockNotify(int targetModuleId) {
|
||||
super(PacketOpcodes.HomeModuleUnlockNotify);
|
||||
|
||||
HomeModuleUnlockNotify proto = HomeModuleUnlockNotify.newBuilder()
|
||||
.setModuleId(targetModuleId)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,14 @@ public class PacketPlayerEnterSceneNotify extends BasePacket {
|
||||
public PacketPlayerEnterSceneNotify(Player player, Player target, EnterType type, EnterReason reason, int newScene, Position newPos) {
|
||||
super(PacketOpcodes.PlayerEnterSceneNotify);
|
||||
|
||||
// Set previous position
|
||||
if(!(newScene == 3)){ // Hardcoded for now else weird positions will occur
|
||||
// Don't update position within same scene or teapot
|
||||
} else {
|
||||
// Only used for exiting teapot currently
|
||||
player.setPrevPos(player.getPosition());
|
||||
}
|
||||
|
||||
player.setSceneLoadState(SceneLoadState.LOADING);
|
||||
player.setEnterSceneToken(Utils.randomRange(1000, 99999));
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlayerHomeCompInfoNotifyOuterClass;
|
||||
import emu.grasscutter.net.proto.PlayerHomeCompInfoOuterClass;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PacketPlayerHomeCompInfoNotify extends BasePacket {
|
||||
|
||||
public PacketPlayerHomeCompInfoNotify(Player player) {
|
||||
@@ -22,7 +20,8 @@ public class PacketPlayerHomeCompInfoNotify extends BasePacket {
|
||||
.setCompInfo(
|
||||
PlayerHomeCompInfoOuterClass.PlayerHomeCompInfo.newBuilder()
|
||||
.addAllUnlockedModuleIdList(player.getRealmList())
|
||||
.addAllLevelupRewardGotLevelList(List.of(1)) // Hardcoded
|
||||
.addAllSeenModuleIdList(player.getSeenRealmList())
|
||||
.addAllLevelupRewardGotLevelList(player.getHomeRewardedLevels())
|
||||
.setFriendEnterHomeOptionValue(player.getHome().getEnterHomeOption())
|
||||
.build()
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user