Refactor how next packages are handled

This commit is contained in:
Melledy
2025-11-02 22:23:35 -08:00
parent d5c112bcf9
commit e0dc291def
4 changed files with 71 additions and 5 deletions

View File

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

View File

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

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

View File

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