Bonjour,
Ca fait un petit bail que je n'ai pas posté ici.
J'ai un soucis, j'vais essayer d'expliquer.
Sur mon jeu, un joueur peut avoir jusqu'à 2 personnages (appelons-les P1 et P2).
Pour acheter un objet dans une boutique, il faut être collé à une case adjacente de cette dernière. (la carte est un damier normal, les positions sont en X/Y. )
Imaginons que P1 entre dans la boutique. Il est à portée de celle ci, donc tout s'affiche normalement.
Le joueur ouvre un nouvel onglet dans son navigateur web, il se connecte à son P2.
Il revient sur la fenetre de la boutique (instanciée par P1). S'il achète un objet, il va y avoir un flux d'erreur avec une redirection sur la page avec "vous n'êtes pas à portée de la boutique" ... sauf que l'objet sera quand même envoyé dans l'inventaire de P2... alors que c'est P1 qui l'a acheté...
En gros, y a un meli mélo dans ma session...
Voici les parties du script qui nous intéressent
Ca fait un petit bail que je n'ai pas posté ici.
J'ai un soucis, j'vais essayer d'expliquer.
Sur mon jeu, un joueur peut avoir jusqu'à 2 personnages (appelons-les P1 et P2).
Pour acheter un objet dans une boutique, il faut être collé à une case adjacente de cette dernière. (la carte est un damier normal, les positions sont en X/Y. )
Imaginons que P1 entre dans la boutique. Il est à portée de celle ci, donc tout s'affiche normalement.
Le joueur ouvre un nouvel onglet dans son navigateur web, il se connecte à son P2.
Il revient sur la fenetre de la boutique (instanciée par P1). S'il achète un objet, il va y avoir un flux d'erreur avec une redirection sur la page avec "vous n'êtes pas à portée de la boutique" ... sauf que l'objet sera quand même envoyé dans l'inventaire de P2... alors que c'est P1 qui l'a acheté...
En gros, y a un meli mélo dans ma session...
Voici les parties du script qui nous intéressent
Code PHP :
<?php
/*
Fichier : action sur batiment.php
Fait par :xxxx
Date : 06/04/2009 18h30
Description :
----------
modifications :
*/
/*************************************/
/***** Anti-hacking / Insclusion *****/
/*************************************/
// je définis une variable pour prévenir l'éventuel hacking
define('INC_OK',true);
//les inclusions
require("libs/template.class.php");
require("libs/drsql.class.php");
require("libs/Joueur.class.php");
require("libs/config.inc.php");
require("libs/pj.class.php");
require("libs/batiment.class.php");
require("libs/inventaire.class.php");
require("libs/sort.class.php");
require('libs/messagerie.class.php');
$TPL = new template();
$DB = new DrSql($host,$user,$pass,$bdd);
$Joueur = new Joueur($TPL); //IL YA UN SESSION START DANS LE CONSTRUCTEUR DE LA CLASSE
$PJ = new pj($DB,$_SESSION['P_Id']);
$Messagerie = new messagerie($DB, $TPL, $PJ, true);
/*************************/
/***** Les variables *****/
/*************************/
if(isset($_GET['type']))
$Type = htmlspecialchars($_GET['type'],ENT_QUOTES);
if(isset($_GET['a']))
$Action = htmlspecialchars($_GET['a'],ENT_QUOTES);
elseif(isset($_POST['a']))
$Action = htmlspecialchars($_POST['a'],ENT_QUOTES);
/*******************************/
/***** ACTIONS DE SESSIONS *****/
/*******************************/
$Joueur->EtrePageSecurisee(true,'index.php'); //si le joueur n'est pas reconnu comme connecté, on redirige sur index.php
/*****************/
/***** DEBUT *****/
/*****************/
/***** actions sur boutique *****/
if($Type == 'boutique')
{
$PosX = htmlspecialchars($_GET['x'],ENT_QUOTES);
$PosY = htmlspecialchars($_GET['y'],ENT_QUOTES);
$QuartierId= htmlspecialchars($_GET['q'],ENT_QUOTES);
$Batiment = new batiment($DB,'',$PosX,$PosY,$QuartierId);
$TPL->assign(
array
(
'Type' => 'boutique',
'Distance' => $Batiment->EtreAPortee($PJ->Pe_Caracs->Pe_PosX,$PJ->Pe_Caracs->Pe_PosY,$PJ->Pe_Caracs->Qu_Id),
'BaId' => $Batiment->BatimentInfos->Ba_Id
)
);
//affichage
$TPL->parse('actions_sur_batiment.tpl');
}
elseif($Action == 'entrer')
{
//affichage
$BoutiqueId = htmlspecialchars($_GET['boutique_id'],ENT_QUOTES);
$Batiment = new batiment($DB,$BoutiqueId);
//on vérifie la distance
if(!$Batiment->EtreAPortee($PJ->Pe_Caracs->Pe_PosX,$PJ->Pe_Caracs->Pe_PosY,$PJ->Pe_Caracs->Qu_Id))
header("location:jouer.php?Erreur=Ce batiment n'est pas à votre portée");
//on assigne les valeurs de la page
$TPL->assign(
array
(
'BoutiqueNom' => $Batiment->BatimentInfos->Ba_Nom,
'BoutiqueDesc' => $Batiment->BatimentInfos->Ba_Description,
'Pe_Thor' => $PJ->Pe_Caracs->Pe_Thor
)
);
//on assigne l'infobulle
//assignation bubulle
$TPL->assign("ToolTips",'<script type="text/javascript">
window.onload=function(){enableTooltips("boutique")};
</script>
');
//on affichage tous les éléments de la boutique
$StockObjets = $Batiment->DonnerObjetsStock();
foreach($StockObjets AS $Objet)
{
//Si un objet à des specificités, on les affiche
if($Objet['type'] == "Parchemin" AND !empty($Objet['typebis']))
{
$Sort = new sort($DB, $Objet['typebis']);
$Specificite = 'Classe - '.$Sort->DonnerClasse();
}
else
$Specificite = '-';
$TPL->assign_block(
'Afficher_ObjetsBoutique',
array
(
'Ob_Nom' => $Objet['nom'],
'Ob_Prix' => $Objet['prix'],
'Ob_Stock' => $Objet['stock'],
'Ob_Specif' => $Specificite,
'Ob_Desc' => $Objet['desc'],
'Ob_Image' => '<img src="'.$Objet['image'].'" alt="'.$Objet['nom'].'" height="40" width="40" />',
'Ob_Id' => $Objet['id'],
'Bo_Id' => $BoutiqueId
)
);
for($i=1; $i <= $Objet['stock']; $i++)
{
$TPL->assign_block(
'Afficher_ObjetsBoutique.Afficher_Stockb',
array
(
'i' => $i
)
);
}
}
//on affiche tous les éléments de l'inventaire
$Inventaire = new inventaire($DB, $PJ);
$InventaireObjet = $Inventaire->DonnerListeObjets();
foreach($InventaireObjet['id'] AS $Objet)
{
//on récupère les infos de l'objet
$ObjetInfos = $Inventaire->DonnerObjetInventaireInfos($Objet);
if($Batiment->PouvoirAcheterObjet($ObjetInfos->Ob_Type))
{
//test sur les pack de munitions qu'on ne vend que par 10
if($ObjetInfos->Ob_Type == 'Munition')
{
$Quantite = FLOOR($ObjetInfos->In_Quantite/10);
}
else
$Quantite = $ObjetInfos->In_Quantite;
$TPL->assign_block(
'Afficher_ObjetsInventaire',
array
(
'In_Affichage' => true,
'In_Nom' => $ObjetInfos->Ob_Nom,
'In_Prix' => $ObjetInfos->Ob_PrixVente,
'In_Stock' => $Quantite,
'In_Desc' => $ObjetInfos->Ob_Description,
'In_Image' => '<img src="'.$ObjetInfos->Ob_Icone.'" alt="'.$ObjetInfos->Ob_Nom.'" height="40" width="40" />',
'In_Id' => $ObjetInfos->In_Id,
'Bo_Id' => $BoutiqueId
)
);
for($i=1; $i <= $Quantite; $i++)
{
$TPL->assign_block(
'Afficher_ObjetsInventaire.Afficher_Stocki',
array
(
'j' => $i
)
);
}
}
else
{
$TPL->assign_block(
'Afficher_ObjetsInventaire',
array
(
'In_Affichage' => false,
'In_Nom' => null,
'In_Prix' => null,
'In_Stock' => null,
'In_Desc' => null,
'In_Image' => null,
'In_Id' => null,
'Bo_Id' => null
)
);
$TPL->assign_block(
'Afficher_ObjetsInventaire.Afficher_Stocki',
array
(
'j' => null
)
);
}
}
//assignation lien pour revenir sur son personnage : OUI
$TPL->assign('retour', true);
//assignation du feedback
if(isset($_GET['Alerte']))
$TPL->assign('Alerte', htmlspecialchars($_GET['Alerte'],ENT_QUOTES));
else
$TPL->assign('Alerte',null);
$TPL->parse('boutique.tpl');
}
elseif($Action == "acheter")
{
$BoutiqueId = htmlspecialchars($_GET['boutique_id'],ENT_QUOTES);
$ObjetId = htmlspecialchars($_GET['objet_id'],ENT_QUOTES);
$Quantite = htmlspecialchars($_POST['nombre'],ENT_QUOTES);
$Batiment = new batiment($DB,$BoutiqueId);
$Inventaire = new inventaire($DB, $PJ);
//on vérifie la distance
if(!$Batiment->EtreAPortee($PJ->Pe_Caracs->Pe_PosX,$PJ->Pe_Caracs->Pe_PosY,$PJ->Pe_Caracs->Qu_Id))
header("location:jouer.php?Erreur=Ce batiment n'est pas à votre portée");
//on vérifie si la boutique possède bien l'objet en stock
if(!$ObjetInfos = $Batiment->EtreEnStock($ObjetId,$Quantite,$BoutiqueId))
header("location:actions_sur_batiment.php?a=entrer&Alerte=Vérifiez la disponibilité de ce produit.");
$Prix = $ObjetInfos->BAS_PrixAchat * $Quantite;
//on vérifie que le joueur peut payer.
if($PJ->Pe_Caracs->Pe_Thor < $Prix)
header("location:actions_sur_batiment.php?a=entrer&boutique_id={$BoutiqueId}&Alerte=Vous n'avez pas assez de Thor pour payer.");
//il peut payer, on retire les sous du joueur, on retire l'objet de la boutique et on ajoute l'objet à l'équipement
$Thor = $PJ->Pe_Caracs->Pe_Thor - $Prix;
$DB->query("UPDATE Personnage SET Pe_Thor={$Thor} WHERE Pe_Id='{$PJ->PjId}'");
if($ObjetInfos->Ob_Type == 'Munition')
$QuantiteInventaire = $Quantite * 10;
else
$QuantiteInventaire = $Quantite;
$Batiment->RetirerStock($ObjetId,$Quantite,$BoutiqueId);
$Inventaire->AjouterObjet($ObjetId,$QuantiteInventaire);
header("location:actions_sur_batiment.php?a=entrer&boutique_id=".$BoutiqueId);
}
/***************/
/***** FIN *****/
/***************/
?>