-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
В этой теме я расскажу как сделать PacketEvent и для чего он вам может пригодиться.
Все примеры будут рассматриватся для дефолтного обработчика событий forge(т.е. MinecraftForge.EVENT_BUS).
Вся тема была написана новичком.
1.Что такое PacketEvent?
Проще говоря, PacketEvent — это событие, активирующееся при отправке/получении пакетов между клиентом и сервером. В основном он поделен на два подкласса:
Send (PacketEvent.Send) — Активируется только при отправке пакетов Клиент→Сервер. Такие пакеты помечены буквой C (например CPacketPlayerTryUseItem).
Receive (PacketEvent.Receive) — Активируется только при получении пакетов Клиент←Сервер. Такие пакеты помечены буквой S (например SPacketEntityVelocity).
2.Для чего нужен PacketEvent?
Его можно использовать для отмены и изменения пакетов, эта возможность очень хорошо облегчает создание функций.
3.Как же его сделать?
Для начала в нашей сборке должна быть настроенная система Mixin и хоть малое понимание её работы(есть много гайдов в гугле и ютубе).
Создаем класс PacketEvent и пишем в нём вот это:
После создаём MixinNetworkManager и заполняем его:
(Если посмотреть то можно сразу увидеть где активируется Send, а где Receive. Не забываем зарегестрировать наш миксин в файле миксинов)
Отлично, PacketEvent готов! Давайте посмотрим два примера его работы:
Первый пример:
Предположим, что нам нужно сделать так, что при попытке отправить пакет CPacketConfirmTeleport он отменялся. Тогда код будет выглядеть так:
Второй пример:
Предположим, что нам нужно при получении пакета SPacketEntityVelocity(нацеленого на игрока) изменить данные motionX, motionY, motionZ на 0. Код будет выглядеть примерно так:
Вот и всё! Теперь вы у вас есть свой PacketEvent и понимание как с ним работать. Теперь всё в руках вашей фантазии.
Все примеры будут рассматриватся для дефолтного обработчика событий forge(т.е. MinecraftForge.EVENT_BUS).
Вся тема была написана новичком.
1.Что такое PacketEvent?
Проще говоря, PacketEvent — это событие, активирующееся при отправке/получении пакетов между клиентом и сервером. В основном он поделен на два подкласса:
Send (PacketEvent.Send) — Активируется только при отправке пакетов Клиент→Сервер. Такие пакеты помечены буквой C (например CPacketPlayerTryUseItem).
Receive (PacketEvent.Receive) — Активируется только при получении пакетов Клиент←Сервер. Такие пакеты помечены буквой S (например SPacketEntityVelocity).
2.Для чего нужен PacketEvent?
Его можно использовать для отмены и изменения пакетов, эта возможность очень хорошо облегчает создание функций.
3.Как же его сделать?
Для начала в нашей сборке должна быть настроенная система Mixin и хоть малое понимание её работы(есть много гайдов в гугле и ютубе).
Создаем класс PacketEvent и пишем в нём вот это:
PacketEvent:
import net.minecraft.network.Packet;
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
@Cancelable
public class PacketEvent extends Event {
private Packet<?> packet;
public PacketEvent(Packet<?> packet) {
this.packet = packet;
}
public final Packet<?> getPacket() {
return this.packet;
}
public final Packet<?> setPacket(Packet<?> packet) {
return this.packet = packet;
}
public static class Send extends PacketEvent {
public Send(Packet<?> packet) {
super(packet);
}
}
public static class Receive extends PacketEvent {
public Receive(Packet<?> packet) {
super(packet);
}
}
}
MixinNetworkManager:
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraftforge.common.MinecraftForge;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.io.IOException;
@Mixin(NetworkManager.class)
public class MixinNetworkManager {
@Inject(method = "sendPacket(Lnet/minecraft/network/Packet;)V", at = @At("HEAD"), cancellable = true)
private void onSendPacket(Packet<?> packet, CallbackInfo callbackInfo) {
PacketEvent packetEvent = new PacketEvent.Send(packet);
MinecraftForge.EVENT_BUS.post(packetEvent);
if (packetEvent.isCanceled()) {
callbackInfo.cancel();
}
}
@Inject(method = "channelRead0", at = @At("HEAD"), cancellable = true)
private void onChannelRead(ChannelHandlerContext channelHandlerContext, Packet<?> packet, CallbackInfo callbackInfo) {
PacketEvent packetEvent = new PacketEvent.Receive(packet);
MinecraftForge.EVENT_BUS.post(packetEvent);
if (packetEvent.isCanceled()) {
callbackInfo.cancel();
}
}
}
Отлично, PacketEvent готов! Давайте посмотрим два примера его работы:
Первый пример:
Предположим, что нам нужно сделать так, что при попытке отправить пакет CPacketConfirmTeleport он отменялся. Тогда код будет выглядеть так:
Java:
@SubscribeEvent
public void onUpdate(PacketEvent.Send e) {
if (e.getPacket() instanceof CPacketConfirmTeleport) {
e.setCanceled(true);
}
}
Предположим, что нам нужно при получении пакета SPacketEntityVelocity(нацеленого на игрока) изменить данные motionX, motionY, motionZ на 0. Код будет выглядеть примерно так:
Java:
@SubscribeEvent
public void onUpdate(PacketEvent.Receive e) {
if (e.getPacket() instanceof SPacketEntityVelocity) {
SPacketEntityVelocity sPacketEntityVelocity = (SPacketEntityVelocity) e.getPacket();
if (sPacketEntityVelocity.getEntityID() == mc.player.getEntityId()) {
sPacketEntityVelocity.motionX = 0;
sPacketEntityVelocity.motionY = 0;
sPacketEntityVelocity.motionZ = 0;
}
}
}
Вот и всё! Теперь вы у вас есть свой PacketEvent и понимание как с ним работать. Теперь всё в руках вашей фантазии.