Variablenwert nach rejoin
Hallo,
gibt es eine Möglichkeit einen Variablenwert "am Server" zu speichern, damit dieser nach dem Rejoinen eines Clients wieder abgerufen werden kann? Etwas genauer: Ein Spieler bekommt für jeden Abschuß Geld (ähnlich wie bei Warfare). Dieser wird zb so gespeichert: Code:
player setVariable["geld", (player getVariable "geld") + 100, true]; :sauer::motz: Ich möchte aber, dass es wieder da ist sobald der gleiche Spieler wieder joint. Wenn's möglich ist, nicht wenn ein anderer Spieler im gleichen Slot, sondern schon derselbe menschliche player. Habe auch schon versucht das als Code:
missionNamespace setVariable [...] :( Weiß einer Rat? |
Zitat:
..... Allgemeine Hinweise findest du hier: http://community.bistudio.com/wiki/6thSense.eu:EG Edit: Eigentlich sollt das ja mit setVariable möglich sei. z.B. der gleiche Variablenname für alle Spieler, weil ja ans Objekt gebunden. Ob und wie das zu handhaben ist bzw. sicher funktioniert, weiß ich nicht. |
Was für ein sympathischer Name... :daumen:
Atzgersdorf lässt grüßen! ;) Ja, genau so etwas in dieser Richtung dachte ich mir schon. Irgendwie war ich etwas verwirrt, da die Vars, die mit Code:
irgendwas setVariable ["blabla, 100, true]; Außerdem sollte doch der dritte Arraywert (true) die Variable public machen... :rolleyes: Naja, however, ich werde mir das mal durch den Kopf und Rechner gehen lassen und schrei nochmal, wenn's ned geht. Erstmal aber daunkschee für den Tipp! |
Ääääh... hab ich was mit den Augen, oder hast du dein Posting gekürzt?:komisch:
Irgendwie find ich deinen Vorschlag mit dem global und public machen nimmer...:motz: Wollt mir das nochmal in Ruhe geben und jetzt ists weg! :oh: |
Ich habe den Teil gelöscht, weil es eigentlich mit setVariable gehen sollte. Habe den Text noch im Zwischenspeicher, also hier nochmal. Ist mit Vorbehalt so zu programmieren.
Zitat:
Solche "Konten" wären vom Server/Host zu verwalten. Was bei der Programmierung der Mission zu erfolgen hat. Wenn ein Konto nur mit lokalen Variablen (das sind die mit beginnendem Unterstrich z.B. _Geld) in einem Skript gespeichert ist, dann ist der Kontostand nur auf dem jeweiligen PC und dort nur in diesem Skript bekannt. Wird ein Spieler aus der Mission geworfen oder stürzt das Skript ab, dann sind diese Daten verloren. Solche Daten müssen in globalen Variablen ohne Unterstrich (z.B. Geld gespeichert werden. Damit sind sie nun auch außerhalb eines Skripts vorhanden. Wird so eine globale Variable auf einem PC geändert, dann ist das ohne weitere Maßnahmen nur auf diesem PC bekannt. Soll also ein Server alle Konten verwalten, dann muss für eine Datenübertragung gesorgt werden. Für eine Synchronisation dieser Variablen mit den Anderen PCs gibt es diese Befehle: http://community.bistudio.com/wiki/a...leEventHandler http://community.bistudio.com/wiki/publicVariable Soll ein Server die Konten verwalten, dann geht es natürlich nicht mehr, wenn alle Spieler die Variable Geld verwenden. Für ein Konto benötigt dann jeder Spieler eine eigene Variable. Für nur wenige Spieler kann man diese Variablen schon vor dem Programmstart festlegen. Es ist aber auch möglich globale Variable erst während dem Programmlauf zu erstellen. Wenn in einer Mission solche Konten nicht synchronisiert sind, dann liegt das an der sehr aufwendigen Programmierung. Allgemeine Hinweise findest du hier: http://community.bistudio.com/wiki/6thSense.eu:EG Edit: Eigentlich sollt das ja mit setVariable möglich sei. z.B. der gleiche Variablenname für alle Spieler, weil ja ans Objekt gebunden. Ob und wie das zu handhaben ist bzw. sicher funktioniert, weiß ich nicht. |
Das hat mit der normalen JIP Problematik nicht mehr soviel am Hut. Interessant für dich sind die Befehle onPlayerConnected und onPlayerDisconnected.
Beachte das beide Befehle nur vom Server ausgeführt werden dürfen (können)! Außerdem benötigst du die UID des Spielers wenn du etwas Personenbezogen abfragen möchtest. Selbige wird bereits mit den beiden oben genannten Events übergeben. Ob die Variable mit setVar, public oder was auch immer gesetzt wird spielt keine Rolle. Wichtig ist, dass die Variable bei disconnect des Spielers an den Server (mit onPlayerDisconnected) übergeben und zusammen mit seiner einzigartigen UID gehalten wird. Wenn ein Spieler connected muß (mit onPlayerConnected) gefragt werden ob dem Server die UID bereits bekannt ist und wenn ja wieder die dazugehörigen Variablen übergeben werden. Falls du nicht allein auf die Lösung kommst, lasse ich dir eine per PM nach dem WE zukommen. Gruß, Psycho |
Sehr cool. Werde mich damit mal rumspielen :daumen:
Da fallen mir ja dann wieder 100 Sachen ein, wenn das geht :D Ah ja, onPlayerConnected habe ich mal überflogen, aber da ich das für JIP eigentlich nie gebraucht habe (mache das über einen Auslöser - funzt auch iwie besser), hab ich das wieder total vergessen... :rolleyes: |
Logischerweise müssen dem Server die zu sichernden Daten laufend übermittelt werden, denn wenn ein Spieler disconnected kann er die ja nicht mehr übertragen.
So ist es wichtig wie die zu sichernden Variablen angelegt und übers Netzt aktualisiert werden. Mit setVariable sollte das einfacher sein, weil so eine Variable an das Objekt gebunden ist und die Variable für alle Spieler-Objekte den gleichen Namen haben kann. Das vereinfacht die Bearbeitung der Variablen in den Skripten erheblich. Das alles für JIP korrekt lauffähig zu erstellen ist nicht einfach, weil man großteils mit Versuch und Irrtum vorgehen muss und das für MP umständlich zu testen ist. Als "Denkaufgabe" scheint mir das zu nervtötend. Psychobastard, wenn du hier eine funktionierende Mission als Beispiel haben solltest, wäre das sicher von allgemeinem Interesse. |
Zitat:
Zitat:
|
Wenn ich das Spiel gewollt verlasse, dann kann ich mir vorstellen, dass die Variablen von meinem PC, die ja auch bei mir in der onPlayerDisconnecte-Routine vermerkt sind, noch schnell an der Server übertragen werden. Bei einem ungewollten Verbindungsabbruch wird das aber nicht mehr möglich sein.
Natürlich interessiert mich die Lösung, aber warum dass alles über PM und nicht hier im Thread? |
Wenn ich mir bei Warfare diesen Eintrag in der Server-Initialisierung ansehe:
Code:
//--- JIP Handling. |
Hallo Troublemaker!
Ich weiß nicht genau ob dir das auch weiterhelfen könnte was die Jungs hier machen. ArmA2 Persistent Database Scripts - WIP - Bohemia Interactive Forums |
Liste der Anhänge anzeigen (Anzahl: 1)
Der Versuch einer Testmission:
In der Test-Mission gibt es drei spielbare Soldaten. Bei der Initialisierung werden die Variablen mit dem Objektnamen der Soldaten angesprochen, im Spiel dann jeweils nur noch mit Player (siehe im Code den Kommentar): init.sqf Code:
if (local player) then //nur wenn Spieler Server_PlayerConnected.sqf Code:
Private ["_uid","_name"]; Server_PlayerDisconnected.sqf Code:
Private ["_uid","_name"]; Für den Diskonnect-Test muss der Spieler wirklich das Spiel verlassen, nicht nur eine andere Spielfigur wählen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr. |
Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias