• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

Weltdaten und Interface

DeletedUser

Gast
Ich meine sowas wie Otto-Normal-DS-Spieler-Mit-Stammesseite-Der-Programmieren-Kann...

Dieses Interface natürlich neben dem normalen.
Das normale ist dann eher für die DS groß tool programmierer wichtig.

Für leute die nur eine Statistik über ihren Stamm und so führen wär das Inteface trafficschonender.

Und wegen der Aktualität: ich würde die Stündliche aktualität, oder wie auch immer sie jetzt ist, beibehalten..
 

DeletedUser61508

Gast
Sicher würde sowas Traffic sparen, aber zum Preis von CPU und Plattenleistung. Für etwa 1000 Stämme auf einem Server einzelne Datenpakete vorzuhalten wäre Schwachsinn, einen extra Datenbankserver abzustellen, um auf diesen Direktqueries auf die letzten Weltdaten zu machen wäre auch recht teuer. Da der Traffic ohnehin als Flatrate verfügbar und die Bandbreite regelbar ist bleibt die bestehende Lösung wohl kalkulierbarer und kostenschonender als jede Alternative.
Aber vllt. macht sich ja wer trotz allem die Mühe sowas anzubieten!?
 

DeletedUser

Gast
also ich denke durchaus, dass die nachfrage für ein dementsprechendes interface da wäre ... einzige problem wäre die finanzierbarkeit, da dort ja keine werbung eingeblendet werden könnte. vor allem kleine tools und usercripte würden von so einem interface profitieren

MfG Dömel
 

DeletedUser

Gast
Import in eine MYSQL datenbank?
Kein Problem:

PHP:
function import_data(){
	$file="database.txt";
	//USER
	query("TRUNCATE TABLE `stamm_user`");
	$lines = gzfile('http://de28.die-staemme.de/map/tribe.txt.gz');
	if(!is_array($lines)){die('Datei konnte nicht geöffnet werden');}
	for($i = 0, $len = count($lines); $len > $i; $i++){
		if(strpos($lines[$i], $GLOBALS["STAMM_ID"])!==false){
	    	$line = explode(',',$lines[$i]);
	   		if($line[2] ==  $GLOBALS["STAMM_ID"]){
	    		$line[1]=str_replace("+", " ", $line[1]);
	      		query("INSERT INTO `stamm_user` ( `id` , `name` , `ally` , `villages` , `points` , `rank` ) VALUES ('$line[0]', '$line[1]', '$line[2]', '$line[3]', '$line[4]', '$line[5]');");
			}
	    }
	}
	unset($line);
	unset($lines);
	//DÖRFER
	query("TRUNCATE TABLE `data_towns`");
	$lines = gzfile('http://de28.die-staemme.de/map/village.txt.gz');
	if(!is_array($lines)) die("Datei konnte nicht geöffnet werden");
	$fp=fopen($file, 'w');
	foreach($lines as $line){
		fwrite($fp, $line);
	}
	$sql=query("LOAD DATA LOCAL INFILE '$file' INTO TABLE `data_towns` FIELDS TERMINATED BY ',' (`town_id`, `name`, `x`, `y`, `user`, `points`, `rank`)");
	fwrite($fp, "");
	fclose($fp);
	unset($lines);

	//Spieler
	query("TRUNCATE TABLE `data_spieler`");
	$lines = gzfile('http://de28.die-staemme.de/map/tribe.txt.gz');
	if(!is_array($lines)) die("Datei konnte nicht geöffnet werden");
	$fp=fopen($file, 'w');
	foreach($lines as $line){
		fwrite($fp, $line);
	}
	$sql=query("LOAD DATA LOCAL INFILE '$file' INTO TABLE `data_spieler` FIELDS TERMINATED BY ',' (`id`, `name`, `ally`, `villages`, `points`, `rank`)");
	fwrite($fp, "");
	fclose($fp);
	unset($lines);

	//Stämme
	query("TRUNCATE TABLE `data_staemme`");
	$lines = gzfile('http://de28.die-staemme.de/map/ally.txt.gz');
	if(!is_array($lines)) die("Datei konnte nicht geöffnet werden");
	$fp=fopen($file, 'w');
	foreach($lines as $line){
		fwrite($fp, $line);
	}
	$sql=query("LOAD DATA LOCAL INFILE '$file' INTO TABLE `data_staemme` FIELDS TERMINATED BY ',' (`id`, `name`, `tag`, `members`, `villages`, `points`, `all_points`, `rank`)");
	fwrite($fp, "");
	fclose($fp);
	unset($lines);

	//Conquers
	query("TRUNCATE TABLE `data_conquer`");
	$lines = gzfile('http://de28.die-staemme.de/map/conquer.txt.gz');
	if(!is_array($lines)) die("Datei konnte nicht geöffnet werden");
	$fp=fopen($file, 'w');
	foreach($lines as $line){
		fwrite($fp, $line);
	}
	$sql=query("LOAD DATA LOCAL INFILE '$file' INTO TABLE `data_conquer` FIELDS TERMINATED BY ',' (`village_id`, `timestamp`, `new_owner`, `old_owner`)");
	fwrite($fp, "");
	fclose($fp);
	unset($lines);

	$fp=fopen($file, 'w');
	fwrite($fp, "");
	fclose($fp);

}

