Movement types | Relative, absolute, etc.. |
Location tag | What location tag contains |
Containers and relative movement | You are on ship that moves at sea |
Movement type | Server | Client | tags | |
a) | Relative coordinates | Nethack and many MUDs | Simple client | vector, relrotation |
b) | Force vector | QUADAS, Cyphesis in future | Normal client | forcevector, torquerotation |
c) | Force vector/limb | Some future world with VR | VR client with suit | forcevector, torquerotation |
d) | Absolute coordinates | Cyphesis currently | Map editor | coords, rotation |
If you have better suggestions for tag names, mail to scripting@.
Server should always support less accurate movement:
Advanced server: | a,b,c |
Less advanced server: | a,b |
Simple server: | a |
Same for client. Client tries most advanced method of moving and if it gets illegal event back then it falls back to less advanced method.
Server implementation could be something like this: server:b, client:a Create appropriate force vector for requested move difference and use it as if that was requested.
When 'force' -tag is used by client, then likely server sends movement sights using 'vector' -tag.
Why?
It would be nice if server would work with less advanced clients and vice versa. We can't immediately implement some very detailed moving. It's just that when client uses less accurate 'movement type' then (s)he cannot control her/his character as accurately. For some programs it doesn't make even sense to do it initially (like some existing program).
Id: Entity that acts as reference for location.
Either coords, vector or forcevector is used for position. Units are in meters unless something different has been decided between server and client.
Coords: absolute coordinates in relation to reference entity. Example (x,y,z):
<coords>12.4,23.2,-0.5</coords>
Vector: relative to receiving character. Example:
<vector>12.4,23.2,-0.5</vector>
Forcevector: Force relative to receiving character. Default unit is newton. Example:
<forcevector>12.4,23.2,-0.5</forcevector>
Either rotation, relrotation or torquerotation is used for rotation. Units are in radians unless something different has been decided between server and client.
Rotation: Absolute rotation in relation to reference entity. Example (x,y,z -axis):
<rotation>0.1,-0.2,2.0</rotation>
Relrotation: Relative rotation in relation to receiving character. Example:
<relrotation>0.1,-0.2,2.0</relrotation>
Forcerotation: Relative torque in relation to receiving character. Default unit is newton meter. Example:
<torquerotation>0.1,-0.2,2.0</torquerotation>
You move: ship has moved in relation to you:
<ent> <id>you_123</id> <loc><id>ship_12</id><vector>-4.5,2,0</vector></loc> </ent>
Ship moves: sea has moved in relation to ship:
<ent> <id>ship_12</id> <loc><id>sea_1</id><vector>0.1,5,0</vector></loc> </ent>
Sea moves: you don't notice.
Somebody else moves on same ship: somebody has moved in relation to you:
<ent> <id>somebody_else_1234</id> <loc><id>ship_12</id><vector>-0.5,2,0</vector></loc> </ent>
Another ship moves: ship2 has moved in relation to your ship:
<ent> <id>ship2_33</id> <loc><id>sea_1</id><vector>-3.1,1.2,0</vector></loc> </ent>