I totally agree that my proposed fix is a pretty big hammer to fix the problem,
but it is a simple way to do it.
It might not be that hard to add some logic (even on the server) of something
like like 'repeat last command until successful/complete'. So you could do a
dropall, and it drops 10 items/tick, and keeps doing so until there is nothing
more to drop. Same for pickup (though in that case, there would be a change in
behavior, as you would have to sit on the space until nothing is left to be
picked up, and this might be non obvious if you have different pickup modes set
(value density), because there might still be a bunch of items on the space,
but nothing that matches the pickup criteria.
Now this actually works reasonably well - at each players tick turn, the socket
can check if the player has issued any new command - if so, it executes that,
thus breaking the sequence of repeating the command. To me, it would be really
annoying to do something like 'drop all', and be frozen with no way of
interrupting it until everything is dropped, which could be many seconds if the
limit/tick is low.
As far as trees/linked lists - I was thinking more on how things are organized
on the map, not queuing things up to dropped. If map spaces were trees instead
of lists, it is possible that the finding matching object to merge would be
fast enough that dropping lots of objects would not be an issue.
In fact, I don't actually think that the time go through the inventory to find
matching items to drop/pickup is the issue - I think the actual issue is the
time to insert them into their destination. So in case of a pickup/dropall
that happens over several ticks, just having the exact same logic now (looking
at source for object that matches criteria) is probably fine, and there isn't
any need to build a temporary list of objects that match the criteria.
Building a temporary list has potential problems - mostly make sure it stays in
sync, making sure it is properly cleared/initialized each time (if there is
some bug where it isn't cleared, such that the player does a dropall, does
something else that changes inventory, and does the dropall again, if the
server thinks this is a continuation of the existing dropall because something
wasn't cleared, good chance you are going to get some odd behavior)
___
crossfire mailing list
crossfire@metalforge.org
http://mailman.metalforge.org/mailman/listinfo/crossfire