package cn.liutils.check;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import cn.annoreg.mc.SideHelper;
import cn.annoreg.mc.network.RegNetworkCall;
import cn.annoreg.mc.s11n.StorageOption.Data;
import cn.annoreg.mc.s11n.StorageOption.Instance;
import cn.annoreg.mc.s11n.StorageOption.Target;
import cn.liutils.util.generic.HashUtils;
import cn.liutils.util.generic.RegistryUtils;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ResourceLocation;
/**
* Provides resource verification when a client connected to server
* @author EAirPeter
*/
public final class ResourceCheck {
private static final ByteBuf buf = Unpooled.buffer();
private static final HandlerServer handler = new HandlerServer();
public static void init() {
FMLCommonHandler.instance().bus().register(handler);
}
/**
* Add a resource which will be verified when client connected to server.
* @param res The resource to be verified
*/
public static void add(ResourceLocation res) {
buf.writeInt(res.hashCode());
buf.writeBytes(HashUtils.SHA1.hash(RegistryUtils.getResourceStream(res)));
}
@RegNetworkCall(side = Side.CLIENT)
public static void sRequestCheck(@Target EntityPlayer player) {
cChecklist(player, buf.array());
}
@RegNetworkCall(side = Side.SERVER)
public static void cChecklist(@Instance EntityPlayer player, @Data byte[] data) {
handler.processPlayer((EntityPlayerMP) player, Arrays.equals(buf.array(), data));
}
}