Posted By: tunisod
Adding firing to Multiplayer workshop 25 - 07/22/11 03:37
First off let me apologize for the messy post
wasn't sure if I should post this to the starting with gamestudio or not but
since my question is regarding multiplayer then I think I'll post it here.
I'm trying to combine the multiplayer workshop 25 script25_2 with AUM 78 multiplayer 11 script.
I'm able to get the server to fire but I don't know how to get the client to fire.
Can anyone offer me help. here's the code I've got so far.
I'm not sure how to post code in a neat little format so I'll post the 2 major parts
wasn't sure if I should post this to the starting with gamestudio or not but
since my question is regarding multiplayer then I think I'll post it here.
I'm trying to combine the multiplayer workshop 25 script25_2 with AUM 78 multiplayer 11 script.
I'm able to get the server to fire but I don't know how to get the client to fire.
Can anyone offer me help. here's the code I've got so far.
I'm not sure how to post code in a neat little format so I'll post the 2 major parts
Code:
//////////////////////////////////////////////////////////////////////////// // simple lite-C online game //////////////////////////////////////////////////////////////////////////// #include <acknex.h> #include <default.c> #define health skill20 //////////////////////////////////////////////////////////////////////////// var fired = 0; var client_ent = 0; // stores the handle to the client entity (client's player) var server_fired = 0; var client_fired = 0; var bullet_pan; // stores the pan angle of the server or client player var players_health; var cam_angle = 90; // set the initial camera angle here var cam_dist = 250; // set the default zoom in factor here var cam_height = 150; // set the default camera height here var im_server = 0; var im_client = 0; var server_only = 0; var client_only = 0; var client_server = 0; var player_id = 0; var my_id = 0; VECTOR temp2; BMAP* hit_tga = "hit.tga"; BMAP* mouse_tga = "C_Standard_800x600.tga"; // bitmap used for the mouse pointer STRING* client_test_str ="#100"; FONT* arial_font = "Arial#15"; /////////////////////////////////////////////////////////////////////////// TEXT* client_test_txt = // displays the info messages at the top of the screen { pos_x = 10; pos_y = 30; layer = 10; font(arial_font); string (client_test_str); flags = visible; } ///////////////////////////////////////////////////////////////////////////// function simple_camera() { cam_dist += 0.9 * mickey.z * time_step; // zoom in / out using the mouse wheel cam_dist = clamp(cam_dist, 20, 500); // limit the distance between the camera and the player to 20...500 cam_height+= 8 *(mouse_force.y)* time_step; // set the height of the camera using the mouse camera.clip_near = 5; // don't pass walls when close to them cam_height = clamp(cam_height, 5, 300); // limit the height of the camera camera.x = my.x - cam_dist * cos(cam_angle); camera.y = my.y - cam_dist * sin(cam_angle); if(mouse_right == 1) { cam_angle += 4 *(mouse_force.x) * time_step; } else { cam_angle = my.pan; // the camera and the player have the same pan angle } camera.z = my.z + cam_height; vec_set(temp2.x, my.x); vec_sub(temp2.x, camera.x); vec_to_angle(camera.pan, temp2); // rotate the camera towards the player at all times } function fade_hits(PARTICLE *p) { p.alpha -= 4 * time_step; // fade out the hit_tga particles if (p.alpha < 0) p.lifespan = 0; } function player_hit(PARTICLE *p) { p->vel_x = 0.2 - random(1) / 4; p->vel_y = 0.2 - random(1) / 4; p->vel_z = 0.3 + random(1) / 3; p.alpha = 25 + random(50); p.bmap = hit_tga; p.size = 5; // gives the size of the hit particles p.flags |= (BRIGHT | MOVE); p.event = fade_hits; } function hit_effect() // this function will generate particles only on the client { effect(player_hit, 5, my.x, nullvector); // generate 5 particles each frame } function remove_bullets() // this function runs when the bullet collides with something { if (connection == 2) // this section runs on the client? { proc_client(my, hit_effect); // then start a function that will only run on the client } else // this section runs on the server { // under normal conditions (without checking the "connection" value) this would create particles on the client, as well as on the server effect(player_hit, 5, my.x, nullvector); } wait (1); // wait a frame to be sure (don't trigger engine warnings) ent_remove (my); // and then remove the bullet } function move_bullets() // this function runs on the server (any ent_create instruction is run on the server) { VECTOR bullet_speed[3]; // stores the speed of the bullet my.emask = ENABLE_IMPACT | ENABLE_ENTITY | ENABLE_BLOCK; // the bullet is sensitive to impacts with entities and level blocks my.event = remove_bullets; // when it collides with something, its event function (remove_bullets) will run my.pan = bullet_pan; // my.pan could be set to server's player.pan or client's player.pan my.skill99 = 1234; // set a unique identifier for the bullets bullet_speed.x = 50 * time_step; // adjust the speed of the bullet here bullet_speed.y = 0; // the bullet doesn't move sideways bullet_speed.z = 0; // or up / down on the z axis while (my) // this loop will run for as long as the bullet exists (it isn't "NULL") { c_move (my, bullet_speed, nullvector, IGNORE_PASSABLE | IGNORE_YOU); // move the bullet ignoring its creator (the player) ent_sendnow(my); // send the updated bullet position each frame (ensures smooth bullet movement on the client as well) wait (1); } } function fire_bullets() // this function is called from main, so it runs on the server and on the client { if (connection == 2 ) // this section runs on the client { str_cpy(client_test_str, "Client Fired"); fired += 1; wait(1); PANEL* digit_pan = { digits (80, 35, 2, *, 1, fired); flags = VISIBLE; } client_fired = 1; // we set client_fired for a frame, and then we reset it wait(1); client_fired = 0; } if (connection == 3 ) // this section runs on the client { str_cpy(client_test_str, "Server Fired"); fired += 1; wait(1); PANEL* digit_pan = { digits (80, 35, 2, *, 1, fired); flags = VISIBLE; } server_fired =1; wait(1); server_fired = 0; } } function on_client_event() // terminate client when server disconnects { if (event_type == EVENT_LEAVE) { sys_exit("Disconnected!"); } } function player_remove() // remove player when client disconnects { if (event_type == EVENT_DISCONNECT) { ent_remove(me); } } function init_mouse() { mouse_mode = 2; mouse_map = mouse_tga; while (1) { vec_set(mouse_pos, mouse_cursor); wait(1); } } action player_move() // control the player on its client, move it on the server, animate it on all clients { my.emask |= ENABLE_DISCONNECT; my.smask |= NOSEND_FRAME; // don't send animation my.event = player_remove; var walk_percentage = 0; var skill1_old = 0, skill2_old = 0; VECTOR bullet_pos[3]; my.health = 100; send_skill(my.health, 0); // send the health value once, at the very beginning, in order to update the health value on the client player at game start while (my.health > 0) // the server player is still alive? { if (my.client_id == dplay_id) // player created by this client? { if (key_w-key_s != my.skill1)// forward/backward key state changed? { my.skill1 = key_w-key_s; send_skill(my.skill1,0); // send the key state in reliable mode } if (key_a-key_d != my.skill2)// rotation key changed? { my.skill2 = key_a-key_d; send_skill(my.skill2,0); // send rotation state in reliable mode } send_var_to(NULL,client_fired); // send client_fired to the server; even client's bullets are created on the server simple_camera(); } if (connection == 3) // running on the server? { if (my.skill1 != skill1_old) { // if movement changed send_skill(my.skill1,SEND_ALL); // send movement to all clients skill1_old = my.skill1; } if (my.skill2 != skill2_old) { // if rotation changed send_skill(my.skill2,SEND_ALL); // send rotation to all clients skill2_old = my.skill2; } if(server_fired == 1) // the client has fired? Then we need to get access to the client player { vec_set (bullet_pos.x, vector (80, -10, 25)); // create the bullet at an offset of x = 30, y = -5, z = 15 vec_rotate (bullet_pos.x, my.pan); // in relation to the "you" model (client's player) vec_add (bullet_pos.x, my.x); //Adds the first and second vector, and copies the result to first. This can be used for adding velocities bullet_pan = my.pan; // and we use client's player pan angle for the bullet ent_create("bullet.mdl", bullet_pos.x, move_bullets); // then create client's bullets (on the server as well) } if (client_fired == 1) // the client has fired? Then we need to get access to the client player { you = ptr_for_handle(client_ent); // let's restore its handle; the client player is now "you" vec_set (bullet_pos.x, vector (80, -10, 25)); // we set bullet_pos to the same offset vec_rotate (bullet_pos.x, you.pan); // in relation to the "you" model (client's player) vec_add (bullet_pos.x, you.x); bullet_pan = you.pan; // and we use client's player pan angle for the bullet ent_create("bullet.mdl", bullet_pos.x, move_bullets); // then create client's bullets (on the server as well) } } my.pan += my.skill2*5*time_step; // rotate the entity using its skill2 var distance = my.skill1*5*time_step; c_move(me, vector(distance,0,0), NULL, GLIDE); // move it using its skill1 walk_percentage += distance; ent_animate(me,"walk",walk_percentage,ANM_CYCLE); // animate the entity wait (1); } } function main() { if (!connection)// not started with -cl / -sv -cl? { sys_exit(NULL); // and then shut down the engine } do { wait(1); }while (dplay_status < 2); // wait until the session is opened or joined dplay_entrate = 4; // 16 ticks/4 = 4 updates per second dplay_smooth = 0; // dead reckoning not needed dplay_localfunction = 2; level_load ("multiplayer6.wmb"); while (dplay_status < 6) wait(1); // wait until the level state is received from the server on_client = on_client_event; on_server = player_remove; // function server_event will run as soon as the server receives a message from a client on_mouse_left = fire_bullets; // the player use the left mouse buttons to fire if (connection == 3)// this instance of the game runs on the server { STRING* title = str_create("Server: "); str_cat(title,server_ip); video_window(0,0,0,title); ent_create ("redguard.mdl",vector(100,50,40),player_move); // then create the red guard! } if(connection == 2)// runs as a connected client { video_window(0,0,0,player_name); random_seed(0); // allow random player positions my=ent_create ("blueguard.mdl",vector(-100+random(200),-50+random(100),40),player_move); // create the blue guard client_ent = handle(my); // now we can get a valid handle to the client entity (the player that runs on the client) send_var_to(NULL,client_ent); // and let's send the handle over the network to the server (no need to do that more than once) } }