PDA

View Full Version : Bug Report jjSendPacket not sending packets


Zah dud4h
Feb 11, 2021, 03:58 PM
Well, there's something weird going on with the jjSendPacket function, apparently.

As a server, if you put a negative number in its second parameter (e.g. `jjSendPacket(packet, -clientID)`), it will do something different than what it should do according to the documentation.

Once you put the negative value of a clientID, the server decides not to send the packet back to players that are not using the clientIDs 1, 3 or 7 (probably also 15 and 31, since there seems to be a pattern here).

Judging by the pattern of the numbers, i suspect there is something in the code that tries to do a bitwise "AND" operation (&) instead of using the "AND" logic comparator (&&), or perhaps some other bitwise operator mistake.

I've sent an attachment with the mutator code I used to test this behavior with multiple clients. It should send packets to the server by just pressing the left mouse button.

Note that when I used this mutator, there was no level script running alongside it in the background, nor any other mutator.

I suggest that people should avoid using this until it gets fixed and that they rather should send packets to the players excluding the clientID they want manually. Here's a possible workaround:

array<bool> clientExists(32,false);
for (int i = 1;i < 32;i++) {
jjPLAYER@ play = jjPlayers[i];
if (play.isActive) clientExists[play.clientID] = true;
}
for (int i = 1;i < 32;i++) {
if (i == clientID) continue;
if (clientExists[i]) {
jjSendPacket(replyPacket, i);
}
}

Seren
Feb 12, 2021, 09:21 AM
Once you put the negative value of a clientID, the server decides not to send the packet back to players that are not using the clientIDs 1, 3 or 7 (probably also 15 and 31, since there seems to be a pattern here).

Judging by the pattern of the numbers, i suspect there is something in the code that tries to do a bitwise "AND" operation (&) instead of using the "AND" logic comparator (&&), or perhaps some other bitwise operator mistake.
No, and this behavior description is not entirely accurate, but thanks for the report, there is indeed a problem with negative arguments to the function!

Violet CLM
Feb 12, 2021, 09:27 AM
Thanks for the report! This bug is news to me but I think I've gotten it fixed locally... I just want to be sure I'm understanding the report right. This sentence I'm having a little trouble parsing:
Once you put the negative value of a clientID, the server decides not to send the packet back to players that are not using the clientIDs 1, 3 or 7
Because jjSendPacket actually has a bool return value, I was able to see that in my testing, it returns true or false depending on the exact (negative) toClientID argument. When it returns false, packets are not sent to any clients. Does that match what you're seeing, or are we somehow experiencing different (yet related) issues?

Zah dud4h
Feb 12, 2021, 03:49 PM
Thanks for the report! This bug is news to me but I think I've gotten it fixed locally... I just want to be sure I'm understanding the report right. This sentence I'm having a little trouble parsing:

Because jjSendPacket actually has a bool return value, I was able to see that in my testing, it returns true or false depending on the exact (negative) toClientID argument. When it returns false, packets are not sent to any clients. Does that match what you're seeing, or are we somehow experiencing different (yet related) issues?

So i've tested this again by changing the jjSendPacket line with this bit of code.

for (int i = 1;i < 32;i++) {
jjDebug(i + ": did it send? " + jjSendPacket(packet,-i));
}

Apparently the results were:

1: did it send? true
2: did it send? false
3: did it send? true
4: did it send? false
5: did it send? false
6: did it send? false
7: did it send? true
8: did it send? true
9: did it send? true
10: did it send? true
11: did it send? true
12: did it send? true
13: did it send? true
14: did it send? true
15: did it send? false
16: did it send? false
17: did it send? false
18: did it send? true
19: did it send? false
20: did it send? false
21: did it send? true
22: did it send? true
23: did it send? true
24: did it send? true
25: did it send? true
26: did it send? true
27: did it send? true
28: did it send? true
29: did it send? true
30: did it send? true
31: did it send? true


The function works as intended when you insert the negative numbers from above that resulted as "true" in the return,aswell as skipping sending packets to the clientID matching it.

However once you insert those who resulted as "false" in the return,it wouldn't send to anybody.

I stand corrected when i claimed it has something to do with a bitwise operator,as this seems to be a different unrelated pattern.
(2, 4, 5, 6, 15, 16, 17, 19, 20)

Violet CLM
Feb 12, 2021, 05:11 PM
Okay, great, that matches what I'm seeing. It's not a "pattern" so much as the game is trying to read unrelated memory by mistake. We should be able to get it fixed no problem now that we know about it though, and thanks for including that workaround script in the first post.

Violet CLM
Mar 21, 2021, 05:24 PM
Fix will be available in 5.8.