Armed-Assault.de Twitter


Editing The world is a Script - write it!

Antwort
 
Themen-Optionen Ansicht
Alt 17.02.2009, 20:31   #1 (permalink)
Newbie
 
Benutzerbild von Langer
 
Registriert seit: 23.05.2008
Ort: Hamburg / Norderstedt
Alter: 45
Beiträge: 44
Standard Arrayübergabe

Moin,

ich komm bei dem Versuch ein Array zu übergeben nicht so recht weiter,
wäre klasse wenn mir da jmd helfen könnte.
(testen tu ich aufn dedi-server)

Hab auf der Map:

1. Spiellogik namens server
2. Auslöser names serverinit
Bedingung: local server
Aktivierungszeile :
Code:
sinit = [] execVM "scripts\serverinit.sqf";
3. Auslöser namens playerinit
Bedingung: local player
Aktivierungszeile :
Code:
pinit = [] execVM "scripts\playerinit.sqf";punkte = [] execVM "scripts\punktefang.sqf";
einige Fahrzeuge (autos/panzer) mit initzeile:
Code:
this addEventHandler ["killed", {handle = [(_this select 0),(_this select 1)] execVM "scripts\enemykilled.sqf"}];
inhalt sqf's

init.sqf :
Code:
LANGER_punkte = compile (preprocessFileLineNumbers "scripts\punktefang.sqf");
playerinit.sqf :
Code:
if !(local player) exitwith {};
_Langermenu1 = player addAction ["Status-Menu", "Dialogs\langer_1.sqf",0,1, false, true,"test2"];

infscore = 0;
infscoreB = format ["%1", infscore];
carscore = 0;
carscoreB = format ["%1", carscore];
tankscore = 0;
tankscoreB = format ["%1", tankscore];
airscore = 0;
airscoreB = format ["%1", airscore];
sonstscore = 0;
sonstscoreB = format ["%1", sonstscore];
gesamtscore = 0;
gesamtscoreB = format ["%1", gesamtscore];
scripts\enemykilled.sqf :
Code:
if !(local server) exitwith {};
_toter = _this select 0;
_killer = _this select 1;

uebergabe = [_killer,_toter];
publicVariable = "uebergabe";
scripts\punktefang.sqf :
Code:
if !(local player) exitwith {};
Player sidechat "punktefang initialisiert";
sleep 0.5;
LANGER_punkte =
{
sleep 0.5;
player groupchat "LANGER_punkte Start";

_killer = uebergabe select 0;
_toter = uebergabe select 1;
_typtoter = typeof _toter;


if (player == _killer) then {

    switch (_typtoter) do {
        case "Man": {
            Player sidechat format["Mann umgelegt von %1",_killer];
            infscore = infscore + 1;
            infscoreB = format ["%1", infscore];
            gesamtscore = gesamtscore + 1;
            gesamtscoreB = format ["%1", gesamtscore];
            _toter removeEventHandler ["Killed", 0];
            };
        case "Car": {
            Player sidechat format["Auto zerstoert von %1",_killer];
            carscore = carscore + 1;
            carscoreB = format ["%1", carscore];
            gesamtscore = gesamtscore + 1;
            gesamtscoreB = format ["%1", gesamtscore];
            _toter removeEventHandler ["Killed", 0];
            };
        default {hint"default"};
        };
                } else {    player sidechat "bist nicht der Killer";
    };
};
for [{_loop=0}, {_loop<1}, {_loop=_loop}] do
{    
    sleep 0.2;
    [] call LANGER_punkte;
    
};
die switch-do-abfrage hab ich gekürzt...

die Funktion läuft, sehe ich an der groupchat-mitteilung
aber irgendwie scheint das mit der Array-übergabe nicht zu funzen..

ich frickel da jetzt seid fast 2Tagen rum und komme nicht weiter

sinn dieser ganzen aktion ist, jedem spieler für eliminierte/zerstörte Soldaten/Fahrzeuge Pkt zuzuweisen und danach Orden/Auszeichnungen zu verteilen..