Zuerst wird der Stoff in eine Lokale datei gebrieben und mit einer MYSQL Funktion direkt in die Datenbank importiert...
Das ist meines Erachtens die schnellste lösung die es gibt in PHP

grüße
Kordian
 

DeletedUser

Gast
Zuerst wird der Stoff in eine Lokale datei gebrieben und mit einer MYSQL Funktion direkt in die Datenbank importiert...
Das ist meines Erachtens die schnellste lösung die es gibt in PHP

grüße
Kordian

Hast du Zeiten gemessen? Meine Funktion machts in ~20 Sekunden ohne die Daten in ne Extra-Textdatei einzulesen ;-)
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
Zuerst wird der Stoff in eine Lokale datei gebrieben und mit einer MYSQL Funktion direkt in die Datenbank importiert...
Das ist meines Erachtens die schnellste lösung die es gibt in PHP

grüße
Kordian

/edit: Hab ich vertan....
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
für leute die keine Bash Zugriff haben ist das gedacht ;) :p

Zitat:
Zitat von kordian10 Beitrag anzeigen
Zuerst wird der Stoff in eine Lokale datei gebrieben und mit einer MYSQL Funktion direkt in die Datenbank importiert...
Das ist meines Erachtens die schnellste lösung die es gibt in PHP

grüße
Kordian


Da importierst du ja minuten lang allein für eine Welt.
Von LOAD DATA LOCAL (INFILE) haste noch nix gehört?

Öhm Blind?! Mit dem hab ichs ja gemacht...

Ich will hier ja keinem Konkurenz machen.. :D
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
ok. geb mich geschlagen. ist aber trotzdem nich optimal: ;-)

PHP:
    $lines = gzfile('http://de28.die-staemme.de/map/tribe.txt.gz');
    if(!is_array($lines)){die('Datei konnte nicht geöffnet werden');}
    for($i = 0, $len = count($lines); $len > $i; $i++){
        if(strpos($lines[$i], $GLOBALS["STAMM_ID"])!==false){
            $line = explode(',',$lines[$i]);
               if($line[2] ==  $GLOBALS["STAMM_ID"]){
                $line[1]=str_replace("+", " ", $line[1]);
                  query("INSERT INTO `stamm_user` ( `id` , `name` , `ally` , `villages` , `points` , `rank` ) VALUES ('$line[0]', '$line[1]', '$line[2]', '$line[3]', '$line[4]', '$line[5]');");
            }
        }
    }

ich glaub fast, dass du da besser dran wärst, wenn du alle user mittels load data local infile in eine tabelle lädst und dann per insert select die user, die du haben willst, in die stamm_user tabelle. :)
 

DeletedUser

Gast
joa glaub ich auch -.-

wollte da den ersten teil ned reintun...
 

DeletedUser

Gast
Woran kann man in den Files erkennen, dass ein User gelöscht wurde oder dass ein Stamm nicht mehr existiert?

Ich hab gerade das Gefühl das geht gar nicht.
 

DeletedUser

Gast
PHP:
    $lines = gzfile('http://de28.die-staemme.de/map/tribe.txt.gz');
    if(!is_array($lines)){die('Datei konnte nicht geöffnet werden');}
    for($i = 0, $len = count($lines); $len > $i; $i++){
        if(strpos($lines[$i], $GLOBALS["STAMM_ID"])!==false){
            $line = explode(',',$lines[$i]);
               if($line[2] ==  $GLOBALS["STAMM_ID"]){
                $line[1]=str_replace("+", " ", $line[1]);
                  query("INSERT INTO `stamm_user` ( `id` , `name` , `ally` , `villages` , `points` , `rank` ) VALUES ('$line[0]', '$line[1]', '$line[2]', '$line[3]', '$line[4]', '$line[5]');");
            }
        }
    }

Ich würde Prepared Statements nutzen ;)
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
 

DeletedUser

Gast
Woran kann man in den Files erkennen, dass ein User gelöscht wurde oder dass ein Stamm nicht mehr existiert?

Ich hab gerade das Gefühl das geht gar nicht.

Dazu brauchst du Vergleichswerte. Du könntest dir die Daten laden, speichern und dann einen Tag / eine Woche später vergleichen. Dann weißt du, wer alles in der Zwischenzeit aufgehört hat bzw. welcher Stamm sich aufgelöst hat ;-)
 

DeletedUser

Gast
Ok, die Lösung gefällt mir aber auch nicht.
Ich denke ich werde meine Tables um einen timestamp erweitern und dann alle die nicht mehr aktualisiert wurden entfernen, ist zumindest eine Lösung für die Allys und Villages. Die Spieler mit 0 Punkten kann ich dann weiter drin lassen so dass man sie bei den Adelungen sieht.
 

DeletedUser

Gast
PHP:
    $lines = gzfile('http://de28.die-staemme.de/map/tribe.txt.gz');
    if(!is_array($lines)){die('Datei konnte nicht geöffnet werden');}
    for($i = 0, $len = count($lines); $len > $i; $i++){
        if(strpos($lines[$i], $GLOBALS["STAMM_ID"])!==false){
            $line = explode(',',$lines[$i]);
               if($line[2] ==  $GLOBALS["STAMM_ID"]){
                $line[1]=str_replace("+", " ", $line[1]);
                  query("INSERT INTO `stamm_user` ( `id` , `name` , `ally` , `villages` , `points` , `rank` ) VALUES ('$line[0]', '$line[1]', '$line[2]', '$line[3]', '$line[4]', '$line[5]');");
            }
        }
    }

Ich würde Prepared Statements nutzen ;)
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

INSERT DELAYED is nochmal schneller... auch wenns geschummelt is :p

MfG
dispy
 

DeletedUser

Gast
@hengst85
Warum sollte es auch. Die Weltdaten geben ein Abbild des aktuellen Stands wieder.
Wenn du wissen willst, ob ein Spieler/Stamm/Dorf nicht mehr vorhanden ist, musst du die aktuellen Daten mit älteren vergleichen.
 

DeletedUser

Gast
Wälder, Berge, etc.:
http://die-staemme.de/stuff/world.dat

Sind 1000 Zeilen mit je 1000 Bytes, sprich 1.000.000 Byte ~ 1MB
Ein Byte steht für ein Feld auf der Karte, auslesen geht wie folgt:

PHP:
fseek($map_file, $y*1000+$x);

0-3 Gras
8-11 Berg
12 See
16-31 Wald

Hi Leute,

