Gamestudio Links
Zorro Links
Newest Posts
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (AndrewAMD, 1 invisible), 1,086 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Adding firing to Multiplayer workshop 25 #378302
07/22/11 03:37
07/22/11 03:37
Joined: Aug 2008
Posts: 36
California USA
tunisod Offline OP
Newbie
tunisod  Offline OP
Newbie

Joined: Aug 2008
Posts: 36
California USA
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


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)
   }

}



Last edited by tunisod; 07/22/11 14:41.
Re: Adding firing to Multiplayer workshop 25 [Re: tunisod] #378303
07/22/11 04:47
07/22/11 04:47
Joined: Nov 2006
Posts: 497
Ohio
xbox Offline
Senior Member
xbox  Offline
Senior Member

Joined: Nov 2006
Posts: 497
Ohio
sorry, i can't help you with your problem but, I know some people on here won't bother if the code is like you have it.

so to fix it, just put all the code your posting, into these tags
"[ code]...[/code ]"

Edit: make sure to take out the spaces before "code" and after "/code".

Last edited by xbox; 07/22/11 04:48.
Re: Adding firing to Multiplayer workshop 25 [Re: xbox] #378304
07/22/11 04:56
07/22/11 04:56
Joined: Aug 2008
Posts: 36
California USA
tunisod Offline OP
Newbie
tunisod  Offline OP
Newbie

Joined: Aug 2008
Posts: 36
California USA
is it right? it didn't seem to change anything.

Re: Adding firing to Multiplayer workshop 25 [Re: tunisod] #378309
07/22/11 05:58
07/22/11 05:58
Joined: Nov 2006
Posts: 497
Ohio
xbox Offline
Senior Member
xbox  Offline
Senior Member

Joined: Nov 2006
Posts: 497
Ohio
replace the quotation marks with square brackets

Re: Adding firing to Multiplayer workshop 25 [Re: xbox] #378327
07/22/11 14:44
07/22/11 14:44
Joined: Aug 2008
Posts: 36
California USA
tunisod Offline OP
Newbie
tunisod  Offline OP
Newbie

Joined: Aug 2008
Posts: 36
California USA
Since I just learned how to make the code all nice and neat I went ahead and put in the whole script.

Any ideas will be appreciated

Last edited by tunisod; 07/22/11 14:45.
Re: Adding firing to Multiplayer workshop 25 [Re: tunisod] #378345
07/22/11 17:37
07/22/11 17:37
Joined: Jul 2011
Posts: 7
M
M3n1nWh1T3 Offline
Newbie
M3n1nWh1T3  Offline
Newbie
M

Joined: Jul 2011
Posts: 7
I started like you but this project isnt good. Use Anet. Its much, much MUCHHH better.

Re: Adding firing to Multiplayer workshop 25 [Re: M3n1nWh1T3] #378347
07/22/11 17:52
07/22/11 17:52
Joined: Aug 2008
Posts: 36
California USA
tunisod Offline OP
Newbie
tunisod  Offline OP
Newbie

Joined: Aug 2008
Posts: 36
California USA
I was thinking about Anet as a last resort. I was hoping to work in GS natively since you have to pay for Anet. I've played with the multiplayer AUMs and they seem to work (with the exception when you try to connect a third client to Aum 78 multiplayer 11. firing is broken) as well as the workshop 25. We just need a little more instruction on how to use it. Like how about adding firing bullets in mulitiplayer to workshop 26

Re: Adding firing to Multiplayer workshop 25 [Re: tunisod] #378377
07/23/11 07:20
07/23/11 07:20
Joined: Jul 2011
Posts: 7
M
M3n1nWh1T3 Offline
Newbie
M3n1nWh1T3  Offline
Newbie
M

Joined: Jul 2011
Posts: 7
The workshop is OK but the aum isnt the greatest. Look i tell you:
The aum is working with the method, to know who shoot for its looking if client or server shoot. This is really wrong because a server usually is running on extra pc's and the cleints wanna play. Download Aum 79 and he will tell you how to make it working wink

Re: Adding firing to Multiplayer workshop 25 [Re: M3n1nWh1T3] #378474
07/23/11 23:04
07/23/11 23:04
Joined: Aug 2008
Posts: 36
California USA
tunisod Offline OP
Newbie
tunisod  Offline OP
Newbie

Joined: Aug 2008
Posts: 36
California USA
Yep, I included the script from AUM 79 along time ago and all worked fine with GS 7.8 but somthing in GS 8.20.1 is broken
or they change somthing and now I can't get a third client to work properly.
That's why I turned to the workshop 25 but I can't figure out how to get firing bullets from the client.


Moderated by  HeelX, Spirit 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1