|
7 registered members (TipmyPip, Martin_HH, Volkovstudio, AndrewAMD, JMMAC, Grant, 1 invisible),
5,432
guests, and 2
spiders. |
|
Key:
Admin,
Global Mod,
Mod
|
|
|
Problem mit Entities und dem Besitzer
#220846
08/10/08 09:16
08/10/08 09:16
|
Joined: Aug 2008
Posts: 18 Germany
Der_Kekser
OP
Newbie
|
OP
Newbie
Joined: Aug 2008
Posts: 18
Germany
|
Hallo, ich möchte ein Strategiespiel wie Age of Empires erstellen. Ich habe aber nun das Problemm, dass egal wer das Gebäude erstellt hat es immer dem Server-Client gehört. Dadurch kan der Server-Client die gebäude benutzen aber die Clienten, die die Gebäude erstellt haben nicht. Hier der Code: var video_mode = 7;// 800x600 pixels
var video_depth = 32; // 32 bit mode
var shadow_stencil = on;
var startposition[3] = 0, 50,0;
var startposition2[3] = 0, -50,0;
var clicked_destroy = 0;
var breaking = 0;
string map_wmb = <testmap.wmb>;
bmap backmenue_tga = <backmenue.tga>;
bmap destroy_tga = <buttondestroy.tga>;
panel backmenue_pan
{
bmap = backmenue_tga;
pos_x = 0;
pos_y = 0;
layer = 10;
flags = overlay, refresh;
}
panel destroy_button_pan
{
bmap = destroy_tga;
pos_x = 0;
pos_y = 0;
layer = 11;
flags = overlay, refresh;
on_click = click_destroy();
}
function click_destroy(){
clicked_destroy = 1;
wait(1);
clicked_destroy = 0;
buttons_ausblenden();
}
function buttons_ausblenden(){
destroy_button_pan.visible = off;
breaking = 1;
wait(1);
breaking = 0;
}
function buttons_ausrichten(){
backmenue_pan.visible = on;
backmenue_pan.scale_x = screen_size.x/800;
backmenue_pan.scale_y = screen_size.y/600;
backmenue_pan.pos_x = screen_size.x - backmenue_pan.size_x * (screen_size.x/800);
backmenue_pan.pos_y = screen_size.y - backmenue_pan.size_y * (screen_size.y/600);
destroy_button_pan.scale_x = screen_size.x/800;
destroy_button_pan.scale_y = screen_size.y/600;
destroy_button_pan.pos_x =740 * screen_size.x/800;
destroy_button_pan.pos_y =540 * screen_size.y/600;
}
function clickevent(){
if (event_type == event_click){
if (my.skill1 == player_name){
if (my.skill2 == 1){
breaking = 1;
wait(1);
breaking = 0;
destroy_button_pan.visible = on;
while(breaking == 0){
my.skill3 = clicked_destroy;
wait(1);
}
}
}
if (my.skill1 != player_name){
if (my.skill2 == 1){
}
}
}
wait(1);
}
action roboterfabrik(){
my.skill1 = player_name;
my.skill2 = 1;
my.skill3 = 0;
my.skill4 = 0;
my.enable_click = on;
my.event = clickevent;
ent_sendnow(my);
while(my.skill3 == 0){
wait(1);
}
ent_remove(me);
}
function server_event(){
ent_create("dummy.mdl",startposition,roboterfabrik);
wait(1);
}
function client_event(){
ent_create("dummy.mdl", startposition2, roboterfabrik);
wait(1);
}
function main()
{
fps_max = 140;
level_load (map_wmb);
ph_setgravity(vector(0,0,0));
sky_color.red = 1;
sky_color.green = 1;
sky_color.blue = 1;
buttons_ausrichten();
wait (3);
camera_player();
maus();
if (!connection){
wait (-4);
sys_exit(NULL);
}
if (connection == 3){
server_event();
}
else {
client_event();
}
}
function camera_player(){
camera.pos = startposition;
camera.x = startposition[0] + cos(camera.pan)*-500;
camera.y = startposition[1] + sin(camera.pan)*-500;
camera.z += 1000;
camera.tilt = -69;
/**
while(1){
if (mouse_pos.x > screen_size.x -2||key_cur){
camera.x += sin(camera.pan)*6;
camera.y += cos(camera.pan)*-6;
}
if (mouse_pos.x < 2||key_cul){
camera.x += sin(camera.pan)*-6;
camera.y += cos(camera.pan)*6;
}
if (mouse_pos.y > screen_size.y -2||key_cud){
camera.x += cos(camera.pan)*-6;
camera.y += sin(camera.pan)*-6;
}
if (mouse_pos.y < 2||key_cuu){
camera.x += cos(camera.pan)*6;
camera.y += sin(camera.pan)*6;
}
*/
wait(1);
}
}
Function maus() {
while(1) {
mouse_range=100000;
mouse_mode=1;
mouse_pos.x = Pointer.x;
mouse_pos.y = Pointer.y;
wait(1);
}
}
on_click = buttons_ausblenden;ich bin für jede Idee dankbar
|
|
|
Re: Problem mit Entities und dem Besitzer
[Re: Der_Kekser]
#221425
08/13/08 23:19
08/13/08 23:19
|
Joined: Nov 2002
Posts: 913 Berlin, Germany
SchokoKeks
User
|
User
Joined: Nov 2002
Posts: 913
Berlin, Germany
|
sorry für die spät antwort. das problem ist eher der konzept deines codes. ich programmiere auch ein multiplayer strategiespiel.
wie du in der main-funktion schon richtig differenziert hast (connection kann aber auch auf dem server den wert 1 haben!) werden die _event funktionen jeweils auf dem server und dem clienten ausgeführt. die funktion roboterfabrik, die dann bei ent_create als parameter übergeben wird startet immer auf dem server! deshalb wird immer der wert player_name vom server genommen. ent_create funktioniert so. du musst den code also überdenken.
(warum my.skill1 = player_name keinen fehler produziert weiß ich nicht, aber man kann variablen (my.skill1) keine strings zuweisen.)
was du benötigst ist ein aufruf von proc_client am anfang von roboterfabrik (aber erst nach wait(-0.5)). die dort angegebene funktion läuft dann auf dem client der ent_create ausgelöst hat. hier kannst du den skill1 dann setzen und per send_skill senden.
bei meinem spiel bekommt jeder spieler seine ID (1, 2, 3, 4). dazu gibt es einige arbeiter als starteinheiten. keines der gebäude wird dannach per ent_create beim client erzeugt, sondern alle beim server. die arbeiter bekommen den auftrag vom client durch die übertragung einiger skills (send_skill). die neuen gebäude übernehmen dort einfach die ID ihres erbauers. das setzt natürlich vorraus das man die gebäude durch einheiten erreichten lässt.
eins ist auch noch ganz wichtig: der server ist bei connection == 3 noch gleichzeitig client. es sollte daher das client_event auch dort ausgelöst werden, und der gleiche code laufen können wie bei clients. das server_event sollte für dinge wie das checken der siegbedingungen zuständig sein.
Last edited by SchokoKeks; 08/13/08 23:19.
|
|
|
|