anpera.net
https://anpera.homeip.net/phpbb3/

Alchemiemod
https://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=5145
Seite 1 von 2

Autor:  Laserian [ Mo 03 Mai, 2010 13:09 ]
Betreff des Beitrags:  Alchemiemod

So dann will ich auch mal wieder ein Addon veröffentlichen, nachdem ichs jetzt endlich in ner verwendbaren Form habe. Heißt aber nicht, dass das Addon zu 100% fertig ist.

Aber genug der einleitenden Worte ihr werdet ja wohl auch mal erfahren wollen was Sache ist, also hier bitte:


Features:

10 Rezepte für Tränke (2 Heiltränke, 2 Waffengifte, 2 Stärkungstränke, Schönheitstrank, Lebenstrank, Elixier der Stärke und Elixier der Geschicklichkeit)
10 Zutaten zum Tränke brauen (4 giftige/negative Zutaten, 4 heilende/unterstützende Zutaten, 2 besondere Zutaten - Drachenblut und Phönixfeder)
Alchemiefertigkeit mit 3 Unterfertigkeiten (Tränke brauen, Umgang mit alchemistischen Geräten, Kräuterkunde)
Tranktasche und Fertigkeitsübersicht als Popup, verlinkt in der VitalInfo
Alchemistin Suiren und ihr Kräuterladen samt Labor zum Tränke brauen und Kräuter verkaufen (erstmal nur Verkauf), sowie neue Rezepte zu kaufen
Zutatenfund im Wald bei Kämpfen



geplante Features:

Finden von Zutaten via Specials
Erlangen neuer Rezepte durch erfüllen diverser Quests
Erlangen der besonderen Kräuter durch erfüllen einer Quest
Kräuterverkauf (evtl. mit schwankenden Preisen je nach Angebot/Nachfrage)
komplexere Alchemiefertigkeit (bezieht sich auf die Unterfertigkeiten und deren Wirkung)
Auswirkungen von alchemistischen Geräten auf die gebrauten Tränke
Tränke brauen in einem eigenen Labor, nicht mehr abhängig von der Alchemistin (evtl. als Hausausbau/Gildenausbau)
falls gewünscht: mehr Zutaten und Tränke


So das wären mal die Infos. Einbauanleitung liegt als .txt im Archiv bei.

Mh wenn ihr eigene Specials/Quests macht, wärs nett die hier auch mit reinzuposten, dann haben alle was von ;)

Und abschließend wünsche ich Euch allen viel Spass damit.

Dateianhänge:
Alchemie.zip [13.93 KIB]
1376-mal heruntergeladen

Autor:  Linus [ Mo 03 Mai, 2010 15:50 ]
Betreff des Beitrags:  Re: Alchemiemod

Auf jeden Fall eine nette Idee. Ein wenig Sorgen bereitet mir nur die Menge an Code die in die forest.php eingefügt werden muss, und dass mit einer stattlichen Anzahl von IF-Abfragen, was die Sache nicht gerade schneller macht. Aber Geschwindigkeit ist auch nicht alles, muss also jeder für sich selbst entscheiden, ob er es einbaut oder nicht. ;)

Was mir beim Überfliegen noch aufgefallen ist:$this->bbcode_second_pass_code('', '$alch="SELECT trank FROM alchemie WHERE acctid=\"$acctid\"";')In der Tabelle alchemie ist aber kein Feld mit dem Namen trank vorhanden! Oder bin ich mal wieder zu blind?

Autor:  Laserian [ Mo 03 Mai, 2010 15:59 ]
Betreff des Beitrags:  Re: Alchemiemod

Ah nein sry mein Fehler, das ist mir beim Überarbeiten der Einbauanleitung durch die Lappen gegangen. Hatte da mehrfach dran herumgebastelt schon... Sry.

Hier der richtige Code für die common.php:

