mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-05-22 19:00:11 +08:00
feat: support multiplayer mode in teapot (#2317)
This commit is contained in:
committed by
GitHub
Unverified
parent
667008ecf1
commit
8563d4b574
@@ -0,0 +1,22 @@
|
||||
package emu.grasscutter.server.event.player;
|
||||
|
||||
import emu.grasscutter.game.home.GameHome;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.types.PlayerEvent;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public final class PlayerEnterHomeEvent extends PlayerEvent implements Cancellable {
|
||||
private final GameHome home;
|
||||
private final Player homeOwner;
|
||||
private final boolean isOtherHome;
|
||||
|
||||
public PlayerEnterHomeEvent(Player player, Player homeOwner, GameHome home) {
|
||||
super(player);
|
||||
|
||||
this.home = home;
|
||||
this.homeOwner = homeOwner;
|
||||
this.isOtherHome = this.getPlayer().equals(this.homeOwner);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.server.event.player;
|
||||
|
||||
import emu.grasscutter.game.home.GameHome;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.server.event.types.PlayerEvent;
|
||||
|
||||
public class PlayerLeaveHomeEvent extends PlayerEvent {
|
||||
private final GameHome home;
|
||||
private final Player homeOwner;
|
||||
private final boolean isOtherHome;
|
||||
private final Reason reason;
|
||||
|
||||
public PlayerLeaveHomeEvent(Player player, Player homeOwner, GameHome home, Reason reason) {
|
||||
super(player);
|
||||
|
||||
this.homeOwner = homeOwner;
|
||||
this.home = home;
|
||||
this.reason = reason;
|
||||
this.isOtherHome = !this.getPlayer().equals(this.homeOwner);
|
||||
}
|
||||
|
||||
public enum Reason {
|
||||
PLAYER_LEAVE,
|
||||
KICKED
|
||||
}
|
||||
}
|
||||
@@ -1,45 +1,67 @@
|
||||
package emu.grasscutter.server.game;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.*;
|
||||
import static emu.grasscutter.utils.lang.Language.translate;
|
||||
|
||||
import emu.grasscutter.*;
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.Grasscutter.ServerRunMode;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.battlepass.BattlePassSystem;
|
||||
import emu.grasscutter.game.chat.*;
|
||||
import emu.grasscutter.game.chat.ChatSystem;
|
||||
import emu.grasscutter.game.chat.ChatSystemHandler;
|
||||
import emu.grasscutter.game.combine.CombineManger;
|
||||
import emu.grasscutter.game.drop.*;
|
||||
import emu.grasscutter.game.drop.DropSystem;
|
||||
import emu.grasscutter.game.drop.DropSystemLegacy;
|
||||
import emu.grasscutter.game.dungeons.DungeonSystem;
|
||||
import emu.grasscutter.game.expedition.ExpeditionSystem;
|
||||
import emu.grasscutter.game.gacha.GachaSystem;
|
||||
import emu.grasscutter.game.managers.cooking.*;
|
||||
import emu.grasscutter.game.home.HomeWorld;
|
||||
import emu.grasscutter.game.home.HomeWorldMPSystem;
|
||||
import emu.grasscutter.game.managers.cooking.CookingCompoundManager;
|
||||
import emu.grasscutter.game.managers.cooking.CookingManager;
|
||||
import emu.grasscutter.game.managers.energy.EnergyManager;
|
||||
import emu.grasscutter.game.managers.stamina.StaminaManager;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestSystem;
|
||||
import emu.grasscutter.game.shop.ShopSystem;
|
||||
import emu.grasscutter.game.systems.*;
|
||||
import emu.grasscutter.game.systems.AnnouncementSystem;
|
||||
import emu.grasscutter.game.systems.InventorySystem;
|
||||
import emu.grasscutter.game.systems.MultiplayerSystem;
|
||||
import emu.grasscutter.game.talk.TalkSystem;
|
||||
import emu.grasscutter.game.tower.TowerSystem;
|
||||
import emu.grasscutter.game.world.*;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.game.world.WorldDataSystem;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.server.dispatch.DispatchClient;
|
||||
import emu.grasscutter.server.event.game.ServerTickEvent;
|
||||
import emu.grasscutter.server.event.internal.*;
|
||||
import emu.grasscutter.server.event.internal.ServerStartEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStopEvent;
|
||||
import emu.grasscutter.server.event.types.ServerEvent;
|
||||
import emu.grasscutter.server.scheduler.ServerTaskScheduler;
|
||||
import emu.grasscutter.task.TaskMap;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
import java.net.*;
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import kcp.highway.*;
|
||||
import lombok.*;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import kcp.highway.ChannelConfig;
|
||||
import kcp.highway.KcpServer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.URI;
|
||||
import java.time.Instant;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.DISPATCH_INFO;
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
import static emu.grasscutter.utils.lang.Language.translate;
|
||||
|
||||
@Getter
|
||||
public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
@@ -48,6 +70,7 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
private final GameServerPacketHandler packetHandler;
|
||||
private final Map<Integer, Player> players;
|
||||
private final Set<World> worlds;
|
||||
private final Int2ObjectMap<HomeWorld> homeWorlds;
|
||||
|
||||
@Setter private DispatchClient dispatchClient;
|
||||
|
||||
@@ -56,6 +79,7 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
private final GachaSystem gachaSystem;
|
||||
private final ShopSystem shopSystem;
|
||||
private final MultiplayerSystem multiplayerSystem;
|
||||
private final HomeWorldMPSystem homeWorldMPSystem;
|
||||
private final DungeonSystem dungeonSystem;
|
||||
private final ExpeditionSystem expeditionSystem;
|
||||
private final DropSystem dropSystem;
|
||||
@@ -98,11 +122,13 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
this.dispatchClient = null;
|
||||
this.players = null;
|
||||
this.worlds = null;
|
||||
this.homeWorlds = null;
|
||||
|
||||
this.inventorySystem = null;
|
||||
this.gachaSystem = null;
|
||||
this.shopSystem = null;
|
||||
this.multiplayerSystem = null;
|
||||
this.homeWorldMPSystem = null;
|
||||
this.dungeonSystem = null;
|
||||
this.expeditionSystem = null;
|
||||
this.dropSystem = null;
|
||||
@@ -140,6 +166,7 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
this.dispatchClient = new DispatchClient(GameServer.getDispatchUrl());
|
||||
this.players = new ConcurrentHashMap<>();
|
||||
this.worlds = Collections.synchronizedSet(new HashSet<>());
|
||||
this.homeWorlds = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>());
|
||||
|
||||
// Extra
|
||||
this.scheduler = new ServerTaskScheduler();
|
||||
@@ -150,6 +177,7 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
this.gachaSystem = new GachaSystem(this);
|
||||
this.shopSystem = new ShopSystem(this);
|
||||
this.multiplayerSystem = new MultiplayerSystem(this);
|
||||
this.homeWorldMPSystem = new HomeWorldMPSystem(this);
|
||||
this.dungeonSystem = new DungeonSystem(this);
|
||||
this.dropSystem = new DropSystem(this);
|
||||
this.dropSystemLegacy = new DropSystemLegacy(this);
|
||||
@@ -198,10 +226,12 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
getPlayers().put(player.getUid(), player);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Player getPlayerByUid(int id) {
|
||||
return this.getPlayerByUid(id, false);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Player getPlayerByUid(int id, boolean allowOfflinePlayers) {
|
||||
// Console check
|
||||
if (id == GameConstants.SERVER_CONSOLE_UID) {
|
||||
@@ -295,6 +325,15 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
|
||||
world.save(); // Save the player's world
|
||||
}
|
||||
|
||||
public void registerHomeWorld(HomeWorld homeWorld) {
|
||||
this.getHomeWorlds().put(homeWorld.getOwnerUid(), homeWorld);
|
||||
this.registerWorld(homeWorld);
|
||||
}
|
||||
|
||||
public HomeWorld getHomeWorldOrCreate(Player owner) {
|
||||
return this.getHomeWorlds().computeIfAbsent(owner.getUid(), (uid) -> new HomeWorld(this, owner));
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (Grasscutter.getRunMode() == ServerRunMode.GAME_ONLY) {
|
||||
// Connect to dispatch server.
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
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.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketBackMyWorldRsp;
|
||||
|
||||
@@ -13,23 +12,15 @@ 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();
|
||||
int prevScene = session.getPlayer().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());
|
||||
boolean result = session.getServer().getHomeWorldMPSystem().leaveCoop(session.getPlayer(), prevScene);
|
||||
|
||||
session.send(new PacketBackMyWorldRsp());
|
||||
session.send(new PacketBackMyWorldRsp(result ? 0 : RetcodeOuterClass.Retcode.RET_FAIL_VALUE));
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ public class HandlerCombatInvocationsNotify extends PacketHandler {
|
||||
// Handle movement
|
||||
EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData());
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
|
||||
if (entity != null) {
|
||||
if (entity != null && session.getPlayer().getSceneLoadState() != Player.SceneLoadState.LOADING) {
|
||||
// Move player
|
||||
MotionInfo motionInfo = moveInfo.getMotionInfo();
|
||||
MotionState motionState = motionInfo.getState();
|
||||
|
||||
@@ -20,7 +20,7 @@ public class HandlerHomeChangeBgmReq extends PacketHandler {
|
||||
home.getHomeSceneItem(session.getPlayer().getSceneId()).setHomeBgmId(homeBgmId);
|
||||
home.save();
|
||||
|
||||
session.send(new PacketHomeChangeBgmNotify(homeBgmId));
|
||||
session.getPlayer().getScene().broadcastPacket(new PacketHomeChangeBgmNotify(homeBgmId));
|
||||
session.send(new PacketHomeChangeBgmRsp());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeChangeEditModeReqOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeBasicInfoNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeChangeEditModeRsp;
|
||||
@@ -17,6 +18,13 @@ public class HandlerHomeChangeEditModeReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = HomeChangeEditModeReqOuterClass.HomeChangeEditModeReq.parseFrom(payload);
|
||||
|
||||
if (req.getIsEnterEditMode() && !session.getPlayer().getCurHomeWorld().getGuests().isEmpty()) {
|
||||
session.send(new PacketHomeChangeEditModeRsp(RetcodeOuterClass.Retcode.RET_HOME_HAS_GUEST_VALUE));
|
||||
return;
|
||||
}
|
||||
|
||||
session.getPlayer().setInEditMode(req.getIsEnterEditMode());
|
||||
session.getPlayer().getCurHomeWorld().getHome().save();
|
||||
session.send(new PacketHomePreChangeEditModeNotify(req.getIsEnterEditMode()));
|
||||
session.send(new PacketHomeBasicInfoNotify(session.getPlayer(), req.getIsEnterEditMode()));
|
||||
session.send(new PacketHomeComfortInfoNotify(session.getPlayer()));
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
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.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeGetOnlineStatusRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeGetOnlineStatusReq)
|
||||
public class HandlerHomeGetOnlineStatusReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
session.send(new PacketHomeGetOnlineStatusRsp(session.getPlayer().getCurHomeWorld().getGuests()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
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.HomeKickPlayerReqOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeKickPlayerRsp;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeKickPlayerReq)
|
||||
public class HandlerHomeKickPlayerReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = HomeKickPlayerReqOuterClass.HomeKickPlayerReq.parseFrom(payload);
|
||||
|
||||
var success = new AtomicBoolean();
|
||||
session.getPlayer().getCurHomeWorld().getGuests().stream()
|
||||
.filter(player -> player.getUid() == req.getTargetUid())
|
||||
.findFirst()
|
||||
.ifPresent(player -> {
|
||||
success.set(session.getServer().getHomeWorldMPSystem().kickPlayerFromHome(session.getPlayer(), player.getUid()));
|
||||
});
|
||||
|
||||
session.send(new PacketHomeKickPlayerRsp(success.get() ? 0 : RetcodeOuterClass.Retcode.RET_FAIL_VALUE, req));
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
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.HomeSaveArrangementNoChangeReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeSaveArrangementNoChangeRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeSaveArrangementNoChangeReq)
|
||||
public class HandlerHomeSaveArrangementNoChangeReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
session.send(new PacketHomeSaveArrangementNoChangeRsp(HomeSaveArrangementNoChangeReqOuterClass.HomeSaveArrangementNoChangeReq.parseFrom(payload).getSceneId()));
|
||||
}
|
||||
}
|
||||
@@ -3,14 +3,29 @@ 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.OtherPlayerEnterHomeNotifyOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeMarkPointNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeSceneInitFinishRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketOtherPlayerEnterOrLeaveHomeNotify;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeSceneInitFinishReq)
|
||||
public class HandlerHomeSceneInitFinishReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var curHomeWorld = session.getPlayer().getCurHomeWorld();
|
||||
|
||||
if (!session.getPlayer().isHasSentInitPacketInHome()) {
|
||||
session.getPlayer().setHasSentInitPacketInHome(true);
|
||||
|
||||
if (curHomeWorld.getHost().isOnline() && !curHomeWorld.getHost().equals(session.getPlayer())) {
|
||||
curHomeWorld.getHost().sendPacket(new PacketOtherPlayerEnterOrLeaveHomeNotify(session.getPlayer(), OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.ENTER));
|
||||
}
|
||||
}
|
||||
|
||||
session.send(new PacketHomeMarkPointNotify(session.getPlayer()));
|
||||
|
||||
session.send(new PacketHomeSceneInitFinishRsp());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -16,19 +14,16 @@ public class HandlerHomeSceneJumpReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = HomeSceneJumpReqOuterClass.HomeSceneJumpReq.parseFrom(payload);
|
||||
|
||||
int realmId = 2000 + session.getPlayer().getCurrentRealmId();
|
||||
|
||||
var home = session.getPlayer().getHome();
|
||||
var world = session.getPlayer().getCurHomeWorld();
|
||||
var home = world.getHome();
|
||||
var owner = world.getHost();
|
||||
int realmId = 2000 + owner.getCurrentRealmId();
|
||||
var homeScene = home.getHomeSceneItem(realmId);
|
||||
home.save();
|
||||
|
||||
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();
|
||||
var scene = world.getSceneById(req.getIsEnterRoomScene() ? homeScene.getRoomSceneId() : realmId);
|
||||
var pos = scene.getScriptManager().getConfig().born_pos;
|
||||
var rot = home.getSceneMap().get(scene.getId()).getBornRot();
|
||||
|
||||
// Make player face correct direction when entering or exiting
|
||||
session.getPlayer().getRotation().set(rot);
|
||||
@@ -38,13 +33,7 @@ public class HandlerHomeSceneJumpReq extends PacketHandler {
|
||||
pos = home.getSceneMap().get(realmId).getBornPos();
|
||||
}
|
||||
|
||||
session
|
||||
.getPlayer()
|
||||
.getWorld()
|
||||
.transferPlayerToScene(
|
||||
session.getPlayer(),
|
||||
req.getIsEnterRoomScene() ? homeScene.getRoomSceneId() : realmId,
|
||||
pos);
|
||||
world.transferPlayerToScene(session.getPlayer(), req.getIsEnterRoomScene() ? homeScene.getRoomSceneId() : realmId, pos);
|
||||
|
||||
session.send(new PacketHomeSceneJumpRsp(req.getIsEnterRoomScene()));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import com.github.davidmoten.guavamini.Lists;
|
||||
import emu.grasscutter.game.home.HomeFurnitureItem;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeTransferReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeTransferReq)
|
||||
public class HandlerHomeTransferReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = HomeTransferReqOuterClass.HomeTransferReq.parseFrom(payload);
|
||||
var player = session.getPlayer();
|
||||
var home = player.getCurHomeWorld().getHome();
|
||||
var item = home.getHomeSceneItem(player.getSceneId());
|
||||
|
||||
if (req.getIsTransferToSafePoint()) {
|
||||
player.getCurHomeWorld().transferPlayerToScene(player, player.getSceneId(), item.getBornPos());
|
||||
} else {
|
||||
for (var homeBlockItem : item.getBlockItems().values()) {
|
||||
List<HomeFurnitureItem> items = Lists.newArrayList();
|
||||
items.addAll(homeBlockItem.getDeployFurnitureList());
|
||||
items.addAll(homeBlockItem.getPersistentFurnitureList());
|
||||
items.stream()
|
||||
.filter(homeFurnitureItem -> homeFurnitureItem.getGuid() == req.getGuid())
|
||||
.findFirst()
|
||||
.ifPresent(homeFurnitureItem -> {
|
||||
player.getCurHomeWorld().transferPlayerToScene(player, player.getSceneId(), homeFurnitureItem.getSpawnPos());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
session.send(new BasePacket(PacketOpcodes.HomeTransferRsp));
|
||||
}
|
||||
}
|
||||
+3
@@ -5,6 +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.PacketHomeMarkPointNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketHomeUpdateArrangementInfoRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.HomeUpdateArrangementInfoReq)
|
||||
@@ -20,6 +21,8 @@ public class HandlerHomeUpdateArrangementInfoReq extends PacketHandler {
|
||||
|
||||
homeScene.update(req.getSceneArrangementInfo());
|
||||
|
||||
session.send(new PacketHomeMarkPointNotify(session.getPlayer()));
|
||||
|
||||
session.getPlayer().getHome().save();
|
||||
|
||||
session.send(new PacketHomeUpdateArrangementInfoRsp());
|
||||
|
||||
+19
@@ -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.PlayerApplyEnterHomeResultReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterHomeResultRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.PlayerApplyEnterHomeResultReq)
|
||||
public class HandlerPlayerApplyEnterHomeResultReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = PlayerApplyEnterHomeResultReqOuterClass.PlayerApplyEnterHomeResultReq.parseFrom(payload);
|
||||
|
||||
session.getServer().getHomeWorldMPSystem().acceptEnterHomeRequest(session.getPlayer(), req.getApplyUid(), req.getIsAgreed());
|
||||
session.send(new PacketPlayerApplyEnterHomeResultRsp(req.getApplyUid(), req.getIsAgreed()));
|
||||
}
|
||||
}
|
||||
@@ -19,16 +19,20 @@ public class HandlerSceneTransToPointReq extends PacketHandler {
|
||||
var player = session.getPlayer();
|
||||
|
||||
ScenePointEntry scenePointEntry =
|
||||
GameData.getScenePointEntryById(req.getSceneId(), req.getPointId());
|
||||
GameData.getScenePointEntryById(req.getSceneId(), req.getPointId());
|
||||
|
||||
if (scenePointEntry != null) {
|
||||
if (player
|
||||
.getWorld()
|
||||
.transferPlayerToScene(
|
||||
player,
|
||||
req.getSceneId(),
|
||||
TeleportType.WAYPOINT,
|
||||
scenePointEntry.getPointData().getTranPos().clone())) {
|
||||
if (player.getCurHomeWorld().isInHome(player)) { // if the player is in home, make the player go back
|
||||
session.getServer().getHomeWorldMPSystem().leaveCoop(player, req.getSceneId(), scenePointEntry.getPointData().getTranPos().clone());
|
||||
session.send(new PacketSceneTransToPointRsp(player, req.getPointId(), req.getSceneId()));
|
||||
return;
|
||||
} else if (player
|
||||
.getWorld()
|
||||
.transferPlayerToScene(
|
||||
player,
|
||||
req.getSceneId(),
|
||||
TeleportType.WAYPOINT,
|
||||
scenePointEntry.getPointData().getTranPos().clone())) {
|
||||
session.send(new PacketSceneTransToPointRsp(player, req.getPointId(), req.getSceneId()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,72 +1,52 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.home.GameHome;
|
||||
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;
|
||||
import emu.grasscutter.net.proto.FriendEnterHomeOptionOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.net.proto.TryEnterHomeReqOuterClass;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketTryEnterHomeRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.TryEnterHomeReq)
|
||||
public class HandlerTryEnterHomeReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = TryEnterHomeReqOuterClass.TryEnterHomeReq.parseFrom(payload);
|
||||
var targetPlayer = session.getServer().getPlayerByUid(req.getTargetUid(), true);
|
||||
|
||||
if (req.getTargetUid() != session.getPlayer().getUid()) {
|
||||
// I hope that tomorrow there will be a hero who can support multiplayer mode and write code
|
||||
// like a poem
|
||||
var targetHome = GameHome.getByUid(req.getTargetUid());
|
||||
switch (targetHome.getEnterHomeOption()) {
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption
|
||||
.FRIEND_ENTER_HOME_OPTION_NEED_CONFIRM_VALUE:
|
||||
if (!targetPlayer.isOnline()) {
|
||||
session.send(
|
||||
new PacketTryEnterHomeRsp(
|
||||
RetcodeOuterClass.Retcode.RET_HOME_OWNER_OFFLINE_VALUE, req.getTargetUid()));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption
|
||||
.FRIEND_ENTER_HOME_OPTION_REFUSE_VALUE:
|
||||
session.send(
|
||||
new PacketTryEnterHomeRsp(
|
||||
RetcodeOuterClass.Retcode.RET_HOME_HOME_REFUSE_GUEST_ENTER_VALUE,
|
||||
req.getTargetUid()));
|
||||
return;
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption
|
||||
.FRIEND_ENTER_HOME_OPTION_DIRECT_VALUE:
|
||||
break;
|
||||
}
|
||||
|
||||
if (targetPlayer == null || !GameHome.doesHomeExist(targetPlayer.getUid())) {
|
||||
session.send(new PacketTryEnterHomeRsp());
|
||||
return;
|
||||
}
|
||||
|
||||
int realmId = 2000 + session.getPlayer().getCurrentRealmId();
|
||||
var targetHome = session.getServer().getHomeWorldOrCreate(targetPlayer).getHome();
|
||||
|
||||
var home = session.getPlayer().getHome();
|
||||
if (req.getTargetUid() != session.getPlayer().getUid()) {
|
||||
// I hope that tomorrow there will be a hero who can support multiplayer mode and write code
|
||||
// like a poem
|
||||
// A person who rote this comment, I DID IT!!!!!! by hamusuke.
|
||||
switch (targetHome.getEnterHomeOption()) {
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption.FRIEND_ENTER_HOME_OPTION_NEED_CONFIRM_VALUE -> {
|
||||
if (!targetPlayer.isOnline()) {
|
||||
session.send(new PacketTryEnterHomeRsp(RetcodeOuterClass.Retcode.RET_HOME_OWNER_OFFLINE_VALUE, req.getTargetUid()));
|
||||
} else {
|
||||
session.getServer().getHomeWorldMPSystem().sendEnterHomeRequest(session.getPlayer(), req.getTargetUid());
|
||||
}
|
||||
}
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption.FRIEND_ENTER_HOME_OPTION_REFUSE_VALUE -> {
|
||||
session.send(new PacketTryEnterHomeRsp(RetcodeOuterClass.Retcode.RET_HOME_HOME_REFUSE_GUEST_ENTER_VALUE, req.getTargetUid()));
|
||||
}
|
||||
case FriendEnterHomeOptionOuterClass.FriendEnterHomeOption.FRIEND_ENTER_HOME_OPTION_DIRECT_VALUE -> {
|
||||
session.getServer().getHomeWorldMPSystem().enterHome(session.getPlayer(), targetPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
// prepare the default arrangement for first come in
|
||||
var homeScene = home.getHomeSceneItem(realmId);
|
||||
home.save();
|
||||
return;
|
||||
}
|
||||
|
||||
Scene scene = session.getPlayer().getWorld().getSceneById(realmId);
|
||||
Position pos = scene.getScriptManager().getConfig().born_pos;
|
||||
|
||||
boolean result =
|
||||
session
|
||||
.getPlayer()
|
||||
.getWorld()
|
||||
.transferPlayerToScene(session.getPlayer(), realmId, TeleportType.WAYPOINT, pos);
|
||||
if (result) session.send(new PacketTryEnterHomeRsp(req.getTargetUid()));
|
||||
session.getServer().getHomeWorldMPSystem().enterHome(session.getPlayer(), targetPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@ import emu.grasscutter.net.proto.BackMyWorldRspOuterClass;
|
||||
|
||||
public class PacketBackMyWorldRsp extends BasePacket {
|
||||
|
||||
public PacketBackMyWorldRsp() {
|
||||
public PacketBackMyWorldRsp(int retcode) {
|
||||
super(PacketOpcodes.BackMyWorldRsp);
|
||||
|
||||
var proto = BackMyWorldRspOuterClass.BackMyWorldRsp.newBuilder();
|
||||
var proto = BackMyWorldRspOuterClass.BackMyWorldRsp.newBuilder().setRetcode(retcode);
|
||||
|
||||
this.setData(proto.build());
|
||||
}
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.game.friends.Friendship;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FriendBriefOuterClass.FriendBrief;
|
||||
import emu.grasscutter.net.proto.FriendEnterHomeOptionOuterClass;
|
||||
import emu.grasscutter.net.proto.FriendOnlineStateOuterClass.FriendOnlineState;
|
||||
import emu.grasscutter.net.proto.GetPlayerFriendListRspOuterClass.GetPlayerFriendListRsp;
|
||||
import emu.grasscutter.net.proto.PlatformTypeOuterClass;
|
||||
import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
|
||||
public class PacketGetPlayerFriendListRsp extends BasePacket {
|
||||
|
||||
public PacketGetPlayerFriendListRsp(Player player) {
|
||||
@@ -33,6 +34,7 @@ public class PacketGetPlayerFriendListRsp extends BasePacket {
|
||||
.setParam(1)
|
||||
.setIsGameSource(true)
|
||||
.setPlatformType(PlatformTypeOuterClass.PlatformType.PLATFORM_TYPE_PC)
|
||||
.setFriendEnterHomeOptionValue(FriendEnterHomeOptionOuterClass.FriendEnterHomeOption.FRIEND_ENTER_HOME_OPTION_REFUSE_VALUE)
|
||||
.build();
|
||||
|
||||
GetPlayerFriendListRsp.Builder proto =
|
||||
|
||||
@@ -11,26 +11,27 @@ public class PacketHomeBasicInfoNotify extends BasePacket {
|
||||
public PacketHomeBasicInfoNotify(Player player, boolean editMode) {
|
||||
super(PacketOpcodes.HomeBasicInfoNotify);
|
||||
|
||||
if (player.getCurrentRealmId() <= 0) {
|
||||
if (player.getCurrentRealmId() <= 0 && player.getCurHomeWorld() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var proto = HomeBasicInfoNotifyOuterClass.HomeBasicInfoNotify.newBuilder();
|
||||
|
||||
var sceneId = player.getCurrentRealmId() + 2000;
|
||||
var homeScene = player.getHome().getHomeSceneItem(sceneId);
|
||||
var home = player.getCurHomeWorld().getHome();
|
||||
var owner = home.getPlayer();
|
||||
var sceneId = owner.getCurrentRealmId() + 2000;
|
||||
var homeScene = home.getHomeSceneItem(sceneId);
|
||||
|
||||
proto.setBasicInfo(
|
||||
HomeBasicInfoOuterClass.HomeBasicInfo.newBuilder()
|
||||
.setCurModuleId(player.getCurrentRealmId())
|
||||
.setCurRoomSceneId(homeScene.getRoomSceneId())
|
||||
.setIsInEditMode(editMode)
|
||||
.setHomeOwnerUid(player.getUid())
|
||||
.setExp(player.getHome().getExp())
|
||||
.setLevel(player.getHome().getLevel())
|
||||
.setOwnerNickName(player.getNickname())
|
||||
// TODO limit shop
|
||||
.build());
|
||||
HomeBasicInfoOuterClass.HomeBasicInfo.newBuilder()
|
||||
.setCurModuleId(owner.getCurrentRealmId())
|
||||
.setCurRoomSceneId(homeScene.getRoomSceneId())
|
||||
.setIsInEditMode(editMode)
|
||||
.setHomeOwnerUid(owner.getUid())
|
||||
.setExp(home.getExp())
|
||||
.setLevel(home.getLevel())
|
||||
.setOwnerNickName(owner.getNickname())
|
||||
// TODO limit shop
|
||||
.build());
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
@@ -15,4 +15,11 @@ public class PacketHomeChangeEditModeRsp extends BasePacket {
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketHomeChangeEditModeRsp(int retcode) {
|
||||
super(PacketOpcodes.HomeChangeEditModeRsp);
|
||||
|
||||
this.setData(HomeChangeEditModeRspOuterClass.HomeChangeEditModeRsp.newBuilder()
|
||||
.setRetcode(retcode));
|
||||
}
|
||||
}
|
||||
|
||||
+5
-8
@@ -5,6 +5,7 @@ import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeGetArrangementInfoRspOuterClass;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PacketHomeGetArrangementInfoRsp extends BasePacket {
|
||||
@@ -12,16 +13,12 @@ public class PacketHomeGetArrangementInfoRsp extends BasePacket {
|
||||
public PacketHomeGetArrangementInfoRsp(Player player, List<Integer> sceneIdList) {
|
||||
super(PacketOpcodes.HomeGetArrangementInfoRsp);
|
||||
|
||||
var home = player.getHome();
|
||||
|
||||
var homeScenes =
|
||||
sceneIdList.stream().map(home::getHomeSceneItem).map(HomeSceneItem::toProto).toList();
|
||||
|
||||
home.save();
|
||||
|
||||
var proto = HomeGetArrangementInfoRspOuterClass.HomeGetArrangementInfoRsp.newBuilder();
|
||||
|
||||
var home = player.getCurHomeWorld().getHome();
|
||||
var homeScenes =
|
||||
sceneIdList.stream().map(home::getHomeSceneItem).map(HomeSceneItem::toProto).toList();
|
||||
proto.addAllSceneArrangementInfoList(homeScenes);
|
||||
home.save();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
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.HomeGetOnlineStatusRspOuterClass;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PacketHomeGetOnlineStatusRsp extends BasePacket {
|
||||
public PacketHomeGetOnlineStatusRsp(List<Player> guests) {
|
||||
super(PacketOpcodes.HomeGetOnlineStatusRsp);
|
||||
|
||||
this.setData(HomeGetOnlineStatusRspOuterClass.HomeGetOnlineStatusRsp.newBuilder()
|
||||
.addAllPlayerInfoList(guests.stream().map(Player::getOnlinePlayerInfo).toList()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeKickPlayerReqOuterClass;
|
||||
import emu.grasscutter.net.proto.HomeKickPlayerRspOuterClass;
|
||||
|
||||
public class PacketHomeKickPlayerRsp extends BasePacket {
|
||||
public PacketHomeKickPlayerRsp(int retcode, HomeKickPlayerReqOuterClass.HomeKickPlayerReq req) {
|
||||
super(PacketOpcodes.HomeKickPlayerRsp);
|
||||
|
||||
this.setData(HomeKickPlayerRspOuterClass.HomeKickPlayerRsp.newBuilder()
|
||||
.setIsKickAll(req.getIsKickAll())
|
||||
.setTargetUid(req.getTargetUid())
|
||||
.setRetcode(retcode));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.HomeMarkPointNotifyOuterClass;
|
||||
import emu.grasscutter.net.proto.HomeMarkPointSceneDataOuterClass;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class PacketHomeMarkPointNotify extends BasePacket {
|
||||
@@ -14,28 +15,32 @@ public class PacketHomeMarkPointNotify extends BasePacket {
|
||||
super(PacketOpcodes.HomeMarkPointNotify);
|
||||
|
||||
var proto = HomeMarkPointNotifyOuterClass.HomeMarkPointNotify.newBuilder();
|
||||
var owner = player.getCurHomeWorld().getHost();
|
||||
var home = player.getCurHomeWorld().getHome();
|
||||
|
||||
if (player.getRealmList() == null) {
|
||||
if (owner.getRealmList() == null) {
|
||||
return;
|
||||
}
|
||||
for (var moduleId : player.getRealmList()) {
|
||||
var homeScene = player.getHome().getHomeSceneItem(moduleId + 2000);
|
||||
|
||||
for (var moduleId : owner.getRealmList()) {
|
||||
var homeScene = home.getHomeSceneItem(moduleId + 2000);
|
||||
|
||||
var markPointData =
|
||||
HomeMarkPointSceneDataOuterClass.HomeMarkPointSceneData.newBuilder()
|
||||
.setModuleId(moduleId)
|
||||
.setSceneId(moduleId + 2000)
|
||||
.setTeapotSpiritPos(homeScene.getDjinnPos().toProto());
|
||||
HomeMarkPointSceneDataOuterClass.HomeMarkPointSceneData.newBuilder()
|
||||
.setModuleId(moduleId)
|
||||
.setSceneId(moduleId + 2000)
|
||||
.setSafePointPos(homeScene.getBornPos().toProto())
|
||||
.setTeapotSpiritPos(homeScene.getDjinnPos().toProto());
|
||||
|
||||
// Now it only supports the teleport point
|
||||
// TODO add more types
|
||||
var marks =
|
||||
homeScene.getBlockItems().values().stream()
|
||||
.map(HomeBlockItem::getDeployFurnitureList)
|
||||
.flatMap(Collection::stream)
|
||||
.filter(i -> i.getFurnitureId() == 373501)
|
||||
.map(x -> x.toMarkPointProto(3))
|
||||
.toList();
|
||||
homeScene.getBlockItems().values().stream()
|
||||
.map(HomeBlockItem::getDeployFurnitureList)
|
||||
.flatMap(Collection::stream)
|
||||
.filter(i -> i.getFurnitureId() == 373501)
|
||||
.map(x -> x.toMarkPointProto(3))
|
||||
.toList();
|
||||
|
||||
markPointData.addAllFurnitureList(marks);
|
||||
proto.addMarkPointDataList(markPointData);
|
||||
|
||||
+14
@@ -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.HomeSaveArrangementNoChangeRspOuterClass;
|
||||
|
||||
public class PacketHomeSaveArrangementNoChangeRsp extends BasePacket {
|
||||
public PacketHomeSaveArrangementNoChangeRsp(int sceneId) {
|
||||
super(PacketOpcodes.HomeSaveArrangementNoChangeRsp);
|
||||
|
||||
this.setData(HomeSaveArrangementNoChangeRspOuterClass.HomeSaveArrangementNoChangeRsp.newBuilder()
|
||||
.setSceneId(sceneId));
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
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.OtherPlayerEnterHomeNotifyOuterClass;
|
||||
|
||||
public class PacketOtherPlayerEnterOrLeaveHomeNotify extends BasePacket {
|
||||
public PacketOtherPlayerEnterOrLeaveHomeNotify(Player enterer, OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason reason) {
|
||||
super(PacketOpcodes.OtherPlayerEnterHomeNotify);
|
||||
|
||||
this.setData(OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.newBuilder()
|
||||
.setNickname(enterer.getNickname())
|
||||
.setReason(reason));
|
||||
}
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
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.PlayerApplyEnterHomeNotifyOuterClass;
|
||||
|
||||
public class PacketPlayerApplyEnterHomeNotify extends BasePacket {
|
||||
public PacketPlayerApplyEnterHomeNotify(Player requester) {
|
||||
super(PacketOpcodes.PlayerApplyEnterHomeNotify);
|
||||
|
||||
this.setData(PlayerApplyEnterHomeNotifyOuterClass.PlayerApplyEnterHomeNotify.newBuilder()
|
||||
.setSrcPlayerInfo(requester.getOnlinePlayerInfo()));
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlayerApplyEnterHomeResultNotifyOuterClass;
|
||||
|
||||
public class PacketPlayerApplyEnterHomeResultNotify extends BasePacket {
|
||||
public PacketPlayerApplyEnterHomeResultNotify(int targetUid, String nickname, boolean agreed, PlayerApplyEnterHomeResultNotifyOuterClass.PlayerApplyEnterHomeResultNotify.Reason reason) {
|
||||
super(PacketOpcodes.PlayerApplyEnterHomeResultNotify);
|
||||
|
||||
this.setData(PlayerApplyEnterHomeResultNotifyOuterClass.PlayerApplyEnterHomeResultNotify.newBuilder()
|
||||
.setTargetUid(targetUid)
|
||||
.setTargetNickname(nickname)
|
||||
.setIsAgreed(agreed)
|
||||
.setReason(reason));
|
||||
}
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlayerApplyEnterHomeResultRspOuterClass;
|
||||
|
||||
public class PacketPlayerApplyEnterHomeResultRsp extends BasePacket {
|
||||
public PacketPlayerApplyEnterHomeResultRsp(int uid, boolean agreed) {
|
||||
super(PacketOpcodes.PlayerApplyEnterHomeResultRsp);
|
||||
|
||||
this.setData(PlayerApplyEnterHomeResultRspOuterClass.PlayerApplyEnterHomeResultRsp.newBuilder()
|
||||
.setApplyUid(uid)
|
||||
.setIsAgreed(agreed));
|
||||
}
|
||||
}
|
||||
+86
-54
@@ -21,30 +21,30 @@ public class PacketPlayerEnterSceneNotify extends BasePacket {
|
||||
player.setEnterSceneToken(Utils.randomRange(1000, 99999));
|
||||
|
||||
var proto =
|
||||
PlayerEnterSceneNotify.newBuilder()
|
||||
.setSceneId(player.getSceneId())
|
||||
.setPos(player.getPosition().toProto())
|
||||
.setSceneBeginTime(System.currentTimeMillis())
|
||||
.setType(EnterType.ENTER_TYPE_SELF)
|
||||
.setTargetUid(player.getUid())
|
||||
.setEnterSceneToken(player.getEnterSceneToken())
|
||||
.setWorldLevel(player.getWorldLevel())
|
||||
.setEnterReason(EnterReason.Login.getValue())
|
||||
.setIsFirstLoginEnterScene(player.isFirstLoginEnterScene())
|
||||
.setWorldType(1)
|
||||
.setSceneTransaction(
|
||||
"3-"
|
||||
+ player.getUid()
|
||||
+ "-"
|
||||
+ (int) (System.currentTimeMillis() / 1000)
|
||||
+ "-"
|
||||
+ 18402);
|
||||
PlayerEnterSceneNotify.newBuilder()
|
||||
.setSceneId(player.getSceneId())
|
||||
.setPos(player.getPosition().toProto())
|
||||
.setSceneBeginTime(System.currentTimeMillis())
|
||||
.setType(EnterType.ENTER_TYPE_SELF)
|
||||
.setTargetUid(player.getUid())
|
||||
.setEnterSceneToken(player.getEnterSceneToken())
|
||||
.setWorldLevel(player.getWorldLevel())
|
||||
.setEnterReason(EnterReason.Login.getValue())
|
||||
.setIsFirstLoginEnterScene(player.isFirstLoginEnterScene())
|
||||
.setWorldType(1)
|
||||
.setSceneTransaction(
|
||||
"3-"
|
||||
+ player.getUid()
|
||||
+ "-"
|
||||
+ (int) (System.currentTimeMillis() / 1000)
|
||||
+ "-"
|
||||
+ 18402);
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketPlayerEnterSceneNotify(
|
||||
Player player, EnterType type, EnterReason reason, int newScene, Position newPos) {
|
||||
Player player, EnterType type, EnterReason reason, int newScene, Position newPos) {
|
||||
this(player, player, type, reason, newScene, newPos);
|
||||
}
|
||||
|
||||
@@ -53,52 +53,52 @@ public class PacketPlayerEnterSceneNotify extends BasePacket {
|
||||
}
|
||||
|
||||
public PacketPlayerEnterSceneNotify(
|
||||
Player player,
|
||||
Player target,
|
||||
EnterType type,
|
||||
EnterReason reason,
|
||||
int newScene,
|
||||
Position newPos) {
|
||||
Player player,
|
||||
Player target,
|
||||
EnterType type,
|
||||
EnterReason reason,
|
||||
int newScene,
|
||||
Position newPos) {
|
||||
this(
|
||||
player,
|
||||
target,
|
||||
TeleportProperties.builder()
|
||||
.enterType(type)
|
||||
.enterReason(reason)
|
||||
.sceneId(newScene)
|
||||
.teleportTo(newPos)
|
||||
.build());
|
||||
player,
|
||||
target,
|
||||
TeleportProperties.builder()
|
||||
.enterType(type)
|
||||
.enterReason(reason)
|
||||
.sceneId(newScene)
|
||||
.teleportTo(newPos)
|
||||
.build());
|
||||
}
|
||||
|
||||
// Teleport or go somewhere
|
||||
public PacketPlayerEnterSceneNotify(
|
||||
Player player, Player target, TeleportProperties teleportProperties) {
|
||||
Player player, Player target, TeleportProperties teleportProperties) {
|
||||
super(PacketOpcodes.PlayerEnterSceneNotify);
|
||||
|
||||
player.setSceneLoadState(SceneLoadState.LOADING);
|
||||
player.setEnterSceneToken(Utils.randomRange(1000, 99999));
|
||||
|
||||
var proto =
|
||||
PlayerEnterSceneNotify.newBuilder()
|
||||
.setPrevSceneId(player.getSceneId())
|
||||
.setPrevPos(player.getPosition().toProto())
|
||||
.setSceneId(teleportProperties.getSceneId())
|
||||
.setPos(teleportProperties.getTeleportTo().toProto())
|
||||
.setSceneBeginTime(System.currentTimeMillis())
|
||||
.setType(teleportProperties.getEnterType())
|
||||
.setTargetUid(target.getUid())
|
||||
.setEnterSceneToken(player.getEnterSceneToken())
|
||||
.setWorldLevel(target.getWorld().getWorldLevel())
|
||||
.setEnterReason(teleportProperties.getEnterReason().getValue())
|
||||
.setWorldType(1)
|
||||
.setSceneTransaction(
|
||||
teleportProperties.getSceneId()
|
||||
+ "-"
|
||||
+ target.getUid()
|
||||
+ "-"
|
||||
+ (int) (System.currentTimeMillis() / 1000)
|
||||
+ "-"
|
||||
+ 18402);
|
||||
PlayerEnterSceneNotify.newBuilder()
|
||||
.setPrevSceneId(player.getSceneId())
|
||||
.setPrevPos(player.getPosition().toProto())
|
||||
.setSceneId(teleportProperties.getSceneId())
|
||||
.setPos(teleportProperties.getTeleportTo().toProto())
|
||||
.setSceneBeginTime(System.currentTimeMillis())
|
||||
.setType(teleportProperties.getEnterType())
|
||||
.setTargetUid(target.getUid())
|
||||
.setEnterSceneToken(player.getEnterSceneToken())
|
||||
.setWorldLevel(target.getWorld().getWorldLevel())
|
||||
.setEnterReason(teleportProperties.getEnterReason().getValue())
|
||||
.setWorldType(1)
|
||||
.setSceneTransaction(
|
||||
teleportProperties.getSceneId()
|
||||
+ "-"
|
||||
+ target.getUid()
|
||||
+ "-"
|
||||
+ (int) (System.currentTimeMillis() / 1000)
|
||||
+ "-"
|
||||
+ 18402);
|
||||
|
||||
// Apply the dungeon ID to the packet if it's a dungeon.
|
||||
if (teleportProperties.getDungeonId() != 0) {
|
||||
@@ -107,4 +107,36 @@ public class PacketPlayerEnterSceneNotify extends BasePacket {
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
// Go home
|
||||
public PacketPlayerEnterSceneNotify(
|
||||
Player player, int targetUid, TeleportProperties teleportProperties, boolean other) {
|
||||
super(PacketOpcodes.PlayerEnterSceneNotify);
|
||||
|
||||
player.setSceneLoadState(SceneLoadState.LOADING);
|
||||
player.setEnterSceneToken(Utils.randomRange(1000, 99999));
|
||||
|
||||
var proto =
|
||||
PlayerEnterSceneNotify.newBuilder()
|
||||
.setPrevSceneId(player.getSceneId())
|
||||
.setPrevPos(player.getPosition().toProto())
|
||||
.setSceneId(teleportProperties.getSceneId())
|
||||
.setPos(teleportProperties.getTeleportTo().toProto())
|
||||
.setSceneBeginTime(System.currentTimeMillis())
|
||||
.setType(other ? EnterType.ENTER_TYPE_OTHER_HOME : EnterType.ENTER_TYPE_SELF_HOME)
|
||||
.setTargetUid(targetUid)
|
||||
.setEnterSceneToken(player.getEnterSceneToken())
|
||||
.setEnterReason(teleportProperties.getEnterReason().getValue())
|
||||
.setWorldType(64)
|
||||
.setSceneTransaction(
|
||||
teleportProperties.getSceneId()
|
||||
+ "-"
|
||||
+ targetUid
|
||||
+ "-"
|
||||
+ (int) (System.currentTimeMillis() / 1000)
|
||||
+ "-"
|
||||
+ 27573);
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -5,7 +5,6 @@ import emu.grasscutter.net.packet.BasePacket;
|
||||
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 {
|
||||
|
||||
@@ -22,7 +21,8 @@ public class PacketPlayerHomeCompInfoNotify extends BasePacket {
|
||||
.setCompInfo(
|
||||
PlayerHomeCompInfoOuterClass.PlayerHomeCompInfo.newBuilder()
|
||||
.addAllUnlockedModuleIdList(player.getRealmList())
|
||||
.addAllLevelupRewardGotLevelList(List.of(1)) // Hardcoded
|
||||
.addAllLevelupRewardGotLevelList(player.getHomeRewardedLevels())
|
||||
.addAllSeenModuleIdList(player.getSeenRealmList())
|
||||
.setFriendEnterHomeOptionValue(player.getHome().getEnterHomeOption())
|
||||
.build())
|
||||
.build();
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
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.PlayerPreEnterMpNotifyOuterClass;
|
||||
|
||||
public class PacketPlayerPreEnterMpNotify extends BasePacket {
|
||||
public PacketPlayerPreEnterMpNotify(Player player) {
|
||||
super(PacketOpcodes.PlayerPreEnterMpNotify);
|
||||
|
||||
this.setData(PlayerPreEnterMpNotifyOuterClass.PlayerPreEnterMpNotify.newBuilder()
|
||||
.setUid(player.getUid())
|
||||
.setNickname(player.getNickname())
|
||||
.setState(PlayerPreEnterMpNotifyOuterClass.PlayerPreEnterMpNotify.State.START));
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ public class PacketTryEnterHomeRsp extends BasePacket {
|
||||
|
||||
TryEnterHomeRspOuterClass.TryEnterHomeRsp proto =
|
||||
TryEnterHomeRspOuterClass.TryEnterHomeRsp.newBuilder()
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_HOME_APPLY_ENTER_OTHER_HOME_FAIL_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
@@ -23,7 +23,6 @@ public class PacketTryEnterHomeRsp extends BasePacket {
|
||||
|
||||
TryEnterHomeRspOuterClass.TryEnterHomeRsp proto =
|
||||
TryEnterHomeRspOuterClass.TryEnterHomeRsp.newBuilder()
|
||||
.setRetcode(0)
|
||||
.setTargetUid(uid)
|
||||
.build();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user