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:
Thoronium
2023-02-09 09:00:16 -07:00
committed by GitHub
parent 0fc578a243
commit ab5b49b7c5
27 changed files with 5731 additions and 6 deletions

View File

@@ -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());
}
}

View File

@@ -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));
}
}
}
}
}

View File

@@ -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
);
}
}

View File

@@ -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));
}
}

View File

@@ -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(),

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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));

View File

@@ -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()
)