@@ -104,78 +104,60 @@ private static void tryTransmit(PacketReceiver receiver, Packet packet, double r
104104 }
105105 }
106106
107+ var timer = System .currentTimeMillis (); // yes this is vulnerable to leap seconds, fight me
107108
108109 WirelessHelpers .Bresenham3D (obstructionBlocks , senderBlockPosition , receiverBlockPosition );
110+
111+ if (timer + 500 <= System .currentTimeMillis ()) {
112+ log .warn ("Bresenham3D took longer than 1 tick - " + obstructionBlocks .size () + " in " + (System .currentTimeMillis () - timer ) + "ms" );
113+ }
114+
109115 var signalDegradation = distance ;
110116 var diagonalCompensation = WirelessHelpers .getDiagonalCompensation (senderBlockPosition , receiverBlockPosition );
111117
112- var enumerationCounter = 0 ;
113118 var cancelled = false ;
114119
115120 unloadedBlocks .clear ();
116121
117- var timer = System .currentTimeMillis (); // yes this is vulnerable to leap seconds, fight me
118122
119- for (Vec3i blockVector : obstructionBlocks ) {
123+
124+ Map <Vec3i , Double > signalDegradationCumulative = new ConcurrentHashMap <>();
125+ timer = System .currentTimeMillis ();
126+ long finalTimer = timer ;
127+ obstructionBlocks .parallelStream ().forEach ((blockVector ) -> {
128+ if (finalTimer + 500 <= System .currentTimeMillis ()) {
129+ return ;
130+ }
120131 var currentBlockPos = new BlockPos (blockVector );
121- if (level . isLoaded ( currentBlockPos ) && !level .isEmptyBlock (currentBlockPos )) {
132+ if (!level .isEmptyBlock (currentBlockPos )) {
122133 var currentBlockState = level .getBlockState (currentBlockPos );
123134 if (!currentBlockState .isAir ()) {
124135 var explosionResistance = currentBlockState .getBlock ().getExplosionResistance ();
125136 if (explosionResistance >= 100 )
126137 explosionResistance /= 4 ;
127- signalDegradation += Math .sqrt (explosionResistance ) * 10.0 * diagonalCompensation ;
138+ signalDegradationCumulative . put ( blockVector , Math .sqrt (explosionResistance ) * 10.0 * diagonalCompensation ) ;
128139 }
129- } else {
130- unloadedBlocks .add (currentBlockPos );
131- }
132-
133- if (signalDegradation > receiveRange ) {
134- break ;
135- }
136- enumerationCounter ++;
137- if (timer + 500 <= System .currentTimeMillis ()) {
138- log .warn ("Distance measure timeout in loaded blocks between [" + senderBlockPosition .getX () + ","
139- + senderBlockPosition .getY () + ","
140- + senderBlockPosition .getZ () + "] and ["
141- + receiverBlockPosition .getX () + ","
142- + receiverBlockPosition .getY () + ","
143- + receiverBlockPosition .getZ () + "]"
144- + " - blocks tested: " + enumerationCounter + "/" + obstructionBlocks .size ());
145- cancelled = true ;
146- break ;
147140 }
141+ });
142+
143+ if (timer + 500 <= System .currentTimeMillis ()) {
144+ log .warn ("Dist measure timeout - " + (System .currentTimeMillis () - timer ) + "ms [" + senderBlockPosition .getX () + ","
145+ + senderBlockPosition .getY () + ","
146+ + senderBlockPosition .getZ () + "] and ["
147+ + receiverBlockPosition .getX () + ","
148+ + receiverBlockPosition .getY () + ","
149+ + receiverBlockPosition .getZ () + "]"
150+ + " - blocks tested: " + signalDegradationCumulative .size () + "/" + obstructionBlocks .size ());
151+ cancelled = true ;
148152 }
149153
150- for (BlockPos currentBlockPos : unloadedBlocks ) {
151- var currentBlockState = level .getBlockState (currentBlockPos );
152- if (!currentBlockState .isAir ()) {
153- var explosionResistance = currentBlockState .getBlock ().getExplosionResistance ();
154- if (explosionResistance >= 100 )
155- explosionResistance /= 4 ;
156- signalDegradation += Math .sqrt (explosionResistance ) * 10.0 * diagonalCompensation ;
157- }
158-
159- if (signalDegradation > receiveRange ) {
160- break ;
161- }
162- enumerationCounter ++;
163- if (timer + 500 <= System .currentTimeMillis ()) {
164- log .warn ("Distance measure timeout in unloaded blocks between [" + senderBlockPosition .getX () + ","
165- + senderBlockPosition .getY () + ","
166- + senderBlockPosition .getZ () + "] and ["
167- + receiverBlockPosition .getX () + ","
168- + receiverBlockPosition .getY () + ","
169- + receiverBlockPosition .getZ () + "]"
170- + " - blocks tested: " + enumerationCounter + "/" + unloadedBlocks .size ());
171- cancelled = true ;
172- break ;
173- }
154+ for (var key : signalDegradationCumulative .keySet ()) {
155+ signalDegradation += signalDegradationCumulative .get (key );
174156 }
175157
176158 if (cancelled ) {
177159 // Extrapolating the signal degradation for the rest of the path
178- signalDegradation = ((signalDegradation - distance ) / (double ) enumerationCounter / obstructionBlocks .size ()) + distance ;
160+ signalDegradation = ((signalDegradation - distance ) / (double ) signalDegradationCumulative . size () / obstructionBlocks .size ()) + distance ;
179161 } else {
180162 ((WirelessModemPeripheral )sender ).addCachedSignalDegradation (receiverBlockPosition , signalDegradation );
181163 }
0 commit comments