$this->bbcode_second_pass_code('', '
if ($session['user']['active']==1){
$acctid=$session['user']['acctid'];
$alch="SELECT * FROM potions WHERE acctid=\"$acctid\"";
$alchres=db_query($alch) or die (db_error(LINK));
$alchrow=db_num_rows($alchres);
$charstat.=appoencode(
templatereplace("stathead",array("title"=>"<a href='statistics.php' target='_blank' onClick=\"".popup("statistics.php").";return false;\" class='motd'><b>Alchemie</b></a>")),true);
if($alchrow>0){
$charstat.=appoencode(templatereplace("stathead",array("title"=>"<a href='potuse.php' target='_blank' onClick=\"".popup("potuse.php").";return false;\" class='motd'><b>Tranktasche</b></a>")),true);
}
}
')


Und wegen der if-abfragen im Wald und der Performancesache bin ich am überarbeiten, bin da noch nicht überall zu gekommen, wenn du Vorschläge hast wie ichs noch verbessern kann abgesehen davon die ganzen if-schleifen über ne switch zu machen ich nehm gerne Vorschläge an. ;)
Ich hab ja gesagt ist noch nicht fertig das Ding, aber danke für den Hinweis :)

Edit: Einbauanleitung dementsprechend editiert

Autor:  Linus [ Mo 03 Mai, 2010 16:57 ]
Betreff des Beitrags:  Re: Alchemiemod

Kein Thema. Wenn ich kann helfe ich ja gerne!

Dann mal ein kleiner Tipp wie du das lange IF-IFELSE-Konstrukt in ein switch() umbauen kannst:
$this->bbcode_second_pass_code('', 'switch(TRUE){
case ($alchemie<=15):
...
break;

case ($alchemie>15 AND $alchemie<=31):
...
break;

...
...
...

case ($alchemie>65 AND $alchemie<=81):
...
break;

case ($alchemie>90):
...
break;
}')Macht das gleiche wie das IF-Konstukt, dürfte aber ein wenig performanter sein.

Und noch was, da sich die IF-IFELSE gegenseitig ausschließen, also nur ein Fall wahr werden kann, wird$this->bbcode_second_pass_code('', 'output("Du findest $text!`#");') nur einmal ausgeführt. Da denke ich mal die können in den einzelnen Fällen entfallen, und nur einmal am Ende vor$this->bbcode_second_pass_code('', ' }
savetable("alchemie");')zum Zuge kommen. Das macht zwar keinen Geschwindigkeitsvorteil, aber sieht schicker aus. ;)

Autor:  Laserian [ Mo 03 Mai, 2010 17:51 ]
Betreff des Beitrags:  Re: Alchemiemod

So dann mal danke Linus. Hab das mal auf switch umgeändert und noch ne kleine Anpassung an der Fundhäufigkeit vorgenommen.

Autor:  Welv [ Mo 03 Mai, 2010 18:05 ]
Betreff des Beitrags:  Re: Alchemiemod

Da es an neuen Ideen eigentlich nie viel zu meckern gibt, nehme ich mir mal den Code vor :)

Positiv fallen mir die Single Quotes bei den Arrayschlüsseln auf, die sonst so gerne verweigert werden, wobei bei der Einbauanleitung für die dragon.php noch ein paar fehlen.
Wenn du dann noch die vielen "if($_GET[op].." in ne switch packst, berücksichtige doch die ' doch auch dort ;) $_GET[] und $_POST[] mögen die auch.


Nun zu den db querys.

db_query($add) or die(db_error(LINK));
"or die(db_error(LINK))" ist überflüssig da dies schon in der db_query() funktion selbst ausgeführt wird.

Wenn ein Feld wie acctid nen Integer erwartet, braucht man keine Apostrophe.
zB.
$sql = "SELECT * FROM potions WHERE acctid='".$acctid."'";
WHERE acctid=".$acctid; reicht vollkommen.


Im übrigen sehe ich oft sehr viele output()s untereinander, also unnötig oft aufgerufene funktionen. Für ne bessere Übersicht und trotzdem gute Performance reichen auch einfach Zeilenumbrüche.
Und wenn nur HTML ohne Farbcodes verwendet wird, wäre ein rawoutput() besser als ein output("",true).

Weitere Verbesserungsvorschläge kommen vielleicht noch später dau ;)

Autor:  Laserian [ Mo 03 Mai, 2010 18:50 ]
Betreff des Beitrags:  Re: Alchemiemod

