Protocoller
This is a very easy-to-use "interceptor" of outgoing / incoming Minecraft packets.
Sometimes it is not possible to do anything using standard APIs, with this plugin, you get the ability to intercept packets when they are sent/received and edit them, which greatly expands the possibilities of the plugin developer. You can also create your own packets, which is also simple here, all (almost) Minecraft classes necessary for creating packets are present and deobfuscated, and everything is also adapted for multiversion.
API example:
(Or on GitHub)
Spoiler: MainClass.java
Code (Java):
package
ExamplePlugin
;
import
net.alis.protocoller.Protocoller
;
import
net.alis.protocoller.ProtocollerClient
;
import
net.alis.protocoller.event.PacketEventsManager
;
import
net.alis.protocoller.event.impl.ManagerType
;
import
net.alis.protocoller.plugin.exception.BannedClientException
;
import
org.bukkit.plugin.Plugin
;
import
org.bukkit.plugin.java.JavaPlugin
;
public
final
class MainClass
extends JavaPlugin
{
public
static ProtocollerClient protocollerApi
;
public
static PacketEventsManager syncEventManager
;
public
static PacketEventsManager asyncEventManager
;
@Override
public
void onEnable
(
)
{
try
{
protocollerApi
= Protocoller.
get
(
) .
registerClient
(
( Plugin
)
this
)
;
}
catch
( BannedClientException e
)
{
throw
new
RuntimeException
( e
)
;
}
syncEventManager
= protocollerApi.
getEventManager
( ManagerType.
SYNCHRONOUS
)
;
asyncEventManager
= protocollerApi.
getEventManager
( ManagerType.
ASYNCHRONOUS
)
;
syncEventManager.
registerListener
( protocollerApi,
new ExampleSyncPacketListener
(
)
)
;
asyncEventManager.
registerListener
( protocollerApi,
new ExampleAsyncPacketListener
(
)
)
;
}
@Override
public
void onDisable
(
)
{
}
}
Spoiler: ExampleAsyncPacketListener.java
Code (Java):
package
ExamplePlugin
;
import
net.alis.protocoller.event.async.AsyncPacketLoginReceiveEvent
;
import
net.alis.protocoller.event.impl.PacketEventHandler
;
import
net.alis.protocoller.event.impl.PacketEventPriority
;
import
net.alis.protocoller.event.impl.PacketListener
;
import
net.alis.protocoller.packet.PacketType
;
import
net.alis.protocoller.packet.packets.login.PacketLoginInStart
;
import
net.alis.protocoller.plugin.managers.LogsManager
;
import
net.alis.protocoller.samples.authlib.GameProfile
;
public
class ExampleAsyncPacketListener
implements PacketListener
{
@PacketEventHandler
( eventPriority
= PacketEventPriority.
NORMAL , ignoreCancelled
=
true
)
public
void onPlayerLoginStart
( AsyncPacketLoginReceiveEvent event
)
{
if
( event.
getPacketType
(
)
== PacketType.
Login .
Client .
START
)
{
PacketLoginInStart loginPack
=
new PacketLoginInStart
( event.
getData
(
)
)
;
GameProfile prePlayerData
= loginPack.
getGameProfile
(
)
;
LogsManager.
get
(
) .
getLogger
(
) .
info
(
"Player \" "
+ prePlayerData.
getName
(
)
+
"\" will join the server soon"
)
;
}
}
}
Spoiler: ExampleSyncPacketListener.java
Code (Java):
package
ExamplePlugin
;
import
net.alis.protocoller.NetworkPlayer
;
import
net.alis.protocoller.event.impl.PacketListener
;
import
net.alis.protocoller.event.sync.PacketPlaySendEvent
;
import
net.alis.protocoller.packet.PacketType
;
import
net.alis.protocoller.packet.packets.game.PacketPlayOutAbilities
;
import
org.bukkit.entity.Player
;
public
class ExampleSyncPacketListener
implements PacketListener
{
public
void yourCustomMethodName
( PacketPlaySendEvent event
)
{
if
( event.
getPacketType
(
)
== PacketType.
Play .
Server .
ABILITIES
)
{
PacketPlayOutAbilities abilities
=
new PacketPlayOutAbilities
( event.
getData
(
)
)
;
NetworkPlayer networkPlayer
= event.
getNetworkPlayer
(
)
;
Player player
= event.
getNetworkPlayer
(
) .
getBukkitPlayer
(
)
;
if
( player.
getName
(
) .
equalsIgnoreCase
(
"ALis"
)
)
{
if
(
! abilities.
isCanFly
(
)
) abilities.
setCanFly
(
true
)
;
event.
setPacket
( abilities
)
;
}
return
;
}
}
}
Spoiler: NetworkPlayerWorkExample.java
Code (Java):
package
ExamplePlugin
;
import
net.alis.protocoller.NetworkPlayer
;
import
net.alis.protocoller.NetworkServer
;
import
net.alis.protocoller.packet.packets.game.PacketPlayOutChat
;
import
net.alis.protocoller.plugin.enums.Version
;
import
net.alis.protocoller.samples.network.NetworkManager
;
import
net.alis.protocoller.samples.network.PlayerConnection
;
import
net.alis.protocoller.samples.network.chat.ChatComponent
;
import
net.md_5.bungee.api.MessageType
;
import
net.md_5.bungee.api.chat.HoverEvent
;
import
org.bukkit.Bukkit
;
import
java.util.UUID
;
public
class NetworkPlayerWorkExample
{
public
void networkPlayerWorking
(
)
{
NetworkServer server
= MainClass.
protocollerApi .
getServer
(
)
;
NetworkPlayer player
= server.
getPlayer
( UUID.
fromString
(
"ALis"
)
)
;
NetworkPlayer player1
= server.
getPlayer
(
"ALis"
)
;
NetworkPlayer player2
= server.
getPlayer
( Bukkit.
getPlayer
(
"ALis"
)
)
;
PlayerConnection connection
= player.
getConnection
(
)
;
int ping
= player.
getPing
(
)
;
int protocol
= player.
getVersion
(
) .
getProtocol
(
)
;
String versionName
= player.
getVersion
(
) .
asString
(
)
;
ChatComponent component
=
new ChatComponent
(
"Welcome to the "
)
;
component.
append
(
"server "
+ player.
getName
(
)
) .
setHoverEvent
( HoverEvent.
Action .
SHOW_TEXT ,
"You amazing!"
)
;
connection.
sendPacket
(
new PacketPlayOutChat
( component, MessageType.
CHAT , player.
getUniqueId
(
)
)
)
;
NetworkManager manager
= connection.
getNetworkManager
(
)
;
}
}
Spoiler: NetworkServerWorkExample.java
Code (Java):
package
ExamplePlugin
;
import
io.netty.channel.ChannelFuture
;
import
net.alis.protocoller.NetworkServer
;
import
net.alis.protocoller.samples.authlib.GameProfile
;
import
net.alis.protocoller.samples.authlib.properties.Property
;
import
net.alis.protocoller.samples.network.NetworkManager
;
import
net.alis.protocoller.samples.network.chat.ChatComponent
;
import
net.alis.protocoller.samples.network.status.ServerData
;
import
net.alis.protocoller.samples.network.status.ServerPing
;
import
net.alis.protocoller.samples.network.status.ServerPingPlayerSample
;
import
net.alis.protocoller.samples.server.ServerConnection
;
import
net.alis.protocoller.samples.server.rcon.QueryThreadGC4
;
import
net.alis.protocoller.samples.server.rcon.RconThread
;
import
net.alis.protocoller.samples.server.rcon.RemoteControlSession
;
import
net.alis.protocoller.samples.server.rcon.RemoteStatusReply
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.UUID
;
public
class NetworkServerWorkExample
{
public
static
void serverConnectionAccess
(
)
{
NetworkServer server
= MainClass.
protocollerApi .
getServer
(
)
;
ServerConnection connection
= server.
getConnection
(
)
;
List
< NetworkManager
> managers
= connection.
getConnections
(
)
;
List
< ChannelFuture
> channels
= connection.
getChannels
(
)
;
NetworkManager manager
= managers.
get
(
0
)
;
Property
[
] p
= manager.
getSpoofedProfiles
(
)
;
}
public
static
void changeServerStatusInfo
(
)
{
NetworkServer server
= MainClass.
protocollerApi .
getServer
(
)
;
ServerPing ping
= server.
getServerStatus
(
)
;
ping.
setVersion
(
new ServerData
(
"Spigot 1.25.1" ,
756
)
)
;
ping.
setFavicon
(
"Some favicon"
)
;
ping.
setDescription
(
new ChatComponent
(
"A best minecraft server!"
)
)
;
ServerPingPlayerSample playerSample
=
new ServerPingPlayerSample
(
10000 ,
999
)
;
List
< GameProfile
> profiles
=
new ArrayList
<>
(
)
;
profiles.
add
(
new GameProfile
( UUID.
randomUUID
(
) ,
"ALis"
)
)
;
profiles.
add
(
new GameProfile
( UUID.
randomUUID
(
) ,
"Tasher228"
)
)
;
profiles.
add
(
new GameProfile
( UUID.
randomUUID
(
) ,
"Notch"
)
)
;
playerSample.
setSample
( profiles.
toArray
(
new GameProfile
[
0
]
)
)
;
ping.
setPlayers
( playerSample
)
;
server.
setServerStatus
( ping
)
;
}
public
static
void changeGC4Thread
(
)
{
NetworkServer server
= MainClass.
protocollerApi .
getServer
(
)
;
QueryThreadGC4 query
= server.
getQueryThreadGC4
(
)
;
if
( query
!=
null
)
{
//QueryThread can be null(Может возвращать null)
query.
setMaxPlayers
(
1000
)
;
RemoteStatusReply statusReply
= query.
getRulesResponse
(
)
;
byte
[
] replyBytes
= statusReply.
toByteArray
(
)
;
query.
setServerIp
(
"1.1.1.1"
)
;
query.
setServerName
(
"Best minecraft server"
)
;
int queryPort
= query.
getQueryPort
(
)
;
}
}
public
void rconCheck
(
)
{
NetworkServer server
= MainClass.
protocollerApi .
getServer
(
)
;
RconThread rcon
= server.
getRconThread
(
)
;
//RconThread can be null
if
( rcon
!=
null
)
{
List
< RemoteControlSession
> sessions
= rcon.
getClients
(
)
;
RemoteControlSession session
= sessions.
get
(
0
)
;
if
( session.
isAuthed
(
)
)
{
session.
setAuthed
(
false
)
;
}
}
}
}