When writing entity properties to a packet, we start off with a list of
requested properties (`requestedProperties`) and keep track of which properties
didn't fit (`propertiesDidntFit`) the packet, which is intialized to
requestedProperties. As we pack the properties, we remove them from
propertiesDidntFit if they didn't need to be written or were able to be
packed. At the end we store propertiesDidntFit, and use it in the future
as our requestedProperties when we try to pack more data into a packet.
The bug: because of the order in which propertiesDidntFit is
initialized, it ended up always being the list of all properties for
that entity. This typically wasn't an issue because we usually go
through and try to append all of the properties, and if we don't need to
append them (because they aren't in requestedProperties)
we remove them from our propertiesDidntFit list. When we
don't have enough remaining space in the current packet for even the
entity header, which is fairly small, we don't bother trying to append
any of the properties. When this happens, propertiesDidntFit contains
the full list of properties, which we save for the next pass through the
entity, and use as our requestedProperties, causing us to resend entity
data again. In the worst case we never end up sending all of the
entity's data.
handControllerGrab.js and WebTablet.js now parents objects to the
AVATAR_SELF_ID parentID, instead of using MyAvatar.sessionUUID, which
is unavailable when not connected to any domain.
I removed several early returns handControllerGrab.js that prevented
grabbing from working if MyAvatar.sessionUUID was invalid.
There were places in the EntityItem.cpp and EntityScriptingInterface.cpp
C++ that would log an error if parentID was set to AVATAR_SELF_ID.
This was to prevent AVATAR_SELF_ID from ever going over the network.
Instead, we now prevent this by replacing all outgoing references of
AVATAR_SELF_ID with the sessionID of the current node.