No, you don't have to wait after teleport, at least I don't do that but it can't hurt if you do.
I believe what you are missing is that the MOVE packet should be completely independent from NEW_TICK and the server. There is nothing that guarantees that you will get exactly 1 NEW_TICK packet exactly every 200ms and it seems you not just calculate with 200ms but actually believe that 200ms that the server sent is really 200ms. No, it's not.
Forget about the tickTime and tilesPerTick.
If a NEW_TICK is recieved you should get the difference between the time of previous and the current newtick in gameTime, let it be timeDiff. Get the current position and add the timeDiff*tilesPerSecond*tileMultiplier to it's direction. Send the MOVE with the tickId, gameTime, newPosition. Now save the time of the current newtick as previous newtick. In pseudo code:
Code:
if not prevTickTime:
sendMovePacket(tickPacket->tickId,gameTime,position,[])
prevTickTime := gameTime
return
currTickTime := gameTime
tilesPerSecond := 4+5.6*(speed/75)
moveDirection := (target-position)/distanceof(target,position)
newPosition := position+moveDirection*tileModifier*tilesPerSecond*(currTickTime-prevTickTime)
position := distanceof(target,position) < distanceof(newPosition,position) ? target : newPosition
sendMovePacket(tickPacket->tickId,gameTime,position,[])
prevTickTime := currTickTime
return
As you can see the whole thing has nothing to do with that 200ms and the tileModifier is the multiplier of the current tile, I don't calculate what's between them and I think the server does neither (I haven't got dropped because of it yet). If by any chance it does, then you can calculate the average speed by checking what tiles are there between your position and the new position. Hope this solves it...