/** * Copyright (c) Lambda Innovation, 2013-2015 * 本作品版权由Lambda Innovation所有。 * http://www.li-dev.cn/ * * This project is open-source, and it is distributed under * the terms of GNU General Public License. You can modify * and distribute freely as long as you follow the license. * 本项目是一个开源项目,且遵循GNU通用公共授权协议。 * 在遵照该协议的情况下,您可以自由传播和修改。 * http://www.gnu.org/licenses/gpl.html */ package cn.dawn47.equipment.block; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.MinecraftForge; import cn.annoreg.core.Registrant; import cn.annoreg.mc.network.Future; 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.dawn47.Dawn47; import cn.liutils.template.client.render.block.RenderEmptyBlock; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; /** * @author WeAthFolD */ @Registrant public class BlockMedkit extends BlockContainer { static final String SYNC_ID = "dw_medkitCount"; static int syncCooldown = 10; public BlockMedkit() { super(Material.cloth); setBlockName("dw_medkit"); setBlockTextureName("dawn47:medkit"); setCreativeTab(Dawn47.cct); setHardness(0.1f); this.setBlockBounds(.2f, 0, .2f, .8f, .3f, .8f); MinecraftForge.EVENT_BUS.register(this); FMLCommonHandler.instance().bus().register(this); } @SubscribeEvent @SideOnly(Side.CLIENT) public void onDrawHighlight(DrawBlockHighlightEvent event) { Block b = event.player.worldObj.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ); if(this == b) event.setCanceled(true); } @SubscribeEvent @SideOnly(Side.CLIENT) public void onClientTick(ClientTickEvent event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; if(player != null) { if(--syncCooldown == 0) { syncCooldown = 20; doQuery(player); } } } @Override public int getRenderType() { return RenderEmptyBlock.id; } @Override public boolean isOpaqueCube() { return false; } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity target) { if(target instanceof EntityPlayer && !((EntityPlayer)target).capabilities.isCreativeMode) { world.setBlockToAir(x, y, z); EntityPlayer player = (EntityPlayer) target; setMedkitCount(player, getMedkitCount(player) + 1); if(world.isRemote) doQuery(player); } } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack stack) { int l = MathHelper.floor_double(placer.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; world.setBlockMetadataWithNotify(x, y, z, l, 0x03); } @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileMedkit(); } public static int getMedkitCount(EntityPlayer player) { return player.getEntityData().getInteger(SYNC_ID); } public static void setMedkitCount(EntityPlayer player, int c) { player.getEntityData().setInteger(SYNC_ID, c); if(!player.worldObj.isRemote) { received(player, c); } } @SideOnly(Side.CLIENT) private static void doQuery(EntityPlayer player) { query(player, Future.create((Object o) -> { setMedkitCount(player, (Integer) o); })); } @RegNetworkCall(side = Side.SERVER) private static void query(@Instance EntityPlayer player, @Data Future future) { future.setAndSync(getMedkitCount(player)); } @RegNetworkCall(side = Side.CLIENT) private static void received(@Instance EntityPlayer player, @Data Integer count) { setMedkitCount(player, count); } }