OK danke Welv für die Infos. Wieder was gelernt^^

Hab das jetzt hoffentlich alles geändert wies gehören sollte.

Edit:

Zitat:
$this->bbcode_second_pass_code('', '
}
savetable("alchemie");
')
zum Zuge kommen. Das macht zwar keinen Geschwindigkeitsvorteil, aber sieht schicker aus. ;)


mh ja mag sein dass es schicker aussieht muss aber leider folgendermassen aussehen

$this->bbcode_second_pass_code('', '
savetable("alchemie");
}
')

weil wenn der savetable befehl ausserhalb der if($session['user']['active']==1){ steht kommt für alle die die alchemiefertigkeit nicht gelernt haben im Wald eine pöse weiße seite wegen einem sql fehler bei jedem Kampf^^
und da sag ich lieber siehts nicht so gut aus dafür funkts^^

Autor:  Linus [ Mo 03 Mai, 2010 21:02 ]
Betreff des Beitrags:  Re: Alchemiemod

Mja, ich habs nicht getestet. Da kann man sich schon mal im Klammerwald verirren. ;)

Autor:  Laserian [ Mo 03 Mai, 2010 21:37 ]
Betreff des Beitrags:  Re: Alchemiemod

Jaja der Klammernwald ist schon doof ich weiß. Naja aber trotzdem danke für die Hilfe war ja schon mal ganz gut ;)

Autor:  Tanjak1710 [ Fr 08 Okt, 2010 14:37 ]
Betreff des Beitrags:  Re: Alchemiemod

Hallo zusammen,

das hat sich echt super angehört und wollte es auch sogleich
einbauen, doch leider gibt er mir immer einen Fehler aus


Warning: reset() [function.reset]: Passed variable is not an array or object in /var/www/web1181/html/logd2/common.php on line 1068

Warning: Variable passed to each() is not an array or object in /var/www/web1181/html/logd2/common.php on line 1069

UPDATE alchemie SE WHERE acctid = 127

Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'WHERE acctid = 127' in Zeile 1



Auszug Common Zeile 1068


reset($session[$key]);
while(list($keys,$val)=each($session[$key])){

ist aus der Einbauanleitung


suche nach

function charstats(){

füge davor ein

function loadtable($keys,$table){
global $session;
$sql = "SELECT $keys FROM $table WHERE acctid=".$session['user']['acctid'];
$result = db_query($sql);
$session[$table]=db_fetch_assoc($result);
return $session[$table];
}

function savetable($key){
global $session;
if($session['loggedin'] && $session['user']['acctid']!=""){
$sql="UPDATE $key SET ";
reset($session[$key]);
while(list($keys,$val)=each($session[$key])){
if(is_array($val)){
$sql.="$keys='".addslashes(serialize($val))."', ";
}else{
$sql.="$keys='".addslashes($val)."', ";
}
}
$sql = substr($sql,0,strlen($sql)-2);
$sql.=" WHERE acctid = ".$session['user']['acctid'];
db_query($sql);
}
}

öffne forest.php


Hoffe mir kann da jemand weiterhelfen :)

Autor:  Adrian [ Fr 05 Nov, 2010 14:49 ]
Betreff des Beitrags:  Re: Alchemiemod

Tanjak1710 hat geschrieben:
Hallo zusammen,

das hat sich echt super angehört und wollte es auch sogleich
einbauen, doch leider gibt er mir immer einen Fehler aus


Warning: reset() [function.reset]: Passed variable is not an array or object in /var/www/web1181/html/logd2/common.php on line 1068

Warning: Variable passed to each() is not an array or object in /var/www/web1181/html/logd2/common.php on line 1069

UPDATE alchemie SE WHERE acctid = 127

Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'WHERE acctid = 127' in Zeile 1





Also dazu wüsste ich auch gerne die Lösung,ich habe nämlich das selbe Problem


PHP:
if ($session['user']['active']==1){
$acctid=$session['user']['acctid'];
$alch="SELECT * FROM potions WHERE acctid=\"$acctid\"";
$alchres=db_query($alch) or die (db_error(LINK));
$alchrow=db_num_rows($alchres);
$charstat.=appoencode(
templatereplace("stathead",array("title"=>"<a href='statistics.php' target='_blank' onClick=\"".popup("statistics.php").";return false;\" class='motd'><b>Alchemie</b></a>")),true);
if($alchrow>0){
$charstat.=appoencode(templatereplace("stathead",array("title"=>"<a href='potuse.php' target='_blank' onClick=\"".popup("potuse.php").";return false;\" class='motd'><b>Tranktasche</b></a>")),true);
}
}


Dies habe ich in meiner Common gepackt,wie es dort oben als Update angegeben wurde,leider blieb der Fehler

Autor:  MySql [ Fr 05 Nov, 2010 18:10 ]
Betreff des Beitrags:  Re: Alchemiemod

Die Fehler sollten meines Erachtens nach an der fehlerhaften Funktion (oder Verwendung von) 'savetable' liegen. Wie genau Du die Funktion anpassen musst, kann ich Dir nicht sagen, daher ich mich mit diesem Mod nicht auseinander gesetzt habe.

~My.

Autor:  Tanjak1710 [ Mo 04 Jul, 2011 20:40 ]
Betreff des Beitrags:  Re: Alchemiemod

Hallo zusammen,

leider bin ich noch immer nicht weiter gekommen.
Wäre schön wenn sich das mal wer anschaut der mehr Erfahrung hat,
denn es ist eigentlich ein schönes Addon, wenn es denn dann geht ;)


