Search in sources :

Example 11 with Cube

use of com.builtbroken.mc.lib.transform.region.Cube in project Engine by VoltzEngine-Project.

the class PacketSelectionData method encodeInto.

@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    // Write player's selection
    selection.writeBytes(buffer);
    // Write cubes
    buffer.writeInt(cubes.size());
    for (Cube cube : cubes) {
        cube.writeBytes(buffer);
    }
    // Write regions
    buffer.writeInt(regions.size());
    for (Cube cube : regions) {
        cube.writeBytes(buffer);
    }
}
Also used : Cube(com.builtbroken.mc.lib.transform.region.Cube)

Example 12 with Cube

use of com.builtbroken.mc.lib.transform.region.Cube in project Engine by VoltzEngine-Project.

the class RadioMap method popMessage.

/**
 * Called to send a message over the network
 *
 * @param sender - object that sent the message
 * @param hz     - frequency of the message
 * @param header - descriptive header of the message, mainly an ID system
 * @param data   - data being sent in the message
 */
public void popMessage(IRadioWaveSender sender, float hz, String header, Object[] data) {
    // Cache for senders that know they will be active
    if (sender_to_receivers_cache.containsKey(sender)) {
        for (IRadioWaveReceiver receiver : sender_to_receivers_cache.get(sender)) {
            receiver.receiveRadioWave(hz, sender, header, data);
        }
        return;
    }
    // Slow way to update receives with messages
    Cube range = sender.getRadioSenderRange();
    if (range != null) {
        // Use simpler method if the range of number of entries is small
        if (// 20 chunks
        receive_to_chunks.size() < 200 || range.getSizeX() > 320 || range.getSizeY() > 320) {
            for (IRadioWaveReceiver receiver : receive_to_chunks.keySet()) {
                if (receiver != null && receiver != sender) {
                    Cube receiverRange = receiver.getRadioReceiverRange();
                    if (range.doesOverlap(receiverRange) || receiverRange.doesOverlap(range)) {
                        receiver.receiveRadioWave(hz, sender, header, data);
                    }
                }
            }
        } else // Complex method only used if number of receive is very high, e.g. is faster~ish than the above method
        {
            List<ChunkCoordIntPair> coords = range.getChunkCoords();
            List<IRadioWaveReceiver> receivers = new ArrayList();
            for (ChunkCoordIntPair pair : coords) {
                List<IRadioWaveReceiver> l = chunk_to_entities.get(pair);
                if (l != null && l.size() > 0) {
                    for (IRadioWaveReceiver r : l) {
                        if (r != null && r != sender && !receivers.contains(r)) {
                            receivers.add(r);
                        }
                    }
                }
            }
            for (IRadioWaveReceiver receiver : receivers) {
                receiver.receiveRadioWave(hz, sender, header, data);
            }
        }
    }
}
Also used : IRadioWaveReceiver(com.builtbroken.mc.api.map.radio.IRadioWaveReceiver) ChunkCoordIntPair(net.minecraft.world.ChunkCoordIntPair) Cube(com.builtbroken.mc.lib.transform.region.Cube) ArrayList(java.util.ArrayList)

Example 13 with Cube

use of com.builtbroken.mc.lib.transform.region.Cube in project Engine by VoltzEngine-Project.

the class RadioMap method updateCache.

/**
 * Updates the list of receivers for this sender.
 * <p>
 * Make sure if you call this you clear your
 * cache when the sender is no longer valid
 * use {@link TileEntity#invalidate()}
 * or {@link Entity#setDead()} to
 * clear the cache.
 * <p>
 * As well make sure to call this method
 * every so often. As the cache is not maintained
 * often or quickly. It is only updated
 * when receives are added or removed. So
 * if the sender's range changes this method
 * needs to be called.
 * <p>
 * Make sure to not call this method often
 * as its a high CPU task.
 *
 * @param sender - object that needs to
 *               have receivers cache. Needs
 *               to have a valid {@link IRadioWaveSender#getRadioSenderRange()}
 *               value in order to be cached.
 */
