#include <acknex.h>
#include <anet.h>
#include <main.h>
#include <default.c>
#include <windows.h>
#include <ackphysx.h>
//netzwerk
function enet_initialisieren()
{
enet_init();
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");
//enet_svset_event(16,"kick_client");
//enet_svset_event(17,"receive_chatmsg");
//enet_clset_event(17,"receive_chatmsg");
}
function start_server()
{
level_load("media/levels/shooter.wmb");
wait(3);
enet_init_server(80,4,"");
wait(-1);
enet_set_level("media/levels/shooter.wmb");
}
function start_client(STRING* ip)
{
enet_init_client(ip,80,"");
}
function client_disconnected(var sender, STRING* msg, var length)
{
if(players[sender] != NULL)
{
ptr_remove(ptr_for_handle(players[sender].skill[40]));
enet_ent_remove(enet_ent_globpointer(players[sender]));
players[sender] = 0;
}
}
function connected_with_server(var sender, STRING* msg, var length)
{
enet_set_playername(playername_input); //sets the playername
if(enet_get_connection() == CLIENT_MODE) //if started as client
{
level_load(msg); //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
{
create_player(); //creates the correct character
}
}
function disconnected_from_server(var sender, STRING* msg, var length)
{
if(length == 0)
error("Lost connection to server!"); //shows a warning on the screen
else
error(msg); //show the sent string
sys_exit(NULL);
}
function synchronizing_complete(var sender, STRING* msg, var length)
{
create_player(); //creates the correct character
}
function follow(ENTITY* ent)
{
my.pan = camera.pan;
vec_set(camera.x,ent.x);
}
function Bewegen()
{
VECTOR player_dist;
VECTOR save_pos;
VECTOR temp;
var save_pan = 0;
TEXT* name_text;
STRING* save_str = "#50";
VECTOR vFeet;
vec_for_min(vFeet,me);
my.flags |= SHADOW;
while(enet_ent_globpointer(my) == ANET_ERROR) {wait(1);}
players[enet_ent_creator(enet_ent_globpointer(my))] = my;
if(enet_ent_creator(enet_ent_globpointer(my)) == enet_get_clientid())
{
wait(1);
while(enet_get_clientid() != ANET_ERROR)
{
if(key_shift)
{
run = 1.5;
}
else
{
if(key_ctrl)
{
run = 0.5;
}
else
{
run = 1;
}
}
VECTOR* mov = vector(0,0,0);
if(key_w)mov.x=movement_speed_fb * run*time_step;
if(key_s)mov.x=movement_speed_fb/2 *-1*run*time_step;
if(key_a)mov.y=movement_speed_rl * run*time_step;
if(key_d)mov.y=movement_speed_rl *-1*run*time_step;
// ANGLE* nothing = camera.pan;
// nothing.tilt=0;
if(c_trace(my.x,vector(my.x,my.y,my.z-40),IGNORE_ME | IGNORE_PASSABLE)){
anziehung=0;
PlayerinderLuft=0;
// c_trace(my.x,vector(my.x,my.y,my.z-1000),IGNORE_ME | IGNORE_PASSABLE);
// my.z = hit.z - vFeet.z + 15;
}
else
{
anziehung=anziehung+gravitiy;
PlayerinderLuft=1;
}
vec_rotate(mov,camera.pan);
if(key_space && PlayerinderLuft==0)
{
mov.z=5*time_step;
anziehung=-30;
PlayerinderLuft=1;
mov.z=-1*anziehung*time_step;
}
else
{
mov.z=-1*anziehung*time_step; // must be set, because vec_rotate sets mov.z when the camera looks up/down.
}
pXent_movechar(me, mov, camera.pan, 0);
follow(me);
if(save_pos.x != my.x || save_pos.y != my.y || save_pos.z != my.z)
{
enet_send_pos(enet_ent_globpointer(my),BROADCAST,NULL);vec_set(save_pos,my.x);
}
if(save_pan != my.pan)
{
enet_send_angle(enet_ent_globpointer(my),BROADCAST,ONLYSEND_PAN);save_pan = my.pan;
}
}
}
else
{
name_text = txt_create(2,2);
name_text.flags |= VISIBLE;
my.skill[40] = handle(name_text); //saves the handle local
while(my != NULL && enet_get_connection() != NO_CONNECTION && enet_ent_globpointer(my) != ANET_ERROR)
{
vec_set(temp,my.x);
vec_to_screen(temp,camera);
name_text.pos_x = temp.x-20;
if(vec_dist(my.x,camera.x)>1) //no div through 0
{
name_text.pos_y = temp.y-250/(vec_dist(my.x,camera.x)*0.01);
}
else
{
name_text.pos_y = temp.y-300;
}
enet_get_playername(enet_ent_creator(enet_ent_globpointer(my)),save_str);
str_cpy((name_text->pstring)[0],save_str);
wait(1);
}
}
}
function create_player()
{
if(team1 <= team2)
{
ENTITY* phys=enet_ent_create("media/models/earth.mdl",vector(-3,2439,100),"Bewegen"); // die variable wird nur für die folgenden physikeinstellungen gebraucht
team1 += 1;
pXent_settype(phys, PH_CHAR, PH_SPHERE);
pXent_setfriction (phys,0);
pXent_setmass( phys, 2 );
}
else if(team1 >team2)
{
team2 += 1;
ENTITY* phys=enet_ent_create("media/models/earth.mdl",vector(-3,2439,100),"Bewegen"); // die variable wird nur für die folgenden physikeinstellungen gebraucht
pXent_settype(phys, PH_CHAR, PH_SPHERE);
pXent_setfriction (phys,0);
pXent_setmass( phys, 2 );
}
}
//netzwerk