Gamestudio Links
Zorro Links
Newest Posts
Zorro 2.70
by jcl. 09/29/25 09:24
optimize global parameters SOLVED
by dBc. 09/27/25 17:07
ZorroGPT
by TipmyPip. 09/27/25 10:05
assetHistory one candle shift
by jcl. 09/21/25 11:36
Plugins update
by Grant. 09/17/25 16:28
AUM Magazine
Latest Screens
Rocker`s Revenge
Stug 3 Stormartillery
Iljuschin 2
Galactic Strike X
Who's Online Now
0 registered members (), 18,561 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
krishna, DrissB, James168, Ed_Love, xtns
19168 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Multi-Player #69771
04/05/06 01:38
04/05/06 01:38
Joined: Aug 2002
Posts: 572
Toronto
MadMark Offline OP
User
MadMark  Offline OP
User

Joined: Aug 2002
Posts: 572
Toronto
I have posted elsewhere, but thought I'd rant here too, in the unlikely hopes that my frustration is noted by the developers and has some kind of effect. Yeah Mod, go ahead, gimme heck. I haven't posted in a while, so I guess I'm due.

Are there any plans to introduce real, working, multi-player to 3DGS? Yes, I know, for $800 US, I can have a version that "supports unlimited users". That is not really providing multi-player. I would expect to have some sort of working MP framework, but I'm hearing that I would have to build my own client server foundation. It seems that in the past few years I have asked for the same features, and have been told that they are in development, check the "Future" section, everything you are asking for is planned. What exactly does that mean? I know that when I worked at Symantec "in development" meant that they were actually being actively worked on by a programmer with deadlines, beta builds and QA windows. These were all plotted using project management software, and the time scale was quarterly, NOT 2-3 years. You seem to have some excessively long build cycles.

Where is the addition of basic, working AI? I've been seeing it advertised as "coming soon". When is that? Yeah, there are add-ons that I can buy that were developed in C-spript by your user community. Seems that most of them have given up, moved on, and switched to some other engine. I'll bet that they would be open to building their code into your engine! Even if it costs, think about the marketing advantage!

It is true that no other engine has the capabilities of 3DGS when it comes to putting together a very quick prototype, but I don't want to prototype on the weekends with friends. I want to _play_ my game, and share the experience, the challenge, and all my pretty artwork. I am impressed with the work that was done getting bones into A6, and that is a nice feature, but it was a nice to have. Why ignore the NEED to haves?

Suggestions (NEEDS) listed in order of priority as I see it:
1) Multi-player (this should be click together by now! server=on) Priority 1.
2) Modules, not templates. (Add "AI.wdl" here. Select options for AI in player's graphical settings box with checkboxes or dropdown lists.)
3) Basic AI. C'mon, let's see what you guys can do. You must be able to code some basic >USEFUL< AI. (Not just follow, panic, shoot, run to wall, hit wall, hit wall...)
4) Improve WED. Make levels run faster. If it has a limit with maximum number of objects, by all means, display an error message, but give me the options for removing, hiding or changing the object load order or something. Help me optimize.
5) Make WED a GUI editor. Edit the world the way uou view it, in game.

I finally have money (and the wife's permission) to buy a game engine. Development of this engine seems very much flat. I just installed A6 Demo on my new PC and don't see any difference from the A6 Demo that I installed and deleted over 8 months ago. There are games waiting to be made. Gimme the tools to express them, as promised so very long ago.

And come on, tell us what the intentions and directions are.

Cheers!
Mark


People who live in glass houses shouldn't vacuum naked.
Re: Multi-Player [Re: MadMark] #69772
04/05/06 02:10
04/05/06 02:10
Joined: Feb 2003
Posts: 6,818
Minot, North Dakota, USA
ulillillia Offline
Senior Expert
ulillillia  Offline
Senior Expert

Joined: Feb 2003
Posts: 6,818
Minot, North Dakota, USA
It's been 16 1/2 months since the last release (6.31) and the next release (6.4x.x) seems to be right around the corner. It could still be another month away.

As to multi-player, having more than 4 players is sufficient and I've made several mentions to having an edition containing all pro features, except that you have to display the logo. Not having to display the logo is the most expensive part ($500+ from what I've read). If one wants to not display the logo, they should be able to just purchase that license separately. It doesn't require much adjustment either, just a small change in the license key.


"You level up the fastest and easiest if you do things at your own level and no higher or lower" - useful tip My 2D game - release on Jun 13th; My tutorials
Re: Multi-Player [Re: MadMark] #69773
04/05/06 07:09
04/05/06 07:09
Joined: Aug 2001
Posts: 2,320
Alberta, Canada
William Offline
Expert
William  Offline
Expert

Joined: Aug 2001
Posts: 2,320
Alberta, Canada
Hello Mark,

Hopefully this will help clear up any confusion:

Quote:


Suggestions (NEEDS) listed in order of priority as I see it:
1) Multi-player (this should be click together by now! server=on) Priority 1.




This is similar to how it works already. But probably not how your viewing it. By default the server updates each and every entity to the clients. This of course is very problematic as your BPS becomes very high. Multiplayer coding is not neccesarily hard, it's all about managing your code to be optimized as possible. That is why this request is impossible if you want a perfectly optimized click-together multiplayer game. That said, there is also many ways for setting up multiplayer and where you want certain functions to run(server or client). If your serious about coding a multiplayer game be sure to research the logic before attempting to code it.

Quote:

2) Modules, not templates. (Add "AI.wdl" here. Select options for AI in player's graphical settings box with checkboxes or dropdown lists.)

3) Basic AI. C'mon, let's see what you guys can do. You must be able to code some basic >USEFUL< AI. (Not just follow, panic, shoot, run to wall, hit wall, hit wall...)






Developing an advanced A.I to fit anyones project would require a fair degree of time; best to code it yourself.

Quote:

4) Improve WED. Make levels run faster. If it has a limit with maximum number of objects, by all means, display an error message, but give me the options for removing, hiding or changing the object load order or something. Help me optimize.




If your developing your levels using WEDS basic geometry I wouldn't expect things to run any faster. After all, it uses BSP already, and if developed right, can run quite well. Personally, I think BSP and block geometry as we know it is rather outdated. I'd reccomend creating your levels out of models and doing your lighting via shaders. If your hesitant to use per-pixel lighting, you can still have nice vertex lighting if you model the environments properly. The engine is going to support Octree in the future, this should give the speed of your model based levels quite a boost.

Quote:

5) Make WED a GUI editor. Edit the world the way uou view it, in game.





I think something similar is already in development by TripleX.


Check out Silas. www.kartsilas.com

Hear my band Finding Fire - www.myspace.com/findingfire

Daily dev updates - http://kartsilas.blogspot.com/
Re: Multi-Player [Re: William] #69774
04/08/06 01:33
04/08/06 01:33
Joined: Aug 2002
Posts: 572
Toronto
MadMark Offline OP
User
MadMark  Offline OP
User

Joined: Aug 2002
Posts: 572
Toronto
Hi William,

Quote:


That is why this request is impossible if you want a perfectly optimized click-together multiplayer game. That said, there is also many ways for setting up multiplayer and where you want certain functions to run(server or client). If your serious about coding a multiplayer game be sure to research the logic before attempting to code it.




The point I am trying to make is that for the past several years, I have heard Conitec saying that they are focusing their efforts on making the 3DGS engine more "click together" capable. Okay. Single player has working templates. Enough. Time to focus on putting together a basic working multi-player setup. Every multi-player game, like every single-player game has a standard set of core components. Message receivers, meassge senders, screen updaters, status detectors, etc. What is the sense in having EVERY developer start from scratch when trying to build every game? (Yes, yes, if I manage to do it successfully once, I will have some code that I can use as a base for the next one. WHY NOT GIVE UP THAT INITIAL CODE TO START WITH????) If it is so hard, then why not make it easier?

Quote:

Developing an advanced A.I to fit anyones project would require a fair degree of time; best to code it yourself.




Didn't say that there should be every possible type of AI, or one that will fit every situation. Just one that actually works, works well, and can be adapted for different situations. These 2 above are advanced coding efforts. If the aim is to make the 3DGS engine attractive to new indie and hobby developers, why would they be expected to deal with the ADVANCED TOPICS? Shouldn't the hard things be the first things that the developers provide to neophytes? If I could already code an awesome MP framework with a great AI, would I really need to use c-script, and would I have difficulty creating the simple movement and other templates? I would be demonstrating a solid base in advanced math and programming skills. Think about it.

The others are much less important, but desirable. The bottom line is that I have been waiting, waiting, and waiting some more for any development in these areas, and all that I hear is "coming soon". How bloody long is SOON? Conitec staff should be eating their own dogfood. Show me what YOU can do with this frekin' engine. Give the community something back for all of the wonderful efforts, loyalty, patience and DOLLARS that have been sent your way. Cobble together a complete working game that shows us beginners how to do it! If you've got the kahonies, make it a multi-player, multi-level, kick-ass game that takes the classic templates to the next level! Break the mold. Demonstrate the engine's capabilities. Think outside of the box and STAY THERE.

I would like nothing more than to see the 3DGS engine succeed and explode onto the market because it deserves to be there, not because the company that flogs it managed to seperate a large number of $50 licenses from thousands of college kids and hobbyists because they were told that MP was "coming soon".

Why do you think there are so few completed projects, and so few awe inspiring titles built with this engine? IMHO it is because the development effort has been token at best, focused on the wrong things, and stretched way too long.

Just my opinion, street value 2ยข.
Cheers!
Mark


People who live in glass houses shouldn't vacuum naked.
Re: Multi-Player [Re: MadMark] #69775
04/10/06 10:33
04/10/06 10:33
Joined: Aug 2001
Posts: 2,320
Alberta, Canada
William Offline
Expert
William  Offline
Expert

Joined: Aug 2001
Posts: 2,320
Alberta, Canada
Ask and ye shall receive. Here is some code I typed up when I learned basic multiplayer concepts in 2 weeks. That's all it takes, and your well on your way.

Include Script:

Code:
 //--------------------------------------------------------------------
// Globals
//--------------------------------------------------------------------

//Skills

define server_angle, skill20;
//define server_angle2, skill21;
//define server_angle3, skill22;

define server_origin, skill23;
//define server_origin2, skill24;
//define server_origin3, skill25;


//Pointers
entity* player; // pointer to player entity


//Variables
var people_connected = 0; // number of people connected to server
var number_of_players = 0; // # of players in game
var latency; //latency
var bps; //Bytes per a second

//Strings
string mdl_guard = <guard.mdl>; //pointer to guard model
string str_people_connected; // number of people connected to server
string str_latency; // number of people connected to server
string str_temp; // temp string
string str_bytes; // temp string

string aemo = " "; //testing string

//Text/Fonts

font arial_font = "arial",1,12;

text astuff
{
layer = 25;
pos_x = 0;
pos_y = 140;
string = aemo;
font = arial_font;
flags = visible;
}

text txt_people_connected
{
pos_x = 0; pos_y = 55; layer = 15;
font arial_font; string str_people_connected;
}

text txt_latency
{
pos_x = 0; pos_y = 35; layer = 15;
font arial_font; string str_latency;
}

text txt_bytes
{
pos_x = 0; pos_y = 15; layer = 15;
font arial_font; string str_bytes;
}

//Panels/Bmaps

//--------------------------------------------------------------------
// HUD Functions
//--------------------------------------------------------------------

function display_info()
{
while(1)
{
latency = dplay_latency;
bps = dplay_bps;

str_cpy(str_people_connected, "People Connected: ");
str_for_num(str_temp, people_connected);
str_cat(str_people_connected, str_temp);

str_cpy(str_latency, "Latency: ");
str_for_num(str_temp, latency);
str_cat(str_latency, str_temp);

str_cpy(str_bytes, "BPS: ");
str_for_num(str_temp, bps);
str_cat(str_bytes, str_temp);
wait(1);
}
}

//--------------------------------------------------------------------
// Server functions
//--------------------------------------------------------------------

function check_server_disconnect()
{
while(1)
{
//server disconnected so quit client too
if(dplay_latency == 0 && dplay_bps == 0 && connection == 2)
{
exit;
}
wait(1);
}
}

function server_called()
{
//if new player connected
if((event_type == event_join) && (people_connected < 8))
{
sleep(0.5);
ifdef server;
people_connected += 1; //another person connected
send_var(people_connected); //send number of people connected
endif; //ifdef server
}

//if player disconnected
if(event_type == event_leave)
{
sleep(0.5);
ifdef server;
people_connected -= 1; // one less person connected to server
send_var(people_connected); // send number of people connected
endif;
}
}

on_server = server_called; // server called

//--------------------------------------------------------------------
// Movement functions
//--------------------------------------------------------------------


define run_force,skill5; // in these lines you define skill5 - skill6 with names. you need this because the engine could not use it without names in MP.
define turn_force,skill6;

define force_x,skill1;
define force_y,skill2;
define speed,skill3;
define movement_mode,skill4;

define mode_walking,1;

function client_movement()
{
var old_pan; var old_position; var dist[3]; var target_trace[3];
var old_runforce; var old_turnforce;

var cs_origin[3]; var cs_angle[3];
var reset_move;

while(1)
{
if(my)
{
if(key_w==1){my.run_force=1; }
if(key_s==1){my.run_force=-1;}
if((key_w==0)&&(key_s==0)){my.run_force=0;}


if(key_a==1){my.turn_force=1;}
if(key_d==1){my.turn_force=-1;}
if((key_a==0)&&(key_d==0)){my.turn_force=0;}

vec_set(target_trace,my.x);
target_trace.z -= 5000;
dist.z = -c_trace(my.x,target_trace, ignore_me + ignore_sprites + ignore_passable);

dist.x = my.run_force * 14 * time;
dist.y = 0;
//dist.z = 0;

vec_set(my.pan, old_pan); vec_set(my.x, old_position);
c_move(my,dist.x,nullvector, glide + ignore_passable);
my.pan += my.turn_force * 10 * time;

if(old_runforce != my.run_force){send_skill(my.run_force, 0);}
if(old_turnforce != my.turn_force){send_skill(my.turn_force, 0);}

old_runforce = my.run_force; old_turnforce = my.turn_force;
vec_set(old_pan, my.pan); vec_set(old_position, my.x);

if(reset_move < 35)
{
reset_move += 1;
vec_set(cs_origin.x, my.server_origin); vec_set(cs_angle.pan, my.server_angle);
vec_set(my.x, cs_origin.x); vec_set(my.pan, cs_angle.pan);
}
}
wait(1);
}
}

function server_movement()
{
var old_turn; var old_forward; var dist[3]; var target_trace[3];

while (1)
{
if(my)
{
if(key_w==1){my.run_force=1; }
if(key_s==1){my.run_force=-1;}
if((key_w==0)&&(key_s==0)){my.run_force=0;}

if(key_a==1){my.turn_force=1;}
if(key_d==1){my.turn_force=-1;}
if((key_a==0)&&(key_d==0)){my.turn_force=0;}

vec_set(target_trace,my.x);
target_trace.z -= 5000;
dist.z = -c_trace(my.x,target_trace, ignore_me + ignore_sprites + ignore_passable);

dist.x = my.run_force * 14 * time;
dist.y = 0;
//dist.z = 0;

c_move(my,dist.x,nullvector, glide + ignore_passable);

my.pan += my.turn_force * 10 * time;
}
wait(1);
}
}


function movement_smooth()
{
var rotate[3]; var s_angle[3]; var old_angle[3]; var new_angle[3]; var angle_direct; var oangle_direct; var pan_factor;
var calc_angle[3]; var move[3]; var move_old[3]; var xdirect; var move_factor;
while(1)
{
if(my != player)
{
vec_set(s_angle.pan, my.server_angle);
rotate.pan = ang(s_angle.pan - my.pan); my.pan += rotate.pan * 0.2 * time;
rotate.tilt = ang(s_angle.tilt - my.tilt); my.tilt += rotate.tilt * 0.2 * time;
rotate.roll = ang(s_angle.roll - my.roll); my.roll += rotate.roll * 0.2 * time;

oangle_direct = angle_direct;
if(old_angle.pan > s_angle.pan){angle_direct = 1;}
if(old_angle.pan < s_angle.pan){angle_direct = -1;}
if(angle_direct != oangle_direct){my.pan = s_angle.pan;}

pan_factor = dplay_entrate; if(dplay_entrate < 5){pan_factor /= 4.5;} if(dplay_entrate > 4){pan_factor /= 9;}
if(rotate.pan > 0.2) || (rotate.pan < -0.2){
if(angle_direct == 1){my.pan -= 16 * pan_factor * time;}
if(angle_direct != 1){my.pan += 16 * pan_factor * time;}
}
//str_for_num(aemo, pan_factor);
vec_set(old_angle.pan, my.server_angle);

vec_set(move.x, my.server_origin);
vec_set(temp.x, move.x); vec_sub(temp.x, my.x);
my.x += temp.x * 0.4 * time;
my.y += temp.y * 0.4 * time;
my.z += temp.z * 0.4 * time;

move_factor = dplay_entrate; if(dplay_entrate < 5){move_factor /= 2;} if(dplay_entrate > 4){move_factor /= 5;}
vec_set(move.x, my.server_origin); vec_sub(move.x, my.x); vec_to_angle(calc_angle.pan, move.x);
temp.x = 7*move_factor*time; temp.y = 0; temp.z = 0; vec_rotate(temp.x, calc_angle.pan); vec_add(my.x, temp.x);

//str_for_num(aemo, temp.x);
vec_set(move_old.pan, my.server_origin);
}
wait(1);
}
}

// -sv
// -cl

function player_events()
{
//client disconnected
if(EVENT_TYPE == EVENT_DISCONNECT){ent_remove(me);}
}

function local_functions()
{
if(my.client == 1)
{
movement_smooth();
wait(1);
}

if(my.client != 1)
{
movement_smooth();
wait(1);
}
}

function cs_move()
{
var old_pan; var old_position; var dist[3]; var target_trace[3];

while(1)
{
if(my)
{
vec_set(target_trace,my.x);
target_trace.z -= 5000;
dist.z = -c_trace(my.x,target_trace, ignore_me + ignore_sprites + ignore_passable);

dist.x = my.run_force * 14 * time;
dist.y = 0;
//dist.z = 0;

c_move(my,dist.x,nullvector, glide + ignore_passable);
my.pan += my.turn_force * 10 * time;
}
wait(1);
}
}

action player_move
{
my.enable_disconnect = on; // player can disconnect from session
my.event = player_events; // player events function

var power_x;
var power_y;
var dist[3];
var target_trace[3];
var anim;
var anim_dir;

my.speed = 3;

if(!player){wait(10);} wait(20); ent_sendnow(me); wait(20);

if(my.client == 1)
{
proc_client(my, client_movement);
proc_local(my,local_functions);
cs_move();
my.nosend_frame = on; my.nosend_alpha = on; my.nosend_ambient = on; my.nosend_color = on; my.nosend_light = on; my.nosend_uv = on;
my.nosend_origin = on; my.nosend_angles = on; my.nosend_flags = on; my.nosend_scale = on; my.nosend_skin = on; my.nosend_sound = on;
}
if(my.client != 1)
{
proc_local(my,local_functions);
server_movement();
my.nosend_frame = on; my.nosend_alpha = on; my.nosend_ambient = on; my.nosend_color = on; my.nosend_light = on; my.nosend_uv = on;
my.nosend_origin = on; my.nosend_angles = on; my.nosend_flags = on; my.nosend_scale = on; my.nosend_skin = on; my.nosend_sound = on;
}

while(1)
{
vec_set(my.server_angle, my.pan);
vec_set(my.server_origin, my.x);
send_skill(my.server_origin, send_all + send_vec + send_rate);
send_skill(my.server_angle, send_all + send_vec + send_rate);

wait(1);
}
}

/*
//if(move.x != move_old.x)||(move.y != move_old.y)||(move.z != move_old.z){

if(temp.x > 0)&&(xdirect != 1){vec_set(my.x, my.server_origin); xdirect = 1;} if(temp.x < 0)&&(xdirect != -1){vec_set(my.x, my.server_origin); xdirect = -1;}
if(xdirect == 1)
{
temp.x = 6*time; temp.y = 0; temp.z = 0; vec_rotate(temp.x, calc_angle.pan); vec_add(my.x, temp.x);
}
if(xdirect == -1)
{
temp.x = 6*move_factor*time; temp.y = 0; temp.z = 0; vec_rotate(temp.x, calc_angle.pan); vec_add(my.x, temp.x);
}*/

//--------------------------------------------------------------------
// Creation Functions
//--------------------------------------------------------------------

function create_player() //remember that the server is also a client, but if u dont use -sv or -cl it wont create
{
ifdef server;
while(connection== 0) {wait(1);} // wait until level loaded and connection set
endif;

ifdef client;
while(connection== 0) {wait(1);} // wait until level loaded and connection set
endif;

if(connection == 3)
{
people_connected = 1;
}

//if dedicated server skip these
if(connection != 1)
{
display_info();
//if not single player mode, display multiplayer information
if(connection)
{
txt_bytes.visible = on;
txt_latency.visible = on;
txt_people_connected.visible = on;
}
}

vec_set(temp.x, nullvector);
temp.x += random(200); temp.x -= random(200);
temp.y += random(200); temp.y -= random(200);
temp.z = -20;

player = ent_create(mdl_guard, temp.x, player_move);

check_server_disconnect();

wait(1);
}



Main Script

Code:
 //---------------------------------------------------------------
//Multiplayer Test
//---------------------------------------------------------------
var video_mode = 4; //800*600 =7
var video_depth = 16; //32 bit
var video_screen=2; //fullscreen

var d3d_mipmapping = 2;
var d3d_triplebuffer = 1;
var d3d_alphadepth = 32;
var d3d_transform = on;
var d3d_lightres=off;
var max_particles=1400;
var sky_curve =0.5;
var clip_particles = 0.2;

include <networkmove.wdl>;

string level_str = <multi_test.wmb>;
//---------------------------------------------------------------
// The main() function
//---------------------------------------------------------------
function main()
{
bg_color.red = 0; bg_color.green = 0; bg_color.blue = 0;
level_load(level_str);

sleep(0.5);

dplay_smooth = 0;
dplay_entrate = 1;

create_player(); //this creates the player entity
}



Build a hollow cube. Place a static camera pointing at its origin. Script will create your model and you can move it. Before running "-cl -sv" on one comp, on other, "-cl". This is a client-side movement set-up, with basic smoothing on the clients of other ents.

This is mostly barebones stuff. It's not for advanced math people/great programmers - anyone can do it. I'm an artist foremost, but most anything can be learned given the time and effort. Click-together multiplayer will never be possible if you want to support 2 different genres of games. Infact, I now learned that a racing game uses a much different set-up than that fps multiplayer code above. Especially when it comes down to prediction. Since 3DGS is open-ended it wouldn't be wise to spend alot of time developing a click together multiplayer for only one genre. Afterall, given the amount of users here you can be very sure not everyones aiming at a particular genre.


Check out Silas. www.kartsilas.com

Hear my band Finding Fire - www.myspace.com/findingfire

Daily dev updates - http://kartsilas.blogspot.com/

Moderated by  aztec, Spirit 

Gamestudio download | 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