@Dark_samurai:

Ja, ich dachte auch, dass das ohne weitere Probleme funktionieren sollte. Spinnen wir das mal eben im trockenem durch:
Der Server startet und generiert das Level. Ein Client loggt sich ein und der Server erstellt einen Spieler. Dazu werden zwei Funktionen benutzt:

Code:
/////////////////////////////////////////////////////////////////////////////////////////
void PLAYER_defaultPlayer(void)
{// SRV
	OSM_addMessage("initiated [PLAYER_movePlayer]");
	c_setminmax(my);
	set(my,FLAG2);
//	set(my,ZNEAR);
	while(1)
	{
		my.pan -= my.skill21 * time_step;
		c_move(my,vector(my.skill11,my.skill12,my.skill13),nullvector,USE_POLYGON | USE_AABB | GLIDE | IGNORE_FLAG2 | IGNORE_SPRITES);
		wait(1);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////




Code:
/////////////////////////////////////////////////////////////////////////////////////////
void PLAYER_manipulatePlayer(void)
{// CL
	OSM_addMessage("initiated [PLAYER_manipulatePlayer]");
	while(1)
	{
		if(!(is(pInterfaceInfo,SHOW)))
		{// Interface aktiv? 
			my.skill11 = (5 * (key_w - key_s)) * time_step;
			my.skill12 = (5 * (key_a - key_d)) * time_step;
			my.skill13 = -(c_trace(my.x,vector(my.x,my.y,(my.z - 2000)),USE_POLYGON | USE_AABB | IGNORE_ME | IGNORE_FLAG2));
			if(!mouse_right)
			{
				my.skill21 = mickey.x * time_step;	// pan
			}
			send_skill(my.skill11,SEND_VEC);
			send_skill(my.skill21,0);
		}
		c_scan(my.x,my.pan,vector(360,0,1000),SCAN_ENTS | SCAN_LIMIT);
		wait(1);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////



Die erste ist die, die den Movement des Spielers steuert/überwacht und Server seitig abläuft.
Die zweite wird auf dem Client ausgeführt und sammelt jeweils nur Werte zur Spieler-Movement Manipulation, zudem besitzt sie den C_SCAN Befehl.

Zum Schluss fehlt noch die Funktion, welche die beiden obigen auslößt, d.h.: sobald sich ein Client auf dem Server einloggt, wird diese aufgerufen:

Code:
void PLAYER_initiatePlayer(var vKindOf)
{// SRV
	switch(vKindOf)
	{
		case asCLIENT:
		{
			my = ent_create("lowPlayer.mdl",vector(g_tsCurrentPlayer.spawnX,g_tsCurrentPlayer.spawnY,g_tsCurrentPlayer.spawnZ),PLAYER_defaultPlayer);
			g_ePlayer = my;
			PLAYER_manipulatePlayer();
			break;
		}
	}
}
/////////////////////////////////////////////////////////////////////////////////////////



Weiterhin gibt es natürlich jetzt noch ein Objekt im Level, welches der Server erstellt hat und eine EVENT Funktion besitzt. Der eMASK ist auf ENABLE_SCAN sensibilisiert.
Starte ich nun eine Sitzung und nähere mich diesem scannbaren Objekt, geschieht nichts.
Sobald ich aber den Tipp von Superku berücksichtige und vor dem Laden des kompletten Levels und jeglicher Generierung von Entitys, DPLAY_LOCALFUNCTION auf 2 setze, wird das EVENT bei dem Objekt ausgelöst.

Soweit dazu. Das riecht im Grunde genommen erst einmal nach (einem schwammigen) Erfolg aber, da gibt es zwei Dinge:

1. Wenn man jetzt die Sache mit dem DPLAY_LOCALFUNCTION außer Acht lässt, gibt es da etwas, was in meiner Programmierung und der C_SCAN Sache, auffällig falsch ist?

2. Wenn ich DPLAY_LOCALFUNCTION 2 benutze, so steht es im Manual, muss ich zusätzlich allen Funktionen, welche nicht beidseitig aktiv sein sollen, anpassen, indem ich die CONNECTION Variable abfrage. Verstehe ich das richtig? Der PROC_CLIENT Befehl erschien mir da irgendwie praktischer und, nun ja, übersichtlicher.


EDIT
--------------------------
Wie es scheint, ist es der "normale" Weg mit DPLAY_LOCALFUNCTION 2. Ich habe jetzt erst einmal die Player Funktionen darauf hin angepasst und es Funktioniert. Allerdings beschleicht mich immer noch ein schwammiges Gefühl dabei.

Last edited by CHaP; 09/22/10 14:18. Reason: -------------------------------