mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-14 21:34:52 +01:00
Refactor how next packages are handled
This commit is contained in:
@@ -2,6 +2,7 @@ package emu.nebula.game.player;
|
|||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
import dev.morphia.annotations.Entity;
|
import dev.morphia.annotations.Entity;
|
||||||
import dev.morphia.annotations.Id;
|
import dev.morphia.annotations.Id;
|
||||||
@@ -21,6 +22,7 @@ import emu.nebula.game.mail.Mailbox;
|
|||||||
import emu.nebula.game.story.StoryManager;
|
import emu.nebula.game.story.StoryManager;
|
||||||
import emu.nebula.game.tower.StarTowerManager;
|
import emu.nebula.game.tower.StarTowerManager;
|
||||||
import emu.nebula.net.GameSession;
|
import emu.nebula.net.GameSession;
|
||||||
|
import emu.nebula.net.NetMsgPacket;
|
||||||
import emu.nebula.proto.PlayerData.DictionaryEntry;
|
import emu.nebula.proto.PlayerData.DictionaryEntry;
|
||||||
import emu.nebula.proto.PlayerData.DictionaryTab;
|
import emu.nebula.proto.PlayerData.DictionaryTab;
|
||||||
import emu.nebula.proto.PlayerData.PlayerInfo;
|
import emu.nebula.proto.PlayerData.PlayerInfo;
|
||||||
@@ -32,6 +34,7 @@ import emu.nebula.proto.Public.WorldClass;
|
|||||||
import emu.nebula.proto.Public.Title;
|
import emu.nebula.proto.Public.Title;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import us.hebi.quickbuf.ProtoMessage;
|
||||||
import us.hebi.quickbuf.RepeatedInt;
|
import us.hebi.quickbuf.RepeatedInt;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -72,11 +75,16 @@ public class Player implements GameDatabaseObject {
|
|||||||
private transient InstanceManager instanceManager;
|
private transient InstanceManager instanceManager;
|
||||||
private transient StoryManager storyManager;
|
private transient StoryManager storyManager;
|
||||||
|
|
||||||
|
// Next packages
|
||||||
|
private transient Stack<NetMsgPacket> nextPackages;
|
||||||
|
|
||||||
@Deprecated // Morphia only
|
@Deprecated // Morphia only
|
||||||
public Player() {
|
public Player() {
|
||||||
this.sessions = new HashSet<>();
|
this.sessions = new HashSet<>();
|
||||||
this.characters = new CharacterStorage(this);
|
this.characters = new CharacterStorage(this);
|
||||||
this.gachaManager = new GachaManager(this);
|
this.gachaManager = new GachaManager(this);
|
||||||
|
|
||||||
|
this.nextPackages = new Stack<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player(Account account, String name, boolean gender) {
|
public Player(Account account, String name, boolean gender) {
|
||||||
@@ -430,6 +438,12 @@ public class Player implements GameDatabaseObject {
|
|||||||
this.storyManager = this.loadManagerFromDatabase(StoryManager.class);
|
this.storyManager = this.loadManagerFromDatabase(StoryManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Next packages
|
||||||
|
|
||||||
|
public void addNextPackage(int msgId, ProtoMessage<?> proto) {
|
||||||
|
this.getNextPackages().add(new NetMsgPacket(msgId, proto));
|
||||||
|
}
|
||||||
|
|
||||||
// Proto
|
// Proto
|
||||||
|
|
||||||
public PlayerInfo toProto() {
|
public PlayerInfo toProto() {
|
||||||
|
|||||||
@@ -167,13 +167,44 @@ public class GameSession {
|
|||||||
this.getPlayer().getMailbox().clearNewState();
|
this.getPlayer().getMailbox().clearNewState();
|
||||||
|
|
||||||
// Send mail state notify
|
// Send mail state notify
|
||||||
byte[] nextPackage = PacketHelper.encodeMsg(
|
this.getPlayer().addNextPackage(
|
||||||
NetMsgId.mail_state_notify,
|
NetMsgId.mail_state_notify,
|
||||||
MailState.newInstance().setNew(true)
|
MailState.newInstance().setNew(true)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set next package
|
||||||
|
if (this.getPlayer().getNextPackages().size() > 0) {
|
||||||
|
// Set current package
|
||||||
|
NetMsgPacket curPacket = null;
|
||||||
|
|
||||||
// Set via reflection
|
// Chain link next packages
|
||||||
PacketHelper.setNextPackage(proto, nextPackage);
|
while (getPlayer().getNextPackages().size() > 0) {
|
||||||
|
// Make sure the current packet has a nextPackage field
|
||||||
|
if (curPacket != null && !PacketHelper.hasNextPackageMethod(curPacket.getProto())) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current package
|
||||||
|
var nextPacket = getPlayer().getNextPackages().pop();
|
||||||
|
|
||||||
|
// Set cur packet if its null
|
||||||
|
if (curPacket == null) {
|
||||||
|
curPacket = nextPacket;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set next package
|
||||||
|
PacketHelper.setNextPackage(nextPacket.getProto(), curPacket.toByteArray());
|
||||||
|
|
||||||
|
// Update next packet
|
||||||
|
curPacket = nextPacket;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set next package of current proto via reflection
|
||||||
|
if (curPacket != null) {
|
||||||
|
PacketHelper.setNextPackage(proto, curPacket.toByteArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/main/java/emu/nebula/net/NetMsgPacket.java
Normal file
19
src/main/java/emu/nebula/net/NetMsgPacket.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package emu.nebula.net;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import us.hebi.quickbuf.ProtoMessage;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class NetMsgPacket {
|
||||||
|
private int msgId;
|
||||||
|
private ProtoMessage<?> proto;
|
||||||
|
|
||||||
|
public NetMsgPacket(int msgId, ProtoMessage<?> proto) {
|
||||||
|
this.msgId = msgId;
|
||||||
|
this.proto = proto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
return PacketHelper.encodeMsg(this.getMsgId(), this.getProto());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,6 +14,8 @@ import us.hebi.quickbuf.ProtoSink;
|
|||||||
public class PacketHelper {
|
public class PacketHelper {
|
||||||
private static Object2IntMap<Class<?>> methodIndexCache = new Object2IntOpenHashMap<>();
|
private static Object2IntMap<Class<?>> methodIndexCache = new Object2IntOpenHashMap<>();
|
||||||
|
|
||||||
|
// Next packages
|
||||||
|
|
||||||
public static void cacheProtos() {
|
public static void cacheProtos() {
|
||||||
var classes = new Reflections(Nebula.class.getPackage().getName()).getSubTypesOf(ProtoMessage.class);
|
var classes = new Reflections(Nebula.class.getPackage().getName()).getSubTypesOf(ProtoMessage.class);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user