mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-16 08:56:04 +01:00
Merge remote-tracking branch 'upstream/development' into dev-mail
This commit is contained in:
@@ -18,6 +18,8 @@ import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo;
|
||||
import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo;
|
||||
import emu.grasscutter.server.dispatch.json.*;
|
||||
import emu.grasscutter.server.dispatch.json.ComboTokenReqJson.LoginTokenData;
|
||||
import emu.grasscutter.server.event.dispatch.QueryAllRegionsEvent;
|
||||
import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent;
|
||||
import emu.grasscutter.utils.FileUtils;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
|
||||
@@ -277,7 +279,11 @@ public final class DispatchServer {
|
||||
if (uri.getQuery() != null && uri.getQuery().length() > 0) {
|
||||
response = regionCurrentBase64;
|
||||
}
|
||||
responseHTML(t, response);
|
||||
|
||||
// Invoke event.
|
||||
QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(response); event.call();
|
||||
// Respond with event result.
|
||||
responseHTML(t, event.getRegionInfo());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package emu.grasscutter.server.event;
|
||||
|
||||
/**
|
||||
* Implementing this interface marks an event as cancellable.
|
||||
*/
|
||||
public interface Cancellable {
|
||||
void cancel();
|
||||
}
|
||||
32
src/main/java/emu/grasscutter/server/event/Event.java
Normal file
32
src/main/java/emu/grasscutter/server/event/Event.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package emu.grasscutter.server.event;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
|
||||
/**
|
||||
* A generic server event.
|
||||
*/
|
||||
public abstract class Event {
|
||||
private boolean cancelled = false;
|
||||
|
||||
/**
|
||||
* Return the cancelled state of the event.
|
||||
*/
|
||||
public boolean isCanceled() {
|
||||
return this.cancelled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the event if possible.
|
||||
*/
|
||||
public void cancel() {
|
||||
if(this instanceof Cancellable)
|
||||
this.cancelled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes this event to all listeners.
|
||||
*/
|
||||
public void call() {
|
||||
Grasscutter.getPluginManager().invokeEvent(this);
|
||||
}
|
||||
}
|
||||
11
src/main/java/emu/grasscutter/server/event/EventHandler.java
Normal file
11
src/main/java/emu/grasscutter/server/event/EventHandler.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package emu.grasscutter.server.event;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
/**
|
||||
* Declares a class as an event listener/handler.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface EventHandler {
|
||||
}
|
||||
7
src/main/java/emu/grasscutter/server/event/Listener.java
Normal file
7
src/main/java/emu/grasscutter/server/event/Listener.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package emu.grasscutter.server.event;
|
||||
|
||||
/**
|
||||
* Implementing this interface declares a class as an event listener.
|
||||
*/
|
||||
public interface Listener {
|
||||
}
|
||||
17
src/main/java/emu/grasscutter/server/event/ServerEvent.java
Normal file
17
src/main/java/emu/grasscutter/server/event/ServerEvent.java
Normal file
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.server.event;
|
||||
|
||||
/**
|
||||
* An event that is related to the internals of the server.
|
||||
*/
|
||||
public abstract class ServerEvent extends Event {
|
||||
protected final Type type;
|
||||
|
||||
public ServerEvent(Type type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
DISPATCH,
|
||||
GAME
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.server.event.dispatch;
|
||||
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
|
||||
public final class QueryAllRegionsEvent extends ServerEvent {
|
||||
private String regionList;
|
||||
|
||||
public QueryAllRegionsEvent(String regionList) {
|
||||
super(Type.DISPATCH);
|
||||
|
||||
this.regionList = regionList;
|
||||
}
|
||||
|
||||
public void setRegionList(String regionList) {
|
||||
this.regionList = regionList;
|
||||
}
|
||||
|
||||
public String getRegionList() {
|
||||
return this.regionList;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.server.event.dispatch;
|
||||
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
|
||||
public final class QueryCurrentRegionEvent extends ServerEvent {
|
||||
private String regionInfo;
|
||||
|
||||
public QueryCurrentRegionEvent(String regionInfo) {
|
||||
super(Type.DISPATCH);
|
||||
|
||||
this.regionInfo = regionInfo;
|
||||
}
|
||||
|
||||
public void setRegionInfo(String regionInfo) {
|
||||
this.regionInfo = regionInfo;
|
||||
}
|
||||
|
||||
public String getRegionInfo() {
|
||||
return this.regionInfo;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package emu.grasscutter.server.event.game;
|
||||
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
public final class ReceivePacketEvent extends ServerEvent implements Cancellable {
|
||||
private final GameSession gameSession;
|
||||
private final int packetId;
|
||||
private byte[] packetData;
|
||||
|
||||
public ReceivePacketEvent(GameSession gameSession, int packetId, byte[] packetData) {
|
||||
super(Type.GAME);
|
||||
|
||||
this.gameSession = gameSession;
|
||||
this.packetId = packetId;
|
||||
this.packetData = packetData;
|
||||
}
|
||||
|
||||
public GameSession getGameSession() {
|
||||
return this.gameSession;
|
||||
}
|
||||
|
||||
public int getPacketId() {
|
||||
return this.packetId;
|
||||
}
|
||||
|
||||
public void setPacketData(byte[] packetData) {
|
||||
this.packetData = packetData;
|
||||
}
|
||||
|
||||
public byte[] getPacketData() {
|
||||
return this.packetData;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package emu.grasscutter.server.event.game;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
public final class SendPacketEvent extends ServerEvent implements Cancellable {
|
||||
private final GameSession gameSession;
|
||||
private GenshinPacket packet;
|
||||
|
||||
public SendPacketEvent(GameSession gameSession, GenshinPacket packet) {
|
||||
super(Type.GAME);
|
||||
|
||||
this.gameSession = gameSession;
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
public GameSession getGameSession() {
|
||||
return this.gameSession;
|
||||
}
|
||||
|
||||
public void setPacket(GenshinPacket packet) {
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
public GenshinPacket getPacket() {
|
||||
return this.packet;
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package emu.grasscutter.server.game;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import emu.grasscutter.server.event.game.ReceivePacketEvent;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
@@ -48,9 +49,7 @@ public class GameServerPacketHandler {
|
||||
}
|
||||
|
||||
public void handle(GameSession session, int opcode, byte[] header, byte[] payload) {
|
||||
PacketHandler handler = null;
|
||||
|
||||
handler = this.handlers.get(opcode);
|
||||
PacketHandler handler = this.handlers.get(opcode);
|
||||
|
||||
if (handler != null) {
|
||||
try {
|
||||
@@ -77,8 +76,10 @@ public class GameServerPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
// Handle
|
||||
handler.handle(session, header, payload);
|
||||
// Invoke event.
|
||||
ReceivePacketEvent event = new ReceivePacketEvent(session, opcode, payload); event.call();
|
||||
if(!event.isCanceled()) // If event is not canceled, continue.
|
||||
handler.handle(session, header, event.getPacketData());
|
||||
} catch (Exception ex) {
|
||||
// TODO Remove this when no more needed
|
||||
ex.printStackTrace();
|
||||
|
||||
@@ -10,6 +10,7 @@ import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodesUtil;
|
||||
import emu.grasscutter.netty.MihoyoKcpChannel;
|
||||
import emu.grasscutter.server.event.game.SendPacketEvent;
|
||||
import emu.grasscutter.utils.Crypto;
|
||||
import emu.grasscutter.utils.FileUtils;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
@@ -161,16 +162,15 @@ public class GameSession extends MihoyoKcpChannel {
|
||||
genshinPacket.buildHeader(this.getNextClientSequence());
|
||||
}
|
||||
|
||||
// Build packet
|
||||
byte[] data = genshinPacket.build();
|
||||
|
||||
// Log
|
||||
if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) {
|
||||
logPacket(genshinPacket);
|
||||
}
|
||||
|
||||
// Send
|
||||
send(data);
|
||||
|
||||
// Invoke event.
|
||||
SendPacketEvent event = new SendPacketEvent(this, genshinPacket); event.call();
|
||||
if(!event.isCanceled()) // If event is not cancelled, continue.
|
||||
this.send(event.getPacket().build());
|
||||
}
|
||||
|
||||
private void logPacket(int opcode) {
|
||||
|
||||
Reference in New Issue
Block a user