/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.support.bukkit; import cn.academy.core.AcademyCraft; import cn.academy.core.event.BlockDestroyEvent; import cn.lambdalib.annoreg.core.Registrant; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import java.lang.reflect.Method; import java.util.UUID; /** * Provides Bukkit support for AcademyCraft. * See AcademyBukkit. * @author EAirPeter */ @SideOnly(Side.SERVER) @Registrant public final class BukkitAdapter { public static final BukkitAdapter INSTANCE = new BukkitAdapter(); private static boolean registered = false; // public static void setWorld(String _world) private static Method setWorld_; // public static void setPlayer(UUID _player) private static Method setPlayer_; // public static boolean checkBlockDestroy(int x, int y, int z) private static Method checkBlockDestroy_; public static final UUID dummy = UUID.randomUUID(); private World world = null; private EntityPlayer player = null; @SubscribeEvent public void onBlockDestroy(BlockDestroyEvent event) { try { if (world != event.world) { world = event.world; setWorld_.invoke(null, world.getWorldInfo().getWorldName()); } if (player != event.player) { player = event.player; setPlayer_.invoke(null, player == null ? dummy : event.player.getUniqueID()); } event.setCanceled((boolean) checkBlockDestroy_.invoke(null, event.x, event.y, event.z)); } catch (Throwable e) { AcademyCraft.log.error("Failed to handle BlockDestroyEvent", e); } } public static void init(Class<?> adapter) { try { setWorld_ = adapter.getMethod("setWorld", String.class); setPlayer_ = adapter.getMethod("setPlayer", UUID.class); checkBlockDestroy_ = adapter.getMethod("checkBlockDestroy", int.class, int.class, int.class); if (!registered) { MinecraftForge.EVENT_BUS.register(INSTANCE); registered = true; } } catch (Throwable e) { AcademyCraft.log.error("Failed to load BukkitAdapter", e); } } }