Liebe Grüße

Tanja

Autor:  Calamita [ Mo 04 Jul, 2011 21:26 ]
Betreff des Beitrags:  Re: Alchemiemod

Schließe mich meiner Vorrednerin an, hab exakt das gleiche Problem

PHP:
function savetable($key){
global $session;
if($session['loggedin'] && $session['user']['acctid']!=""){
$sql="UPDATE $key SET ";
reset($session[$key]);
while(list($keys,$val)=each($session[$key])){
if(is_array($val)){
$sql.="$keys='".addslashes(serialize($val))."', ";
}else{
$sql.="$keys='".addslashes($val)."', ";
}
}
$sql = substr($sql,0,strlen($sql)-2);
$sql.=" WHERE acctid = ".$session['user']['acctid'];
db_query($sql);
}
}


Auszug aus der Common und ich komm nicht wirklich weiter..
(Wollte nicht nerven, aber dachte mir, wenn sich deswegen noch jemand meldet, dass dann die Chance höher ist, dass jemand Lust hat zu antworten :D )

Autor:  Jack [ Mo 04 Jul, 2011 22:27 ]
Betreff des Beitrags:  Re: Alchemiemod

*scratch*

Ich bin zwar kein MySQL Erfahrener.. Aber u.a die Zeile

$this->bbcode_second_pass_code('', '$sql.="$keys='".addslashes(serialize($val))."', ";')

sieht für mich total falsch aus. Müsste das nicht eher

$this->bbcode_second_pass_code('', '$keys=''.addslashes(serialize($val)).'';')

heißen?

Autor:  Eliwood [ Di 05 Jul, 2011 09:24 ]
Betreff des Beitrags:  Re: Alchemiemod

Nein, diese Stelle müsste korrekt sein. keys ist ein Feldname, während val der Wert für das Feld ist. Sie sind Zusammen ein Paar aus einem Array ($session[$key]), wobei $key ein Tabellenname ist. Die Funktion selbst ist vermutlich eine Abwandlung der Funktion saveuser(), aber leider ziemlich unsauber geschrieben. Darum auch die Fehlermeldung. Warum aber die Fehlermeldung zustande kommt, bzw. warum $session[$key] kein Array ist, weiss ich nicht. Um den Fehler aber abzuwehren, reicht es, die Funktion mit Sicherheiten zu versehen:

