anpera.net
https://anpera.dyndns.org/phpbb3/

Frage zum Programmieren mit php
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=883
Seite 1 von 1

Autor:  Gast [ Mi 19 Jan, 2005 00:50 ]
Betreff des Beitrags:  Frage zum Programmieren mit php

Hallo,

ich habe mal eine Frage betreffend die neue 0.9.8-Version.
Ich möchte gerne ein Forest-Special schreiben, das beim Betreten desselbigen ein zufällig sortiertes Array erzeugt. Dieses soll nur ein einziges Mal erstellt werden und für den entsprechenden Benutzer für die Dauer seines Aufenthaltes gültig sein. Das Erstellen des Arrays ist kein Problem, nur wie schaffe ich es, das es für die Dauer des Ereignisses gespeichert wird?

In vollem Vertrauen auf eure Fähigkeiten
Nathan

Autor:  anpera [ Mi 19 Jan, 2005 03:17 ]
Betreff des Beitrags: 

Du kannst es z.B. mit set_module_pref("prefname",createstring($deinarray)) speichern und mit $deinarray=createarray(get_module_pref("prefname")) jederzeit laden.

Das array bleibt auch nach verlassen des Ereignisses gespeichert, wenn du es nicht löschst. Was du damit alles anstellen kannst, bleibt deiner Fantasie überlassen.

Von anderen Modulen/Ereignissen aus (z.B. Erweiterungen für dein Modul) und von anderen Spielern aus kannst du set_module_pref("prefname",createstring($deinarray),"modulname",$acctid) und $deinarray=createarray(get_module_pref("prefname","modulname",$acctid)) verwenden.

Ich hoffe, das hilft dir weiter. (Hat wenig mit PHP zu tun, weil eigentlich nur LoGD-eigene Funktionen zum Einsatz kommen ;) )

Eine andere Möglichkeit wäre es, das array einfach in der Session zu speichern. Z.B. mit $session['prefname']=$deinarray. Zugriff wäre mit $deinarray=$session['prefname'] oder direkt mit $session['prefname']['arrayitem'] möglich. Allerdings ist diese Möglichkeit nicht so sicher, wie die zuerst genannte, weil die Information so nicht in der Datenbank gespeichert wird.

Autor:  Gast [ Mi 19 Jan, 2005 17:43 ]
Betreff des Beitrags: 

Danke, das war sehr hilfreich. Ich wußte nicht das man arrays so in den module_prefs speichern kann, außerdem dachte ich, man müßte für jede dort gespeicherte Variable auch entsprechend in der get_module_info unter "prefs" einen Eintrag vornehmen. Aber wenn ich das jetzt richtig verstehe, ist das nur für Variablen, die man editieren möchte oder wenigstens in den Usersettings angezeigt bekommen möchte, notwendig.
Das man mit $acctid auch auf die User-Preferences anderer Spieler zugreifen ist mir auch neu, mal schauen was man damit alles anstellen kann.

Aber ich habe auch noch eine weiter Frage zu einem kleinen, aber störenden Detail.
Da es bis jetzt meines Wissens kein Item-System gibt, habe ich mir in einem Ereignis so geholfen:

in _getmoduleinfo unter prefs:
"item1"=>"Hat der Spieler Item1?,bool|false"

in _install:
addhook("fightnav-specialties");
addhook("apply-specilties");

in _dohook:
case "fightnav-specialties":
$script = args['script'];
if (get_module_pref("item1")) addnav("Items");
if (get_module_pref("item1")) addnav("Item1", $script."op=fight&skill=item1",true);

case "apply-specialties":
$skill = httpget('skill');
if ($skill=="item1") {
if (get_module_pref("item1")) {
applybuff(...);
set_module_pref("item1",false);
}
}

in _runevent irgendwo dann:
set_module_pref("item1",true);

Das ganze funktioniert auch einwandfrei bis auf 2 kleine Ausnahmen:
1. Man installiert zum ersten Mal dieses Modul oder
2. Ein neuer Charakter beginnt das Spiel
Dann passiert es nämlich leider, das man, auch ohne das Item zu haben (in den Usersettings steht auch "Hat der Spieler Item1? NO"!), im Kampf den Link angezeigt bekommt und das Items ganz normal benutzen kann.
Wurde das Modul neu installiert heißt das, jeder Spieler bekommt das Item einmal einfach so! (eigentlich habe ich drei Items dieser Art in dem Ereignis, aber der Einfachheit halber habe ich im obigen Ausschnitt das mal für nur eines angegeben).
Was mache ich da falsch, habe ich irgendwo noch was vergessen?

Autor:  anpera [ Mi 19 Jan, 2005 20:00 ]
Betreff des Beitrags: 

Ich vermute den Fehler in der etwas unsauberen if-Abfrage.
Probiers mal mit "item1"=>"Hat der Spieler Item1?,bool|0" in _install. So wie ich get_module_pref() verstehe, wird, wenn noch kein Wert definiert ist, der Standardwert zurückgeliefert. In deinem Fall wäre das "false" als String, was natürlich bei deiner if-Abfrage true ergibt. (Das "bool" in den Modulinfos definiert nur die Art der Anzeige in den Einstellungen! Es legt nicht den Variablentyp fest.)
Wenn an set_module_pref() der Wert "true" übergeben wird, wird er als 1 gespeichert. "False" als 0.

Du kannst, wenn du Interesse hast, gerne mal if (get_module_pref("item1")===true) oder if (get_module_pref("item1")>0) oder if (isset(get_module_pref("item1"))) probieren. :?

Ich würde das Ganze auch etwas umschreiben. In _dohook würde ich ganz am Anfang, noch vor den cases, aus Performancegründen $item1=(int)get_module_pref("item1"); einfügen. Die Abfragen gehen dann am besten auf if ($item1==1).

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/