[crossfire] Bug [ 1735459 ] Ground view missing face updates
Mark Wedel
mwedel at sonic.net
Sat Jul 7 18:59:07 CDT 2007
Andreas Kirschbaum wrote:
> Nicolas Weeger wrote:
>>> At some level, it is very easy to fix - if player is on a space, and
>>> anything (including face) on that space change, we just send all the
>>> contents of that space again to the player.
>> Why all items? Don't items on a space get a tag, that can be used to
>> simply send this item's update to clients?
>
> I agree: the server should remember which items and attributes he has
> sent to the client. (Which IMO already have to be implemented in order
> to make the item/upditem/delitem/delinv commands work right.) Using this
> information, the server is able to issue correct upditem commands for
> changed ground objects.
The server has no memory what it has sent to the client, save for the map. To
remember what it has sent to the client would require that for each player, a
complete copy of the spaces contents to be recorded as last sent.
Instead, the server has some idea what is has sent to the client based on
current state of events. The client knows that first 50 items of a stack will
be sent to the client when a player moves to a space. And so it also knows that
if something changes on those items, it can just update the relevant fields.
However, the server has to know what has changed - you can't simply say 'object
foo has changed - send client updates'. The code has to say 'nrof in foo has
changed, so update nrof in client'.
Note that in some/many cases, the server may send upditem/deltim commands to
the client for objects it hasn't sent. That isn't terrible - the bandwidth of
the item commands, unless you are on a large stack, usually won't be that costly.
>> The bug isn't important enough to warrant the fix.
>
> I somewhat disagree here: the bug is at least (slightly) confusing. For
> example, go into Beginners and follow the instructions of the first
> handle ("Type an A to open"). This applies the handle but the ground
> view does not change until you move off and on.
Also for things like spikes and gates, it may be hard to see that they are
still moving if your character is on top, but if properly updated in the look
window, becomes very clear they are still going up and down.
>> Also, one should consider the case where the modified face is not
>> visible because the map layer is full (can happen if many objects).
>
> Map layer does not apply here since it is the ground view. But still:
> the ground view holds only a maximum of 50 objects.
Which, just as a note, was a limit put in purely for bandwith and socket
limitation issues (current max size of a socket packet server supports is 64K,
so can't go more than that. You also don't want to be sending too much data at
once to client, as that also then causes lag (sending 64K of data over a 1.5 mbs
link (fairly typical DSL speed) would take 400 ms. Given a standard game tick is
120 ms, fixing things so that larger amount of data can be sent at once may not
be a good thing).
Checking to see where the object is in the stack of 50 viewable objects of the
client is a costlier issue. Other than walking the object list (following the
below pointers), there isn't any easy way to know if the object is in the
viewable list or not.
I suspect that a lot of code, including Ryo's recent changes, presume that the
objects in question will always be in that stack of 50. That is simple, and
doesn't waste too much bandwidth.
What I'd really like to do at some point is limit number of objects on a space
to 50, so this is never an issue. But with spell effects, that would likely
cause problems.
More information about the crossfire
mailing list