ID:2254864
 
Code:
proc/RemoveEffect(var/atom/Loc,var/Effect)
for(var/O in Loc.overlays) if(O:name==Effect) Loc.overlays.Remove(O)
for(var/O in Loc.underlays) if(O:name==Effect) Loc.underlays.Remove(O)


proc/ShowEffect(var/atom/movable/Loc,var/Effect,var/Repeat=0,var/OffX=0,var/OffY=0,var/RandomOffset=0,var/Dir,var/IconFile,var/Layer="overlays",var/TagName,var/Blend,var/Alpha,var/Color)
var/obj/Effect/O=new
if(Dir) O.dir=Dir
else O.dir=SOUTH
O.pixel_x=Loc.bound_x-8;O.pixel_y=Loc.bound_y
if(RandomOffset) {O.pixel_x=Loc.bound_x-8+rand(-OffX,OffX);O.pixel_y=Loc.bound_y+rand(-OffY,OffY)}
O.name="[initial(O.name)]: [Effect]"
O.icon_state="[Effect]"
O.PxLocate(Loc)//______________________control line
if(ismob(Loc))
if(Layer=="overlays") Loc.overlays.Add(O)
// if(!Repeat)
// spawn(20) RemoveEffect(Loc,O.name)

mob/Player/Click()
ShowEffect(src,"[pick("Boom","PoisonCloud","recovery")]")


Problem description:

I don't understand why when i try animate any anim in player overlays it wont work.
When i clicked on Richard we can see one boom animation - from "control line"
but when i change icon_state - attack, it's play from player overlays.
I need play it one time from player overlays, couse when i move my player animation stay at player old location. And it isn't look good.




Well, for one your code is changing loc.overlays, not mob.overlays, which is gonna give you all sorts of issues.

Two, you're dramatically over-complicating things, I suggest reading up on the animate() proc.
Check out mob.step_x and mob.step_y. You'll need to set the effect's step offsets identical to the mob's.