mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-12 08:32:57 +08:00
addfb5eb5d
* [BREAK] proto auto compiled by gradle * [BREAK] move proto to submodule * update gitmodules * [BREAK] move proto to submodule * move proto to submodule * fix merge conflict * fix github action after merging * fix merge conflicts and del submodule * upload the proto
60 lines
2.1 KiB
Java
60 lines
2.1 KiB
Java
package emu.grasscutter.game;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import emu.grasscutter.net.packet.GenshinPacket;
|
|
import emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType;
|
|
|
|
public class InvokeHandler<T> {
|
|
private final List<T> entryListForwardAll;
|
|
private final List<T> entryListForwardAllExceptCur;
|
|
private final List<T> entryListForwardHost;
|
|
private final Class<? extends GenshinPacket> packetClass;
|
|
|
|
public InvokeHandler(Class<? extends GenshinPacket> packetClass) {
|
|
this.entryListForwardAll = new ArrayList<>();
|
|
this.entryListForwardAllExceptCur = new ArrayList<>();
|
|
this.entryListForwardHost = new ArrayList<>();
|
|
this.packetClass = packetClass;
|
|
}
|
|
|
|
public synchronized void addEntry(ForwardType forward, T entry) {
|
|
switch (forward) {
|
|
case FORWARD_TO_ALL -> entryListForwardAll.add(entry);
|
|
case FORWARD_TO_ALL_EXCEPT_CUR, FORWARD_TO_ALL_EXIST_EXCEPT_CUR -> entryListForwardAllExceptCur.add(entry);
|
|
case FORWARD_TO_HOST -> entryListForwardHost.add(entry);
|
|
default -> {
|
|
}
|
|
}
|
|
}
|
|
|
|
public synchronized void update(GenshinPlayer player) {
|
|
if (player.getWorld() == null) {
|
|
this.entryListForwardAll.clear();
|
|
this.entryListForwardAllExceptCur.clear();
|
|
this.entryListForwardHost.clear();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if (entryListForwardAll.size() > 0) {
|
|
GenshinPacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAll);
|
|
player.getScene().broadcastPacket(packet);
|
|
this.entryListForwardAll.clear();
|
|
}
|
|
if (entryListForwardAllExceptCur.size() > 0) {
|
|
GenshinPacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardAllExceptCur);
|
|
player.getScene().broadcastPacketToOthers(player, packet);
|
|
this.entryListForwardAllExceptCur.clear();
|
|
}
|
|
if (entryListForwardHost.size() > 0) {
|
|
GenshinPacket packet = packetClass.getDeclaredConstructor(List.class).newInstance(this.entryListForwardHost);
|
|
player.getWorld().getHost().sendPacket(packet);
|
|
this.entryListForwardHost.clear();
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|