"; } $chunkymap_anchor_name="chunkymap_top"; $is_verbose = false; if ($is_verbose) echo "REQUEST..."; foreach($_REQUEST as $key => $value) { //in case auto_globals is not enabled $GLOBALS[$key]=$value; if ($is_verbose) echo "$key:$value..."; } if ($is_verbose) echo "timezone..."; date_default_timezone_set('EST'); //required by PHP >=5.1.0 if ($is_verbose) echo "globals..."; //$chunkymap_view_x=0; //$chunkymap_view_z=0; //$chunkymap_view_zoom_multiplier=25; if (!isset($chunkymap_view_x)) { $chunkymap_view_x=0; } if (!isset($chunkymap_view_z)) { $chunkymap_view_z=0; } if (!isset($chunkymap_view_zoom_multiplier)) { $chunkymap_view_zoom_multiplier=.25; } $chunkymapdata_path = "chunkymapdata"; $chunkymapdata_worlds_path = $chunkymapdata_path."/worlds"; $chunkymapdata_thisworld_path = null; $showplayers=true; // NOT OPTIONAL: $chunkymap_tile_original_w=16; $chunkymap_tile_original_h=16; $chunk_dimension_min=$chunkymap_tile_original_w; if ($chunkymap_tile_original_h<$chunk_dimension_min) $chunk_dimension_min=$chunkymap_tile_original_h; $chunkymap_view_min_zoom=1.0/$chunk_dimension_min; //should be a number that would get to exactly 100 eventually if multiplied by 2 repeatedly (such as 0.09765625); 0.005 was avoided since tiles used to be 80x80 pixels $chunkymap_view_max_zoom=13107200.0; function echo_error($val) { if (!isset($val)) { $val="Unknown Error"; } echo ''.$val.'
'."\n"; } function get_dict_from_conf($path, $assignment_operator) { global $is_verbose; if ($is_verbose) echo "get_dict..."; $handle = fopen($path, "r"); $result = null; if ($handle) { while (($line = fgets($handle)) !== false) { $line_strip = trim($line); if (strlen($line_strip)>0) { if (substr($line_strip,0,1)!="#") { $ao_index = strpos($line_strip, $assignment_operator); if ($ao_index>0 and $ao_index<(strlen($line_strip)-1)) { //skip blank variable OR value $found_name = substr($line_strip, 0, $ao_index); $found_value_index = $ao_index + 1; $found_value = substr($line_strip, $found_value_index, strlen($line_strip)-$found_value_index); if ($result===null) { $result = array(); } $result[$found_name]=$found_value; } } } } fclose($handle); } else { echo "Failed to read $path (run chunkymap-cronjob script as root first, otherwise see README.md in minetest-chunkymap to ensure installation is correct).
"; } return $result; }//end get_dict_from_conf $map_dict = null; //startsWith and endsWith are from: //Salmon A. stackoverflow. . 5 Feb 2016. 19 Feb, 2016. function startsWith($haystack, $needle) { // search backwards starting from haystack length characters from the end return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false; } function endsWith($haystack, $needle) { // search forward starting from end minus needle length characters return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== false); } //NOTE: This function is here since the builtin is_int checks type (which is not needed in this webapp) and the builtin is_numeric includes decimal and exponent (see http://php.net/manual/en/function.is-numeric.php) function is_int_string($val) { global $is_verbose; if ($is_verbose) echo "is_int_string..."; $result = true; $int_chars="0123456789-"; for ($i=0; $i"; } function echo_chunkymap_controls() { global $chunkymap_view_x; global $chunkymap_view_z; global $chunkymap_view_zoom_multiplier; global $chunkymap_view_max_zoom; global $chunkymap_view_min_zoom; global $chunkymap_anchor_name; $is_in=false; $is_out=false; $in_img_name = "zoom-in.png"; $out_img_name = "zoom-out.png"; $in_zoom = $chunkymap_view_zoom_multiplier; if ($in_zoom<$chunkymap_view_max_zoom) { $is_in=true; $in_zoom = $chunkymap_view_zoom_multiplier*2.0; //echo "in:$in_zoom "; } else $in_img_name = "zoom-in_disabled.png"; $out_zoom = $chunkymap_view_zoom_multiplier; if ($out_zoom>$chunkymap_view_min_zoom) { $is_out=true; $out_zoom = ($chunkymap_view_zoom_multiplier/2.0); } else $out_img_name = "zoom-out_disabled.png"; $zoom_clip = $chunkymap_view_max_zoom; $found=false; while ($zoom_clip>=$chunkymap_view_min_zoom) { if ($out_zoom>$zoom_clip) { $out_zoom=$zoom_clip*2; $found=true; break; } $zoom_clip = $zoom_clip/2; } if (!$found) { $out_zoom=$chunkymap_view_min_zoom; } //if ($in_zoom>$chunkymap_view_max_zoom) { // $in_zoom=$chunkymap_view_max_zoom; // echo ""; //} //elseif ($in_zoom>200) $in_zoom=400; //elseif ($in_zoom>100) $in_zoom=200; //elseif ($in_zoom>75) $in_zoom=100; //if ($in_zoom>50) $in_zoom=75; //elseif ($in_zoom>25) $in_zoom=50; //elseif ($in_zoom>12) $in_zoom=25; //elseif ($in_zoom>4) $in_zoom=12; //elseif ($in_zoom>2) $in_zoom=4; //elseif ($in_zoom>1) $in_zoom=2; //else $in_zoom=$chunkymap_view_min_zoom; // if ($in_zoom>1) $in_zoom=5; //echo "in:$in_zoom "; // if ($out_zoom<$chunkymap_view_min_zoom) $out_zoom=$chunkymap_view_min_zoom; // elseif ($out_zoom<2) $out_zoom=1; // elseif ($out_zoom<4) $out_zoom=2; // elseif ($out_zoom<12) $out_zoom=4; // elseif ($out_zoom<25) $out_zoom=12; // elseif ($out_zoom<50) $out_zoom=25; // elseif ($out_zoom<75) $out_zoom=50; // elseif ($out_zoom<100) $out_zoom=75; //elseif ($out_zoom<200) $out_zoom=100; //elseif ($out_zoom<$chunkymap_view_max_zoom) $out_zoom=(int)($chunkymap_view_max_zoom/2); //else $out_zoom=$chunkymap_view_max_zoom; //if ($out_zoom>76) $out_zoom=100; $zoom_clip=$chunkymap_view_min_zoom; $found=false; while ($zoom_clip<=$chunkymap_view_max_zoom) { if ($in_zoom<($zoom_clip*2)) { $in_zoom=$zoom_clip; $found=true; break; } $zoom_clip = $zoom_clip * 2; } if (!$found) $in_zoom=$chunkymap_view_max_zoom; $in_html=""; $out_html=""; global $world_name; $append_vars="&"; if (isset($world_name)) { $prefix = ""; if (strlen($append_vars)>0 && !endsWith($append_vars,"&") ) { $prefix = "&"; } $append_vars.="$prefix"."world_name=$world_name"; } if ($is_in) $in_html="$in_html"; if ($is_out) $out_html="$out_html"; echo $in_html; echo $out_html; } $is_echo_never_held=false; $held_echos=""; function echo_hold($val) { global $is_echo_never_held; global $held_echos; if (!$is_echo_never_held) $held_echos.="$val"; else echo "$val"; } function echo_release() { global $held_echos; global $is_echo_never_held; if (!$is_echo_never_held) echo "$held_echos"; $held_echos=""; } function echo_map_heading_text() { echo "Chunkymap"; //echo "Map of "; //echo_worldname(); } // function echo_worldname() { // global $map_dict; // if (isset($map_dict["world_name"])) { // echo $map_dict["world_name"]; // } // else echo "(missing world name)"; // } function get_chunk_folder_path_from_chunky_coords($chunky_x, $chunky_z) { global $chunkymapdata_thisworld_path; //NOTE: floor converts -.5 to -1 (and -1.5 to -2) but .5 to 0 $decachunk_x = get_decachunky_coord_from_chunky_coord($chunky_x); $decachunk_z = get_decachunky_coord_from_chunky_coord($chunky_z); //if ($x<0) { $decachunk_x = $x + $x%10; } //else { $decachunk_x = $x - $x%10; } //if ($z<0) { $decachunk_z = $z + $z%10; } //else { $decachunk_z = $z - $z%10; } $result = $chunkymapdata_thisworld_path.'/16px/'.$decachunk_x.'/'.$decachunk_z; return $result; } function get_decachunk_folder_path_from_location($x, $z) { global $chunkymapdata_thisworld_path; //NOTE: floor converts -.5 to -1 (and -1.5 to -2) but .5 to 0 $chunky_x = get_chunky_coord_from_location($x); $chunky_z = get_chunky_coord_from_location($z); $decachunky_x = get_decachunky_coord_from_chunky_coord($chunky_x); $decachunky_z = get_decachunky_coord_from_chunky_coord($chunky_z); $hectochunk_x = get_hectochunky_coord_from_decachunky_coord($decachunky_x); $hectochunk_z = get_hectochunky_coord_from_decachunky_coord($decachunky_z); $result = $chunkymapdata_thisworld_path.'/160px/'.$hectochunk_x.'/'.$hectochunk_z; return $result; } function get_decachunk_folder_path_from_decachunk($chunky_x, $chunky_z) { global $chunkymapdata_thisworld_path; //NOTE: floor converts -.5 to -1 (and -1.5 to -2) but .5 to 0 $hectochunk_x = get_hectochunky_coord_from_decachunky_coord($chunky_x); $hectochunk_z = get_hectochunky_coord_from_decachunky_coord($chunky_z); $result = $chunkymapdata_thisworld_path.'/160px/'.$hectochunk_x.'/'.$hectochunk_z; return $result; } function get_chunky_coord_from_location($location_x) { $chunk_x = intval($location_x/16); return $chunk_x; } function get_decachunky_coord_from_chunky_coord($chunky_x) { return intval(floor((float)$chunky_x/10.0)); } function get_hectochunky_coord_from_decachunky_coord($chunky_x) { return intval(floor((float)$chunky_x/10.0)); } function get_decachunky_coord_from_location($location_x) { $chunk_x = get_chunky_coord_from_location($location_x); $decachunk_x = get_decachunky_coord_from_chunky_coord($chunk_x); return $decachunk_x; } function get_decachunk_image_name_from_decachunk($x, $z) { return "decachunk_x"."$x"."z"."$z".".jpg"; } function echo_chunkymap_canvas() { global $chunkymap_view_x; global $chunkymap_view_z; global $chunkymap_view_zoom_multiplier; global $chunkymap_view_max_zoom; global $chunkymap_view_min_zoom; global $showplayers; check_world(); global $chunkymapdata_thisworld_path; global $world_name; global $chunkymapdata_worlds_path; $x_opener="decachunk_x"; $z_opener="z"; $dot_and_ext = ".jpg"; if ($chunkymap_view_zoom_multiplier<$chunkymap_view_min_zoom) $chunkymap_view_zoom_multiplier = $chunkymap_view_min_zoom; if ($chunkymap_view_zoom_multiplier>$chunkymap_view_max_zoom) $chunkymap_view_zoom_multiplier = $chunkymap_view_max_zoom; $decachunks_per_page = 1.0/$chunkymap_view_zoom_multiplier; $view_w = (($decachunks_per_page*160.0)); $view_h = (($decachunks_per_page*160.0)); $view_left = (($chunkymap_view_x)) - (($view_w/2.0)); $view_right = $view_left + $view_w; //z is cartesian still: $view_top = (($chunkymap_view_z)) + (($view_h/2.0)); $view_bottom = $view_top - $view_h; echo_chunkymap_anchor(); echo_chunkymap_controls(); echo "\r\n"; echo " ".($chunkymap_view_zoom_multiplier*100.0)."%\r\n";//(string)((int)($chunkymap_view_zoom_multiplier*100+.5)); //"chunkymapdata/images/compass-rose.png" //"chunkymapdata/images/start.png" $decachunky_min_x = get_decachunky_coord_from_location($view_left); $decachunky_min_z = get_decachunky_coord_from_location($view_bottom); $decachunky_max_x = get_decachunky_coord_from_location($view_right); $decachunky_max_z = get_decachunky_coord_from_location($view_top); $decachunky_count_x = $decachunky_max_x-$decachunky_min_x+1; $decachunky_count_z = $decachunky_max_z-$decachunky_min_z+1; //#region local vars $generated_yml_path = $chunkymapdata_thisworld_path."/generated.yml"; //#endregion local vars $decachunky_z=$decachunky_max_z; //echo "
"; //echo "$decachunky_min_x:$decachunky_max_x,$decachunky_min_z:$decachunky_max_z
"; $td_placeholder_content=""; $td_1px_placeholder_content=""; echo ''."\r\n"; echo ' '."\r\n"; echo ' '."\r\n"; echo " '."\r\n"; echo ' '."\r\n"; echo ' '."\r\n"; $cell_perc=intval(round(100.0/$decachunky_count_x)); echo ' '."\r\n"; echo " '."\r\n"; echo ' '."\r\n"; echo " '."\r\n"; echo ' '."\r\n"; echo ' '."\r\n"; echo ' '."\r\n"; echo " '."\r\n"; echo ' '."\r\n"; echo ' '."\r\n"; echo '
'."$td_placeholder_content".'".''.''."$td_placeholder_content".'
".''.''."\r\n"; echo ' '."\r\n"; while ($decachunky_z>=$decachunky_min_z) { echo ' '."\r\n"; $decachunky_x=$decachunky_min_x; $cell_perc_remaining=100; while ($decachunky_x<=$decachunky_max_x) { $decachunk_file_name=get_decachunk_image_name_from_decachunk($decachunky_x, $decachunky_z); $decachunk_file_path=get_decachunk_folder_path_from_decachunk($decachunky_x, $decachunky_z).'/'.$decachunk_file_name; $td_content=""; if (is_file($decachunk_file_path)) { $td_content=""; } $this_cell_perc=$cell_perc; if ($cell_perc_remaining>=$this_cell_perc) { echo " '."\r\n"; //echo ' '."\r\n"; $cell_perc_remaining-=$this_cell_perc; } $decachunky_x+=1; } if ($cell_perc_remaining>0) { $td_content=$td_1px_placeholder_content; echo " "."\r\n"; } echo ' '."\r\n"; $decachunky_z-=1; } echo '
"."$td_content".''."$decachunky_x,$decachunky_z".'$td_content
'."\r\n"; echo '
".''.'
'."$td_placeholder_content".'".''.''."$td_placeholder_content".'
'."\r\n"; } function check_world() { global $chunkymapdata_thisworld_path; global $world_name; global $chunkymapdata_worlds_path; if (!isset($world_name)) { if ($handle = opendir($chunkymapdata_worlds_path)) { while (false !== ($file_name = readdir($handle))) { if (substr($file_name, 0, 1) != ".") { $file_path = $chunkymapdata_worlds_path."/".$file_name; if (is_dir($file_path)) { $world_name=$file_name; break; } } } closedir($handle); } } if (isset($world_name)) { $chunkymapdata_thisworld_path = $chunkymapdata_worlds_path."/".$world_name; } } //formerly echo_chunkymap_table function echo_chunkymap_as_chunk_table($show_all_enable) { ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); //error_reporting(-1); global $is_echo_never_held; $is_echo_never_held=true; global $chunkymap_view_x; global $chunkymap_view_z; global $chunkymap_view_zoom_multiplier; global $chunkymap_view_max_zoom; global $chunkymap_view_min_zoom; global $chunkymapdata_path; global $chunkymapdata_worlds_path; global $map_dict; global $is_verbose; global $chunkymap_tile_original_w; global $chunkymap_tile_original_h; global $chunkymap_view_max_zoom; global $world_name; echo_chunkymap_anchor(); echo_chunkymap_controls(); echo " ".($chunkymap_view_zoom_multiplier*100.0)."%";//(string)((int)($chunkymap_view_zoom_multiplier*100+.5)); if ($chunkymap_view_zoom_multiplier<$chunkymap_view_min_zoom) $chunkymap_view_zoom_multiplier = $chunkymap_view_min_zoom; if ($chunkymap_view_zoom_multiplier>$chunkymap_view_max_zoom) $chunkymap_view_zoom_multiplier = $chunkymap_view_max_zoom; //$zoom_divisor = (int)(100/$chunkymap_view_zoom_multiplier); $chunk_assoc = array(); // used for storing players; and used for determining which chunks are on the edge, since not all generated map tiles are the same size (edge tile images are smaller and corner ones are smaller yet) $chunk_count = 0; $x_opener="chunk_x"; $z_opener="z"; $dot_and_ext = ".png"; $min_chunkx = 0; $min_chunkz = 0; $max_chunkx = 0; $max_chunkz = 0; $chunks_per_page = (1.0/$chunkymap_view_zoom_multiplier)*10; $view_w = (($chunks_per_page*16.0)); $view_h = (($chunks_per_page*16.0)); $view_left = (($chunkymap_view_x)) - (($view_w/2.0)); $view_right = $view_left + $view_w; //z is cartesian still: $view_top = (($chunkymap_view_z)) + (($view_h/2.0)); $view_bottom = $view_top - $view_h; if (!$show_all_enable) { $min_chunkx=intval($view_left/$chunkymap_tile_original_w); $max_chunkx=intval($view_right/$chunkymap_tile_original_w); $min_chunkz=intval($view_bottom/$chunkymap_tile_original_w); $max_chunkz=intval($view_top/$chunkymap_tile_original_w); } global $showplayers; $players = array(); $player_count = 0; $character_icon_w=8; $character_icon_h=8; global $chunkymapdata_thisworld_path; check_world(); if (isset($world_name)) { $generated_yml_path = $chunkymapdata_thisworld_path."/generated.yml"; if (is_file($generated_yml_path)) { $map_dict = get_dict_from_conf($generated_yml_path,":"); } else { echo_error("Missing '".$generated_yml_path."'"); } if ($showplayers==true) { $chunkymap_players_path = $chunkymapdata_thisworld_path."/players"; if ($handle = opendir($chunkymap_players_path)) { while (false !== ($file_name = readdir($handle))) { if (substr($file_name, 0, 1) != ".") { $file_lower = strtolower($file_name); if (endsWith($file_lower, ".yml")) { $player_id=substr($file_name,0,strlen($file_name)-4); //-4 for .yml $file_path = $chunkymap_players_path."/".$file_name; if (is_file($file_path)) { $player_dict = get_dict_from_conf($file_path,":"); } else { echo_error("Missing '$player_dict'"); } $player_dict["id"]=$player_id; //$players[$player_count]=get_dict_from_conf($file_path); //$players[$player_count]["id"]=$player_id; //if (isset($player_dict["position"])) { if (isset($player_dict["x"]) and isset($player_dict["z"])) { //$tuple_string=trim($player_dict["position"]); //if ( startsWith($tuple_string, "(") and endsWith($tuple_string, ")") ) { // $tuple_string=substr($tuple_string,1,strlen($tuple_string)-2); //} //$coordinates = explode(",", $tuple_string); //if (count($coordinates)==3) { //$nonchunky_x=(int)$coordinates[0]; //$nonchunky_z=(int)$coordinates[2]; $nonchunky_x=(int)$player_dict["x"]; $nonchunky_z=(int)$player_dict["z"]; $x = (int)( $nonchunky_x/$chunkymap_tile_original_w ); $z = (int)( $nonchunky_z/$chunkymap_tile_original_h ); $chunk_luid = "x".$x."z".$z; $rel_x = $nonchunky_x - ($x*$chunkymap_tile_original_w); $rel_z = $nonchunky_z - ($z*$chunkymap_tile_original_h); if (!isset($chunk_assoc[$chunk_luid])) { $chunk_assoc[$chunk_luid] = array(); } if (!isset($chunk_assoc[$chunk_luid]["players"])) { $chunk_assoc[$chunk_luid]["players"] = array(); } if (!isset($chunk_assoc[$chunk_luid]["players_count"])) { $chunk_assoc[$chunk_luid]["players_count"] = 0; } //already checked for position in outer case //DEPRECATED: $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "position" ] = $player_dict["position"]; $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "x" ] = $player_dict["x"]; $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "z" ] = $player_dict["z"]; $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "rel_x" ] = $rel_x; $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "rel_z" ] = $rel_z; $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "file_path" ] = $file_path; if (isset($player_dict["name"])) { $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "text" ] = $player_dict["name"]; } else { $chunk_assoc[$chunk_luid][ "players" ][ $chunk_assoc[$chunk_luid]["players_count"] ][ "text" ] = $player_dict["id"]; } $chunk_assoc[$chunk_luid]["players_count"] += 1; //} //else { // echo_error("Bad coordinates $tuple_string for player."); //} } else { echo_error("Missing player location in data: ".implode(" ",$player_dict)); } //$player_count++; } } } closedir($handle); } } $chunkymap_markers_path = $chunkymapdata_thisworld_path."/markers"; if ($handle = opendir($chunkymap_markers_path)) { while (false !== ($file_name = readdir($handle))) { if (substr($file_name, 0, 1) != ".") { $file_name_lower = strtolower($file_name); if (endsWith($file_name_lower, ".yml")) { $file_path = $chunkymap_markers_path."/".$file_name; $marker_vars = get_dict_from_conf($file_path, ":"); $abs_pos = explode(",",$marker_vars["location"]); if (count($abs_pos)==3) { //convert from 3d to 2d: $abs_pos[1]=$abs_pos[3]; } //$text = ""; //if (isset($marker_vars["text"])) { // $text = $marker_vars["text"]; //} if (count($abs_pos)>=2) { $chunky_x = intval($abs_pos[0]/$chunkymap_tile_original_w); $chunky_z = intval($abs_pos[1]/$chunkymap_tile_original_h); $rel_x = intval($abs_pos[0]) - ($chunky_x*$chunkymap_tile_original_w); $rel_z = intval($abs_pos[1]) - ($chunky_z*$chunkymap_tile_original_h); $chunk_luid = 'x'.$chunky_x.'z'.$chunky_z; if (!isset($chunk_assoc[$chunk_luid])) { $chunk_assoc[$chunk_luid] = array(); } if (!isset($chunk_assoc[$chunk_luid]["markers"])) { $chunk_assoc[$chunk_luid]["markers"] = array(); } if (!isset($chunk_assoc[$chunk_luid]["markers_count"])) { $chunk_assoc[$chunk_luid]["markers_count"] = 0; } $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "x" ] = $abs_pos[0]; $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "z" ] = $abs_pos[1]; $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "rel_x" ] = $rel_x; $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "rel_z" ] = $rel_z; if (isset($marker_vars["image"])) { $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "image" ] = $marker_vars["image"]; } if (isset($marker_vars["text"])) { $chunk_assoc[$chunk_luid][ "markers" ][ $chunk_assoc[$chunk_luid]["markers_count"] ][ "text" ] = $marker_vars["text"]; } $chunk_assoc[$chunk_luid]["markers_count"] += 1; } else { echo_error("Bad location in marker file '$file_path'"); } } } } } //if ($map_dict != null) { // $min_chunkx = $map_dict["min_chunkx"]; // $min_chunkz = $map_dict["min_chunkz"]; // $max_chunkx = $map_dict["max_chunkx"]; // $max_chunkz = $map_dict["max_chunkz"]; //} //else { //echo "calculating range..."; //NOTE: even though *min and *max could be known from $map_dict, build a dict of chunks in order to align images properly since they are not all the same size: $chunks_16px_path = $chunkymapdata_thisworld_path.'/'."16px"; if ($chunks_16px_handle = opendir($chunks_16px_path)) { while (false !== ($decachunk_x_name = readdir($chunks_16px_handle))) { $decachunk_x_path = $chunks_16px_path."/".$decachunk_x_name; if ((substr($decachunk_x_name, 0, 1) != ".") and is_dir($decachunk_x_path)) { $decachunk_x_handle = opendir($decachunk_x_path); while (false !== ($decachunk_z_name = readdir($decachunk_x_handle))) { $decachunk_folder_path = $decachunk_x_path."/".$decachunk_z_name; if ((substr($decachunk_z_name, 0, 1) != ".") and is_dir($decachunk_folder_path)) { $decachunk_z_handle = opendir($decachunk_folder_path); while (false !== ($chunk_name = readdir($decachunk_z_handle))) { $file_lower = strtolower($chunk_name); if (endsWith($file_lower, $dot_and_ext) and startsWith($file_lower, $x_opener)) { $z_opener_index = strpos($file_lower, $z_opener, strlen($x_opener)); if ($z_opener_index !== false) { $x_len = $z_opener_index - strlen($x_opener); $remaining_len = strlen($file_lower) - strlen($x_opener) - $x_len - strlen($z_opener) - strlen($dot_and_ext); $x = substr($file_lower, strlen($x_opener), $x_len); $z = substr($file_lower, $z_opener_index + strlen($z_opener), $remaining_len); if (is_int_string($x) and is_int_string($z)) { $chunk_luid = "x".$x."z".$z; if (!isset($chunk_assoc[$chunk_luid])) { $chunk_assoc[$chunk_luid] = array(); } $chunk_assoc[$chunk_luid]["is_rendered"] = true; if ($is_verbose) echo "$chunk_luid,"; if ($show_all_enable) { if ($x<$min_chunkx) { $min_chunkx=(int)$x; } if ($x>$max_chunkx) { $max_chunkx=(int)$x; } if ($z<$min_chunkz) { $min_chunkz=(int)$z; } if ($z>$max_chunkz) { $max_chunkz=(int)$z; } } } else { echo "misnamed chunk tile image '$chunk_name' had coordinates ".$x.",".$z." for x,z."; } } } } closedir($decachunk_z_handle); } } closedir($decachunk_x_handle); } } if ($is_verbose) echo "checked all chunks."; echo ""; closedir($chunks_16px_handle); } else { echo_error("could not open $chunks_16px_path"); } //} $x_count = $max_chunkx - $min_chunkx; $z_count = $max_chunkz - $min_chunkz; echo "\r\n"; echo "
\r\n"; //cellpadding="0" cellspacing="0" still needed for IE echo_hold( " \r\n"); $z = (int)$max_chunkz; $scale=(float)$chunkymap_view_zoom_multiplier; // no longer /100 $zoomed_w=(int)((float)$chunkymap_tile_original_w*$scale+.5); $zoomed_h=(int)((float)$chunkymap_tile_original_h*$scale+.5); $genresult_suffix_then_dot_then_ext="_mapper_result.txt"; $dot_yaml=".yml"; $minute=60; $player_file_age_expired_max_seconds=20*$minute-1; $player_file_age_idle_max_seconds=5*$minute-1; $chunks_16px_path = $chunkymapdata_thisworld_path.'/'."16px"; while ($z >= $min_chunkz) { echo_hold( " \r\n"); $x = (int)$min_chunkx; while ($x <= $max_chunkx) { $this_zoomed_w = $zoomed_w; $this_zoomed_h = $zoomed_h; $chunk_yaml_name = $x_opener.$x.$z_opener.$z.$dot_yaml; //$chunk_yaml_path = $chunkymapdata_thisworld_path.'/'.$chunk_yaml_name; //$chunk_yaml_path = $chunks_16px_path.'/'. $chunk_yaml_path = get_chunk_folder_path_from_chunky_coords($x, $z).'/'.$chunk_yaml_name; //$chunk_genresult_name = $x_opener.$x.$z_opener.$z.$genresult_suffix_then_dot_then_ext; //$chunk_genresult_path = $chunkymapdata_thisworld_path.'/'.$chunk_img_name; $td_style_suffix=""; $element_align_style_suffix=""; $alignment_comment=""; //if (is_file($chunk_genresult_path)) { // contains lines such as: // Result image (w=80 h=64) will be written to chunk_x0z1.png // ('PNG Region: ', [0, 64, 80, 128]) // ('Pixels PerNode: ', 1) // where PNG Region's list value is an exclusive rect ordered as x1, y1, x2, y2 //$found_original_w = null; //$found_original_h = null; //$this_zoomed_w=(int)((float)$found_original_w*$scale+.5); //this_zoomed_h=(int)((float)$found_original_h*$scale+.5); //} if (is_file($chunk_yaml_path)) { // contains lines such as: //is_marked_empty:False //is_marked:True //image_w:80 //image_h:80 //image_left:0 //image_top:64 //image_right:-80 //image_bottom:-16 // where if is_marked_empty, the remaining values don't exist $expected_left = (int)$x * (int)$chunkymap_tile_original_w; $expected_top = (int)$z * (int)$chunkymap_tile_original_h; $expected_right = (int)$x + (int)$chunkymap_tile_original_w; $expected_bottom = (int)$z + (int)$chunkymap_tile_original_h; $chunk_dict = get_dict_from_conf($chunk_yaml_path,":"); if (isset($chunk_dict["image_w"])) { $this_zoomed_w=(int)((float)$chunk_dict["image_w"]*$scale+.5); } if (isset($chunk_dict["image_h"])) { $this_zoomed_h=(int)((float)$chunk_dict["image_h"]*$scale+.5); } //TODO: use image_* to determine (if the doesn't touch certain sides of image_w x image_h rect, change the following accordingly) if (isset($chunk_dict["image_left"])) { if (isset($chunk_dict["image_right"])) { if ( (int)$chunk_dict["image_left"] > $expected_left ) { $td_style_suffix.="text-align:right;"; //$alignment_comment.=""; } //elseif ( (int)$chunk_dict["image_right"] < $expected_right ) { // $td_style_suffix.="text-align:left;"; //} else { $td_style_suffix.="text-align:left;"; //$alignment_comment.=""; } } } //if (isset($chunk_dict["image_right"])) { // if ( (int)$chunk_dict["image_right"] != $expected_right ) { // $td_style_suffix.="text-align:left;"; // } // //else { // // $td_style_suffix.="text-align:left;"; // //} //} if (isset($chunk_dict["image_top"])) { if (isset($chunk_dict["image_bottom"])) { if ( (int)$chunk_dict["image_top"] > $expected_top) { $element_align_style_suffix.="vertical-align:bottom;"; //$alignment_comment.=""; } //elseif ( (int)$chunk_dict["image_bottom"] < $expected_bottom) { // $element_align_style_suffix.="vertical-align:top;"; //} else { $element_align_style_suffix.="vertical-align:top;"; //$alignment_comment.=""; } } } //if (isset($chunk_dict["image_bottom"])) { // if ( (int)$chunk_dict["image_bottom"] != $expected_bottom) { // $element_align_style_suffix.="vertical-align:top;"; // } // //else { // // $element_align_style_suffix.="vertical-align:bottom;"; // //} //} //$element_align_style_suffix.="vertical-align:left;"; } echo_hold( " \r\n"); $x++; } echo_hold( " \r\n"); echo_release(); $z--; } echo "
"); echo_hold("
"); //causes child's absolute position to be relative to this div's location, as per http://www.w3schools.com/css/tryit.asp?filename=trycss_position_absolute $chunk_luid = "x".$x."z".$z; $chunk_img_name = $x_opener.$x.$z_opener.$z."$dot_and_ext"; $chunk_img_path = get_chunk_folder_path_from_chunky_coords($x, $z).'/'.$chunk_img_name; if (is_file($chunk_img_path)) { echo_hold( ""); } else { //echo_hold( " "); } if (isset($chunk_assoc[$chunk_luid]["players_count"])) { echo ""; $nonprivate_name_beginning_char_count = 20; for ($player_count=0; $player_count<$chunk_assoc[$chunk_luid]["players_count"]; $player_count++) { $rel_x = $chunk_assoc[$chunk_luid][ "players" ][ $player_count ]["rel_x"]; $rel_z = $chunk_assoc[$chunk_luid][ "players" ][ $player_count ]["rel_z"]; $is_expired=false; $is_idle=false; if (isset($chunk_assoc[$chunk_luid][ "players" ][ $player_count ]["file_path"])) { $last_player_update_time=filemtime($chunk_assoc[$chunk_luid][ "players" ][ $player_count ]["file_path"]); if (time()-$last_player_update_time > $player_file_age_expired_max_seconds) { $is_expired=true; } elseif (time()-$last_player_update_time > $player_file_age_idle_max_seconds) { $is_idle=true; } } $text = $chunk_assoc[$chunk_luid]["players"][$player_count]["text"]; if (strlen($chunk_assoc[$chunk_luid]["players"][$player_count]["text"])>$nonprivate_name_beginning_char_count) { $text = substr($text, 0, $nonprivate_name_beginning_char_count)."*"; } //show head full size (not zoomed): $zoomed_head_w=$character_icon_w;//(int)((float)$character_icon_w*$scale+.5); $zoomed_head_h=$character_icon_h;//(int)((float)$character_icon_h*$scale+.5); $rel_x -= (int)($zoomed_head_w/2); $rel_z -= (int)($zoomed_head_h/2); //$img_style="position:absolute; "; $img_style=""; $img_border_style="border: 1px solid white;"; $text_style="color:white;"; if ($is_expired==false) { if ($is_idle==true) { $img_border_style="border: 1px solid rgba(128,128,128,.5);"; $img_style.="opacity: 0.4; filter: alpha(opacity=40);"; //filter is for IE8 and below $text_style="color:white; opacity: 0.4; filter: alpha(opacity=40);"; //filter is for IE8 and below } echo_hold( "
$text
" ); } //$position_offset_x+=$character_icon_w; } } else echo ""; if (isset($chunk_assoc[$chunk_luid]["markers_count"])) { echo ""; $nonprivate_name_beginning_char_count = 20; for ($marker_count=0; $marker_count<$chunk_assoc[$chunk_luid]["markers_count"]; $marker_count++) { $rel_x = $chunk_assoc[$chunk_luid][ "markers" ][ $marker_count ]["rel_x"]; $rel_z = $chunk_assoc[$chunk_luid][ "markers" ][ $marker_count ]["rel_z"]; $is_expired=false; $is_idle=false; // if (isset($chunk_assoc[$chunk_luid][ "markers" ][ $marker_count ]["file_path"])) { // $last_marker_update_time=filemtime($chunk_assoc[$chunk_luid][ "markers" ][ $marker_count ]["file_path"]); // if (time()-$last_marker_update_time > $marker_file_age_expired_max_seconds) { // $is_expired=true; // } // elseif (time()-$last_marker_update_time > $marker_file_age_idle_max_seconds) { // $is_idle=true; // } // } $text = $chunk_assoc[$chunk_luid]["markers"][$marker_count]["text"]; $image_path = ""; if (isset($chunk_assoc[$chunk_luid]["markers"][$marker_count]["image"])) { $image_path = $chunk_assoc[$chunk_luid]["markers"][$marker_count]["image"]; } if (strlen($chunk_assoc[$chunk_luid]["markers"][$marker_count]["text"])>$nonprivate_name_beginning_char_count) { $text = substr($text, 0, $nonprivate_name_beginning_char_count)."*"; } //show head full size (not zoomed): //$zoomed_head_w=$character_icon_w;//(int)((float)$character_icon_w*$scale+.5); //$zoomed_head_h=$character_icon_h;//(int)((float)$character_icon_h*$scale+.5); $zoomed_image_w=16; $zoomed_image_h=16; $rel_x -= (int)($zoomed_image_w/2); $rel_z -= (int)($zoomed_image_h/2); //$img_style="position:absolute; "; $img_style=""; $img_border_style=""; //$img_border_style="border: 1px solid white;"; $text_style="color:white;"; if ($is_expired==false) { if ($is_idle==true) { $img_border_style=""; //$img_border_style="border: 1px solid rgba(128,128,128,.5);"; $img_style.="opacity: 0.4; filter: alpha(opacity=40);"; //filter is for IE8 and below $text_style="color:white; opacity: 0.4; filter: alpha(opacity=40);"; //filter is for IE8 and below } echo_hold( "
$text
" ); } //$position_offset_x+=$character_icon_w; } } else echo ""; //echo "
".$x.",0,".$z; echo_hold($alignment_comment); echo_hold("
"); echo_hold( "
\r\n"; echo "
\r\n"; } else { //not isset($world_name) echo "

Choose world:

"; echo ""; } } ?>