Jop, hab ich durchgelesen, ich hab daraus sogar Code für den Anfang kopiert -.- *schähm* ^^
über die while-Schleifen oder das mit dem Pan-Winkel bei der Bewegung bitte darüber weg sehn, ich schreib das meist etwas kompliziert hin und wenn es vom Prinzip funktioniert, optimiere ich das dann noch ^^
Okay, dann hier etwas Code:
Die mainfunktion steht im ersten Code-Block zu unterst. Syntaxfehler(sowas wie Semikolon vergessen oder so), die eigentlich Fehlermeldungen produzieren würden, sind mir dann beim hier hereinkopieren passiert, die Engine läuft das bei mir problemlos durch.
function create_player()
{
enet_ent_create("spieler01_unten.mdl",vector(random(100), 0, 0),"move_player");
wait(1);
}
string playername_str = "#50";
//client event beim einklinken
function connected_with_server(sender, msg)
{
inkey(playername_str); //Lässt den Spieler einen Spielernamen eingeben
enet_set_playername(playername_str); //Speichert den Spielernamen
if(enet_get_connection() == CLIENT_MODE) //if started as client
{
error("neuer client");
//level_load(msg); //loads the level which is loaded on the server
level_load("level_001__test.wmb"); //loads the level which is loaded on the server
wait(3); //wait until the level is loaded
enet_ent_synchronize(); //sends a synchronizing request
}
else //started as server or server/client
{
error("neuer server");
create_player(); //creates the correct character
}
}
function synchronizing_complete(sender, msg)
{
create_player(); //creates the correct character
}
function start_client(ip)
{l
enet_init_client(ip,used_port,""); //initializes a client
}
function start_server()
{
while(key_F1){wait(1);} // zum schnell testen mit F1 server
level_load("level_001__test.wmb"); //Loads the first Level
wait(3); //wait until the level is loaded
while((enet_init_server(used_port,max_players,""))==ANET_ERROR) {wait(1);}
enet_set_level("level_001__test.wmb"); //sets the level
wait(4);
//start_client("localhost"); // server spielt auch mit
start_client("255.255.255.255");
}
function test_start_client() //zum testen den Client dazu
{
while(1)
{
if(KEY_F2)
{
//start_client("localhost");
start_client("255.255.255.255");
break;
}
wait(1);
}
}
function main()
{
fps_max = 60;
wait(1); //wait for the plugin to get loaded
if((enet_init())==ANET_ERROR){exit;}
anet_set_compatibility(1);
//enet_svset_event(EVENT_DISCONNECTED,"client_disconnected");
enet_clset_event(EVENT_CONNECTED,"connected_with_server");
//enet_clset_event(EVENT_DISCONNECTED,"disconnected_from_server");
enet_clset_event(EVENT_SYNCHRONIZED,"synchronizing_complete");
//enet_clset_event(EVENT_LEVEL,"change_level_event");
//sets userevents:
//enet_svset_event(16,"kick_client");
//enet_svset_event(17,"receive_chatmsg");
//enet_clset_event(17,"receive_chatmsg");
level_load(""); //loads an empty level
wait(3); //wait until the level is loaded
//shows the mouse
mouse_mode = 1;
mouse_map = arrow_bmap;
test_start_client(); //temp
while(1)
{
//gets some info vars:
enet_connection = enet_get_connection();
enet_clientid = enet_get_clientid();
enet_clients = enet_connected_clients();
ping = enet_get_ping();
//controls the mouse:
MOUSE_POS.X = POINTER.X;
MOUSE_POS.Y = POINTER.Y;
wait(1);
}
}
ON_F1 = start_server(); //test
das ist die Mainfunktion und was den Server+Client initialisiert.
Die Spielerfunktion ist hier:
function oberes_teil()
{
while(enet_ent_globpointer(my) == ANET_ERROR) {wait(1);}
my.passable = on;
while(1)
{
you = enet_ent_locpointer(my.entity_handle);
vec_set(my.x,you.x);
vec_set(temp.x,vector(mouse_pos.x,mouse_pos.y,camera_dist));
vec_for_screen(temp,camera);
temp.z = 0;
vec_sub (temp.x, you.x);
vec_to_angle (my.pan, temp); // rotate it towards the target
wait(1);
}
}
function move_player()
{
my.leben = 100;
my.max_leben = 100;
my.mana = 100;
my.max_mana = 100;
var dist_move[3];
var moved_dist; //die Distanz, die zurückgelegt wurde (damit wird überprüft, ob Spieler bewegt wurde, wenn ja -> broadcast)
var moved_pan; //die Drehung, die zurückgelegt wurde (damit wird überprüft, ob Spieler bewegt wurde, wenn ja -> broadcast)
while(enet_ent_globpointer(my) == ANET_ERROR) {wait(1);}
you = enet_ent_create("spieler01_oben.mdl",vector(my.x,my.y,my.z),"oberes_teil");
while(enet_ent_globpointer(you) == ANET_ERROR) {wait(1);}
you.entity_handle = enet_ent_globpointer(my);
// updates(); //updates für Charakter-Wert-Balken u.ä.
while(1)
{
if(enet_ent_creator(enet_ent_globpointer(my)) == enet_get_clientid())
{
while(my.leben>0)
{
if(key_A+key_W+key_D+key_S>0) {dist_move.x = 25*time;} else {dist_move.x = 0;}
moved_dist = c_move(my,dist_move,nullvector,IGNORE_PASSABLE|GLIDE|IGNORE_PUSH);
if(abs(moved_dist) > 0) //Wenn sich die Entity bewegt hat
{
enet_set_unreliable(1); //damit die Position unreliable gesendet wird
//sendet die neue Position an alle:
enet_send_pos(enet_ent_globpointer(my),BROADCAST,0);
enet_set_unreliable(0); //schaltet unreliable wieder aus
//damit andere Sendfunktionen nicht beeinflusst werden
}
if(key_W) {moved_pan = 90;}
if(key_A) {moved_pan = 180;}
if(key_S) {moved_pan = 270;}
if(key_D) {moved_pan = 0;}
if(key_W && key_D) {moved_pan = 45;}
if(key_S && key_D) {moved_pan = 315;}
if(key_S && key_A) {moved_pan = 225;}
if(key_W && key_A) {moved_pan = 135;}
if(moved_pan != my.pan) //wenn der Player gedreht wurde
{
my.pan = moved_pan;
enet_set_unreliable(1);
//sendet die neuen Winkel an alle:
enet_send_angle(enet_ent_globpointer(my),BROADCAST,ONLYSEND_PAN);
enet_set_unreliable(0);
}
kamera_bewegung(); //if(key_F){erster_slot+=1;} enet_send_skill(enet_ent_globpointer(my),1,1,BROADCAST);
wait(1);
}
}
wait(1);
}
}
Ich hab das aus dem 3D-Chat-workshop(der echt toll ist!).
Der Server wird erstellt.
Er clinkt sich dabei selbst als Client ein und erstellt ne Spielfigur.
Clients joinen und per enet_clset_event->EVENT_CONNECTED wird synchronisiert.
Durch das ausgelöste enet_clset_event->EVENT_SYNCHRONIZED wird eine Spielfigur für den Clienten erstellt.
Doch wenn ich das ausführe, passiert das, was ich vorhin beschrieben habe -
1. Servervlient: 2 entities (ober- und unterkörper)
weiterer client: 6 entities
dritter client: 12 entities
jeder kann sich bewegen, es ist alles "normal" - mir ist das erst garnicht aufgefallen, nur durch die Anzahl der Entities später.
Die, die zusätzlich "nicht da sein dürften" "kleben" an der Serverclient-Entity.