tweak commands/networking hooks

This commit is contained in:
asie 2018-11-08 08:56:14 +01:00
parent 524f8cfb7f
commit 7952ae283c
5 changed files with 43 additions and 64 deletions

View file

@ -22,7 +22,6 @@ import net.minecraft.command.ServerCommandSource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
public class CommandRegistry {
@ -31,7 +30,7 @@ public class CommandRegistry {
private final List<Consumer<CommandDispatcher<ServerCommandSource>>> serverCommands;
private final List<Consumer<CommandDispatcher<ServerCommandSource>>> dedicatedServerCommands;
public CommandRegistry() {
protected CommandRegistry() {
this.serverCommands = new ArrayList<>();
this.dedicatedServerCommands = new ArrayList<>();
}

View file

@ -20,14 +20,15 @@ import net.fabricmc.api.Side;
import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
import net.fabricmc.fabric.networking.PacketContext;
import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
import net.fabricmc.fabric.networking.impl.PacketContextImpl;
import net.minecraft.client.MinecraftGame;
import net.minecraft.client.network.handler.ClientGameNetworkHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerServer;
import net.minecraft.network.handler.ServerPlayNetworkHandler;
import net.minecraft.network.packet.client.CPacketCustomPayload;
import net.minecraft.network.packet.server.SPacketCustomPayload;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ThreadTaskQueue;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -35,13 +36,31 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ClientGameNetworkHandler.class)
public class MixinClientPlayNetworkHandler {
public class MixinClientPlayNetworkHandler implements PacketContext {
@Shadow
private MinecraftGame game;
@Inject(method = "onCustomPayload", at = @At("HEAD"), cancellable = true)
public void onCustomPayload(CPacketCustomPayload packet, CallbackInfo info) {
MinecraftGame game = MinecraftGame.getInstance();
if (CustomPayloadHandlerRegistry.CLIENT.accept(packet.getChannel(), new PacketContextImpl(Side.CLIENT, game.player, game), packet.getData())) {
if (CustomPayloadHandlerRegistry.CLIENT.accept(packet.getChannel(), this, packet.getData())) {
info.cancel();
}
}
@Override
public Side getNetworkSide() {
return Side.CLIENT;
}
@Override
public EntityPlayer getPlayer() {
return game.player;
}
@Override
public ThreadTaskQueue getTaskQueue() {
return game;
}
}

View file

@ -20,11 +20,12 @@ import net.fabricmc.api.Side;
import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
import net.fabricmc.fabric.networking.PacketContext;
import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
import net.fabricmc.fabric.networking.impl.PacketContextImpl;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerServer;
import net.minecraft.network.handler.ServerPlayNetworkHandler;
import net.minecraft.network.packet.server.SPacketCustomPayload;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ThreadTaskQueue;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -32,24 +33,33 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerPlayNetworkHandler.class)
public class MixinServerPlayNetworkHandler {
public class MixinServerPlayNetworkHandler implements PacketContext {
@Shadow
private MinecraftServer server;
@Shadow
private EntityPlayerServer player;
private PacketContext fabricPacketContext;
@Inject(method = "onCustomPayload", at = @At("HEAD"), cancellable = true)
public void onCustomPayload(SPacketCustomPayload packet, CallbackInfo info) {
if (fabricPacketContext == null || fabricPacketContext.getPlayer() != player) {
fabricPacketContext = new PacketContextImpl(Side.SERVER, player, server);
}
SPacketCustomPayloadAccessor accessor = ((SPacketCustomPayloadAccessor) packet);
if (CustomPayloadHandlerRegistry.SERVER.accept(accessor.getChannel(), fabricPacketContext, accessor.getData())) {
if (CustomPayloadHandlerRegistry.SERVER.accept(accessor.getChannel(), this, accessor.getData())) {
info.cancel();
}
}
@Override
public Side getNetworkSide() {
return Side.SERVER;
}
@Override
public EntityPlayer getPlayer() {
return player;
}
@Override
public ThreadTaskQueue getTaskQueue() {
return server;
}
}

View file

@ -26,7 +26,7 @@ import net.minecraft.util.ThreadTaskQueue;
* the correct task queue to enqueue synchronization-requiring code on.
*/
public interface PacketContext {
Side getSide();
Side getNetworkSide();
EntityPlayer getPlayer();
ThreadTaskQueue getTaskQueue();
}

View file

@ -1,49 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.networking.impl;
import net.fabricmc.api.Side;
import net.fabricmc.fabric.networking.PacketContext;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ThreadTaskQueue;
public class PacketContextImpl implements PacketContext {
private final Side side;
private final EntityPlayer player;
private final ThreadTaskQueue taskQueue;
public PacketContextImpl(Side side, EntityPlayer player, ThreadTaskQueue taskQueue) {
this.side = side;
this.player = player;
this.taskQueue = taskQueue;
}
@Override
public Side getSide() {
return side;
}
@Override
public EntityPlayer getPlayer() {
return player;
}
@Override
public ThreadTaskQueue getTaskQueue() {
return taskQueue;
}
}