*** empty log message ***
switch from Event to EV
update copyrights and other minor stuff to deliantra
do away with silly command process idle watcher, we process most commands in the mainloop anyways, so its only overhead
major changes: - on_same_map and related functions now do not block on map loads, instead they pretend the map is not there. this ensures lag-free operation, but changes semantics considerably: running quickly over the worldmap often lets you bump into map borders until the map has been loaded. also, rabies takes longer to nuke a full continent now. - mapinfo (a major sync blocker) is now fully asynchronous, and works by quieing all mapinfo requests and retrying them on every tick until satisfed.
big semantic change - old server and crossfire did update/draw maps check for player commands, move players and monsters flush sockets - new server does check for player commands, move players and monsters update/draw maps flush sockets I have zero idea why the old code didn't do it this way. the net effect is that there is a guarenteed delay of one tick between an issued command and the player seeing its execution. The same for monster movements. That is, the new ordering reduces "lag" by a constant 120ms, which is immense, and can be felt immediately. This is a change I wanted to do for a long time. Apart from that, the tcp send code has been simplified and underwent some further tuning, leading to an even more accurate congestion management.
allow perl access to the full tcpi structure. do some elaborate congestion control (very experimental, but better than the old way)
very very preliminary, non-working sound framework
welcome to fxix protocol version 3, with uniform handling over all resources
- new extcmd version, much streamlined - new npc dialogue protocol - older cfplus clients are supported, without cfplus_support (no dialogue), for some time. - improved worldmap support.
try a very simple method of failsafe-bandweidthing by not sending any data when the socket buffer could not be drained in the last tick
first workable server-side music implementation
- upgrade crossfire trt to the GPL version 3 (hopefully correctly). - add a single file covered by the GNU Affero General Public License (which is not yet released, so I used the current draft, which is legally a bit wavy, but its likely better than nothing as it expresses direct intent by the authors, and we can upgrade as soon as it has been released). * this should ensure availability of source code for the server at least and hopefully also archetypes and maps even when modified versions are not being distributed, in accordance of section 13 of the agplv3.
- support priority as second argument of askface - send images of same priority in fifo order, but higher priorities first.
prepare for better fxixsx+rx protocol
folded developers into authors and fixed stuff
first rough cut of msg rewriting, introducing cfpod, a haxored pod variant for crossfire messgaes. where will it end?
- pippijn unknowingly inspired the idea of documenting the type of the objetc_vector_index explicitly. - pippijn spotted a typoe, to, go figure!
- introduce global NOW variable storing current tick time. - force some packet send at least every 2 seconds, forcing an ack reply. - timeout connections on ack delay exclusively, by default disconnect after 8 seconds (allowing for at least 5.5s of network hiccups). (linux only, should port to bsds). - nuke ericserver stats code. - reduce number of syscalls (less gettimeofday, only get tcp_info about once/second). - get rid of coroapi.time () in favour of now ().
rename arch->name to arch->archname for preparation of subclassing object
- update copyrights in .h files, where applicable - rename preprocess to genkeywords
very very aggressive tcp keepalive - tghis might time out connections in 4 seconds
rewrote output buffer handling. the new system: - outputs messages immediately. - suppresses following duplicates. - enforces a minimum setting. - is, as usual, faster and leaner. the only problem is that the code worked out of the box, which is not reassuring.
- implement a rudimentary framework for a "msg" command that replaces drawinfo and drawextinfo and allows for simpler usage in simple cases and extensibility for the less complex uses. - moved the character race choosing logic into perl, making use of the new msg command if the client supports it.
store and transfer the player objetc count not uuid in the extmap protocol, we cannot reasonably hope to get rid of the count anyway
- implement smoothing in the fxix (or better: fxixsx) protocol. - this *enforces* that smoothing is *per face* and not *per archetype*. - no extra bandwidth is needed for map information (unlike in the crossfire 1.x protocol, where smoothlevels are per-mapspace and take up a lot of bandwidth). - no extra storage is required on the client-side (although smoothing for cached map data is then only available for tiles that have been seen). - temporarily supply empty_S.x11 smoothfaces again, as this hack is required because there is no way to specify a smoothlevel but no smoothface otherwise. this should be optimised away at a future point, but this will break gcfclient (but disabling smoothing for that might be a good compromise).
- fix ber encoding - reduce image checksum length to 6 bytes (from 16) - implement fx packet, which reduces face overhead to amortised 10/12 bytes per face instead of 21/32 bytes and allows an unlimited number of faces instead of 2**16.
add untested ber integer encoding function
find mss value for future use
moved setup to perlspace to facilitate easier extensions and some cleanups. feels more secure, too
- implement yet another bug workaround for gcfclient. its rather sad. when bg scrubbing, the server sends images in advance, about twice per second. then receiving a new image, gcfclient destroys the imventory and rebuilds it (the widgets). this makes using it rather hard, as twice per seconds all widgets go away and are replaced by new ones, so mouse clicks, if not fast enough, will be ignored, making the client rather hard to use. soo.... only to background sending for cfplus, which needs it least.
implement another bug workaround for clients
- background scrub the client face cache: - on the first image request, start sending out all faces in order (one face per tick) when there is no other image sending activity. - send out one image every BG_SCRUB_RATE max. if there is no other image sending activity. - by default this sends roughly 2 images to the client per second, and 8 face indications if the faces are already known to the client.
- make face caching mandatory, and pester users to enable it - implement rate-limiting, for images only right now - implement and document output-rate command to set rate limit. - default 1mbit.
- rewrote more face handling code - automatically send smooth faces, as the client will need them anyways and it makes little sense to wait for the client to axk for it. of course, gcfclient suffers from weird ordering problems again. - UP_OBJ_FACE was often abused in situations where other things changed, updated lots of spaces, probably more to be done. - update_smooth became so small that inlining it actually clarified the code. similar for update_space, which is not inlined for other reasons. - faces were not initialised properly - add versioncheck for face data - rewrite invisibility handling a bit: god finger etc. now makes you blink, blinking routine has changed to be less annoying and more useful while still indicating invisibleness.
- send smooth faces automatically with their base face, anything else just complictaes everything and clients who want smoothing would requets the face anyways. - this reduces the size of struct client considerably, from 300k to about 300k (whoops).
- rewrote smooth face handling, as a side-effect, smoothing seems to work again and smooth faces can be reloaded. - the server now sends the full animation for an object the first time it is seen, this uses slightly more bandwidth initially, but avoids the flickering for objects change their face later.
- gcfclient compares against the server-provided image checksum but stores its own checksum in the database. needless to say, they differed. needless to say, we now have to provide a dummy superfluous gcfclient checksum for gcfclient only. - add various bug workaround flags to enbale gcfclient to cache imges again.
- remove faces form each mapspace, as they were stored and calculated *solely* for magicmap. sic. - as update_ is a major bottleneck, this will certainly help load, too. - semantics have changed: objects with blank faces are now transfered, but i assume this is rare (and might give a nice hint about invisible stuff :)
- MAJOR CHANGE - you now need to use cfutil to install arches. - former bigfaces are broken in the server - bigfaces are no longer supported. at all. - use face numbers instead of pointers * saves lotsa space * saves lotsa indirections * saves lots(?) cpu cycles - completely rewrote face handling - faces can now be added at runtime - reload will add new faces - this does not apply to animations - use a hastable instead of binary search (faster) for faces - face caching is broken - facesets are gone - server always reports MAX_FACES to any client who asks
- improve image_sums - DOWNGRADE server protocol version to 1026. * this disables requestinfo image_sums and image_info in gcfclient, allowing us to use up to 10000 faces dynamically (right now, we already sue up to 7500 faces, but the 10000 face limit is, of coruse, hardcoded into gcfclient)) -- A student, in hopes of understanding the Lambda-nature, came to Greenblatt. As they spoke a Multics system hacker walked by. "Is it true", asked the student, "that PL-1 has many of the same data types as Lisp". Almost before the student had finshed his question, Greenblatt shouted, "FOO!", and hit the student with a stick.
nano-cleanups
- tell player about each region as she enters. - region longnames no longer are prefixed with in, change accordingly.
make a horrendous hack to enable say and chat to be executed almost anytime
*** empty log message ***
comments
- move most last_* values into socket, where they belong - this actually saved a lot of space in the text segment, which might mean less complicated pointer accesses, because the data is no where it belongs, mostly.
""
added some copyrights
formatting
- small, but subtle, rewrite of object management - perl will now keep attachable objects alive - objects are now refcounted - refcouts need to be tested explicitly (refcnt_chk) - explicit destroy is required current - explicit destroy asks "nicely" for the object to self destruct, if possible - refcounts will be used during mortal killing - minor bugfixes, optimisations etc. - some former hacks removed.
- implement (mostly untested) array member support for genacc - make some arrays and other members available to perl - redefined meaning of NUM_FLAGS (really meaning number of flags now, as the code assumed anyway). - moved afk flag to client, where it belongs (make sno sense to save it, is also true for wiz &c). - updated extensions to reflect all that (Jewler.pm should be tested w.r.t. resistances)
- reorder stuff so that the endlessly sucky gcfclient doesn't get confused
- improved login code - removed some cruft code and (finally), the player_pod hack
*** empty log message ***
- preliminary check in, stuff is rudimentarily working - moved most of the player creation process into a perl coroutine - changed internal design of player management to not reuse and morph the object in funny ways. should be safer and much nicer to handle. - got rid of some annoying hacks, such as clear() (TODO: get rid of player_pod and other stuff now unnecessary?)
- made state a per-client variable (that does not magically make state a per-client thing!) - rename player->socket to player->ns. its not a good name for "client", but it is an historical artifact, and better than "socket".
- made client a first-class crossfire-perl object (its attachable), but perl support is missing. - added some client events - fixed reply not working after logout
- minor cleanups - minor optimisations (in_player vs. is_player_inv) - added P_PLAYER map flag - some (dead) concept code
some source simplification
goofing around in vain, trying to find a generalisation for esrv*item
- hide floorbox implementation details - use meaning (hopefully) names
- separate all comamnds into immediate/socket-level and queued/player-level - clean up player command handling, handle up to 8 commands/tick
another bug, do some adjustments to coredumping 'algorithm'
- clean up some code - fix some possible (minor) bugs - use a bitset for anims_sent - fix a memory leak - removed dead code
fix memory leak in player command queue.
- limit command backlog to two seconds
- socket i/o is completely asynchronous now - some command sare handled immediately - others (most palying related commands) are queued for later (as of now synchronous) processing - specifying a max queue length (in seconds) is possible, but disabled - also add some syntax sugar for network code
I goofed.
more slight copyright adjustments
the rename for sanity campaign hits you died - renamed stuff - partially updated copyrights - some cleanups
This form allows you to request diffs between any two revisions of this file. For each of the two "sides" of the diff, select a symbolic revision name using the selection box, or choose 'Use Text Field' and enter a numeric revision.