wenn jmd eine Idee hat, was ich falsch mache oder einen anderen Lösungsweg weiss ...

einen ratlosen Gruss,
Langer
Langer ist offline   Mit Zitat antworten
Alt 17.02.2009, 21:11   #2 (permalink)
Newbie
 
Registriert seit: 05.12.2006
Beiträge: 43
Standard

Man kann die Sache, natürlich sehr unterschiedlich angehen, alles möglichst client-seitig (da muss man wegen den killed-eventhandler etwas aufpassen), oder die ganze Punktevergabe serverseitig (wobei die aktuellen Punkte dann regelmäßig oder auf Anforderung des Clients aktualisiert werden) oder ne Mischung aus beidem, so wie hier

Hab mir das ganze jetzt nicht so genau angeschaut und durchdacht,
aber

- funktioniert die "Array-Übergabe" wohl nicht, wegen dem "=" bei publicVariable "uebergabe"; , das gehört da nicht hin

- wirst du zur Einordnung des Einheitentyps wohl noch isKindOf brauchen (die Konstruktion mit dem switch wirst du dann wohl etwas umbauen müssen)

- solltest du bei dem busy-waiting-mäßigen Abfragen von der Variable uebergabe aufpassen - jeder Kill sollte wohl nur einmal gezählt werden

- statt dem busy-waiting mit der Schleife vielleicht mal addPublicVariableEventHandler anschauen

- statt der Konstruktion mit der Gamelogic server und local server kann einfach isServer verwendet werden

Hoffe, ich konnte helfen
Master85 ist offline   Mit Zitat antworten
Alt 19.02.2009, 09:17   #3 (permalink)
Newbie
 
Benutzerbild von Langer
 
Registriert seit: 23.05.2008
Ort: Hamburg / Norderstedt
Alter: 45
Beiträge: 44
Standard

Moin,

vielen Dank für deine Hilfe, Master85 ,

pöses "=" , wie hat sich das nur wieder eingeschlichen...
auch die array-zuweisung habe ich in
Code:
uebergabe set [0, _killer];
uebergabe set [1, _toter];
geändert. Nun "kommt" das Array auf den Client(s) an...

Ich glaube diesen addPublicVariableEventhandle verstehe ich nicht richtig,
Code:
"uebergabe" addPublicVariableEventHandler { 
     hier kommt rein was passieren soll ?       };
oder ändert er welche Variable Public wird? (mein English ist nicht gerade gut) ich werde mal ein wenig damit rumprobieren.

Mfg
Langer
Langer ist offline   Mit Zitat antworten
Alt 19.02.2009, 10:49   #4 (permalink)
50 Beiträge
 
Registriert seit: 13.01.2009
Beiträge: 60
Garstiger Hobbit eine Nachricht über Skype™ schicken
Standard

Ein addPublicVariableEventHandler funktionert so, wenn der Server diese ausgibt z.B Tot dann legt dieser los und macht das was du ihm gesagt hast.

Ein bsp:
"TOT" addPublicVariableEventHandler{
Player sidechat "Bla bla ist tot";
};
Du kannst den so oft benutzten wie du möchtest der legt immer wieder los wenn die Variable gesetzt wird.

Du kannst den sogar nur auf true angehen lassen.
Ein bsp:
"TOT" addPublicVariableEventHandler{
if(tot)then{Player sidechat "Bla bla ist tot";};
};

Wenn du beibe Varianten haben willst kann das so aussehen.
Ein bsp:
"TOT" addPublicVariableEventHandler{
if(tot)then{Player sidechat "Bla bla ist tot";};
if(!tot)then{player sidechat "bla bla ist noch am leben";};
};

Ich hoffe du kann mit meiner Erklärung was anfangen.

Was noch zu dem addPublicVariableEventHandler was zu erwähnen ist das funktioniert nur decidet also nicht wenn du das im Editor testest, da du dort Server und Client gleichzeitig bist. Wenn du eine Variable beim clienten Ausgibts dann wird auch der PublicVariableEventHandler bei dir nicht funktionieren sondern nur bei den anderen Spielern bzw auf dem Server.

