After days of hard work I am close to confusion. I tried to set up a multiplayer
test with a red ball which is moved by the server (-cl -sv) and a blue box
moved by the client (-cl) just by the keys wsad.
All works fine, but the blue box is never moved by input from the client. I
even tried to convert the essential code lines from Locoweeds tutorial to
Lite-C; no success.
Either the skills (movement input) are not recieved by the server or the
movement function is not executed for the client object on the server. It
looks very much like the second option, I found no way to verify the first.

Has anyone an idea?

Here is the code:

// Simple Multiplayer
// 3D Gamestudio A7 Version 7.05 commercial

#include <acknex.h>
#include <default.c>

ENTITY* clPlayer;
ENTITY* svPlayer;

var isMove = 0;
var isInput = 0;
var showX = 0;
var showY = 0;

function moveMe () { // movement for both on server
while (1) {
my.x += my.skill1 * time_step;
my.y += my.skill2 * time_step;
ent_sendnow (me);

if (me == clPlayer) isMove++; // moveMe running for client? NO!
if (isMove > 999) isMove = 0; // remove 'if (me == clPlayer)' to see
wait (1); // that moveMe runs on server only
}
}

function getInput () { // wsad control on client and server separately
if (connection == 2) me = clPlayer;
if (connection == 3) me = svPlayer;

while (1) {
if (key_w == 1) my.skill1 = 5;
if (key_s == 1) my.skill1 = -5;
if (key_a == 1) my.skill2 = 5;
if (key_d == 1) my.skill2 = -5;
if (!key_any) {
my.skill1 = 0;
my.skill2 = 0;
}

if (connection == 2) send_skill (my.skill1, SEND_VEC|SEND_UNRELIABLE);

showX = my.skill1; // show input
showY = my.skill2; // show input
isInput++; // getInput running?
if (isInput > 999) isInput = 0;
wait (1);
}
}

////////////////////////////// main ///////////////////////////////////////
function main () {
level_load ("M.wmb"); // just a platform and a cylinder at +X for orientation
wait (-0.5);
vec_set(camera.x,vector(-200, 0 , 20));

while (connection == 0) wait (1);

if (connection == 2) { // client
clPlayer = ent_create ("BlueBox.mdl", vector (70, 30, 0), moveMe);
}

if (connection == 3) { // client / server
svPlayer = ent_create ("RedSphere.mdl", vector (70, -30, 0), moveMe);
}
wait (-0.5);

getInput();
}

PANEL* diag_pan = {
flags = VISIBLE;
digits (4,10,"Diagnostics",*,1,NULL);
digits (4,20,"connection =",*,1,NULL);
digits (80,20,3.0,*,1,connection);
digits (4,50,session_name,*,1,NULL);
digits (4,60,player_name,*,1,NULL);
digits (4,70,"Input :",*,1,NULL);
digits (80,70,3.0,*,1,isInput);
digits (4,80,"Move :",*,1,NULL);
digits (80,80,3.0,*,1,isMove);
digits (4,90,"Inp X :",*,1,NULL);
digits (80,90,3.0,*,1,showX);
digits (4,100,"Inp Y :",*,1,NULL);
digits (80,100,3.0,*,1,showY);
}