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);
}
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);
}
}
}
}
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;
}
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));
}
}
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);
}
}
}
}
Aggregations