mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-19 10:24:47 +01:00
Open state framework (#1483)
* Added more server debug options * made server debug code prettier * fixed initialization bug * Enables logging of packets contained in UnionCmdNotify, when debug level is WHITELIST or BLACKLIST * Fully Implement OpenState Framework * added devOpenStates * Commented out newPlayerOpenStates * Removed OPEN_STATE_NONE from devOpenStates
This commit is contained in:
@@ -17,7 +17,7 @@ import static emu.grasscutter.Configuration.ACCOUNT;
|
||||
|
||||
@Opcodes(PacketOpcodes.PlayerLoginReq) // Sends initial data packets
|
||||
public class HandlerPlayerLoginReq extends PacketHandler {
|
||||
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// Check
|
||||
@@ -28,18 +28,20 @@ public class HandlerPlayerLoginReq extends PacketHandler {
|
||||
|
||||
// Parse request
|
||||
PlayerLoginReq req = PlayerLoginReq.parseFrom(payload);
|
||||
|
||||
|
||||
// Authenticate session
|
||||
if (!req.getToken().equals(session.getAccount().getToken())) {
|
||||
session.close();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Load character from db
|
||||
Player player = session.getPlayer();
|
||||
|
||||
|
||||
// Show opening cutscene if player has no avatars
|
||||
if (player.getAvatars().getAvatarCount() == 0) {
|
||||
// Set New Player OpenStates
|
||||
player.getOpenStateManager().onNewPlayerCreate();
|
||||
// Pick character
|
||||
session.setState(SessionState.PICKING_CHARACTER);
|
||||
session.send(new BasePacket(PacketOpcodes.DoSetPlayerBornDataNotify));
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.props.OpenState;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SetOpenStateReqOuterClass.SetOpenStateReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSetOpenStateRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SetOpenStateReq)
|
||||
public class HandlerSetOpenStateReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = SetOpenStateReq.parseFrom(payload);
|
||||
int openState = req.getKey();
|
||||
int value = req.getValue();
|
||||
|
||||
session.getPlayer().getOpenStateManager().setOpenState(OpenState.getTypeByValue(openState), value);
|
||||
//Client Automatically Updates its OpenStateMap, no need to send OpenStateUpdateNotify
|
||||
|
||||
session.send(new PacketSetOpenStateRsp(openState,value));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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.OpenStateChangeNotifyOuterClass.OpenStateChangeNotify;
|
||||
|
||||
//Sets openState to value
|
||||
public class PacketOpenStateChangeNotify extends BasePacket {
|
||||
|
||||
public PacketOpenStateChangeNotify(int openState, int value) {
|
||||
super(PacketOpcodes.OpenStateChangeNotify);
|
||||
|
||||
OpenStateChangeNotify proto = OpenStateChangeNotify.newBuilder()
|
||||
.putOpenStateMap(openState,value).build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,22 +1,25 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.player.PlayerOpenStateManager;
|
||||
import emu.grasscutter.game.props.OpenState;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.OpenStateUpdateNotifyOuterClass.OpenStateUpdateNotify;
|
||||
|
||||
import java.util.Map;
|
||||
/*
|
||||
Must be sent on login for openStates to work
|
||||
Tells the client to update its openStateMap for the keys sent. value is irrelevant
|
||||
*/
|
||||
public class PacketOpenStateUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketOpenStateUpdateNotify() {
|
||||
|
||||
public PacketOpenStateUpdateNotify(Player player) {
|
||||
super(PacketOpcodes.OpenStateUpdateNotify);
|
||||
|
||||
|
||||
OpenStateUpdateNotify.Builder proto = OpenStateUpdateNotify.newBuilder();
|
||||
|
||||
for (OpenState type : OpenState.values()) {
|
||||
if (type.getValue() > 0) {
|
||||
proto.putOpenStateMap(type.getValue(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
proto.putAllOpenStateMap(player.getOpenStateManager().getOpenStateMap()).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.SetOpenStateRspOuterClass.SetOpenStateRsp;
|
||||
|
||||
public class PacketSetOpenStateRsp extends BasePacket {
|
||||
|
||||
public PacketSetOpenStateRsp(int openState, int value) {
|
||||
super(PacketOpcodes.SetOpenStateRsp);
|
||||
|
||||
SetOpenStateRsp proto = SetOpenStateRsp.newBuilder()
|
||||
.setKey(openState).setValue(value).build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user