Noch was zu deinem Vorhaben du kannst auch einfach den Score des Spielers auslesen.
Bsp:
_number=score player;

Du könntest es ja dann score abhängig machen wann du deinem Spieler die Orden,Auszeichnungen usw vergeben.
Garstiger Hobbit ist offline   Mit Zitat antworten
Alt 19.02.2009, 11:44   #5 (permalink)
Newbie
 
Benutzerbild von Langer
 
Registriert seit: 23.05.2008
Ort: Hamburg / Norderstedt
Alter: 45
Beiträge: 44
Standard

sehr gute erklärung, jetz hab sogar ich verstanden wie der funktioniert, Großes Danke!
Mit verwendung des PublicVariable-Handlers brauch ich dann auch keine andauerde Abfrage über eine schleife...

Das Auszeichnungssystem von den score abhängig zu machen, hab ich schon mal, dort wurde leider kein unterschied gemacht ob ich mit M1 aufm Hügel campe und alles aus 3km wegholze, oder mit M136 in der Stadt unterwegs bin.

Daher wollte ich jetzt einen Schritt weiter gehen und erstmal eine eigene Punkteliste erstellen, dort dann einbauen "wie" das "killed"-event zustande kam und dementsprechend mehr oder weniger punkte verteilen etc. etc.

Ich bin relativ neu im scripten und muss daher schritt für schritt vorgehen,
alles auf einmal wächst einem schnell übern kopf

Mfg
Langer
Langer ist offline   Mit Zitat antworten
Alt 19.02.2009, 11:47   #6 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Warum sollte zwischen

uebergabe = [_killer,_toter];

oder

uebergabe = [];
uebergabe set [0, _killer];
uebergabe set [1, _toter];

ein Unterschied sein? Ich denke das liegt eher daran, dass lokale Objekte nicht übertragen werden können (z.B. eine vom Server oder einem Spieler gesteuerte KI).


Wäre interessant, wenn du addPublicVariableEventHandler testen würdest.

Dieser EventHandler überträgt vermutlich eine Änderung der Variablen automatisch übers Netzt. Dabei werden zwei Werte übergeben:

_this select 0 = <Name der Variablen als "String">
_this select 1 = <Inhalt der der Variablen>

Das könntest du in deinem Fall so testen:

"uebergabe" addPublicVariableEventHandler {hint format["Name=%1 Inhalt=%2",_this select 0,_this select 1]}

Funktioniert das, dann kann die übliche Übertragung mit publicVariable entfallen.
Vienna ist offline   Mit Zitat antworten
Alt 19.02.2009, 13:40   #7 (permalink)
Newbie
 
Benutzerbild von Langer
 
Registriert seit: 23.05.2008
Ort: Hamburg / Norderstedt
Alter: 45
Beiträge: 44
Standard

@Vienna,

hab mal beide Versionen getestet:
Code:
uebergabe = [_toter,_killer];
sowie:
Code:
uebergabe set [0, _toter];
uebergabe set [1,_killer];
funzen beide Methoden.

im PublicEventhandler stecke ich beide übergabewerte in
Code:
_nplayer = format["%1",Player];
_nkiller = format["%1",_killer];
if (_nplayer == _nkiller) then {
da ich sonst nicht feststellen kann ob (Player == _killer) ist...


Die zweite Übergabe (mit set) ist denke ich etwas übersichtlicher, da ich einige zusätzliche Variablen einbauen möchte (z.B. welche Waffe/Fahrzeug wurde benutzt, vlt die Crew, um Fahrer eines Panzers auch pkt zu geben .. etc. etc...) und diese einzelnen Zeilen besser mit Kommentaren versehen kann...


Nochmals Danke an alle die mir geholfen haben

Mfg
Langer
Langer ist offline   Mit Zitat antworten
Antwort

Stichworte
array, arrayübergabe


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119