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

[DS3][PHP5-OOP] Advanced Charstats [alpha]
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=4895
Seite 1 von 1

Autor:  Bathory [ Do 21 Mai, 2009 08:49 ]
Betreff des Beitrags:  [DS3][PHP5-OOP] Advanced Charstats [alpha]

*deleted*

Autor:  dragonslayer [ Do 21 Mai, 2009 10:19 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Wow Bathory, du bist und bleibst der Herr der Klassen!

Autor:  Tidus [ Do 21 Mai, 2009 11:50 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

das ist der hammer O_O, die DS'ler werden davon bestimmt begeistert sein ;) Bathory hats halt drauf! ^^

Autor:  Bathory [ Do 21 Mai, 2009 12:27 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Danke fürs Lob, aber die Klasse ist längst noch nicht fertig :o

Hab btw eine neue Version ins erste Post gepostet.
Jetzt ist der Aufbau schlanker und die erweiterbarkeit der CharStat um einiges einfacher.

ToDo: In der Prefs.php das ein-/ausblenden und umsortieren mit JS realisieren.
Dann sollte sie fertig sein =)

Autor:  Tidus [ Do 21 Mai, 2009 12:57 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

oh mann, du sagst das so, als wäre es das einfachste von der welt ~.~

meld dich mal wenn du arbeitslos bist XD ich stell dich als mein Lehrer ein O_o

Autor:  Auric [ Do 21 Mai, 2009 13:23 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Hübsch Hübsch!
Nur verstehe ich nicht, warum du die einzelnen Elemente nicht ebenfalls gleich als Objekte realisierst - das dürfte den Code um einiges übersichtlicher machen als die tausend cases. Und für den absoluten Bling-Bling-Faktor könntest du noch versuchen, das ganze nicht per Auswahlfeld sondern als Drag&Drop zu realisieren (So beispielsweise - womöglich aber auch mit Alucards-DragDrop-Lib). Zu guter Letzt könnte man in der oben gelistet Funktion noch den global-Teil entrümpeln - dürfte ja nur noch $session benötigt werden.

Nun aber genug von meinem (hoffentlich konstruktiven) Gemäkel auf hohem Niveau.
Hut Ab!

Auric

Autor:  Bathory [ Do 21 Mai, 2009 14:36 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Auric hat geschrieben:
Hübsch Hübsch!
Nur verstehe ich nicht, warum du die einzelnen Elemente nicht ebenfalls gleich als Objekte realisierst - das dürfte den Code um einiges übersichtlicher machen als die tausend cases.


Bezieht sich das auf die alte Version oder auf die Neue?
Hab eigentlich den Switch/Case Aufbau verworfen. Diente eigentlich nur der ersten Orientierung.
War vllt ein Fehler das ich die erste Version schon hochgeladen hatte :D

Das mit der JS Version ist noch in der mache =)

Und Danke für die Kritik =) die brauche ich nämlich damit was brauchbares am Ende rauskommt.
Immo ist das noch eher rumgespiele :D die aus einer Idee die gestern Nacht entsprungen ist bei Atrahor.

Autor:  Liath [ Do 21 Mai, 2009 14:41 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

wow ich werds auf jedenfall lokal bei mir testen und dir evtl. fehler direkt mitteilen...

Bathory hat geschrieben:
die aus einer Idee die gestern Nacht entsprungen ist bei Atrahor.

wie bitte? Oo Die Idee dazu ist gestern Nacht entstanden und schon dteht sowas wie da oben? oO

€dit:
also ich habs Lokal installiert und wie Du geschrieben hast, geht eine mehrfache Vergabe der Zahlen natürlich noch nicht (habs aber trotzdem versucht :D )

dadurch hat sich die letzte Nummer ausgeblendet und kann selbst durch das zurücksetzen der Charstat nicht wiederhergestellt werden

Autor:  Auric [ Do 21 Mai, 2009 22:44 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Öhm - ich habe einfach die Datei zum Zeitpunkt meines Posts heruntergeladen und eingestellt. Was das genau war darfst du dir selbst ausmalen. De Facto wäre meine Idee nur: Kategorien und Row jeweils als Objekte implementieren, die jeweils auf bestimme Unterklassen (online_only etc.) vererben. Dann kannst du die alle ganz stupide in einer Schleife handhaben. Müsste meines Wissens nach per Visitor arbeiten.

Grüße,
Auric

Autor:  Salator [ Mo 01 Jun, 2009 22:10 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Ich fummel gerade an der freidefinierbaren Vitalinfo rum.
Feine Sache übrigens! Eine Woche vor deiner Veröffentlichung fragt mich eine Userin, dass genau dies eine feine Sache wäre, und ich sag noch "Nee, zu aufwändig" :D

Ich lese ja hier was von verschwundenen Zeilen, die durch falsche Sortierung entstehen sollen. Das kann ich so nicht nachvollziehen, aber man darf keine Nummer wählen die man eigentlich nicht hat. Also Besitz 1-7 ist falsch, das dürfte nur 1-5 sein. (dass Superuser dann doch 7 Optionen haben geht ja auch noch nicht)
Wenn man aber die Sortierung der Superuser-Optionen zulässt -die Nichtanzeige wird ja nur durch ein <tr style=" display:none;"> realisiert- funktioniert alles wieder.

Autor:  Bathory [ Mi 03 Jun, 2009 12:31 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

@Salator jep der Superuser teil ist noch "ausgeblendet" weil ich den Teil noch nicht angefangen hab.

Naja wenn man mehrfach die gleiche Zahl vergibt, versucht das Skript diesen "Fehler" zu beheben und dabei entstehen schon mal Zahlen die es im Array nicht gibt. Aber mit dem Javascript Sortable, kann das ja dann nicht mehr passieren, hatte nur noch keine Zeit da JS mäßig rumzufummeln :lol:

Autor:  dragonslayer [ Do 04 Jun, 2009 10:04 ]
Betreff des Beitrags:  Re: [DS3][PHP5-OOP] Advanced Charstats [alpha]

Kleiner Fehler wenn der anzuzeigende Wert "0" ist. Dann wird nämlich die ganze Zeile auf grund der empty Bedingung ausgeblendet.
Stattdessen nehme ich das hier
$this->bbcode_second_pass_code('', '
if(!$session['user']['alive'] && $val2['type'] == 1){}
else if($session['user']['alive'] && $val2['type'] == 2){}
else if(!$session['user']['superuser'] && $val2['su'] == true){}
else if(isset($val2['mindk']) && $session['user']['dragonkills'] < $val2['mindk']) {}
else if(is_null_or_empty($val2['value']) || adv_empty($this->arr_data[ $val2['value'] ]) ){}
else
{
$charstat.=$this->do_stat($key,$bit,$val2['title'],$this->arr_data[ $val2['value'] ],$val2['free']);
}
')

wobei adv_empty eben nur eben empty ohne "0" nachbildet:

$this->bbcode_second_pass_code('', '
function adv_empty($var)
{
$string = trim($var);
if(!is_numeric($var))
{
return empty($var);
}
return false;
}
')

Außerdem hab ich noch das Bedürfnis gehabt bestimmte Elemente erst ab X Drachenkills anzuzeigen und dynamisch Elemente "hinten dran" zu bappen, die eben immer ganz vorne oder ganz hinten stehen sollen und nicht ausblendbar sind. Die dynamisch hinzugefügten Dinge werden jedoch noch nicht angezeigt, weil der Charstat array ja aus den Prefs kommt und nicht beachtet dass etwas hinten dran kommt.
Ich häng mal meine Version an, vielleicht hat ja einer ne Idee. Alle bisherigen Funktionen sind aber immernoch voll funktionsfähig, nur der Aufruf muss jetzt
$this->bbcode_second_pass_code('', '
$CCharStats->initialize_data($CCharStats->arr_default,$data);
return $CCharStats->get_char_stats();
')
heissen.
:
$this->bbcode_second_pass_code('', '
<?php
/**
* Advanced CharStats
* @author Báthory rolandvgilead@web.de
* @version DS-E V/3.x
*/
class CCharStats
{
/**
* Enthält die Charstat Struktur
* @var array
*/
public $arr_default = array(
0 => array('Vital-Info',
array
(
array('title'=>'Name','type'=>3,'su'=>false,'free'=>false,'value'=>'name')
,array('title'=>'Lebenspunkte','type'=>1,'su'=>false,'free'=>false,'value'=>'hitpoints')
,array('title'=>'Seelenpunkte','type'=>2,'su'=>false,'free'=>false,'value'=>'soulpoints')
,array('title'=>'Runden','type'=>1,'su'=>false,'free'=>false,'value'=>'turns')
,array('title'=>'Gefallen','type'=>2,'su'=>false,'free'=>false,'value'=>'deathpower')
,array('title'=>'Schlossrunden','type'=>1,'su'=>false,'free'=>false,'mindk'=>10,'value'=>'castleturns')
,array('title'=>'Foltern','type'=>2,'su'=>false,'free'=>false,'value'=>'gravefights')
,array('title'=>'Stimmung','type'=>3,'su'=>false,'free'=>false,'value'=>'spirits')
,array('title'=>'Level','type'=>3,'su'=>false,'free'=>false,'value'=>'level')
,array('title'=>'Erfahrung','type'=>3,'su'=>false,'free'=>false,'value'=>'exp')
,array('title'=>'Angriff','type'=>1,'su'=>false,'free'=>false,'value'=>'atk')
,array('title'=>'Verteidigung','type'=>1,'su'=>false,'free'=>false,'value'=>'def')
,array('title'=>'Ansehen','type'=>1,'su'=>false,'free'=>false,'value'=>'repu')
,array('title'=>'Psyche','type'=>2,'su'=>false,'free'=>false,'value'=>'psy')
,array('title'=>'Geist','type'=>2,'su'=>false,'free'=>false,'value'=>'geist')
)
)
, 1 => array('Besitz',
array
(
array('title'=>'Gold','type'=>3,'su'=>false,'free'=>false,'value'=>'gold')
,array('title'=>'Edelsteine','type'=>3,'su'=>false,'free'=>false,'value'=>'gems')
,array('title'=>'Waffe','type'=>3,'su'=>false,'free'=>false,'value'=>'weapon')
,array('title'=>'Rüstung','type'=>3,'su'=>false,'free'=>false,'value'=>'armour')
,array('title'=>'Haustier','type'=>3,'su'=>false,'free'=>false,'value'=>'animal')
,array('title'=>'Debug','type'=>3,'su'=>true,'free'=>false,'value'=>'debug')
,array('title'=>'Quick Nav','type'=>3,'su'=>true,'free'=>true,'value'=>'quicknav')
)
)
, 2 => array('Profil und Info',
array
(
array('title'=>'Weiteres','type'=>3,'su'=>false,'free'=>false,'value'=>'profil')
,array('title'=>'Nächster Tag','type'=>3,'su'=>false,'free'=>false,'value'=>'nextd')
)
)
, 3 => array('Aktionen',
array
(
array('title'=>'Aktionen','type'=>3,'su'=>false,'free'=>true,'value'=>'buffs')
)
)

);
/**
* Enthält die Daten die dargestellt werden sollen
* @var array
*/
public $arr_data = array();

//Bei Änderungen am Array $arr_default version um 1 erhöhen!
static $int_version = 2;
private $arr_charstat = array();
private $str_charstat = "";

public function __construct()
{
//Default constructor
}

public function initialize_data($form,$data)
{
$this->arr_data = $data;
$this->arr_default = $form;
}

////////////////////////////////////////////////////////////////////
// Ab hier muss bei Änderungen nichts mehr angepasst werden
////////////////////////////////////////////////////////////////////

public function get_char_stats()
{
global $session;

$this->initialize();
$int_count = count($this->arr_charstat);
for($k = 0 ; $k < $int_count ; $k++)
{
$this->str_charstat .= $this->build($this->arr_charstat[$k][0],$this->arr_charstat[$k][1]);
}

return $this->str_charstat;
}

private function build($key,$val)
{
global $session;
$charstat = appoencode(templatereplace('statstart'),true);
if($session['user']['prefs']['charstat_aus']['aus_header_'.$key] != '1')
{
$bit = plu_mi_get_val('show_'.$key);
$headstr = plu_mi('show_'.$key, $bit).'&nbsp;'.$this->arr_default[$key][0];
$charstat.=appoencode(templatereplace('stathead',array('title'=>$headstr)),true);

for($j=0;$j<count($val);$j++)
{
if($session['user']['prefs']['charstat_aus']['aus_body_'.$key.'_'.$val[$j]] != '1')
{
$val2 = $this->arr_default[$key][1][$val[$j]];
if(!$session['user']['alive'] && $val2['type'] == 1){}
else if($session['user']['alive'] && $val2['type'] == 2){}
else if(!$session['user']['superuser'] && $val2['su'] == true){}
else if(isset($val2['mindk']) && $session['user']['dragonkills'] < $val2['mindk']) {}
else if(is_null_or_empty($val2['value']) || adv_empty($this->arr_data[ $val2['value'] ]) ){}
else
{
$charstat.=$this->do_stat($key,$bit,$val2['title'],$this->arr_data[ $val2['value'] ],$val2['free']);
}
}
}
}
$charstat.=appoencode(templatereplace('statend'),true);
return $charstat;
}

private function do_stat($key,$bit,$val,$return,$free=false)
{
if($free)
{
return appoencode(templatereplace('freedata',array('id'=>plu_mi_unique_id('show_'.$key), 'style'=>($bit?'':'display:none;'), 'title'=>$val,'free_data'=>$return)),true);
}
return appoencode(templatereplace('statrow',array('id'=>plu_mi_unique_id('show_'.$key), 'style'=>($bit?'':'display:none;'), 'title'=>$val,'value'=>$return)),true);
}

private function initialize()
{
global $session;
if(is_array($session['user']['prefs']['charstat']))
{
$this->arr_charstat = $session['user']['prefs']['charstat'];

if($session['user']['prefs']['charstat_version'] != self::$int_version)
{
if(count($this->arr_default) > count($this->arr_charstat))
{
for($c=count($this->arr_charstat);$c<count($this->arr_default);$c++)
{
$this->arr_charstat[$c] = array($c,array());
}
}
else if(count($this->arr_default) < count($this->arr_charstat))
{
for($d=0;$d<count($this->arr_charstat);$d++)
{
if($this->arr_charstat[$d][0] >= count($this->arr_default)) unset($this->arr_charstat[$d]);
}
}

for($i=0;$i<count($this->arr_charstat);$i++)
{
if(count($this->arr_default[$i][1]) > count($this->arr_charstat[$i][1]))
{
for($a=count($this->arr_charstat[$i][1]);$a<count($this->arr_default[$i][1]);$a++)
{
$this->arr_charstat[$i][1][$a] = $a;
}
}
else if(count($this->arr_default[$i][1]) < count($this->arr_charstat[$i][1]))
{
for($b=0;$b<count($this->arr_charstat[$i][1]);$b++)
{
if($this->arr_charstat[$i][1][$b] >= count($this->arr_default[$i][1])) unset($this->arr_charstat[$i][1][$b]);
}
}
}
$session['user']['prefs']['charstat'] = $this->arr_charstat;
$session['user']['prefs']['charstat_version'] = self::$int_version;
}
}
else
{
for($i=0;$i<count($this->arr_default);$i++)
{
$arr_sub = array();
for($k=0;$k<count($this->arr_default[$i][1]);$k++){$arr_sub[$k]=$k;}
$this->arr_charstat[$i] = array($i,$arr_sub);
}
$session['user']['prefs']['charstat'] = $this->arr_charstat;
$session['user']['prefs']['charstat_version'] = self::$int_version;
}
}

public function get_prefs()
{
$this->initialize();
$charForm = $this->get_char_form();
$return = array(
"CharStat,title"
,'charForm' => $charForm.',viewonly');
return $return;
}

public function check_prefs_save()
{
global $session;
if($_POST)
{
$temp = array();
for($i=0;$i<count($this->arr_default);$i++)
{
if($_POST['aus_header_'.$i.''] == 1)
{
$session['user']['prefs']['charstat_aus']['aus_header_'.$i] = 1;
}
else
{
$session['user']['prefs']['charstat_aus']['aus_header_'.$i] = 0;
}
unset($_POST['aus_header_'.$i.'']);
$subtemp = array();

for($k=0;$k<count($this->arr_default[$i][1]);$k++)
{
if($_POST['aus_body_'.$i.'_'.$k.''] == 1)
{
$session['user']['prefs']['charstat_aus']['aus_body_'.$i.'_'.$k.''] = 1;
}
else
{
$session['user']['prefs']['charstat_aus']['aus_body_'.$i.'_'.$k.''] = 0;
}
unset($_POST['aus_body_'.$i.'_'.$k.'']);

if(isset($subtemp[(((int)$_POST['pos_body_'.$i.'_'.$k.''])-1)]))
{
$subtemp[] = $k;
}
else
{
$subtemp[(((int)$_POST['pos_body_'.$i.'_'.$k.''])-1)] = $k;
}
unset($_POST['pos_body_'.$i.'_'.$k.'']);
}

if(isset($temp[(((int)$_POST['pos_header_'.$i.''])-1)]))
{
$temp[] = array($i,$subtemp);
}
else
{
$temp[(((int)$_POST['pos_header_'.$i.''])-1)] = array($i,$subtemp);
}
unset($_POST['pos_header_'.$i.'']);
}
$session['user']['prefs']['charstat'] = $temp;
$this->arr_charstat = $temp;
}
if((int)$_GET['charstats'] == 1)
{
$session['user']['prefs']['charstat'] = $temp;
$this->arr_charstat = $temp;
}
}

private function get_char_form()
{
global $session;
$return = '
<table align="center">';
for($i=0;$i<count($this->arr_charstat);$i++)
{
$return .= '<tr>
<td> <select name="pos_header_'.$this->arr_charstat[$i][0].'">';

for($a=1;$a<=count($this->arr_charstat);$a++)
{
$return .= '<option value="'.$a.'" '.( ($a==($i+1)) ? 'selected="selected"' : '' ).'>'.$a.'</option>';
}

$return .= '</select> </td>
<td>'.$this->arr_default[$this->arr_charstat[$i][0]][0].'</td>
<td></td>
<td><input name="aus_header_'.$this->arr_charstat[$i][0].'" type="checkbox" value="1" '.( ($session['user']['prefs']['charstat_aus']['aus_header_'.$this->arr_charstat[$i][0]] == 1) ? 'checked="checked"' : '').' > ausblenden</td>
</tr>';
for($k=0;$k<count($this->arr_charstat[$i][1]);$k++)
{
if(!$this->arr_default[$this->arr_charstat[$i][0]][1][$this->arr_charstat[$i][1][$k]]['su'])
{
$return .= '<tr>';
}
else
{
$return .= '<tr style=" display:none;">';
}
$return .= '
<td></td>
<td> <select name="pos_body_'.$this->arr_charstat[$i][0].'_'.$this->arr_charstat[$i][1][$k].'">';

for($b=1;$b<=count($this->arr_charstat[$i][1]);$b++)
{
$return .= '<option value="'.$b.'" '.( ($b==($k+1)) ? 'selected="selected"' : '' ).'>'.$b.'</option>';
}

$return .= '</select> </td>
<td>'.$this->arr_default[$this->arr_charstat[$i][0]][1][$this->arr_charstat[$i][1][$k]]['title'].'</td>
<td><input name="aus_body_'.$this->arr_charstat[$i][0].'_'.$this->arr_charstat[$i][1][$k].'" type="checkbox" value="1" '.( ($session['user']['prefs']['charstat_aus']['aus_body_'.$this->arr_charstat[$i][0].'_'.$this->arr_charstat[$i][1][$k]] == 1) ? 'checked="checked"' : '').' > ausblenden</td>
</tr>';
}

}
$return .= '</table>
<br><br>
<center><a href="prefs.php?charstats=1">Standardwerte für Reihenfolge zurücksetzen</a></center><br><br>';
return $return;
}
}
?>
')

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