- Поддерживаемые версии
- 1.8
- 1.9
- 1.10
- 1.11
- 1.12
- 1.13
- 1.14
- 1.15
- 1.16
- 1.17
- 1.18
- 1.19
Protocoller
Это весьма простой в использовании "перехватчик" исходящих/входящих пакетов Minecraft.
Иногда невозможно осуществить что-либо с использованием стандартных API, с помощью данного плагина, вы получаете возможность перехватывать пакеты при их отправке/получении и редактировать их, что значительно расширяет возможности разработчика плагина. Так же можно создавать свои пакеты что здесь также просто, все(почти) классы Minecraft необходимые для создания пакетов присутствуют и деобфусцированы, а так же все адаптировано под мультиверсионность.
Пример работы с API:
(Или на GitHub'e)
Это весьма простой в использовании "перехватчик" исходящих/входящих пакетов Minecraft.
Иногда невозможно осуществить что-либо с использованием стандартных API, с помощью данного плагина, вы получаете возможность перехватывать пакеты при их отправке/получении и редактировать их, что значительно расширяет возможности разработчика плагина. Так же можно создавать свои пакеты что здесь также просто, все(почти) классы Minecraft необходимые для создания пакетов присутствуют и деобфусцированы, а так же все адаптировано под мультиверсионность.
Пример работы с API:
(Или на GitHub'e)
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() { }
}
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");
}
}
}
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;
}
}
}
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();
}
}
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(Может быть null)
if(rcon != null){
List<RemoteControlSession> sessions = rcon.getClients();
RemoteControlSession session = sessions.get(0);
if(session.isAuthed()) {
session.setAuthed(false);
}
}
}
}
Java:
package ExamplePlugin;
import net.alis.protocoller.NetworkServer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class CommandWorkingExample {
public void registerCommands() {
NetworkServer server = MainClass.protocollerApi.getServer();
Command command = server.getCommandMap().getCommand("tpa");
server.getCommandMap().unregister(command);
server.getCommandMap().register("plugin_name", new ExampleCommand("example"));
server.syncCommands();
}
public static class ExampleCommand extends Command {
protected ExampleCommand(@NotNull String name) {
super(name);
this.setPermission("example.permission");
this.setAliases(List.of("example1", "example2"));
}
@Override
public boolean execute(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] strings) {
commandSender.sendMessage("Command successfully executed!");
return true;
}
@NotNull
@Override
public List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
return List.of("Your", "custom", "completions");
}
}
}
- Исходный код
- https://github.com/ItsALisName/Protocoller
- Команды и права
- /protocoller, /protocoller ?, /protocoller help - показывает список команд с описанием; (PERMISSION: protocoller.command)
- /protocoller version - показывает текущую версию плагина; (PERMISSION: protocoller.command.version)
- /protocoller checkupdates - принудительно запускает проверку обновлений; (PERMISSION: protocoller.command.checkupdates)
- /protocoller users - показывает список пользователей API; (PERMISSION: protocoller.command.users)
- /protocoller users unregister <name> - удаляет определенного пользователя; (PERMISSION: protocoller.command.users.unregister)
- /protocoller reload - перезагружает конфигурацию; (PERMISSION: protocoller.command.reload)
Для выполенения любой команды из данных нужно как минимум право 'protocoller.command'
При выполнение из игры все команды снабжены автозаполением, наводимым и кликабельным текстом(В некоторых случаях при наличии определенных прав).