<div id="content-pic">
<?php include 'templates/Ress.tpl'; ?>
</div>
<div id=content>
<div id=mappic>
<?php
//error_reporting(E_ALL);
//// Variablen und Grundwerte zur Karten und Positionsberechnung
$SlicepointX = $UserMapX*10-277; // Auschnittspunkt X
$SlicepointY = $UserMapY*10-220; // Auschnittspunkt Y
$NearestKoordsX1 = $UserMapX-21;
$NearestKoordsX2 = $UserMapX+22;
$NearestKoordsY1 = $UserMapY-27; // Erfassung aller Spieler des Kartenausschnittes
$NearestKoordsY2 = $UserMapY+27;
//// Abweichende Berechnung bei Kartenrandnähe ansonsten wird Spieler immer auf der Mitte angezeigt
if ($UserMapX<22) {
$SlicepointX = 0;
$NearestKoordsX1 = 0;
$NearestKoordsX2 = 44;
}
if ($UserMapX>178) {
$SlicepointX = 1457;
$NearestKoordsX2 = 201;
$NearestKoordsX1 = 156;
}
if ($UserMapY<28) {
$SlicepointY = 0;
$NearestKoordsY1 = 0;
$NearestKoordsY2 = 56;
}
if ($UserMapY>172) {
$SlicepointY = 1568;
$NearestKoordsY2 = 201;
$NearestKoordsY1 = 145;
}
//// Aus der 2000*2000Px Karte den passenden KartenAusschnitt erstellen (Tiling)
$dir= "img/Map/$SlicepointX";
if (file_exists($dir) == false) {
mkdir("img/Map/$SlicepointX", 0700); // Verzeichniss erstellen wenn noch nie erstellt
}
$file= "img/Map/$SlicepointX/$SlicepointY.jpeg";
if (file_exists($file) == false) { // Prüfen ob Auschnitt (Tile) schon existiert
//// Kartenausschnitt ohne Spielerposition
$size = array(543,432); // Breite und Höhe des Auschnitts
$point = array($SlicepointX,$SlicepointY); // Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
$image = imagecreatefromjpeg("img/MAP1.jpg") ; // Original einlesen
$new = imagecreatetruecolor($size[0],$size[1]); // Neues Bild leer erstellen
imagecopyresampled($new, $image, 0,0, $point[0],$point[1],
$size[0],$size[1], $size[0],$size[1]); // Ausschnitt rüberkopieren
imageJPEG($new,"img/Map/$SlicepointX/$SlicepointY.jpeg",100); // Bild speichern
}
//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
$sql = "SELECT
PosX,
PosY,
Username
FROM
User
WHERE
PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
// SammelplatzID der gefundenen Sammelplätze in Array speichern
$sql = "SELECT
SammelplatzID
FROM
FoundSammelplatz
WHERE
Username ='$Username'";
$result1 = $db->query($sql);
if (!$result1) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row1 = $result1->fetch_assoc()) {
$SammelplatzID1[] = $row1;
}
// Array in Variable speichern. Wird bei der nächsten Datenbankabfrage benötigt
$count=count($SammelplatzID1);
for($i = 0; $i < $count; $i++) {
if ($i == $count-1) {
// beim letzten Datensatz kein Kommata hinzufügen
$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"];
}
else {
$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"].',';
}
}
// Alle Sammelplätze, Koordinaten, Art und Menge in Array speichern
$sql = "SELECT
Ressource,
ScrapX,
ScrapY,
Menge
FROM
Sammelplatz
WHERE
SammelplatzID IN ($Sammelplatz)
AND
ScrapX >=$NearestKoordsX1 AND ScrapX < $NearestKoordsX2
AND
ScrapY >=$NearestKoordsY1 AND ScrapY < $NearestKoordsY2";
$result2 = $db->query($sql);
if (!$result2) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row2 = $result2->fetch_assoc()) {
$Sammel[] = $row2;
}
// Folgende Funktionen ersetzen die Keys ScrapX/ScrapY mit PosX/PosY
// gefunden auf Tutorials.de danke Yaslaw
$Sammel=correctKeysRekursiveX($Sammel);
$Sammel=(correctKeysRekursiveY($Sammel));
function correctKeysRekursiveX($Sammel){
//Die Schlüssel extrahieren
$keys = array_keys($Sammel);
//In allen Schlüsseln @ durch nix ersetzen
foreach($keys as $index => $key){
//Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden
if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveX($Sammel[$key]);
$keys[$index] = str_replace("ScrapX", "PosX", $key);
}
//Den Array wieder zusammensetzen
return array_combine($keys, $Sammel);
}
function correctKeysRekursiveY($Sammel){
//Die Schlüssel extrahieren
$keys = array_keys($Sammel);
//In allen Schlüsseln @ durch nix ersetzen
foreach($keys as $index => $key){
//Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden
if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveY($Sammel[$key]);
$keys[$index] = str_replace("ScrapY", "PosY", $key);
}
//Den Array wieder zusammensetzen
return array_combine($keys, $Sammel);
}
// Arrays zusammenführen
$data1=array_merge($data,$Sammel);
// Array $koords mit allen Kordinaten innerhalb des Kartenausschnitts befüllen
$koords=array();
$count=count($koords);
for ($i=$NearestKoordsX1; $i<$NearestKoordsX2; $i++) {
for ($j=$NearestKoordsY1; $j<$NearestKoordsY2; $j++) {
$count++;
$koords[$count]['PosX'] = $i;
$koords[$count]['PosY'] = $j;
}
}
// Array $koords mit Array $data1 vergleichen
// Wenn Koordinaten aus Array $koords nicht im Array $data1 vorhanden sind
// wird das Koordinatenpaar dem Array $data hinzugefügt
// VIELEN DANK YASLAW VON TUTORIALS.DE
foreach($koords as $koord){
$flag = false;
foreach($data1 as $item){
if($koord["PosX"]==$item["PosX"] && $koord["PosY"]==$item["PosY"]){
$flag = true;
break;
}
}
if(!$flag){
$newIndex = count($data1);
$data1[$newIndex]["PosX"] = $koord["PosX"];
$data1[$newIndex]["PosY"] = $koord["PosY"];
}
}
//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';
//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);
foreach($data1 as $item)
{
$node=$doc->
documentElement->
getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));
if ($item['Username']==$Username) {
$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
}
if ($item['Ressource']!='') {
$node->setAttribute('title',''.$item['Menge'].' '.$item['Ressource'].': '.$item['PosX'].'/'.$item['PosY']);
}
if ($item['Username']!=$Username AND $item['Ressource']=='') {
$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
}
if ($item['Username']=='' AND $item['Ressource']==''){
$node->setAttribute('title',''.$item['PosX'].'/'.$item['PosY']);
}
$node->setAttribute('href',
'main.php?section=erkunden&PosX='.$item["PosX"].'&PosY='.$item["PosY"].'');
if($item['Username']==$Username){
$node->setAttribute('class','me');
}
if ($item['Ressource']!='') {
$node->setAttribute('class','ress');
}
if ($item['Username']!=$Username AND $item['Ressource']=='') {
$node->setAttribute('class','enemy');
}
if ($item['Username']=='' AND $item['Ressource']=='') {
$node->setAttribute('class','empty');
}
}
// Abfrage der Bewegungen der User innerhalb des Kartenbereichs
$sql = "SELECT
PosX,
PosY,
MoveX,
MoveY,
Username
FROM
User
WHERE
MoveX >=$NearestKoordsX1 AND MoveX < $NearestKoordsX2
AND
MoveY >=$NearestKoordsY1 AND MoveY < $NearestKoordsY2";
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
$data2[] = $row;
}
// Nur Bewegungen der User ausserhlb ihres Bunkers auf der Karte zeigen
foreach($data2 as $item)
{
$node=$doc->
documentElement->
// dem Gitter Bewegungskoordinaten zuordnen
getElementsByTagName('div')->item(($item['MoveX']-$NearestKoordsX1))->
getElementsByTagName('a')->item(($item['MoveY']-$NearestKoordsY1));
// User ausserhalb von Bunker?
if ($item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY']){
// Atribute an dieser Position schon vergeben?
if (($title = $node->getAttribute('title')) != '') {
// weiteren User ans titleTAG granhängen
$title.= ''.': '.$item['Username'];
}
// Atribut nicht vergeben
else {
// User ins Atribut schreiben
$title = ''.$item['Username'];
}
//Attribut erstellen
$node->setAttribute('title', $title);
}
//Link generieren mit Position (Position wird auf erkunden.php ausgelesen)
$node->setAttribute('href',
'main.php?section=erkunden&PosX='.$item["MoveX"].'&PosY='.$item["MoveY"].'');
// Klasse erstellen und Minigrafik auf Karte an Position zeigen
if ($item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY']){
$node->setAttribute('class','move');
}
}
?>
<style type="text/css">
/*CSS fürs Grid*/
#grid{
background: url(img/Map/<? echo "$SlicepointX/$SlicepointY"; ?>.jpeg) no-repeat;
width:543px;
height:432px;
}
#grid div{
width:543px;
height:10px;
}
#grid div a{
display:block;
width:10px;
height:10px;
float:left;
}
/*CSS zur markierung der Felder, hier könnte man statt Farben Sprites einsetzen*/
#grid a.me{
background: url(img/list12x12-dot18.gif) no-repeat;
}
#grid a.move{
background: url(img/pin25.gif) no-repeat;
}
#grid a.enemy{
background: url(img/list12x12-dot19.gif) no-repeat;
}
#grid a.ress{
//margin: 1px 0px 0px 1px;
background: url(img/minidot8x8-19.gif) no-repeat;
}
#grid a.empty{
}
</style>
<?php
//Ausgabe des Grids
echo $doc->saveHTML();
?>
</div>
</div>
<div id="upper-pic">
</div>
<div id="uppercontent">
<h2><?php
echo "Benötigte Dauer: ".(microtime(true)-$start)." Sekunden.<br>";
echo "Die Map wird zur Zeit optimiert.";
//var_dump($row["Username"]);
//unset($_SESSION['Positionen']);
//echo "unset ";
?></h2>
</div>