ID:544467
 
(See the best response by Kaiochao.)
Code:
        proc
tablecheck()
if(player1&&player2)
var/mob/battledecoy/b=new()
var/mob/battledecoy/c=new()
for(var/turf/marker/m in world)
if(m.id==id)
b.z=2
c.z=2
b.y=m.y
c.y=m.y
b.x=m.x-4
c.x=m.x+4
player1.client.eye=locate(m.loc)
player2.client.eye=locate(m.loc)
player1.client.perspective = EYE_PERSPECTIVE
player2.client.perspective = EYE_PERSPECTIVE
b.icon=player1.Digimon.icon
c.icon=player2.Digimon.icon
b.icon_state=player1.Digimon.icon_state
c.icon_state=player2.Digimon.icon_state
else
spawn(5)
tablecheck()


Problem description:
Excuse the super messy code, not going for performance or readability here. Why doesn't the eye move to the marker? I read tons of posts like this, and rather than giving an actual answer, they just ctrl+v "Read up on client.perspective". Well, so I did, but apparently this doesn't work either? D:

Best response
var turf/marker/m

// search for a marker with the same id
for(m) if(m.id == id) break

// because of 'break', 'm' could be
// either the matching marker,
// or null.

// a matching marker exists
if(m)
var mob/battledecoy
// initialize two /battledecoys
// at given initial positions (note 1)
b = new(locate(m.x - 4, m.y, 2))
c = new(locate(m.x + 4, m.y, 2))

// this stuff could be moved to /mob/battledecoy/New()
// by passing the player's Digimon as an argument (note 2)
b.icon = player1.Digimon.icon
b.icon_state = player1.Digimon.icon_state
c.icon = player2.Digimon.icon
c.icon_state = player2.Digimon.icon_state

// 'm' is a turf.
// 'm.loc' is an area, and you don't want that.
player1.client.perspective = EYE_PERSPECTIVE
player1.client.eye = m
player2.client.perspective = EYE_PERSPECTIVE
player2.client.eye = m


Note 1: Setting coordinates individually doesn't work when the object has a null location. When either x, y, or z are 0 at any point in the code, they are all 0. This means if you set one to 2 and the rest are still 0, they all become 0. To fix this you use locate(), which returns a turf when given the 3 coordinates together.

Note 2: A slightly more advanced example
mob/battledecoy
// The first argument is always Loc
// I don't know the type path for Digimon
// so I'll just use /atom since they share icon/icon_state
New(Loc, atom/Digimon)
// This is just in case you have other stuff going on
// New() doesn't actually set the location or anything
..()

icon = Digimon.icon
icon_state = Digimon.icon_state

// --- copied from the above code ---

var mob/battledecoy
// initialize two /battledecoys
// at given initial positions
// and given the players' digimon
b = new(locate(m.x - 4, m.y, 2), player1.Digimon)
c = new(locate(m.x + 4, m.y, 2), player2.Digimon)
Thanks, worked perfectly! Also made my code look much tidier...
m is a turf. m.loc is an area. locate(m.loc) is not a valid use of locate().

You just want to place the eye at m itself, because m is a turf. (if your markers were /obj's, then you would want to place the eye at m.loc)

<edit>
Ah, beaten to the punch by a much more thorough answer!