public void updateCache(IRadioWaveSender sender) {
    // Clear cache value
    sender_to_receivers_cache.remove(sender);
    Cube range = sender.getRadioSenderRange();
    if (range != null) {
        sender_to_receivers_cache.put(sender, getReceiversInRange(range, sender instanceof IRadioWaveReceiver ? (IRadioWaveReceiver) sender : (IRadioWaveReceiver) null));
    }
}
Also used : IRadioWaveReceiver(com.builtbroken.mc.api.map.radio.IRadioWaveReceiver) Cube(com.builtbroken.mc.lib.transform.region.Cube)

Example 14 with Cube

use of com.builtbroken.mc.lib.transform.region.Cube in project Engine by VoltzEngine-Project.

the class RadioMap method add.

public boolean add(IRadioWaveReceiver receiver) {
    if (!receive_to_chunks.containsKey(receiver)) {
        Cube range = receiver.getRadioReceiverRange();
        if (range != null) {
            updateChunkCache(receiver, range);
            updateSenderCache(receiver, range);
            return true;
        }
    }
    return false;
}
Also used : Cube(com.builtbroken.mc.lib.transform.region.Cube)

Example 15 with Cube

use of com.builtbroken.mc.lib.transform.region.Cube in project Engine by VoltzEngine-Project.

the class RadioMap method updateSenderCache.

protected void updateSenderCache(IRadioWaveReceiver receiver, Cube range) {
    if (range != null) {
        // Update sender cache
        for (IRadioWaveSender sender : sender_to_receivers_cache.keySet()) {
            Cube senderRange = sender.getRadioSenderRange();
            if (senderRange.doesOverlap(range)) {
                List<IRadioWaveReceiver> receivers = sender_to_receivers_cache.get(sender);
                if (receivers == null) {
                    receivers = new ArrayList();
                }
                if (!receivers.contains(receiver)) {
                    receivers.add(receiver);
                }
                sender_to_receivers_cache.put(sender, receivers);
            }
        }
    }
}
Also used : IRadioWaveReceiver(com.builtbroken.mc.api.map.radio.IRadioWaveReceiver) Cube(com.builtbroken.mc.lib.transform.region.Cube) IRadioWaveSender(com.builtbroken.mc.api.map.radio.IRadioWaveSender) ArrayList(java.util.ArrayList)

Aggregations

Cube (com.builtbroken.mc.lib.transform.region.Cube)21 Pos (com.builtbroken.mc.lib.transform.vector.Pos)6 IRadioWaveReceiver (com.builtbroken.mc.api.map.radio.IRadioWaveReceiver)4 PacketTile (com.builtbroken.mc.core.network.packet.PacketTile)3 BlockTile (com.builtbroken.mc.prefab.tile.BlockTile)3 Tile (com.builtbroken.mc.prefab.tile.Tile)3 FakeWorld (com.builtbroken.mc.testing.junit.world.FakeWorld)3 ArrayList (java.util.ArrayList)3 ForgeDirection (net.minecraftforge.common.util.ForgeDirection)3 Test (org.junit.Test)3 Region (com.builtbroken.mc.lib.modflags.Region)2 TileEntity (net.minecraft.tileentity.TileEntity)2 IRadioWaveSender (com.builtbroken.mc.api.map.radio.IRadioWaveSender)1 IMultiTileHost (com.builtbroken.mc.api.tile.multiblock.IMultiTileHost)1 PacketSelectionData (com.builtbroken.mc.core.network.packet.PacketSelectionData)1 RadioMap (com.builtbroken.mc.lib.world.radio.RadioMap)1 Entity (net.minecraft.entity.Entity)1 NBTTagCompound (net.minecraft.nbt.NBTTagCompound)1 NBTTagList (net.minecraft.nbt.NBTTagList)1 AxisAlignedBB (net.minecraft.util.AxisAlignedBB)1