Package pneumaticCraft.common.ai

Source Code of pneumaticCraft.common.ai.FakePlayerItemInWorldManager

package pneumaticCraft.common.ai;

import java.lang.reflect.Field;

import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.server.management.ItemInWorldManager;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.event.world.BlockEvent;
import pneumaticCraft.common.entity.living.EntityDrone;
import pneumaticCraft.lib.Log;
import pneumaticCraft.lib.PneumaticValues;
import cpw.mods.fml.relauncher.ReflectionHelper;

public class FakePlayerItemInWorldManager extends ItemInWorldManager{

    private static Field isDigging, acknowledged;
    public boolean isAccepted;
    private final EntityDrone drone;

    public FakePlayerItemInWorldManager(World par1World, EntityPlayerMP player, EntityDrone drone){
        super(par1World);
        thisPlayerMP = player;
        this.drone = drone;
    }

    @Override
    public void onBlockClicked(int par1, int par2, int par3, int par4){
        super.onBlockClicked(par1, par2, par3, par4);
        isAccepted = isDigging();
        uncheckedTryHarvestBlock(par1, par2, par3);
    }

    public boolean isDigging(){
        if(isDigging == null) isDigging = ReflectionHelper.findField(ItemInWorldManager.class, "field_73088_d", "isDestroyingBlock");
        try {
            return isDigging.getBoolean(this);
        } catch(Exception e) {
            Log.error("Drone FakePlayerItemInWorldManager failed with reflection (Digging)!");
            e.printStackTrace();
            return true;
        }
    }

    public boolean isAcknowledged(){
        if(acknowledged == null) acknowledged = ReflectionHelper.findField(ItemInWorldManager.class, "field_73097_j", "receivedFinishDiggingPacket");
        try {
            return acknowledged.getBoolean(this);
        } catch(Exception e) {
            Log.error("Drone FakePlayerItemInWorldManager failed with reflection (Acknowledge get)!");
            e.printStackTrace();
            return true;
        }
    }

    public void cancelDigging(){
        cancelDestroyingBlock(-1, -1, -1);
    }

    /**
     * Attempts to harvest a block at the given coordinate
     */
    @Override
    public boolean tryHarvestBlock(int x, int y, int z){
        BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(theWorld, getGameType(), thisPlayerMP, x, y, z);
        if(event.isCanceled()) {
            return false;
        } else {
            ItemStack stack = thisPlayerMP.getCurrentEquippedItem();
            if(stack != null && stack.getItem().onBlockStartBreak(stack, x, y, z, thisPlayerMP)) {
                return false;
            }
            Block block = theWorld.getBlock(x, y, z);
            int l = theWorld.getBlockMetadata(x, y, z);
            theWorld.playAuxSFXAtEntity(thisPlayerMP, 2001, x, y, z, Block.getIdFromBlock(block) + (theWorld.getBlockMetadata(x, y, z) << 12));
            boolean flag = false;

            ItemStack itemstack = thisPlayerMP.getCurrentEquippedItem();

            if(itemstack != null) {
                itemstack.func_150999_a(theWorld, block, x, y, z, thisPlayerMP);

                if(itemstack.stackSize == 0) {
                    thisPlayerMP.destroyCurrentEquippedItem();
                }
            }

            if(removeBlock(x, y, z)) {
                block.harvestBlock(theWorld, thisPlayerMP, x, y, z, l);
            }

            // Drop experience
            if(!isCreative() && flag && event != null) {
                block.dropXpOnBlockBreak(theWorld, x, y, z, event.getExpToDrop());
            }
            drone.addAir(null, -PneumaticValues.DRONE_USAGE_DIG);
            return true;
        }
    }

    /**
     * Removes a block and triggers the appropriate events
     */
    private boolean removeBlock(int par1, int par2, int par3){
        Block block = theWorld.getBlock(par1, par2, par3);
        int l = theWorld.getBlockMetadata(par1, par2, par3);
        block.onBlockHarvested(theWorld, par1, par2, par3, l, thisPlayerMP);
        boolean flag = block != null && block.removedByPlayer(theWorld, thisPlayerMP, par1, par2, par3);

        if(flag) {
            block.onBlockDestroyedByPlayer(theWorld, par1, par2, par3, l);
        }

        return flag;
    }

}
TOP

Related Classes of pneumaticCraft.common.ai.FakePlayerItemInWorldManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.