Search in sources :

Example 1 with IBlockTrackEntry

use of pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry in project PneumaticCraft by MineMaarten.

the class BlockTrackUpgradeHandler method update.

@Override
public void update(EntityPlayer player, int rangeUpgrades) {
    ticksExisted++;
    SearchUpgradeHandler searchHandler = HUDHandler.instance().getSpecificRenderer(SearchUpgradeHandler.class);
    if (ticksExisted % updateInterval == 0) {
        int timeTaken = (int) accTime / updateInterval;
        updateInterval = updateInterval * timeTaken / MAX_TIME;
        if (updateInterval <= 1)
            updateInterval = 2;
        accTime = 0;
        ticksExisted = 0;
    }
    accTime -= System.currentTimeMillis();
    int blockTrackRange = BLOCK_TRACKING_RANGE + Math.min(rangeUpgrades, 5) * PneumaticValues.RANGE_UPGRADE_HELMET_RANGE_INCREASE;
    int baseX = (int) Math.floor(player.posX) - blockTrackRange;
    int baseY = (int) Math.floor(player.posY) - blockTrackRange + blockTrackRange * (ticksExisted % updateInterval) / (updateInterval / 2);
    int maxY = (int) Math.floor(player.posY) - blockTrackRange + blockTrackRange * (ticksExisted % updateInterval + 1) / (updateInterval / 2);
    baseY = MathHelper.clamp_int(baseY, 0, 255);
    maxY = MathHelper.clamp_int(maxY, 0, 255);
    int baseZ = (int) Math.floor(player.posZ) - blockTrackRange;
    IBlockAccess chunkCache = new ChunkCache(player.worldObj, baseX, baseY, baseZ, baseX + 2 * blockTrackRange, maxY, baseZ + 2 * blockTrackRange, 0);
    for (int i = baseX; i <= baseX + 2 * blockTrackRange; i++) {
        for (int j = baseY; j < maxY; j++) {
            for (int k = baseZ; k <= baseZ + 2 * blockTrackRange; k++) {
                if (player.getDistance(i, j, k) > blockTrackRange)
                    continue;
                TileEntity te = chunkCache.getTileEntity(i, j, k);
                if (MinecraftForge.EVENT_BUS.post(new BlockTrackEvent(player.worldObj, i, j, k, te)))
                    continue;
                if (searchHandler != null && te instanceof IInventory) {
                    searchHandler.checkInventoryForItems(te);
                }
                List<IBlockTrackEntry> entries = BlockTrackEntryList.instance.getEntriesForCoordinate(chunkCache, i, j, k, te);
                if (entries.isEmpty())
                    continue;
                boolean inList = false;
                for (int l = 0; l < blockTargets.size(); l++) {
                    if (blockTargets.get(l).isSameTarget(player.worldObj, i, j, k)) {
                        inList = true;
                        // cancel lost targets
                        blockTargets.get(l).ticksExisted = Math.abs(blockTargets.get(l).ticksExisted);
                        blockTargets.get(l).setTileEntity(te);
                        break;
                    }
                }
                if (!inList) {
                    boolean sentUpdate = false;
                    for (IBlockTrackEntry entry : entries) {
                        if (entry.shouldBeUpdatedFromServer(te)) {
                            if (!sentUpdate) {
                                NetworkHandler.sendToServer(new PacketDescriptionPacketRequest(i, j, k));
                                sentUpdate = true;
                            }
                        }
                    }
                    addBlockTarget(new RenderBlockTarget(player.worldObj, player, i, j, k, te, this));
                    for (IBlockTrackEntry entry : entries) {
                        if (countBlockTrackersOfType(entry) == entry.spamThreshold() + 1) {
                            HUDHandler.instance().addMessage(new ArmorMessage(I18n.format("blockTracker.message.stopSpam", I18n.format(entry.getEntryName())), new ArrayList<String>(), 60, 0x7700AA00));
                        }
                    }
                }
            }
        }
    }
    accTime += System.currentTimeMillis();
    for (int i = 0; i < blockTargets.size(); i++) {
        RenderBlockTarget blockTarget = blockTargets.get(i);
        boolean wasNegative = blockTarget.ticksExisted < 0;
        blockTarget.ticksExisted += CommonHUDHandler.getHandlerForPlayer(player).getSpeedFromUpgrades();
        if (blockTarget.ticksExisted >= 0 && wasNegative)
            blockTarget.ticksExisted = -1;
        blockTarget.update();
        if (blockTarget.getDistanceToEntity(player) > blockTrackRange + 5 || !blockTarget.isTargetStillValid()) {
            if (blockTarget.ticksExisted > 0) {
                blockTarget.ticksExisted = -60;
            } else if (blockTarget.ticksExisted == -1) {
                removeBlockTarget(i);
                i--;
            }
        }
    }
    List<String> textList = new ArrayList<String>();
    RenderBlockTarget focusedTarget = null;
    for (RenderBlockTarget blockTarget : blockTargets) {
        if (blockTarget.isInitialized() && blockTarget.isPlayerLooking()) {
            focusedTarget = blockTarget;
            break;
        }
    }
    if (focusedTarget != null) {
        blockTrackInfo.setTitle(focusedTarget.stat.getTitle());
        textList.addAll(focusedTarget.textList);
    } else {
        blockTrackInfo.setTitle("Current tracked blocks:");
        if (blockTypeCount == null || ticksExisted % 40 == 0) {
            blockTypeCount = new int[BlockTrackEntryList.instance.trackList.size()];
            for (RenderBlockTarget target : blockTargets) {
                for (IBlockTrackEntry validEntry : target.getApplicableEntries()) {
                    blockTypeCount[BlockTrackEntryList.instance.trackList.indexOf(validEntry)]++;
                }
            }
        }
        for (int i = 0; i < blockTypeCount.length; i++) {
            if (blockTypeCount[i] > 0) {
                textList.add(blockTypeCount[i] + " " + I18n.format(BlockTrackEntryList.instance.trackList.get(i).getEntryName()));
            }
        }
        if (textList.size() == 0)
            textList.add("Tracking no blocks currently.");
    }
    blockTrackInfo.setText(textList);
}
Also used : IInventory(net.minecraft.inventory.IInventory) ChunkCache(net.minecraft.world.ChunkCache) ArrayList(java.util.ArrayList) IBlockAccess(net.minecraft.world.IBlockAccess) TileEntity(net.minecraft.tileentity.TileEntity) IBlockTrackEntry(pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry) PacketDescriptionPacketRequest(pneumaticCraft.common.network.PacketDescriptionPacketRequest) BlockTrackEvent(pneumaticCraft.api.client.pneumaticHelmet.BlockTrackEvent)

