feat: implement teapot suite (#2344)

* feat: implement teapot suite

* fix: home animals, check respawn, etc

* fix: NPE and cancel summon events

* fix: forgot to send eventId also
This commit is contained in:
hamusuke
2023-09-08 12:34:03 +09:00
committed by GitHub
Unverified
parent 83602f78ae
commit fc42f665a7
36 changed files with 1125 additions and 210 deletions
@@ -0,0 +1,30 @@
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.HomeAvatarRewardEventGetReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHomeAvatarAllFinishRewardNotify;
import emu.grasscutter.server.packet.send.PacketHomeAvatarRewardEventGetRsp;
import emu.grasscutter.server.packet.send.PacketHomeAvatarRewardEventNotify;
@Opcodes(PacketOpcodes.HomeAvatarRewardEventGetReq)
public class HandlerHomeAvatarRewardEventGetReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = HomeAvatarRewardEventGetReqOuterClass.HomeAvatarRewardEventGetReq.parseFrom(payload);
var player = session.getPlayer();
var rewardsOrError = player.getCurHomeWorld().getModuleManager().claimAvatarRewards(req.getEventId());
session.send(new PacketHomeAvatarRewardEventNotify(player));
session.send(new PacketHomeAvatarAllFinishRewardNotify(player));
session.send(
rewardsOrError.map(
gameItems -> new PacketHomeAvatarRewardEventGetRsp(req.getEventId(), gameItems),
integer -> new PacketHomeAvatarRewardEventGetRsp(req.getEventId(), integer)
)
);
}
}
@@ -0,0 +1,19 @@
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.HomeAvatarSummonEventReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHomeAvatarSummonEventRsp;
@Opcodes(PacketOpcodes.HomeAvatarSummonEventReq)
public class HandlerHomeAvatarSummonEventReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = HomeAvatarSummonEventReqOuterClass.HomeAvatarSummonEventReq.parseFrom(payload);
var moduleManager = session.getPlayer().getCurHomeWorld().getModuleManager();
var eventOrError = moduleManager.fireAvatarSummonEvent(session.getPlayer(), req.getAvatarId(), req.getGuid(), req.getSuitId());
session.send(eventOrError.map(PacketHomeAvatarSummonEventRsp::new, PacketHomeAvatarSummonEventRsp::new));
}
}
@@ -0,0 +1,21 @@
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.HomeAvatarSummonFinishReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHomeAvatarSummonAllEventNotify;
import emu.grasscutter.server.packet.send.PacketHomeAvatarSummonFinishRsp;
@Opcodes(PacketOpcodes.HomeAvatarSummonFinishReq)
public class HandlerHomeAvatarSummonFinishReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = HomeAvatarSummonFinishReqOuterClass.HomeAvatarSummonFinishReq.parseFrom(payload);
var player = session.getPlayer();
player.getCurHomeWorld().getModuleManager().onFinishSummonEvent(req.getEventId());
session.send(new PacketHomeAvatarSummonAllEventNotify(session.getPlayer()));
session.send(new PacketHomeAvatarSummonFinishRsp(req.getEventId()));
}
}
@@ -1,5 +1,6 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.home.HomeScene;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
@@ -31,14 +32,8 @@ public class HandlerHomeChangeEditModeReq extends PacketHandler {
session.send(new PacketHomeComfortInfoNotify(session.getPlayer()));
if (!req.getIsEnterEditMode()) {
var scene = session.getPlayer().getScene();
scene.addEntities(
session
.getPlayer()
.getCurHomeWorld()
.getHome()
.getHomeSceneItem(scene.getId())
.getAnimals(scene));
var scene = (HomeScene) session.getPlayer().getScene();
scene.onLeaveEditMode();
}
session.send(new PacketHomeChangeEditModeRsp(req.getIsEnterEditMode()));
@@ -1,7 +1,5 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
@@ -19,9 +17,10 @@ public class HandlerHomeChangeModuleReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
HomeChangeModuleReqOuterClass.HomeChangeModuleReq req =
HomeChangeModuleReqOuterClass.HomeChangeModuleReq.parseFrom(payload);
HomeChangeModuleReqOuterClass.HomeChangeModuleReq.parseFrom(payload);
if (!session.getPlayer().getCurHomeWorld().getGuests().isEmpty()) {
var homeWorld = session.getPlayer().getCurHomeWorld();
if (!homeWorld.getGuests().isEmpty()) {
session.send(new PacketHomeChangeModuleRsp());
return;
}
@@ -33,13 +32,10 @@ public class HandlerHomeChangeModuleReq extends PacketHandler {
session.send(new PacketHomeComfortInfoNotify(session.getPlayer()));
int realmId = 2000 + req.getTargetModuleId();
var scene = homeWorld.getSceneById(realmId);
var pos = scene.getScriptManager().getConfig().born_pos;
Scene scene = session.getPlayer().getWorld().getSceneById(realmId);
Position pos = scene.getScriptManager().getConfig().born_pos;
session
.getPlayer()
.getWorld()
.transferPlayerToScene(session.getPlayer(), realmId, TeleportType.WAYPOINT, pos);
homeWorld.transferPlayerToScene(session.getPlayer(), realmId, TeleportType.WAYPOINT, pos);
homeWorld.refreshModuleManager();
}
}
@@ -1,10 +1,9 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.entity.EntityHomeAnimal;
import emu.grasscutter.game.home.HomeScene;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.VisionTypeOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHomeEnterEditModeFinishRsp;
@@ -17,12 +16,8 @@ public class HandlerHomeEnterEditModeFinishReq extends PacketHandler {
* This packet is about the edit mode
*/
var scene = session.getPlayer().getScene();
scene.removeEntities(
scene.getEntities().values().stream()
.filter(gameEntity -> gameEntity instanceof EntityHomeAnimal)
.toList(),
VisionTypeOuterClass.VisionType.VISION_TYPE_REMOVE);
var scene = (HomeScene) session.getPlayer().getScene();
scene.onEnterEditModeFinish();
session.send(new PacketHomeEnterEditModeFinishRsp());
}
@@ -1,6 +1,8 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.*;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.OtherPlayerEnterHomeNotifyOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.*;
@@ -16,16 +18,20 @@ public class HandlerHomeSceneInitFinishReq extends PacketHandler {
session.getPlayer().setHasSentInitPacketInHome(true);
if (curHomeWorld.getHost().isOnline()
&& !curHomeWorld.getHost().equals(session.getPlayer())) {
&& !curHomeWorld.getHost().equals(session.getPlayer())) {
curHomeWorld
.getHost()
.sendPacket(
new PacketOtherPlayerEnterOrLeaveHomeNotify(
session.getPlayer(),
OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.ENTER));
.getHost()
.sendPacket(
new PacketOtherPlayerEnterOrLeaveHomeNotify(
session.getPlayer(),
OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.ENTER));
}
}
curHomeWorld.ifHost(session.getPlayer(), player -> {
player.sendPacket(new PacketHomeAvatarRewardEventNotify(player));
player.sendPacket(new PacketHomeAvatarSummonAllEventNotify(player));
});
session.send(new PacketHomeMarkPointNotify(session.getPlayer()));
session.send(new PacketHomeSceneInitFinishRsp());
@@ -5,10 +5,7 @@ import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.HomeUpdateArrangementInfoReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHomeAvatarTalkFinishInfoNotify;
import emu.grasscutter.server.packet.send.PacketHomeBasicInfoNotify;
import emu.grasscutter.server.packet.send.PacketHomeMarkPointNotify;
import emu.grasscutter.server.packet.send.PacketHomeUpdateArrangementInfoRsp;
import emu.grasscutter.server.packet.send.*;
@Opcodes(PacketOpcodes.HomeUpdateArrangementInfoReq)
public class HandlerHomeUpdateArrangementInfoReq extends PacketHandler {
@@ -22,14 +19,17 @@ public class HandlerHomeUpdateArrangementInfoReq extends PacketHandler {
session.getPlayer().getHome().getHomeSceneItem(session.getPlayer().getSceneId());
var roomSceneId = homeScene.getRoomSceneId();
homeScene.update(req.getSceneArrangementInfo());
homeScene.update(req.getSceneArrangementInfo(), session.getPlayer());
if (roomSceneId != homeScene.getRoomSceneId()) {
session.getPlayer().getHome().onMainHouseChanged();
}
session.getPlayer().getCurHomeWorld().getModuleManager().onUpdateArrangement();
session.send(new PacketHomeAvatarRewardEventNotify(session.getPlayer()));
session.send(
new PacketHomeBasicInfoNotify(session.getPlayer(), session.getPlayer().isInEditMode()));
session.send(new PacketHomeAvatarTalkFinishInfoNotify(session.getPlayer()));
session.send(new PacketHomeAvatarSummonAllEventNotify(session.getPlayer()));
session.send(new PacketHomeMarkPointNotify(session.getPlayer()));
session.getPlayer().getHome().save();
@@ -0,0 +1,18 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.HomeAvatarAllFinishRewardNotifyOuterClass;
public class PacketHomeAvatarAllFinishRewardNotify extends BasePacket {
public PacketHomeAvatarAllFinishRewardNotify(Player player) {
super(PacketOpcodes.HomeAvatarAllFinishRewardNotify);
var list = player.getHome().getFinishedRewardEventIdSet();
if (list != null) {
this.setData(HomeAvatarAllFinishRewardNotifyOuterClass.HomeAvatarAllFinishRewardNotify.newBuilder()
.addAllEventIdList(player.getHome().getFinishedRewardEventIdSet()));
}
}
}
@@ -0,0 +1,26 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.HomeAvatarRewardEventGetRspOuterClass;
import java.util.List;
public class PacketHomeAvatarRewardEventGetRsp extends BasePacket {
public PacketHomeAvatarRewardEventGetRsp(int eventId, List<GameItem> rewards) {
super(PacketOpcodes.HomeAvatarRewardEventGetRsp);
this.setData(HomeAvatarRewardEventGetRspOuterClass.HomeAvatarRewardEventGetRsp.newBuilder()
.setEventId(eventId)
.addAllItemList(rewards.stream().map(GameItem::toItemParam).toList()));
}
public PacketHomeAvatarRewardEventGetRsp(int eventId, int retcode) {
super(PacketOpcodes.HomeAvatarRewardEventGetRsp);
this.setData(HomeAvatarRewardEventGetRspOuterClass.HomeAvatarRewardEventGetRsp.newBuilder()
.setEventId(eventId)
.setRetcode(retcode));
}
}
@@ -0,0 +1,12 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
public class PacketHomeAvatarRewardEventNotify extends BasePacket {
public PacketHomeAvatarRewardEventNotify(Player homeOwner) {
super(PacketOpcodes.HomeAvatarRewardEventNotify);
this.setData(homeOwner.getCurHomeWorld().getModuleManager().toRewardEventProto());
}
}
@@ -0,0 +1,12 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
public class PacketHomeAvatarSummonAllEventNotify extends BasePacket {
public PacketHomeAvatarSummonAllEventNotify(Player homeOwner) {
super(PacketOpcodes.HomeAvatarSummonAllEventNotify);
this.setData(homeOwner.getCurHomeWorld().getModuleManager().toSummonEventProto());
}
}
@@ -0,0 +1,22 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.home.suite.event.HomeAvatarSummonEvent;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.HomeAvatarSummonEventRspOuterClass;
public class PacketHomeAvatarSummonEventRsp extends BasePacket {
public PacketHomeAvatarSummonEventRsp(HomeAvatarSummonEvent event) {
super(PacketOpcodes.HomeAvatarSummonEventRsp);
this.setData(HomeAvatarSummonEventRspOuterClass.HomeAvatarSummonEventRsp.newBuilder()
.setEventId(event.getEventId()));
}
public PacketHomeAvatarSummonEventRsp(int retcode) {
super(PacketOpcodes.HomeAvatarSummonEventRsp);
this.setData(HomeAvatarSummonEventRspOuterClass.HomeAvatarSummonEventRsp.newBuilder()
.setRetcode(retcode));
}
}
@@ -0,0 +1,14 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.HomeAvatarSummonFinishRspOuterClass;
public class PacketHomeAvatarSummonFinishRsp extends BasePacket {
public PacketHomeAvatarSummonFinishRsp(int eventId) {
super(PacketOpcodes.HomeAvatarSummonFinishRsp);
this.setData(HomeAvatarSummonFinishRspOuterClass.HomeAvatarSummonFinishRsp.newBuilder()
.setEventId(eventId));
}
}
@@ -0,0 +1,14 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.PlayerQuitFromHomeNotifyOuterClass;
public class PacketPlayerQuitFromHomeNotify extends BasePacket {
public PacketPlayerQuitFromHomeNotify(PlayerQuitFromHomeNotifyOuterClass.PlayerQuitFromHomeNotify.QuitReason reason) {
super(PacketOpcodes.PlayerQuitFromHomeNotify);
this.setData(PlayerQuitFromHomeNotifyOuterClass.PlayerQuitFromHomeNotify.newBuilder()
.setReason(reason));
}
}