Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ziqian zhang
Grasscutter
Commits
8b4212ff
Commit
8b4212ff
authored
Jul 20, 2022
by
Melledy
Browse files
Refactor `PacketOpcodesUtil` to be more... useful
parent
52ee229e
Changes
5
Show whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/Grasscutter.java
View file @
8b4212ff
...
@@ -5,7 +5,6 @@ import ch.qos.logback.classic.Logger;
...
@@ -5,7 +5,6 @@ import ch.qos.logback.classic.Logger;
import
com.google.gson.Gson
;
import
com.google.gson.Gson
;
import
com.google.gson.GsonBuilder
;
import
com.google.gson.GsonBuilder
;
import
emu.grasscutter.Grasscutter.ServerDebugMode
;
import
emu.grasscutter.auth.AuthenticationSystem
;
import
emu.grasscutter.auth.AuthenticationSystem
;
import
emu.grasscutter.auth.DefaultAuthentication
;
import
emu.grasscutter.auth.DefaultAuthentication
;
import
emu.grasscutter.command.CommandMap
;
import
emu.grasscutter.command.CommandMap
;
...
@@ -14,6 +13,7 @@ import emu.grasscutter.command.PermissionHandler;
...
@@ -14,6 +13,7 @@ import emu.grasscutter.command.PermissionHandler;
import
emu.grasscutter.config.ConfigContainer
;
import
emu.grasscutter.config.ConfigContainer
;
import
emu.grasscutter.data.ResourceLoader
;
import
emu.grasscutter.data.ResourceLoader
;
import
emu.grasscutter.database.DatabaseManager
;
import
emu.grasscutter.database.DatabaseManager
;
import
emu.grasscutter.net.packet.PacketOpcodesUtils
;
import
emu.grasscutter.plugin.PluginManager
;
import
emu.grasscutter.plugin.PluginManager
;
import
emu.grasscutter.plugin.api.ServerHook
;
import
emu.grasscutter.plugin.api.ServerHook
;
import
emu.grasscutter.scripts.ScriptLoader
;
import
emu.grasscutter.scripts.ScriptLoader
;
...
@@ -98,6 +98,10 @@ public final class Grasscutter {
...
@@ -98,6 +98,10 @@ public final class Grasscutter {
Tools
.
createGmHandbook
();
Tools
.
createGmHandbook
();
exitEarly
=
true
;
exitEarly
=
true
;
}
}
case
"-dumppacketids"
->
{
PacketOpcodesUtils
.
dumpPacketIds
();
exitEarly
=
true
;
}
case
"-gachamap"
->
{
case
"-gachamap"
->
{
Tools
.
createGachaMapping
(
DATA
(
"gacha_mappings.js"
));
Tools
.
createGachaMapping
(
DATA
(
"gacha_mappings.js"
));
exitEarly
=
true
;
exitEarly
=
true
;
...
...
src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
View file @
8b4212ff
package
emu.grasscutter.net.packet
;
package
emu.grasscutter.net.packet
;
import
java.util.HashSet
;
public
class
PacketOpcodes
{
public
class
PacketOpcodes
{
// Empty
// Empty
public
static
final
int
NONE
=
0
;
public
static
final
int
NONE
=
0
;
...
@@ -1856,12 +1854,4 @@ public class PacketOpcodes {
...
@@ -1856,12 +1854,4 @@ public class PacketOpcodes {
public
static
final
int
WorldRoutineTypeCloseNotify
=
3502
;
public
static
final
int
WorldRoutineTypeCloseNotify
=
3502
;
public
static
final
int
WorldRoutineTypeRefreshNotify
=
3525
;
public
static
final
int
WorldRoutineTypeRefreshNotify
=
3525
;
// Unknown
public
static
final
HashSet
<
Integer
>
BANNED_PACKETS
=
new
HashSet
<>()
{
{
this
.
add
(
PacketOpcodes
.
WindSeedClientNotify
);
this
.
add
(
PacketOpcodes
.
PlayerLuaShellNotify
);
}
};
}
}
\ No newline at end of file
src/main/java/emu/grasscutter/net/packet/PacketOpcodesUtil.java
→
src/main/java/emu/grasscutter/net/packet/PacketOpcodesUtil
s
.java
View file @
8b4212ff
...
@@ -4,13 +4,33 @@ import java.io.BufferedWriter;
...
@@ -4,13 +4,33 @@ import java.io.BufferedWriter;
import
java.io.FileWriter
;
import
java.io.FileWriter
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Field
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.TreeMap
;
import
java.util.stream.Collectors
;
import
emu.grasscutter.GameConstants
;
import
emu.grasscutter.Grasscutter
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
public
class
PacketOpcodesUtil
{
public
class
PacketOpcodesUtil
s
{
private
static
Int2ObjectMap
<
String
>
opcodeMap
;
private
static
Int2ObjectMap
<
String
>
opcodeMap
;
public
static
final
Set
<
Integer
>
BANNED_PACKETS
=
Set
.
of
(
PacketOpcodes
.
WindSeedClientNotify
,
PacketOpcodes
.
PlayerLuaShellNotify
);
public
static
final
Set
<
Integer
>
LOOP_PACKETS
=
Set
.
of
(
PacketOpcodes
.
PingReq
,
PacketOpcodes
.
PingRsp
,
PacketOpcodes
.
WorldPlayerRTTNotify
,
PacketOpcodes
.
UnionCmdNotify
,
PacketOpcodes
.
QueryPathReq
);
static
{
static
{
opcodeMap
=
new
Int2ObjectOpenHashMap
<
String
>();
opcodeMap
=
new
Int2ObjectOpenHashMap
<
String
>();
...
@@ -32,13 +52,15 @@ public class PacketOpcodesUtil {
...
@@ -32,13 +52,15 @@ public class PacketOpcodesUtil {
return
opcodeMap
.
getOrDefault
(
opcode
,
"UNKNOWN"
);
return
opcodeMap
.
getOrDefault
(
opcode
,
"UNKNOWN"
);
}
}
public
static
void
dumpOpcodes
()
{
public
static
void
dumpPacketIds
()
{
try
{
try
(
FileWriter
writer
=
new
FileWriter
(
"./PacketIds_"
+
GameConstants
.
VERSION
+
".json"
))
{
BufferedWriter
out
=
new
BufferedWriter
(
new
FileWriter
(
"opcodes.ini"
));
// Create sorted tree map
for
(
Int2ObjectMap
.
Entry
<
String
>
entry
:
opcodeMap
.
int2ObjectEntrySet
())
{
Map
<
Integer
,
String
>
packetIds
=
opcodeMap
.
int2ObjectEntrySet
().
stream
()
out
.
write
(
String
.
format
(
"%04X=%s%s"
,
entry
.
getIntKey
(),
entry
.
getValue
(),
System
.
lineSeparator
()));
.
filter
(
e
->
e
.
getIntKey
()
>
0
)
}
.
collect
(
Collectors
.
toMap
(
Int2ObjectMap
.
Entry
::
getIntKey
,
Int2ObjectMap
.
Entry
::
getValue
,
(
k
,
v
)
->
v
,
TreeMap:
:
new
));
out
.
close
();
// Write to file
writer
.
write
(
Grasscutter
.
getGsonFactory
().
toJson
(
packetIds
));
Grasscutter
.
getLogger
().
info
(
"Dumped packet ids."
);
}
catch
(
IOException
e
)
{
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
...
...
src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java
View file @
8b4212ff
...
@@ -95,7 +95,7 @@ public class GameServerPacketHandler {
...
@@ -95,7 +95,7 @@ public class GameServerPacketHandler {
// Log unhandled packets
// Log unhandled packets
if
(
GAME_INFO
.
logPackets
==
ServerDebugMode
.
MISSING
)
{
if
(
GAME_INFO
.
logPackets
==
ServerDebugMode
.
MISSING
)
{
Grasscutter
.
getLogger
().
info
(
"Unhandled packet ("
+
opcode
+
"): "
+
emu
.
grasscutter
.
net
.
packet
.
PacketOpcodesUtil
.
getOpcodeName
(
opcode
));
Grasscutter
.
getLogger
().
info
(
"Unhandled packet ("
+
opcode
+
"): "
+
emu
.
grasscutter
.
net
.
packet
.
PacketOpcodesUtil
s
.
getOpcodeName
(
opcode
));
}
}
}
}
}
}
src/main/java/emu/grasscutter/server/game/GameSession.java
View file @
8b4212ff
...
@@ -9,7 +9,7 @@ import emu.grasscutter.game.Account;
...
@@ -9,7 +9,7 @@ import emu.grasscutter.game.Account;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.net.packet.BasePacket
;
import
emu.grasscutter.net.packet.BasePacket
;
import
emu.grasscutter.net.packet.PacketOpcodes
;
import
emu.grasscutter.net.packet.PacketOpcodes
;
import
emu.grasscutter.net.packet.PacketOpcodesUtil
;
import
emu.grasscutter.net.packet.PacketOpcodesUtil
s
;
import
emu.grasscutter.server.event.game.SendPacketEvent
;
import
emu.grasscutter.server.event.game.SendPacketEvent
;
import
emu.grasscutter.utils.Crypto
;
import
emu.grasscutter.utils.Crypto
;
import
emu.grasscutter.utils.FileUtils
;
import
emu.grasscutter.utils.FileUtils
;
...
@@ -126,7 +126,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
...
@@ -126,7 +126,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
}
}
public
void
logPacket
(
String
sendOrRecv
,
int
opcode
,
byte
[]
payload
)
{
public
void
logPacket
(
String
sendOrRecv
,
int
opcode
,
byte
[]
payload
)
{
Grasscutter
.
getLogger
().
info
(
sendOrRecv
+
": "
+
PacketOpcodesUtil
.
getOpcodeName
(
opcode
)
+
" ("
+
opcode
+
")"
);
Grasscutter
.
getLogger
().
info
(
sendOrRecv
+
": "
+
PacketOpcodesUtil
s
.
getOpcodeName
(
opcode
)
+
" ("
+
opcode
+
")"
);
System
.
out
.
println
(
Utils
.
bytesToHex
(
payload
));
System
.
out
.
println
(
Utils
.
bytesToHex
(
payload
));
}
}
public
void
send
(
BasePacket
packet
)
{
public
void
send
(
BasePacket
packet
)
{
...
@@ -138,7 +138,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
...
@@ -138,7 +138,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
// DO NOT REMOVE (unless we find a way to validate code before sending to client which I don't think we can)
// DO NOT REMOVE (unless we find a way to validate code before sending to client which I don't think we can)
// Stop WindSeedClientNotify from being sent for security purposes.
// Stop WindSeedClientNotify from being sent for security purposes.
if
(
PacketOpcodes
.
BANNED_PACKETS
.
contains
(
packet
.
getOpcode
()))
{
if
(
PacketOpcodes
Utils
.
BANNED_PACKETS
.
contains
(
packet
.
getOpcode
()))
{
return
;
return
;
}
}
...
@@ -150,7 +150,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
...
@@ -150,7 +150,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
// Log
// Log
switch
(
GAME_INFO
.
logPackets
)
{
switch
(
GAME_INFO
.
logPackets
)
{
case
ALL
->
{
case
ALL
->
{
if
(!
loop
Packet
.
contains
(
packet
.
getOpcode
()))
{
if
(!
Packet
OpcodesUtils
.
LOOP_PACKETS
.
contains
(
packet
.
getOpcode
()))
{
logPacket
(
"SEND"
,
packet
.
getOpcode
(),
packet
.
getData
());
logPacket
(
"SEND"
,
packet
.
getOpcode
(),
packet
.
getData
());
}
}
}
}
...
@@ -174,14 +174,6 @@ public class GameSession implements GameSessionManager.KcpChannel {
...
@@ -174,14 +174,6 @@ public class GameSession implements GameSessionManager.KcpChannel {
}
}
}
}
private
static
final
Set
<
Integer
>
loopPacket
=
Set
.
of
(
PacketOpcodes
.
PingReq
,
PacketOpcodes
.
PingRsp
,
PacketOpcodes
.
WorldPlayerRTTNotify
,
PacketOpcodes
.
UnionCmdNotify
,
PacketOpcodes
.
QueryPathReq
);
@Override
@Override
public
void
onConnected
(
GameSessionManager
.
KcpTunnel
tunnel
)
{
public
void
onConnected
(
GameSessionManager
.
KcpTunnel
tunnel
)
{
this
.
tunnel
=
tunnel
;
this
.
tunnel
=
tunnel
;
...
@@ -234,7 +226,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
...
@@ -234,7 +226,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
// Log packet
// Log packet
switch
(
GAME_INFO
.
logPackets
)
{
switch
(
GAME_INFO
.
logPackets
)
{
case
ALL
->
{
case
ALL
->
{
if
(!
loop
Packet
.
contains
(
opcode
))
{
if
(!
Packet
OpcodesUtils
.
LOOP_PACKETS
.
contains
(
opcode
))
{
logPacket
(
"RECV"
,
opcode
,
payload
);
logPacket
(
"RECV"
,
opcode
,
payload
);
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment