Voila mon script complet:
//Script de contournement des problèmes de rotations de cartes
//définition des zones (cleanZone) et des positions sur la carte (goThere):
$coordonnees = array();
$coordonnees['R2D2_NULL'][] = "";
$coordonnees['R2D2_ENTREE'][] = "22010,26832,25310,28282,1";
$coordonnees['R2D2_CUISINE'][] = "25181,25138,28591,26738,1";
$coordonnees['R2D2_SALON'][] = "24609,26759,29909,31199,1";
$coordonnees['R2D2_SEJOUR'][] = "24199,31282,27549,33882,1";
$coordonnees['R2D2_CHAMBRE'][] = "20368,30121,24068,33721,1";
$coordonnees['R2D2_BUREAU'][] = "17296,30031,20246,33731,1";
$coordonnees['R2D2_COULOIR'][] = "19443,28254,24093,30054,1";
$coordonnees['R2D2_SALLEDEAU'][] = "24009,23856,25059,27156,1";
//Coordonnees des goThere
$coordonnees['R2D2_Poubelle'][] = "28300,25950";
//Zones de regroupement plusieurs autres zones :
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_ENTREE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CHAMBRE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_BUREAU'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_COULOIR'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];
$coordonnees['R2D2_PIECEQUOTIDIEN'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_PIECEQUOTITIEN'][] = $coordonnees['R2D2_SALLEDEAU'][0];
// Récupération des paramètres stockés dans le virtuel :
// rotation relative de la carte == 0 lors de la création initiale des zones
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][rotation_map]#");
$rotation = $cmd->execCmd();
// centre X de la carte :
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][centre_x]#");
$centre_x = $cmd->execCmd();
// centre Y de la carte :
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][centre_y]#");
$centre_y = $cmd->execCmd();
$centre = array($centre_x,$centre_y); // centre X, Y de la carte (25000,25000)
function rotate($x,$y, $angle,$centre) {
if($angle == 0)
{
// ajustement facultatif du centre par défaut en cas de léger déplacement de la base :
// $x = $x - 80;
// $y = $y + 80;
return array($x,$y);
}
$angle *= M_PI / 180;
$xM = $x - $centre[0];
$yM = $y - $centre[1];
$x = $xM * cos($angle) + $yM * sin($angle) + $centre[0];
$y = - $xM * sin($angle) + $yM * cos($angle) + $centre[1];
return array(round($x), round($y));
}
function generer($coordonnees,$quoi,$rotation,$centre)
{
if( count($coordonnees[$quoi])<1 ) return "AUCUN";
$zonedef=array();
foreach($coordonnees[$quoi] as $lazone)
{ // pour chaque zone
$zone=explode(',', $lazone);
$coord=array();
list( $xa , $ya ) = rotate($zone[0],$zone[1],$rotation,$centre); // Renvoi position debut array(x,y)
if( $zone[2] > 0 )
{ // Clean zone
list( $xb , $yb ) = rotate($zone[2],$zone[3],$rotation,$centre); // renvoi position fin array(x,y)
if( $xa < $xb )
{
$coord[0] = $xa;
$coord[1] = 0;
$coord[2] = $xb;
}
else{
$coord[0] = $xb;
$coord[1] = 0;
$coord[2] = $xa;
}
if( $ya < $yb )
{
$coord[1] = $ya;
$coord[3] = $yb;
}
else{
$coord[1] = $yb;
$coord[3] = $ya;
}
$coord[4]=$zone[4];
$zonedef[]='['.implode(',',$coord).']';
}
else{ // Gothere
$zonedef[] = $xa . "," . $ya;
}
}
return implode(',',$zonedef);
}
$cmd = cmd::bystring("#[Systeme][R2D2 Virtuel][Ordre]#");
$job = $cmd->execCmd(); // contient le nom de la zone ou position demandée (tel que défini dans notre tableau)
// on génère les coordonnées corrigées :
$newpos = generer($coordonnees,$job,$rotation,$centre);
// et on sauve ces coordonnées dans notre virtuel (pour qu'ils soient exploitables hors de notre bloc de code)
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][coordonnees]#");
$cmd->event($newpos);
// FIN DU SCRIPT