Search in sources :

Example 1 with IRadioWaveReceiver

use of icbm.classic.api.tile.IRadioWaveReceiver in project ICBM-Classic by BuiltBrokenModding.

the class RadioMap method updateChunkCache.

protected void updateChunkCache(IRadioWaveReceiver receiver, Cube range) {
    List<ChunkPos> list = range.getChunkCoords();
    // Update chunk position map
    for (ChunkPos pair : list) {
        List<IRadioWaveReceiver> receivers = chunk_to_entities.get(pair);
        if (receivers == null) {
            receivers = new ArrayList();
        }
        if (!receivers.contains(receiver)) {
            receivers.add(receiver);
        }
        chunk_to_entities.put(pair, receivers);
    }
    // Update receiver map
    receive_to_chunks.put(receiver, list);
}
Also used : IRadioWaveReceiver(icbm.classic.api.tile.IRadioWaveReceiver) ArrayList(java.util.ArrayList) ChunkPos(net.minecraft.util.math.ChunkPos)

Example 2 with IRadioWaveReceiver

use of icbm.classic.api.tile.IRadioWaveReceiver in project ICBM-Classic by BuiltBrokenModding.

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(icbm.classic.api.tile.IRadioWaveReceiver) Cube(icbm.classic.lib.transform.region.Cube) IRadioWaveSender(icbm.classic.api.tile.IRadioWaveSender) ArrayList(java.util.ArrayList)

Example 3 with IRadioWaveReceiver

use of icbm.classic.api.tile.IRadioWaveReceiver in project ICBM-Classic by BuiltBrokenModding.

the class RadioMap method remove.

public boolean remove(IRadioWaveReceiver receiver) {
    if (fullMapRangeReceives.contains(receiver)) {
        fullMapRangeReceives.remove(receiver);
    }
    if (receive_to_chunks.containsKey(receiver)) {
        // Clear cached chunk positions
        for (ChunkPos pair : receive_to_chunks.get(receiver)) {
            if (chunk_to_entities.containsKey(pair)) {
                chunk_to_entities.get(pair).remove(receiver);
            }
        }
        // Clear entry in receiver map
        receive_to_chunks.remove(receiver);
        // Update sender cache
        for (IRadioWaveSender sender : sender_to_receivers_cache.keySet()) {
            List<IRadioWaveReceiver> receivers = sender_to_receivers_cache.get(sender);
            if (receivers == null) {
                receivers = new ArrayList();
            }
            if (receivers.contains(receiver)) {
                receivers.remove(receiver);
            }
            sender_to_receivers_cache.put(sender, receivers);
        }
        return true;
    }
    return false;
}
Also used : IRadioWaveReceiver(icbm.classic.api.tile.IRadioWaveReceiver) IRadioWaveSender(icbm.classic.api.tile.IRadioWaveSender) ArrayList(java.util.ArrayList) ChunkPos(net.minecraft.util.math.ChunkPos)

Example 4 with IRadioWaveReceiver

use of icbm.classic.api.tile.IRadioWaveReceiver in project ICBM-Classic by BuiltBrokenModding.

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(icbm.classic.api.tile.IRadioWaveReceiver) Cube(icbm.classic.lib.transform.region.Cube)

Example 5 with IRadioWaveReceiver

use of icbm.classic.api.tile.IRadioWaveReceiver in project ICBM-Classic by BuiltBrokenModding.

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;
    }
    // Receivers that have full map range, used for legacy systems mainly
    for (int i = fullMapRangeReceives.size() - 1; i >= 0; i--) {
        fullMapRangeReceives.get(i).receiveRadioWave(hz, sender, header, data);
    }
    // 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<ChunkPos> coords = range.getChunkCoords();
            List<IRadioWaveReceiver> receivers = new ArrayList();
            for (ChunkPos 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(icbm.classic.api.tile.IRadioWaveReceiver) Cube(icbm.classic.lib.transform.region.Cube) ArrayList(java.util.ArrayList) ChunkPos(net.minecraft.util.math.ChunkPos)

Aggregations

IRadioWaveReceiver (icbm.classic.api.tile.IRadioWaveReceiver)6 ArrayList (java.util.ArrayList)5 Cube (icbm.classic.lib.transform.region.Cube)4 ChunkPos (net.minecraft.util.math.ChunkPos)3 IRadioWaveSender (icbm.classic.api.tile.IRadioWaveSender)2