When player walks with arrows, it calculates 'path' [1 step 'path'] on client side.
When player 'use item' or use map walk, it calculates 'path' on server side.
Server has up to date information about players, so it allows player to walk thru other player by checking
Player::canWalkthrough
every step.
Information about 'can I walk thru player' is send to tibia client, when player sees other player for first time. Then it's cached and never updated.
So if player saw other player outside depot, his client will cache 'this player is not walkable' and won't let tibia client walk thru other player. Pressing 'arrow' in client won't even send packet 'make step' to server.
Only real fix for that is to send 'update walkthru' every player step to every other player on screen.
TODO on TFS 0.x:
1. This function is not implemented at all on 0.4:
TFS repository once kept private, converted from SVN - otland/tfs-old-svn
github.com
here is TFS 1.5 code for it:
A free and open-source MMORPG server emulator written in C++ - otland/forgottenserver
github.com
2. Function to send 'walkthru' to all players on screen does not exist on 0.4. Here is 1.5 code:
3. You got to send update of 'walkthru' every player step, ex. in this line:
under:
Code:
if(creature != this)
return;
add:
Code:
g_game.updateCreatureWalkthrough(this);
so it will execute only for player that makes step, not all players 'on his screen' - we want to 'broadcast walkthru' of player that just did step, not X times same information for all players that 'see someone makes step'.
EDIT: Code like that is on Kasteria and it did not affect CPU/network usage heavily.