ID:143856
 
Code:
obj/Move()
if(src.moving)
return
else
var/L=src.loc
.=..()
if(.)
src.moving=1
..()
spawn(src.movespeed) src.moving=null
if(src.HasTrail)
var/obj/Trail/T=new(L)
T.dir=src.dir


Problem description:
The moving object and the trail appear at the same time, pretty much (so you cant see the obj).
I cant fix this by adjusting layer height (its a beam, so the colours of the trail match the head)...

You are calling ..() twice. You shouldn't be doing that. Just once (the first time, where you store its value in .)

Before you call ..(), store the current loc in a variable (call it oldloc). Then, if the move was successful (if(.)), create the new trail at oldloc.

If trailed objects can turn, you'll want to save the old direction, and set the dir accordingly. If trailed objects can only move in cardinal (north / south / east / west) directions, then that's as simple as olddir&dir. If not, it requires a bit more work (and you'll have to use icon_states instead of directions).

Next, your movespeed stuff is in the wrong spot. It should only restrict client input, so it should be present in the client/Move() proc. The speed of everything else can be limited by not moving more often than they should.