das ist sehr interessant, nur irgendwie bin ich zu doof, um die Bytes auch auszulesen.. ;-)
Ich wuerde mich sehr freuen, wenn jemand den php code um das fseek herum mal posten koennte..

Was fehlt mir, um einfach mal ein paar Testwerte ausgeben zu lassen?:
Code:
<?php
$handler = fopen("world.dat", "r");
for ($x=0; $x<30; $x++) {
  for ($y=0; $y<30; $y++) {
    fseek ($handler, $y * 1000 + $x);
    }
  echo "<br>";
  }
?>

Ciao,
Bastian
 

DeletedUser

Gast
fseek setzt den Cursor auf eine Position.
Das Byte muss dann aber auch noch mit fread ausgelesen werden.
PHP:
$type = fread($handler,1);
echo $type;
 

DeletedUser

Gast
Versucht habe ich das mit fgetc, fread und noch einer Funktion, die ich schon wieder vergessen habe.. ;-)

PHP:
<?php
$handler = fopen("world.dat", "r");
for ($x=0; $x<30; $x++) {
  for ($y=0; $y<30; $y++) {
    fseek ($handler, $y * 1000 + $x);
    $type = fread($handler,1);
    echo $type."-";
    }
  echo "<br>";
  }
?>

bringt leider nicht das gewuenschte Ergebnis.
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser61508

Gast
Was erwartest du denn für eine Ausgabe? Vielleicht ist es ja Blödsinn, aber die Rückgabe von fread() liefert doch einen String/in unserem Fall ein Zeichen mit ASCII Werten 1-31, korrekt? Dass dabei so komische Zeichen rauskommen, wenn man auch noch K0 einliest, der im Normalfall leer ist, scheint doch normal!?

Müsste nicht, um auf den eigentlichen Zahlenwert und damit die Grafik zu kommen, auf die Rückgabe von fread() noch ord() verwendet werden? Wie gesagt, vllt. ist es ja Blödsinn. ^^
 

DeletedUser

Gast
Bingo! "ord()" war der fehlende Teil des Puzzles!
Vielen Dank fuer alle Antworten! :cool:
 

DeletedUser

Gast
-/map/kill_att_tribe.txt, /map/kill_def_tribe.txt, /map/kill_all_tribe.txt

ranglisten der besiegten gegner für die stämme, war glaub noch nicht aufgeführt.
 

DeletedUser61508

Gast
-/map/kill_att_tribe.txt, /map/kill_def_tribe.txt, /map/kill_all_tribe.txt

ranglisten der besiegten gegner für die stämme, war glaub noch nicht aufgeführt.

*_tribe für Stämme entspricht aber nicht der Standard-Benamung, oder? Aber ne sehr sinnvolle Info, die hoffentlich den tatsächlichen Bashdaten aus dem Spiel entspricht!?
 

DeletedUser

Gast
Das hat mir ein Entwickler so mitgeteilt. Obs nun von der Nomanklatur zu den anderen Daten passt oder nicht wird da wohl nicht so eng gesehen oder es gehört zum Prozess des Umstellens.

Project: Die Staemme
Issue Type: Improvement
deliver defeated oppenent data also for tribes
Resolution:
kill_all_tribe.txt
kill_att_tribe.txt
kill_def_tribe.txt
 

DeletedUser

Gast
*_tribe für Stämme entspricht aber nicht der Standard-Benamung, oder? Aber ne sehr sinnvolle Info, die hoffentlich den tatsächlichen Bashdaten aus dem Spiel entspricht!?

benamung is in der tat seltsam ... aber der inahlt scheint mit der internen basherliste übereinzustimmen

MfG Dömel

/e:
Das hat mir ein Entwickler so mitgeteilt. Obs nun von der Nomanklatur zu den anderen Daten passt oder nicht wird da wohl nicht so eng gesehen oder es gehört zum Prozess des Umstellens.
von tribe/ally zu player/tribe == seltsam
 
Oben