Example 2 with IBlockTrackEntry

use of pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry in project PneumaticCraft by MineMaarten.

the class RenderBlockTarget method update.

public void update() {
    if (te != null && te.isInvalid())
        te = null;
    stat.update();
    List<IBlockTrackEntry> applicableTrackEntries = getApplicableEntries();
    if (CommonHUDHandler.getHandlerForPlayer().ticksExisted % 100 == 0) {
        boolean sentUpdate = false;
        for (IBlockTrackEntry entry : applicableTrackEntries) {
            if (entry.shouldBeUpdatedFromServer(te)) {
                if (!sentUpdate) {
                    NetworkHandler.sendToServer(new PacketDescriptionPacketRequest(blockX, blockY, blockZ));
                    sentUpdate = true;
                }
            }
        }
    }
    playerIsLooking = isPlayerLookingAtTarget();
    arrowRenderer.ticksExisted++;
    if (!getBlock().isAir(world, blockX, blockY, blockZ)) {
        textList = new ArrayList<String>();
        if (ticksExisted > 120) {
            stat.closeWindow();
            for (IBlockTrackEntry entry : applicableTrackEntries) {
                if (blockTracker.countBlockTrackersOfType(entry) <= entry.spamThreshold()) {
                    stat.openWindow();
                    break;
                }
            }
            if (playerIsLooking) {
                stat.openWindow();
                addBlockTrackInfo(textList);
            }
            stat.setText(textList);
        } else if (ticksExisted < -30) {
            stat.closeWindow();
            stat.setText(textList);
        }
    }
    if (hackTime > 0) {
        IHackableBlock hackableBlock = HackableHandler.getHackableForCoord(world, blockX, blockY, blockZ, player);
        if (hackableBlock != null) {
            // = Math.min(hackTime + 1, hackableBlock.getHackTime(world, blockX, blockY, blockZ, player));
            hackTime++;
        } else {
            hackTime = 0;
        }
    }
}
Also used : IHackableBlock(pneumaticCraft.api.client.pneumaticHelmet.IHackableBlock) IBlockTrackEntry(pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry) PacketDescriptionPacketRequest(pneumaticCraft.common.network.PacketDescriptionPacketRequest)

Aggregations

IBlockTrackEntry (pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry)2 PacketDescriptionPacketRequest (pneumaticCraft.common.network.PacketDescriptionPacketRequest)2 ArrayList (java.util.ArrayList)1 IInventory (net.minecraft.inventory.IInventory)1 TileEntity (net.minecraft.tileentity.TileEntity)1 ChunkCache (net.minecraft.world.ChunkCache)1 IBlockAccess (net.minecraft.world.IBlockAccess)1 BlockTrackEvent (pneumaticCraft.api.client.pneumaticHelmet.BlockTrackEvent)1 IHackableBlock (pneumaticCraft.api.client.pneumaticHelmet.IHackableBlock)1