$this->bbcode_second_pass_code('', 'function savetable($table) {
global $session;

if(!isset($USESECUREQUERY)) {
if(function_exists('db_query_secure')) {
static $USESECUREQUERY = true;
}
else {
static $USESECUREQUERY = false;
}
}

if ($session['loggedin'] == true and !empty($session['user']['acctid'])) {
// Der User ist sowohl eingeloggt als auch "valid" im Sinne einer gesetzten Account-ID
if(isset($session[$table]) and is_array($session[$table]) and count($session[$table]) > 0) {
// $session[$table] ist sowohl gesetzt als ein array mit Inhalt

// Bereite Variablen vor
$sql = "UPDATE `$table` SET ";
$fields = array();
if($USESECUREQUERY) {
$values = array();
}

// Durchlaufe das Array $session[$table]
foreach($session[$table] as $field => $value) {
if(is_array($value)) {
if($USESECUREQUERY) {
$fields[] = "`$field` = ?";
$values[] = serialize($value);
}
else {
$fields[] = "`$field` = '".addslashes(serialize($value))."'";
}
}
else {
if($USESECUREQUERY) {
$fields[] = "`$field` = ?";
$values[] = serialize($value);
}
else {
$fields[] = "`$field` = '".addslashes($value)."'";
}
}
}

// Füge die Teile zusammen
$sql .= implode(', ', $fields);
if($USESECUREQUERY) {
// Beschränke das Update auf den aktuellen User
$sql .= " WHERE `acctid` = ?";
// Füge die Acctid in die Liste der Werte ein
$values[] = $session['user']['acctid'];

db_query_secure($sql, $values);
}
else {
// Beschränke das Update auf den aktuellen User
$sql .= " WHERE `acctid` = ".intval($session['user']['acctid']);
db_query($sql);
}
}
}
}')

Funktion ist allerdings ungetestet auf Fehler, hat dafür Unterstützung für db_query_secure().

Autor:  Calamita [ Di 05 Jul, 2011 11:16 ]
Betreff des Beitrags:  Re: Alchemiemod

PHP:
// Füge die Acctid in die Liste der Werte ein
$values[] = ;


Die letzte Zeile muss wohl
PHP:
$values[] = "" ;

heißen, da bei mir sonst die Fehlermeldung
Zitat:
Parse error: syntax error, unexpected ';' in C:\xampp\htdocs\logd\common.php on line 680


kommt. Mit den "" scheint es aber zu funktionieren.

Ich komm jetzt zumindest zur Alchemistin rein, den Rest probier ich später mit mehr Zeit aus. Aber vielen Dank an dich für die Hilfe :)

Autor:  Tidus [ Di 26 Jul, 2011 13:00 ]
Betreff des Beitrags:  Re: Alchemiemod

Calamita hat geschrieben:
PHP:
// Füge die Acctid in die Liste der Werte ein
$values[] = ;


Die letzte Zeile muss wohl
PHP:
$values[] = "" ;

heißen, da bei mir sonst die Fehlermeldung
Zitat:
Parse error: syntax error, unexpected ';' in C:\xampp\htdocs\logd\common.php on line 680


kommt. Mit den "" scheint es aber zu funktionieren.

Ich komm jetzt zumindest zur Alchemistin rein, den Rest probier ich später mit mehr Zeit aus. Aber vielen Dank an dich für die Hilfe :)


also wenn ich jetz nur mal die Stelle anschaue dann kann es mit "" nicht funktionieren da dort die AccountID eingetragen werden sollte die mitübergeben werden muss um den Platzhalter zu ersetzen.

wenn ich mich an obiges halte währe wohl
PHP:
$values[] = intval($session['user']['acctid']);


das richtige..

grüße

Autor:  Eliwood [ Mi 27 Jul, 2011 10:08 ]
Betreff des Beitrags:  Re: Alchemiemod

Tidus hat geschrieben:
[..]

wenn ich mich an obiges halte währe wohl
PHP:
$values[] = intval($session['user']['acctid']);


das richtige..

grüße


Ubs, da hab ich wohl nicht ganz aufgepasst. Übrigens wäre richtiger:
$this->bbcode_second_pass_code('', '$values[] = $session['user']['acctid'];')

db_query_secure übernimmt den Rest.

Autor:  Tidus [ Mi 27 Jul, 2011 15:01 ]
Betreff des Beitrags:  Re: Alchemiemod

hab das query_secure nicht deswegen weis ichs nicht, hab es nur von oben genommen wo es direkt in den Query eingefügt wird :)

grüße

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