load(db_fetch_assoc($res));
}
function load($indata) {
foreach($indata as $key=>$val) {
$this->$key = $val;
}
}
}
class wvNav {
/**
* Speichert die Kategorien
* @var array
*/
var $cat;
/**
* Speichert die einzelnen Navpunkte
* @var array
*/
var $navs;
/**
* Beinhaltet den Ausgangslink zur aktuellen Seite
* @var unknown_type
*/
var $baselink;
/**
* Standardkategorie für navs ohne Angabe
* @var unknown_type
*/
var $defcat;
/**
* Beinhaltet die Daten in neuer Baumstruktur
* $d
* > categoryA
* -> item1
* ==> label1
* ==> link1
* -> item2
* [...]
* @var array
*/
var $d = array();
/**
* Referenz auf eine Instanz von sysTxt
*
* @var sysTxt
*/
var $txt;
function wvNav($baselink = HAUS_BASEFILE) {
$this->baselink = $baselink;
$this->txt = sysTxt::instance();
}
function getLink($part, $keep_cat = false, $keep_loc = true) {
global $quater;
$str = $this->baselink . '?' . $part;
if($keep_cat && !empty($_GET['cat']))
$str .= '&cat=' . $_GET['cat'];
if($keep_loc && !strpos($str, 'quater_id'))
$str .= (empty($part) ? '' : '&') . 'quater_id=' . $quater->quater_id;
return $str;
}
function getAdvLink($part, $misc) {
if (isset($misc['final']) || false !== strpos($part,'.php')) {
return $part;
} else {
$keep_cat = isset($misc['keep_cat']) ? $misc['keep_cat'] : false;
$keep_loc = isset($misc['keep_loc']) ? $misc['keep_loc'] : true;
return $this->getLink($part,$keep_cat,$keep_loc);
}
}
function getParsed($in,$file = false) {
if (substr($in,0,4) == 'nav_') {
$ret = $this->txt->get($in,$file);
if (empty($ret)) echo "Konnte nichts zu '$in' in der file '$file' finden
\n";
return $ret;
} else
return $in;
}
function setDefCategory($intext,$textfile = false) {
$name = $this->getParsed($intext,$textfile);
if (!empty($this->d[$name])) {
$this->defcat = $name;
return true;
} else
return false;
}
function insNav($label, $link, $category){
$category = $this->getParsed($category);
if (isset($this->d[$category])) {
$this->d[$category][] = array('label' => $label, 'link' => $link);
return true;
} else {
echo "insNav geht nicht, Kategorie '$category' fehlt!
\n";
return false;
}
}
function addCategory($intext, $setdef = true, $textfile = false){
$name = $this->getParsed($intext, $textfile);
if (empty($this->d[$name])) {
$this->d[$name] = array();
// echo "Kategorie '$name' Eingefügt!
\n";
} else {
// echo "Kategorie '$name' bereits vorhanden, Überschreiben unterbunden
\n";
}
if ($setdef) $this->setDefCategory($name);
}
function addNav($inlabel, $linkpart, $incategory = false, $textfile = false, $linkmisc = array()) {
$category = empty($incategory) ? $this->defcat : $this->getParsed($incategory,$textfile);
$label = $this->getParsed($inlabel, $textfile);
$link = empty($linkmisc) ? $this->getLink($linkpart) : $this->getAdvLink($linkpart, $linkmisc);
return $this->insNav($label,$link,$category);
}
////////////////////
// Alte Versionen //
////////////////////
function category($name,$setdef = true) {
if($setdef)
$this->defcat = $name;
$this->cat[$name] = array();
}
function insertNav($name,$link,$category = false) {
if($category == false)
$category = $this->defcat;
if (substr($category,0,4) == 'nav_') {
$wvtxt = & sysTxt::instance();
$category = $wvtxt->get($category);
}
$this->navs[] = array('name'=>$name, 'link'=>$link);
$this->cat[$category][] = count($this->navs) - 1;
}
function link($text,$keep_cat = false, $keep_loc = true) {
return $this->getLink($text,$keep_cat,$keep_loc);
}
function nav($name,$text = '',$category = false,$keep_cat = false) {
$link = $this->link($text, $keep_cat);
$this->insertNav($name, $link, $category);
}
function txtCategory($catname,$setdef = true,$txtcat = false) {
$wvtxt = & sysTxt::instance();
$this->category($wvtxt->get($catname, $txtcat), $setdef);
}
function txtNav($txtname,$text = '',$category = false,$keep_cat = false,$txtcat = false) {
$wvtxt = & sysTxt::instance();
if (substr($category,0,4) == 'nav_') $category = $wvtxt->get($category,$txtcat);
$this->nav($wvtxt->get($txtname, $txtcat), $text, $category, $keep_cat);
}
function end() {
// Neuer Einzelbaum
foreach($this->d as $category=>$items) {
addnav($category);
foreach($items as $item) {
addnav($item['label'],$item['link']);
}
}
// Alter Doppelbaum
if(!empty($this->cat)) {
foreach($this->cat as $name=>$arr) {
if(empty($name))
continue;
addnav($name);
foreach($arr as $num) {
addnav($this->navs[$num]['name'], $this->navs[$num]['link']);
}
}
}
}
function clear() {
$this->cat = array();
$this->navs = array();
$this->defcat = '';
}
}
class wvKey {
var $key_id;
var $house_id;
var $user_id;
var $key_nr;
var $owner;
function wvKey($indata,$readRest = false) {
$this->readIndata($indata);
if($readRest && !empty($this->key_id))
$this->readFromDB();
}
function readIndata($indata) {
foreach(array_keys($indata) as $k) {
$this->$k = $indata[$k];
}
}
function readFromDB() {
$sql = 'SELECT * FROM `' . HAUS_KEY_TABLE . '` WHERE `key_id` = ' . $this->key_id . ' LIMIT 1';
$res = dying_query($sql, 'Fehler beim Lesen eines Schlüssels', __FILE__, __LINE__);
$row = db_fetch_assoc($res);
$this->readIndata($row);
}
function save() {
if(!empty($this->key_id)) {
$sql = 'REPLACE INTO `' . HAUS_KEY_TABLE . '`(`key_id`,`house_id`,`acctid`,`key_nr`,`owner`) VALUES(' . $this->key_id . ',' . $this->get(HAUS_ID_FIELD) . ',' . $this->user_id . ',' . $this->key_nr . ',"' . $this->owner . '")';
} else {
$sql = 'INSERT INTO `' . HAUS_KEY_TABLE . '`(`house_id`,`acctid`,`key_nr`,`owner`) VALUES(' . $this->house_id . ',' . $this->user_id . ',' . $this->key_nr . ',"' . $this->owner . '")';
}
dying_query($sql, 'Fehler beim Speichern eines Keys', __FILE__, __LINE__, $this);
}
function generateKeys($houseid,$keys,$owner,$start = 1) {
for($i = $start; $i < $keys + $start; $i++) {
$key = new wvKey(array('house_id'=>$houseid, 'user_id'=>$owner, 'key_nr'=>$i, 'owner'=>$i == 1 ? '1' : '0'));
$key->save();
unset($key);
}
}
function findByHouse($house_id, $with_ownerdata=false) {
if (empty($with_ownerdata)) {
$sql = sprintf("SELECT `k`.* FROM `wv_keys` `k` WHERE `house_id`=%s",$house_id);
} else {
$fields = is_array($with_ownerdata) ? implode(', ',$with_ownerdata) : $with_ownerdata;
$sql = sprintf("SELECT `k`.*, %s FROM `".HAUS_KEY_TABLE."` `k` JOIN `accounts` USING(`acctid`) WHERE `house_id`=%s",$fields,$house_id);
}
$res = dying_query($sql,"Fehler beim Suchen der Schlüssel eines Hauses",__FILE__,__LINE__);
$keys = array();
for($i=0,$max=db_num_rows($res);$i<$max;$i++) {
$keys[] = new wvKey(db_fetch_assoc($res));
}
return $keys;
}
}
class wvTxt {
var $included;
var $texts;
var $deffile;
var $language;
function wvTxt($language = HAUS_TXT_DEFLANG,$startfile = false) {
$this->loadLanguage($language);
if(!empty($startfile)) {
if(is_array($startfile)) {
foreach($startfile as $file)
$this->loadFile($file);
$this->deffile = $startfile[count($startfile) - 1];
} else {
$this->loadFile($startfile);
$this->deffile = $startfile;
}
}
}
function loadLanguage($language) {
if(substr($language, strlen($language) - 1) != '/')
$language .= '/';
if(file_exists(HAUS_TXT_LANGDIR . $language)) {
$this->language = $language;
} elseif($language == HAUS_TXT_DEFLANG || $language == HAUS_TXT_DEFLANG . '/') {
stirb("Fehler beim Laden des Standard-Sprachordners für das Haussystem " . HAUS_TXT_LANGDIR . $language, $this, __FILE__, __LINE__);
} else {
$this->loadLanguage(HAUS_TXT_DEFLANG);
}
}
function loadFile($filename,$setdef=true) {
if(empty($this->included[$filename])) {
$existenz = $this->fileExists($filename);
if($existenz === 0) {
stirb("Fehler: Konnte keine Textdatei für das Kürzel '$filename' finden. Diese sollte zumindst in der Standardsprache verfügbar sein", $this, __FILE__, __LINE__);
} elseif($existenz === 2) {
wvLog(array('loss','text','tune'),"Konnte die Textdatei für das Kürzel '$filename' in der Sprachkategorie '$this->language' finden.");
}
require_once $this->buildFilestr($filename,$existenz == 2 ? HAUS_TXT_DEFLANG : false);
$str = 'text_' . $filename;
$this->texts[$filename] = $$str;
$this->included[$filename] = true;
if($setdef || empty($this->deffile))
$this->deffile = $filename;
}
}
function fileExists($filename) {
$ret = 0;
if (file_exists($this->buildFilestr($filename))) $ret = 1;
elseif ($this->language != HAUS_TXT_DEFLANG && file_exists($this->buildFilestr($filename,HAUS_TXT_DEFLANG))) $ret = -1;
return $ret;
}
function buildFilestr($filename, $language = false) {
$language = $language === false ? $this->language : $language;
$extension = substr($filename,-4) == '.php' ? '' : '.php';
return HAUS_TXT_LANGDIR . $language . $filename . $extension;
}
function search($name){
$found = false;
// Alle eingelesenen Daten durchsuchen
foreach($this->texts as $catname => $category) {
// Einzelne Texte durchsuchen
if(!empty($category[$name])) {
$found = array('category' => $catname, 'value' => $category[$name]);
break;
}
}
return $found;
}
function lookup($name,$cat) {
$ret = '';
$found = $this->search($name);
// Debug-Data vorbereiten
$data = array('searched_for' => $name ,'searched_cat' => $cat, 'language' => $this->language, 'read_files' => implode(',', array_keys($this->included)));
if($found !== false) { // Wert an anderer Stelle gefunden
$ret = $found['value'];
$types = 'text,loss';
$text = 'Textitem in falscher Kategorie gefunden';
} else { // Wert nicht gefunden
if($this->language != HAUS_TXT_DEFLANG) {
// Daten zwischenspeichern und standard-Sprachdatei laden, wenn diese nicht aktiv ist
$bak = $this->texts[$cat];
$baklang = $this->language;
$this->loadLanguage(HAUS_TXT_DEFLANG);
$this->loadFile($cat);
$found2 = $this->search($name);
if($found2 !== false) { // Wert in Standardsprache gefunden
$ret = $found2['value'];
$types = 'text,loss';
$text = 'Textitem in der language nicht gefunden, auf Standardsprache ausgewichen';
} else { // Wert auch hier nicht gefunden
$ret = '';
$types = 'test,loss,error';
$text = 'Textitem konnte auch in der standardsprache nicht gefunden werden nicht gefunden werden';
}
$this->loadLanguage($baklang);
$this->texts[$cat] = $bak;
} else { // Wert nicht gefunden, Standardsprache bereits aktiv
$ret = '';
$types = 'test,loss,error';
$text = 'Textitem konnte nicht gefunden werden, Standardsprache bereits aktiv';
}
}
// Logeintrag schreiben
wvLog($types, $text, array_merge((array) $found, $data));
return $ret;
}
function get($name,$cat = false) {
if($cat)
$this->loadFile($cat);
else
$cat = $this->deffile;
$ret = $this->texts[$cat][$name];
if(empty($ret)) {
// Suchen mit debug-logging:
$lookup = $this->lookup($name,$cat);
if (!empty($lookup)) $ret = $lookup;
}
return $ret;
}
function massGet($names,$cat = false) {
$str = '';
foreach($names as $name)
$str .= $this->get($name, $cat);
return $str;
}
function repGet($name,$sea,$rep,$cat = false) {
$str = $this->get($name, $cat);
if(is_array($sea))
$str = $this->multipleReplace($sea, $rep, $str); else
$str = str_replace($sea, $rep, $str);
return $str;
}
function multipleReplace($sea,$rep,$str) {
$ret = $str;
foreach($sea as $key=>$val) {
$ret = str_replace($val, $rep[$key], $ret);
}
return $ret;
}
}
class wvLevel {
// @todo Zu Überarbeiten
var $level;
var $name;
var $gold;
var $gems;
var $keys;
var $zimmer;
var $goldchest;
var $gemschest;
function wvLevel($level = 1) {
if($level <= $this->hoechste()) {
$sql = 'SELECT * FROM `'.HAUS_LEVEL_TABLE.'` WHERE level = ' . $level;
$res = dying_query($sql,'Ausbaustufenfehler',__FILE__,__LINE__);
$row = db_fetch_assoc($res);
foreach($row as $key=>$val) {
$this->{$key} = $val;
}
} else {
stirb("Fehler - Zugrif auf einen nicht eingetragenen Level nicht möglich. Bitte Admin kontaktieren!
\n" . "Folgende Werte wurden übergeben:
Eingetragene Level: " . $this->levels() . ",
Angeforterter Level: " . $level);
}
}
function levels() {
$sql = 'SELECT COUNT(`level`) AS `anzahl` FROM '.HAUS_LEVEL_TABLE;
$res = dying_query($sql,'Fehler beim lesen der Levels',__FILE__,__LINE__);
$row = db_fetch_assoc($res);
return (int) $row['anzahl'];
}
function hoechste() {
$sql = 'SELECT MAX(`level`) AS maximum FROM '.HAUS_LEVEL_TABLE;
$res = dying_query($sql,'Level error');
$row = db_fetch_assoc($res);
return (int) $row['maximum'];
}
/*
function speichern($aufid = false) {
if($aufid == false)
$aufid = $this->level;
if($aufid <= $this->levels()) {
$sql = "UPDATE `houselevels` SET level=" . $aufid . ", name=" . $this->name . ", gold=" . $this->gold . ", gems=" . $this->gems . ", keys=" . $this->keys . ", goldchest=" . $this->goldchest . ", gemschest=" . $this->gemschest . " WHERE level=" . $this->level;
} else {
$sql = "INSERT INTO houselevels SET level=" . $aufid . ", name=" . $this->name . ", gold=" . $this->gold . ", gems=" . $this->gems . ", keys=" . $this->keys . ", goldchest=" . $this->goldchest . ", gemschest=" . $this->gemschest;
}
db_query($sql) or dir(db_error(LINK));
}
*/
}
class wvStreet extends wvLoadable {
var $street_id;
var $street_nr;
var $quater_id;
var $name;
var $description;
var $shortdesc;
var $house_num;
function wvStreet($in) {
if(is_array($in)) {
$this->load($in);
} elseif(is_numeric((int) $in)) {
$this->street_id = $in;
$this->read('SELECT * FROM `' . HAUS_STREET_TABLE . '` WHERE `street_id` = ' . $this->street_id . ' LIMIT 1');
} else {
stirb('Fehler beim Einlesen einer Straße', null, __FILE__, __LINE__);
}
}
function findHouses($level = false,$level_op = '>=') {
$whereclause = 'WHERE `h`.`street_id`=' . $this->street_id . ($level ? ' AND `level`' . $level_op . $level : '');
$sql = 'SELECT `h`.`' . HAUS_ID_FIELD . '`,`h`.`' . HAUS_NR_FIELD . '`, `h`.`name`, `h`.`level`, `h`.`extensions`, `l`.`name` AS `level_name`, `a`.`name` AS `owner_name`, COUNT(`k`.`key_nr`) AS `keys` FROM `' . HAUS_TABLE . '` `h` INNER JOIN `' . HAUS_LEVEL_TABLE . '` `l` USING(`level`) INNER JOIN `' . HAUS_KEY_TABLE . '` `k` USING(`' . HAUS_ID_FIELD . '`) INNER JOIN `accounts` `a` USING(`acctid`) ' . $whereclause . ' GROUP BY `h`.`' . HAUS_ID_FIELD . '` ORDER BY `h`.`' . HAUS_NR_FIELD . '` ASC';
$res = dying_query($sql, 'Fehler beim Suchen nach Hausdaten für die Übersichtstabelle', __FILE__, __LINE__);
$all = array();
for($i = 0, $max = db_num_rows($res); $i < $max; $i++)
$all[] = new haus_outside(db_fetch_assoc($res));
return $all;
}
function listHouses($level = false,$level_op = '>=') {
$wvtxt = & sysTxt::instance();
$all = $this->findHouses($level, $level_op);
$str = sprintf($wvtxt->get('list_houses_head'), count($all));
for($i = 0, $max = count($all); $i < $max; $i++) {
$str .= $all[$i]->list_row(($i + 1) % 2);
}
$str .= $wvtxt->get('list_foot');
return $str;
}
function list_row($class = 0,$fields = array('street_nr','name','house_num','shortdesc')) {
$wvtxt = & sysTxt::instance();
$str = '';
$tpl = $wvtxt->get('list_field');
for($i = 0, $max = count($fields); $i < $max; $i++) {
$str .= sprintf($tpl, $this->$fields[$i]);
}
addnav('', $this->getLink());
$str .= sprintf($wvtxt->get('list_field_link'), $this->getLink());
return sprintf($wvtxt->get('list_row_' . ($class ? 'light' : 'dark')), $str);
}
function getText() {
$str = '';
$str .= $this->listHouses();
return $str;
}
function isBuildPossible() {
return $this->house_num < HAUS_PER_STREET;
}
function incHouses($id) {
dying_query('UPDATE `' . HAUS_STREET_TABLE . '` SET `house_num`=`house_num` + 1 WHERE `street_id` = ' . $id, 'Fehler beim Erhöhen der Häuserzahl einer Straße', __FILE__, __LINE__);
}
function getLink($txtonly=false) {
global $wvnav;
$link = 'act=street&street_id=' . $this->street_id;
if (!$txtonly) $link = $wvnav->link($link);
return $link;
}
function findAccessableHouses($userid=false){
if(!$userid) {
global $session;
$userid = $session['user']['acctid'];
}
$sql = 'SELECT `k`.`'.HAUS_ID_FIELD.'`, `name`, `house_nr` FROM `'.HAUS_KEY_TABLE.'` `k` INNER JOIN `'.HAUS_TABLE.'` `h` USING(`'.HAUS_ID_FIELD.'`) WHERE `k`.`acctid` = '.$userid.' AND `h`.`street_id` = '.$this->street_id.' GROUP BY `h`.`'.HAUS_ID_FIELD.'`';
$res = dying_query($sql,'Fehler beim Finden der betretbaren Häuser des Straße '.$this->street_id.' für den User'.$userid,__FILE__,__LINE__);
$data = array();
for($i=0,$max=db_num_rows($res);$i<$max;$i++) {
$row = db_fetch_assoc($res);
$data[$row[HAUS_ID_FIELD]] = $row;
}
return $data;
}
function listAccessableHouses($userid=false){
$wvtxt = & sysTxt::instance();
$data = $this->findAccessableHouses($userid);
$str = sprintf($wvtxt->get('list_keys_head'),count($data));
$i = 0;
foreach($data as $value) {
$haus = new haus_outside($value);
$str .= $haus->list_row($i%2,array('house_nr','name','enter_link'));
$i++;
}
$str .= $wvtxt->get('list_foot');
return $str;
}
}
class wvQuater extends wvLoadable {
var $quater_id;
var $name;
var $description;
var $backlink;
function wvQuater($in) {
if(is_array($in)) {
$this->load($in);
} elseif(is_numeric((int) $in)) {
$this->quater_id = $in;
$this->read('SELECT * FROM `' . HAUS_QUATER_TABLE . '` WHERE `quater_id` = ' . $this->quater_id . ' LIMIT 1');
} else {
stirb('Fehler beim Einlesen eines Wohnviertels', null, __FILE__, __LINE__);
}
}
function findStreets($onlyExtendable = false) {
$sql = 'SELECT `s`.`street_id`, `s`.`street_nr`, `s`.`name`, `s`.`shortdesc`, COUNT(`house_id`) AS `house_num` FROM `' . HAUS_STREET_TABLE . '` `s` LEFT OUTER JOIN `' . HAUS_TABLE . '` USING(`street_id`) WHERE `s`.`quater_id`=' . $this->quater_id . ($onlyExtendable ? ' AND `house_num` < `maxhouses`' : '') . ' GROUP BY `street_id`';
$res = dying_query($sql, 'Fehler beim einlesen aller Straßen eines Viertels', __FILE__, __LINE__);
$streets = array();
for($i = 0, $max = db_num_rows($res); $i < $max; $i++) {
$streets[] = new wvStreet(db_fetch_assoc($res));
}
return $streets;
}
function listStreets() {
$wvtxt = & sysTxt::instance();
$streets = $this->findStreets();
$houses = 0;
$str = '';
for($i = 0, $max = count($streets); $i < $max; $i++) {
$str .= $streets[$i]->list_row($i % 2);
$houses += $streets[$i]->house_num;
}
$str .= $wvtxt->get('list_foot');
return sprintf($wvtxt->get('list_streets_head'), $houses, count($streets)) . $str;
}
}
/**
* Bietet eine interne Loggingfunktion (Primär zum debuggen und als Programmierhilfe)
*
* @param mixed $types
* @param string $message
* @param mixed $data
*/
function wvLog($types,$message,$data='NULL'){
$sql = "INSERT INTO `".HAUS_LOG_TABLE."`(`type`,`message`,`data`) VALUES ('%s','%s','%s')";
$params = array(
is_array($types) ? implode(',',$types) : $types,
$message,
addslashes(is_string($data) ? $data : serialize($data))
);
dying_query(vsprintf($sql,$params),"Fehler beim Speichern eines Logeintrags (d'oh!)",__FILE__,__LINE__,true);
}
/**
* Stellt ein erweitertes die() zur Verfügung
* Es wird eine strukturierte Fehlermeldung mit Zusätzliche details ausgegeben
*
* @param string $nachricht Fehlermessage
* @param object $objekt Fehlerauslöser
* @param string $datei Datei des Vorfalls __FILE__
* @param int $zeile Zeile des Vorfalls __LINE__
*/
function stirb($nachricht,$objekt = null,$datei = "",$zeile = "",$nolog=false) {
global $session;
$basestr = "
'.$dump.''; } if(strpos(db_error(), '#0') === false) { $str .= "