Skip to content

Commit 7cf368e

Browse files
committed
Wireless modification for signal caluclation
0-1023 -> 1024 blocks by default, cache enabled, same for 65534 to not break vanilla GPS 1024+ -> /4 range, caching disabled
1 parent 8f4d403 commit 7cf368e

File tree

14 files changed

+279
-45
lines changed

14 files changed

+279
-45
lines changed

build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ githubRelease {
3939
prerelease = isUnstable
4040
}
4141

42-
tasks.publish { dependsOn(tasks.githubRelease) }
43-
4442
idea.project.settings.runConfigurations {
4543
register<JUnitExt>("Core Tests") {
4644
vmParameters = "-ea"

projects/common-api/src/main/java/dan200/computercraft/api/network/Packet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* @see PacketNetwork#transmitSameDimension(Packet, double)
1919
* @see PacketNetwork#transmitInterdimensional(Packet)
2020
* @see PacketReceiver#receiveDifferentDimension(Packet)
21-
* @see PacketReceiver#receiveSameDimension(Packet, double)
21+
* @see PacketReceiver#receiveSameDimension(Packet, double, double)
2222
*/
2323
public record Packet(
2424
int channel,

projects/common-api/src/main/java/dan200/computercraft/api/network/PacketNetwork.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public interface PacketNetwork {
4040
* @param packet The packet to send.
4141
* @param range The maximum distance this packet will be sent.
4242
* @see #transmitInterdimensional(Packet)
43-
* @see PacketReceiver#receiveSameDimension(Packet, double)
43+
* @see PacketReceiver#receiveSameDimension(Packet, double, double)
4444
*/
4545
void transmitSameDimension(Packet packet, double range);
4646

projects/common-api/src/main/java/dan200/computercraft/api/network/PacketReceiver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public interface PacketReceiver {
3535
*
3636
* @return The maximum distance this device can send and receive messages.
3737
* @see #isInterdimensional()
38-
* @see #receiveSameDimension(Packet packet, double)
38+
* @see #receiveSameDimension(Packet packet, double, double)
3939
* @see PacketNetwork#transmitInterdimensional(Packet)
4040
*/
4141
double getRange();
@@ -58,12 +58,13 @@ public interface PacketReceiver {
5858
* @param packet The packet to receive. Generally you should check that you are listening on the given channel and,
5959
* if so, queue the appropriate modem event.
6060
* @param distance The distance this packet has travelled from the source.
61+
* @param signalStrength The signal strength with which the packet has arrived.
6162
* @see Packet
6263
* @see #getRange()
6364
* @see PacketNetwork#transmitSameDimension(Packet, double)
6465
* @see PacketNetwork#transmitInterdimensional(Packet)
6566
*/
66-
void receiveSameDimension(Packet packet, double distance);
67+
void receiveSameDimension(Packet packet, double distance, double signalStrength);
6768

6869
/**
6970
* Receive a network packet from a different dimension.

projects/common/src/datagen/java/dan200/computercraft/data/LanguageProvider.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,7 @@ private void addTranslations() {
255255
addConfigGroup(ConfigSpec.serverSpec, "peripheral", "Peripherals");
256256
addConfigEntry(ConfigSpec.commandBlockEnabled, "Enable command block peripheral");
257257
addConfigEntry(ConfigSpec.modemRange, "Modem range (default)");
258-
addConfigEntry(ConfigSpec.modemHighAltitudeRange, "Modem range (high-altitude)");
259258
addConfigEntry(ConfigSpec.modemRangeDuringStorm, "Modem range (bad weather)");
260-
addConfigEntry(ConfigSpec.modemHighAltitudeRangeDuringStorm, "Modem range (high-altitude, bad weather)");
261259
addConfigEntry(ConfigSpec.maxNotesPerTick, "Maximum notes that a computer can play at once");
262260
addConfigEntry(ConfigSpec.monitorBandwidth, "Monitor bandwidth");
263261

projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNodeImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ synchronized void tryTransmit(Packet packet, double packetDistance, boolean pack
7878
if (!packetInterdimensional) {
7979
var receiveRange = Math.max(range, receiver.getRange()); // Ensure range is symmetrical
8080
if (interdimensional || receiver.isInterdimensional() || packetDistance < receiveRange) {
81-
receiver.receiveSameDimension(packet, packetDistance + element.getPosition().distanceTo(receiver.getPosition()));
81+
receiver.receiveSameDimension(packet, packetDistance + element.getPosition().distanceTo(receiver.getPosition()), receiveRange - packetDistance);
8282
}
8383
} else {
8484
if (interdimensional || receiver.isInterdimensional()) {

projects/common/src/main/java/dan200/computercraft/shared/config/Config.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@ public final class Config {
1616
public static boolean commandRequireCreative = true;
1717

1818
public static boolean enableCommandBlock = false;
19-
public static int modemRange = 64;
20-
public static int modemHighAltitudeRange = 384;
21-
public static int modemRangeDuringStorm = 64;
22-
public static int modemHighAltitudeRangeDuringStorm = 384;
19+
public static int modemRange = 1024;
20+
public static int modemRangeDuringStorm = 896;
2321
public static int maxNotesPerTick = 8;
2422
public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
2523
public static int monitorDistance = 65;

projects/common/src/main/java/dan200/computercraft/shared/config/ConfigSpec.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ public final class ConfigSpec {
5656

5757
public static final ConfigFile.Value<Boolean> commandBlockEnabled;
5858
public static final ConfigFile.Value<Integer> modemRange;
59-
public static final ConfigFile.Value<Integer> modemHighAltitudeRange;
6059
public static final ConfigFile.Value<Integer> modemRangeDuringStorm;
61-
public static final ConfigFile.Value<Integer> modemHighAltitudeRangeDuringStorm;
6260
public static final ConfigFile.Value<Integer> maxNotesPerTick;
6361
public static final ConfigFile.Value<Integer> monitorBandwidth;
6462

@@ -277,21 +275,13 @@ or a single method (computercraft:inventory#pushItems).
277275
.define("command_block_enabled", Config.enableCommandBlock);
278276

279277
modemRange = builder
280-
.comment("The range of Wireless Modems at low altitude in clear weather, in meters.")
278+
.comment("The maximum range of Wireless Modems in clear weather, in meters.")
281279
.defineInRange("modem_range", Config.modemRange, 0, MODEM_MAX_RANGE);
282280

283-
modemHighAltitudeRange = builder
284-
.comment("The range of Wireless Modems at maximum altitude in clear weather, in meters.")
285-
.defineInRange("modem_high_altitude_range", Config.modemHighAltitudeRange, 0, MODEM_MAX_RANGE);
286-
287281
modemRangeDuringStorm = builder
288-
.comment("The range of Wireless Modems at low altitude in stormy weather, in meters.")
282+
.comment("The maximum range of Wireless Modems in stormy weather, in meters.")
289283
.defineInRange("modem_range_during_storm", Config.modemRangeDuringStorm, 0, MODEM_MAX_RANGE);
290284

291-
modemHighAltitudeRangeDuringStorm = builder
292-
.comment("The range of Wireless Modems at maximum altitude in stormy weather, in meters.")
293-
.defineInRange("modem_high_altitude_range_during_storm", Config.modemHighAltitudeRangeDuringStorm, 0, MODEM_MAX_RANGE);
294-
295285
maxNotesPerTick = builder
296286
.comment("Maximum amount of notes a speaker can play at once.")
297287
.defineInRange("max_notes_per_tick", Config.maxNotesPerTick, 1, Integer.MAX_VALUE);
@@ -423,9 +413,7 @@ public static void syncServer(@Nullable Path path) {
423413
Config.enableCommandBlock = commandBlockEnabled.get();
424414
Config.maxNotesPerTick = maxNotesPerTick.get();
425415
Config.modemRange = modemRange.get();
426-
Config.modemHighAltitudeRange = modemHighAltitudeRange.get();
427416
Config.modemRangeDuringStorm = modemRangeDuringStorm.get();
428-
Config.modemHighAltitudeRangeDuringStorm = modemHighAltitudeRangeDuringStorm.get();
429417
Config.monitorBandwidth = monitorBandwidth.get();
430418

431419
// Turtles

projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ public void removed() {
114114
}
115115

116116
@Override
117-
public void receiveSameDimension(Packet packet, double distance) {
117+
public void receiveSameDimension(Packet packet, double distance, double signalStrength) {
118118
if (packet.sender() == this || !state.isOpen(packet.channel())) return;
119119

120120
synchronized (computers) {
121121
for (var computer : computers) {
122122
computer.queueEvent("modem_message",
123-
computer.getAttachmentName(), packet.channel(), packet.replyChannel(), packet.payload(), distance);
123+
computer.getAttachmentName(), packet.channel(), packet.replyChannel(), packet.payload(), distance, signalStrength);
124124
}
125125
}
126126
}

projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral.java

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,21 @@
1010
import dan200.computercraft.shared.config.Config;
1111
import dan200.computercraft.shared.peripheral.modem.ModemPeripheral;
1212
import dan200.computercraft.shared.peripheral.modem.ModemState;
13+
import dan200.computercraft.shared.util.WirelessHelpers;
14+
import net.minecraft.core.Vec3i;
15+
import net.minecraft.util.Tuple;
16+
17+
import java.util.HashMap;
1318

1419
public abstract class WirelessModemPeripheral extends ModemPeripheral {
1520
public static final String NORMAL_ADJECTIVE = "upgrade.computercraft.wireless_modem_normal.adjective";
1621
public static final String ADVANCED_ADJECTIVE = "upgrade.computercraft.wireless_modem_advanced.adjective";
1722

1823
private final boolean advanced;
24+
private HashMap<Vec3i, HashMap<Vec3i, Tuple<Double, Long>>> cachedSignalStrengths = new HashMap<>();
25+
26+
public Long lastLFTransmit = 0L;
27+
public Long lastMFTransmit = 0L;
1928

2029
public WirelessModemPeripheral(ModemState state, boolean advanced) {
2130
super(state);
@@ -34,17 +43,11 @@ public double getRange() {
3443
} else {
3544
var world = getLevel();
3645
if (world != null) {
37-
var position = getPosition();
38-
double minRange = Config.modemRange;
39-
double maxRange = Config.modemHighAltitudeRange;
46+
double range = Config.modemRange;
4047
if (world.isRaining() && world.isThundering()) {
41-
minRange = Config.modemRangeDuringStorm;
42-
maxRange = Config.modemHighAltitudeRangeDuringStorm;
48+
range = Config.modemRangeDuringStorm;
4349
}
44-
if (position.y > 96.0 && maxRange > minRange) {
45-
return minRange + (position.y - 96.0) * ((maxRange - minRange) / ((world.getMaxBuildHeight() - 1) - 96.0));
46-
}
47-
return minRange;
50+
return range;
4851
}
4952
return 0.0;
5053
}
@@ -54,4 +57,42 @@ public double getRange() {
5457
protected PacketNetwork getNetwork() {
5558
return ComputerCraftAPI.getWirelessNetwork(Nullability.assertNonNull(getLevel().getServer()));
5659
}
60+
61+
public double getCachedSignalDegradation(Vec3i receiverPos) {
62+
var senderPos = WirelessHelpers.floorToVec3i(getPosition());
63+
var senderCachedSignals = cachedSignalStrengths.get(senderPos);
64+
if (senderCachedSignals != null) {
65+
var receiverCachedSignal = senderCachedSignals.get(receiverPos);
66+
if (receiverCachedSignal != null) {
67+
double signalDegradation = receiverCachedSignal.getA();
68+
Long expiration = receiverCachedSignal.getB();
69+
if (getLevel().getDayTime() < expiration) {
70+
return signalDegradation;
71+
}
72+
// Remove invalidated caches
73+
senderCachedSignals.remove(receiverPos);
74+
if (senderCachedSignals.isEmpty()) {
75+
cachedSignalStrengths.remove(senderPos);
76+
}
77+
}
78+
}
79+
return Integer.MAX_VALUE;
80+
}
81+
82+
public void addCachedSignalDegradation(Vec3i receiverPos, double signalDegradation) {
83+
// Prevent overflow the lazy way
84+
if (cachedSignalStrengths.size() > 2000) {
85+
cachedSignalStrengths = new HashMap<>();
86+
}
87+
88+
var senderPos = WirelessHelpers.floorToVec3i(getPosition());
89+
var expiration = getLevel().getDayTime() + 2400;
90+
if (cachedSignalStrengths.containsKey(senderPos)) {
91+
cachedSignalStrengths.get(senderPos).put(receiverPos, new Tuple<>(signalDegradation, expiration));
92+
return;
93+
}
94+
var senderCachedSignals = new HashMap<Vec3i, Tuple<Double, Long>>();
95+
senderCachedSignals.put(receiverPos, new Tuple<>(signalDegradation, expiration));
96+
cachedSignalStrengths.put(senderPos, senderCachedSignals);
97+
}
5798
}

0 commit comments

Comments
 (0)