public static function generatePage(&$tpl, &$session, &$account) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //Définir la page à afficher ( par défaut: resume ) if (!isset($_GET['p'])) { $p = "resume"; } elseif (is_numeric($_GET['p'])) { $p = (int) $_GET['p']; } else { return fctErrorMSG('page introuvable'); } //Validation de la page if ($p != "resume" && !is_numeric($p)) { return fctBugReport("Format invalide", $p, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, true, true); } if (is_numeric($p) && ($p < 1 || $p > 9)) { return fctBugReport("Range invalide", $p, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, true, true); } //Fetcher le contenu adéquat $pageContenu = $tpl->fetch($account->getSkinRemotePhysicalPath() . '../_common/background/bg_' . $p . '.htm', __FILE__, __LINE__); $pageMenu = $tpl->fetch($account->getSkinRemotePhysicalPath() . '../_common/background/bg_menu.htm', __FILE__, __LINE__); //Placer le contenu de la page dans le template et appliquer les BBCodes si nécéssaires $tpl->set('PAGE_MENU', $pageMenu); $tpl->set('PAGE_CONTENU', BBCodes($pageContenu, false, false)); //Ne pas remplacer les sauts de lignes //Retourner le template complété/rempli return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Visitor/background.htm', __FILE__, __LINE__); }
public function queryPlus($query, $file = null, $line = null, $function = null, $class = null, $method = null, $byPassCheck = false) { try { $this->startTimer(); $sql = parent::query($query); $this->stopTimer(); return $sql; } catch (Exception $e) { fctBugReport('Erreur de requête', array('error' => $e->getMessage(), 'query' => $query), $file, $line); } }
private static function doTransactions() { $limitTransaction = 5; //On récupère les transactions qui doivent être effectuées $transactions = Member_BanqueTransactionAuto::getTransactionsReady($limitTransaction); if (count($transactions) > 0) { foreach ($transactions as $transaction) { try { $transaction->effectuerTransaction(); } catch (Exception $e) { //S'il y a un problème, on signal l'erreur mais on continue l'exécution de la remise fctBugReport('Erreur lors d\'une transaction automatique de banque', array('error' => $e->getMessage()), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, false, false, false); } } } }
public function executePlus(&$pdoInstance = NULL, $file = NULL, $line = NULL) { $try = 0; while ($try < 10) { try { if ($pdoInstance === NULL) { return parent::execute(); } else { $pdoInstance->startTimer(); $sql = parent::execute(); $pdoInstance->stopTimer(); return $sql; } } catch (Exception $e) { // 1213 = ER_LOCK_DEADLOCK : code : '40001' // 1205 = ER_LOCK_WAIT_TIMEOUT : code : 'HY000' if ($e->getCode() != '40001' && $e->getCode() != 'HY000' || $try >= 9) { fctBugReport('Erreur de requête', array('error code' => $e->getCode(), 'error' => $e->getMessage(), 'requete' => $this->queryString, 'values' => $this->p_params, 'try' => $try), $file, $line); } } $try++; } }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //BUT: Démarrer un template propre à cette page //Cout en PA des actions $coutPa = 1; if ($perso->getPa() <= $coutPa) { return fctErrorMSG('Vous n\'avez pas assez de PA pour effectuer cette action.', $errorUrl); } //Vérifier l'état du perso if (!$perso->isAutonome()) { return fctErrorMSG('Votre n\'êtes pas en état d\'effectuer cette action.'); } //Rechercher la banque $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'banque' . ' WHERE banque_lieu=:nomTech' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':nomTech', $perso->getLieu()->getNomTech(), PDO::PARAM_STR); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si la banque existe if ($arr === false) { return fctErrorMSG('Cette banque est actuellement innaccessible ou innexistante (' . $perso->getLieu()->getNomTech() . ').'); } //Instancier la banque $banque = new Member_Banque($arr); $tpl->set('BANQUE', $banque); //Passer l'objet "banque" au template //###Changer le NIP if (isset($_POST['changeNIP'])) { if (!isset($_POST['nip'])) { return fctErrorMSG('Vous devez entrer un NIP.'); } if (empty($_POST['nip'])) { return fctErrorMSG('Vous devez entrer un NIP.'); } if (!is_numeric($_POST['nip'])) { return fctErrorMSG('Le NIP doit être numérique.'); } if ($_POST['nip'] < 0) { return fctErrorMSG('Le NIP est incorrect.'); } if (!isset($_POST['compte_id'])) { fctBugReport('Le compte n\'est pas spécifié.', array(), __FILE__, __LINE__); } //Récupérer le compte try { $compteToChangeNIP = Member_BanqueCompte::getCompteFromId($_POST['compte_id']); } catch (GameException $e) { return fctErrorMSG($e->getMessage()); } //Modifier le nip $compteToChangeNIP->changeNIP($_POST['nip']); } //###Fermer un compte if (isset($_POST['close'])) { //Valider si le perso possède assez de PA if ($perso->getPa() < 1) { return fctErrorMSG('Vous n\'avez pas assez de PA pour effectuer cette action.'); } //Instancier le compte afin d'y faire des opérations. $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'banque_comptes' . ' WHERE compte_id=:compteId' . ' AND compte_idperso=:persoId' . ' LIMIT 1'; $prep = $db->prepare($query); $prep->bindValue(':compteId', $_POST['compte_id'], PDO::PARAM_STR); $prep->bindValue(':persoId', $perso->getId(), PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si le compte existe if ($arr === false) { return fctErrorMSG('Ce compte n\'existe pas (' . $_POST['compte_id'] . ').'); } //Instancier le compte $compte = $banque->getCompte($arr['compte_compte'], $arr); //Valider if (!isset($_POST['c_check'])) { return fctErrorMSG('Vous devez cocher la case pour confirmer que vous voulez bien fermer ce compte.', '?popup=1&m=Action_Lieu_Banque'); } //Effectuer le transfert d'argent (Transférer l'argent du compte vers le perso) $perso->changeCash('+', $compte->getCash()); $perso->setCash(); //Effacer le compte $query = 'DELETE FROM ' . DB_PREFIX . 'banque_comptes' . ' WHERE compte_id=:compteId' . ' AND compte_idperso=:persoId' . ' LIMIT 1'; $prep = $db->prepare($query); $prep->bindValue(':compteId', $_POST['compte_id'], PDO::PARAM_STR); $prep->bindValue(':persoId', $perso->getId(), PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $prep->closeCursor(); $prep = NULL; //Retirer les PA $perso->changePa('-', $coutPa); $perso->setPa(); //Ajouter la transaction à l'historique $compte->add_bq_hist('', 'FRMT', $compte->getCash(), 0, "FERMÉ"); Member_He::add('System', $perso->getId(), 'banque', 'Vous fermez un compte en banque.'); } $tpl->set('PA', $perso->getPa()); $tpl->set('CASH', $perso->getCash()); //Trouver tous les comptes appartenant au perso $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'banque_comptes' . ' WHERE compte_banque=:banque' . ' AND compte_idperso=:persoId;'; $prep = $db->prepare($query); $prep->bindValue(':banque', $banque->getNoBanque(), PDO::PARAM_STR); $prep->bindValue(':persoId', $perso->getId(), PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arrCompte = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; //Ouvrir un nouveau compte si on le demande ou si aucun compte n'existe if (count($arrCompte) == 0 || isset($_POST['newaccount'])) { //Afficher le template d'ouverture de compte $tpl->set('BANK_ACCOUNT_NAME', $perso->getNom()); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_compte_add.htm', __FILE__, __LINE__); } else { //Faire les opération sur le(s) compte(s) existant(s). foreach ($arrCompte as &$arr) { $BANK_ACCOUNTS[] = $banque->getCompte($arr['compte_compte'], $arr); } $tpl->set('BANK_ACCOUNTS', $BANK_ACCOUNTS); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque.htm', __FILE__, __LINE__); } }
public static function generatePage(&$tpl, &$session, &$account) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //Déterminer la quantité de perso que ce compte à l'autorisation de créer $query = 'SELECT auth_creation_perso' . ' FROM ' . DB_PREFIX . 'account' . ' WHERE id=:id;'; $prep = $db->prepare($query); $prep->bindValue(':id', $account->getId(), PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; if ($arr['auth_creation_perso'] == 0) { return fctErrorMSG('Vous n\'avez pas l\'autorisation de créer un personnage. (cheat)'); } //Établir la liste des statistiques disponibles $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'stat;'; $prep = $db->prepare($query); $prep->execute($db, __FILE__, __LINE__); $arrS = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; $arrStat = array(); foreach ($arrS as &$arr) { $arr['xp'] = 0; $arrStat[] = $arr; } $tpl->set('STATS', $arrStat); //Établir la liste des compétences disponibles $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'competence' . ' WHERE inscription="1";'; $prep = $db->prepare($query); $prep->execute($db, __FILE__, __LINE__); $arrC = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; $arrComp = array(); foreach ($arrC as &$arr) { $arr['lvl'] = 0; $arrComp[] = $arr; } $tpl->set('COMPS', $arrComp); //Établir la liste de caractéristiques disponibles. $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'caract' . ' WHERE type="system"' . ' AND catid=0' . ' ORDER BY nom;'; $prep = $db->prepare($query); $prep->execute($db, __FILE__, __LINE__); $arrC = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; $cat = array(); foreach ($arrC as &$arr) { $arr['nom'] = stripslashes($arr['nom']); $arr['desc'] = stripslashes($arr['desc']); $cat[] = $arr; } //Lister les caracts $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'caract' . ' WHERE type="system"' . ' AND catid>0' . ' ORDER BY nom;'; $prep = $db->prepare($query); $prep->execute($db, __FILE__, __LINE__); $arrC = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; $signes = array(); foreach ($arrC as &$arr) { $arr['nom'] = stripslashes($arr['nom']); $arr['desc'] = stripslashes($arr['desc']); $caract[] = $arr; } $tpl->set('CAT', $cat); $tpl->set('CARACT', $caract); //Lister les caracts incompatibles $query = 'SELECT *' . ' FROM ' . DB_PREFIX . 'caract_incompatible;'; $prep = $db->prepare($query); $prep->execute($db, __FILE__, __LINE__); $arrC = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; if (count($arrC) != 0) { $tpl->set('CARACT_INCOMPATIBLE', $arrC); } //Resumer une création (mécanisme de recouvrement de donnée d'urgence, en cas d'erreur de la validation JS) if (isset($_POST['nom'])) { //Avertir que le JS n'à pas su assurer la validation adéquatement fctBugReport('La validation JS de la création d\'un perso à échouée.', $_POST, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, false, false); //Si les magicQuote sont activer, les retirer. fctStripMagicQuote($_POST); $tpl->set('PERSO', $_POST); $arrC = array(); foreach ($caract as $arr) { if (isset($_POST['caractDesc_' . $arr['id']]) && !empty($_POST['caractDesc_' . $arr['id']])) { $arrC[$arr['id']] = $_POST['caractDesc_' . $arr['id']]; } } $tpl->set('PERSO_CARACT', $arrC); } //Retourner le template complété/rempli $tpl->set('GAME_IS_CYBERCITY', GAME_IS_CYBERCITY); $tpl->set('REDIRECT_TO', 'CreerPerso3'); $tpl->set('CHECK_URL', 'CreerPerso2Check'); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/creerPerso2.htm', __FILE__, __LINE__); }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante $errorUrl = '?popup=1&m=Action_Perso_Attaquer'; // ### VALIDATIONS //Vérifier l'état du perso if (!$perso->isAutonome()) { return fctErrorMSG('Vous n\'êtes pas en état d\'effectuer cette action.', $errorUrl); } //Vérifier si un personnage à été sélectionné if (!isset($_POST['perso_id'])) { return fctErrorMSG('Vous devez sélectionner la personne que vous désirez attaquer.', $errorUrl); } //Vérifier si un nombre de tours à été sélectionné if (!isset($_POST['tours']) || !is_numeric($_POST['tours'])) { return fctErrorMSG('Vous devez sélectionner le nombre de tour(s) à effectuer.', $errorUrl); } //Vérifier si nous avons assez de PA pour attaquer $cout_pa = Member_Action_Perso_Attaquer::coutPaTotal($perso, $_POST['tours']); if ($_POST['type_att'] == 'cible') { $cout_pa += 15; } if (isset($_POST['furtif'])) { $cout_pa += 15; } if ($perso->getPa() <= $cout_pa) { return fctErrorMSG('Vous n\'avez pas assez de PA pour effectuer cette action.', $errorUrl); } //Vérifier si le perso sélectionné est bien présent dans le lieu actuel $i = 0; while ($tmp = $perso->getLieu()->getPerso($perso, $i++)) { if ($tmp->getId() == $_POST['perso_id']) { $victime = $tmp; break; } } if (!isset($victime)) { return fctErrorMSG('Le personnage sélectionné n\'est pas présent dans le lieu actuel.', $errorUrl); } //ATTAQUE CIBLÉE: Vérifier si une zone à été sélectionnée if ($_POST['type_att'] == 'cible' && !isset($_POST['zones'])) { return fctErrorMSG('Une attaque ciblée doit avoir une zone à cibler.', $errorUrl); } //CHEAT+HACK: Vérifier l'état innitial de la victime if (!$perso->isVivant()) { return fctErrorMSG('Vous ne pouvez pas attaquer une personne déjà morte.', $errorUrl); } //CHEAT+HACK: ATTAQUE CIBLÉE: Valider qu'une attaque ciblé n'a qu'un seul tour if ($_POST['type_att'] == 'cible' && $_POST['tours'] > 1) { return fctErrorMSG('Une attaque ciblée ne peut avoir qu\'un seul tour.', $errorUrl); } //CHEAT+HACK: Vérifier si la portée est valide $porteeSelectionnee = $_POST['portee']; $porteeArme = $perso->getArme()->getPortee(); $dimensionLieu = $perso->getLieu()->getDimension(); //Trouver la distance la plus courte entre la portée de l'arme et la dimension de la piece. $porteeAutoriseeMax = Member_Action_Perso_Attaquer::porteePlusPetite($dimensionLieu, $porteeArme) ? $dimensionLieu : $porteeArme; if (!Member_Action_Perso_Attaquer::porteePlusPetite($porteeSelectionnee, $porteeAutoriseeMax)) { return fctErrorMSG('La portée ne peut dépasser la capacité de l\'arme ou la taille du lieu.', $errorUrl); } // ### DÉBUT DU MOTEUR D'ATTAQUE $tour = 0; $persoEsq = 0; //Nombre d'esquive effectuées $victimeEsq = 0; //Nombre d'esquive effectuées //Messages d'intro $msgPerso = 'Vous tentez une attaque'; $msgVictime = 'Une personne tente une attaque'; $msgLieu = 'Vous voyez une personne tenter une attaque'; if (isset($_POST['furtif'])) { $msgPerso .= ' furtive'; $att_furtive = true; } if ($_POST['type_att'] == 'cible') { $msgPerso .= " ciblée (Zone visée: " . $_POST['zones'] . "):"; } else { $msgPerso .= " par tours (tour(s) tentés: " . $_POST['tours'] . "):"; } $noticeInconscient = true; $noticeVivant = true; $noticeParalyse = true; $noticeInconscientAtt = true; $noticeVivantAtt = true; $noticeParalyseAtt = true; $attStop = false; do { $tour++; if (DEBUG_MODE) { echo "<hr />Tour #{$tour}<br />"; } $msgPerso .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')'; $msgVictime .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')'; $msgLieu .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')'; //Lancer le tour d'attaque en fonction du type d'arme utilisé switch (get_class($perso->getArme())) { case 'Member_ItemArmeMainsnues': $riposte = Member_Action_Perso_Attaquer2ArmeMainsnues::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); break; case 'Member_ItemArmeBlanche': $riposte = Member_Action_Perso_Attaquer2ArmeBlanche::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); break; case 'Member_ItemArmeFeu': $riposte = Member_Action_Perso_Attaquer2ArmeFeu::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); break; //case 'Member_ItemArmeExplosive': // $riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); // break; //case 'Member_ItemArmeLourde': // $riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); // break; //case 'Member_ItemArmeExplosive': // $riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); // break; //case 'Member_ItemArmeLourde': // $riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); // break; case 'Member_ItemArmeParalysante': $riposte = Member_Action_Perso_Attaquer2ArmeParalysante::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false); break; default: fctBugReport('Type d\'arme innexistant (' . get_class($perso->getArme()) . ')', array($perso, $perso->getArme()), __FILE__, __LINE__); break; } if ($victime->getPa() == 0 && $noticeParalyse) { $msgPerso .= "\nVotre opposant est paralysé."; $msgVictime .= "\nVous êtes paralysé."; $msgLieu .= "\nLa victime est paralysée."; $noticeParalyse = false; //Pour ne pas repetter à chaque tour } //Vérifier l'état de la victime et afficher si elle tombe inconsciente ou meurt if (!$victime->isConscient() && $noticeInconscient) { $msgPerso .= "\nVotre opposant est inconscient."; $msgVictime .= "\nVous êtes inconscient."; $msgLieu .= "\nLa victime est inconsciente."; $noticeInconscient = false; //Pour ne pas repetter à chaque tour } if (!$victime->isVivant() && $noticeVivant) { $msgVictime .= "\nVous êtes mort."; $noticeVivant = false; //Pour ne pas repetter à chaque tour } if (isset($_POST['furtif'])) { unset($_POST['furtif']); } //De cette facon, la furtivité est uniquement tenté au premier tour. //Au besoin, lancer la riposte de la part de la victime if ($riposte && $victime->isAutonome() && $victime->getPa() > 0 && $victime->getReaction() == 'riposte') { if (DEBUG_MODE) { echo "<br /><br />Riposte:"; } //Vérifier si la porté est plus distante que le nombre de tour (TC(1)=0 tour d'attente, C(2)=1 tour d'attente, M(3)=2 tours d'attente, etc..) if ($tour < Member_Action_Perso_Attaquer::porteeVersInt($porteeSelectionnee)) { $msgPerso .= "\nVotre opposant aimerait riposter, mais il est trop loin pour le moment."; $msgVictime .= "\nVous aimeriez riposter, mais vous êtes trop loin pour le moment."; $msgLieu .= "\nLa victime est trop éloignée de son agresseur pour pouvoir riposter."; } else { $msgPerso .= "\nVotre opposant tente de riposter (" . $victime->getArme()->getNom() . '): '; $msgVictime .= "\nVous tentez de riposter (" . $victime->getArme()->getNom() . '): '; $msgLieu .= "\nLa victime tente de riposter (" . $victime->getArme()->getNom() . '): '; switch (get_class($victime->getArme())) { case 'Member_ItemArmeMainsnues': $riposte = Member_Action_Perso_Attaquer2ArmeMainsnues::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); break; case 'Member_ItemArmeBlanche': $riposte = Member_Action_Perso_Attaquer2ArmeBlanche::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); break; case 'Member_ItemArmeFeu': $riposte = Member_Action_Perso_Attaquer2ArmeFeu::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); break; //case 'Member_ItemArmeExplosive': // $riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); // break; //case 'Member_ItemArmeLourde': // $riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); // break; //case 'Member_ItemArmeExplosive': // $riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); // break; //case 'Member_ItemArmeLourde': // $riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); // break; case 'Member_ItemArmeParalysante': $riposte = Member_Action_Perso_Attaquer2ArmeParalysante::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true); break; default: fctBugReport('Type d\'arme innexistant (' . get_class($victime->getArme()) . ')', array($victime, $victime->getArme()), __FILE__, __LINE__); break; } //On vérifie l'état de l'agresseur et on affiche dnas le HE en cas de changement d'état if ($perso->getPa() == 0 && $noticeParalyseAtt) { $msgPerso .= "\nVous êtes paralysé."; $msgVictime .= "\nVotre agresseur est paralysé."; $msgLieu .= "\nL'agresseur est paralysée."; $noticeParalyseAtt = false; //Pour ne pas repetter à chaque tour } if (!$perso->isConscient() && $noticeInconscientAtt) { $msgPerso .= "\nVous êtes inconscient."; $msgVictime .= "\nVotre agresseur est inconscient."; $msgLieu .= "\nL'agresseur est inconsciente."; $noticeInconscientAtt = false; //Pour ne pas repetter à chaque tour } if (!$perso->isVivant() && $noticeVivantAtt) { $msgPerso .= "\nVous êtes mort."; $noticeVivantAtt = false; //Pour ne pas repetter à chaque tour } } } //Vérifier les options d'arrêt if ($_POST['att_stop'] == 'normal' && !$victime->isNormal()) { $attStop = true; } if ($_POST['att_stop'] == 'autonome' && !$victime->isAutonome()) { $attStop = true; } if ($_POST['att_stop'] == 'conscient' && !$victime->isConscient()) { $attStop = true; } //Si il faut arrêter, vérifier si l'arrêt réussit ou échoue if ($attStop) { $reussite_arret = 85 + $perso->getStatRealLevel('PER') * 3; $de = rand(1, 100); if ($de >= $reussite_arret) { //ÉCHEC de l'arrêt $attStop = false; } } if ($attStop) { $msgPerso .= "\n\nVous décidez de vous en tenir là, son compte est bon."; $msgVictime .= "\n\nL'aggresseur arrête soudainement son attaque: votre compte est bon."; $msgLieu .= "\n\nL'aggresseur arrête soudainement son attaque."; } if ($riposte && $victime->isAutonome() && $victime->getPa() > 0 && $victime->getReaction() == 'fuir') { //Lister tout les lieux en libre accès accessibles de l'emplacement actuel $i = 0; while ($lien = $perso->getLieu()->getLink($i++)) { if ($lien->getProtection() == '0') { $lieuFuite[] = $lien; } } if ($e > 0) { $choix = rand(0, $e - 1); $query = 'UPDATE ' . DB_PREFIX . 'perso' . ' SET lieu=:lieuTech' . ' WHERE id =:persoId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':lieuTech', $lieuFuite[$choix]->getNomTech(), PDO::PARAM_STR); $prep->bindValue(':persoId', $victime->getId(), PDO::PARAM_INT); $prep->executePlus($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; $msgPerso .= "\n\nLa victime arrive à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i]."; $msgVictime .= "\n\nVous arrivez à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i]."; $msgLieu .= "\n\nLa victime arrive à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i]."; $attStop = true; } else { $msgPerso .= "\n\nLa victime tente de fuir mais ne trouve aucune issue."; $msgVictime .= "\n\nVous tentez de fuir mais vous ne trouvez aucune issue."; $msgLieu .= "\n\nLa victime tente de fuir mais ne trouve aucune issue."; } } //Vérifier si le nombre de tours maximum est atteind (ou dépassé) if ($tour >= $_POST['tours']) { $attStop = true; } //Vérifier que l'agresseur est encore en état de se battre if (!$perso->isAutonome()) { $msgPerso .= "\nVous n'êtes plus en état de vous battre."; $msgVictime .= "\nVotre agresseur n'est plus en état de se battre."; $msgLieu .= "\nL'agresseur n'est plus en état de se battre."; $attStop = true; } } while (!$attStop); //Fin de la boucle des tours //### FIN DU MOTEUR D'ATTAQUE //Retirer les PA de l'attaquant $perso->changePa('-', $cout_pa); $perso->setPa(); $perso->setPv($victime, 'Attaque'); $victime->setPv($perso, 'Attaque'); $victime->setPa(); if (!$perso->getArme() instanceof Member_ItemArmeMainsnues) { $resistance = $perso->getArme()->getResistance() < 0 ? 0 : $perso->getArme()->getResistance(); $perso->getArme()->setResistance($resistance); //Vérifier si l'arme tombe à 0 if ($perso->getArme()->getResistance() == 0) { $perso->getArme()->desequiper(); $msgPerso .= "\n\nVotre arme s'est trop endommagée pendant l'attaque et elle est maintenant inutilisable."; } } if (!$victime->getArme() instanceof Member_ItemArmeMainsnues) { $resistance = $victime->getArme()->getResistance() < 0 ? 0 : $victime->getArme()->getResistance(); $victime->getArme()->setResistance($resistance); //Vérifier si l'arme tombe à 0 if ($victime->getArme()->getResistance() == 0) { $victime->getArme()->desequiper(); $msgVictime .= "\n\nVotre arme s'est trop endommagée pendant l'attaque et elle est maintenant inutilisable."; } } //Gain en STAT+COMP $msgPerso .= self::gainXP($perso, $perso->getArme(), $_POST['type_att'] == 'cible', isset($att_furtive), $tour, $persoEsq); $msgVictime .= self::gainXP($victime, $victime->getArme(), false, false, $tour, $victimeEsq); //Envoyer le message aux 2 personnes impliqués Member_He::add($perso->getId(), $victime->getId(), 'attaque', $msgPerso, HE_TOUS, HE_AUCUN); Member_He::add($perso->getId(), $victime->getId(), 'attaque', $msgVictime, HE_AUCUN, HE_TOUS); //Envoyer le message à tout les gens présent sur le lieu $i = 0; $arrPersoLieu = array(); while ($tmp = $perso->getLieu()->getPerso($perso, $i++)) { if ($tmp->getId() != $perso->getId() && $tmp->getId() != $victime->getId()) { $arrPersoLieu[count($arrPersoLieu)] = $tmp->getId(); } } if (count($arrPersoLieu) > 0) { Member_He::add(array($perso->getId(), $victime->getId()), $arrPersoLieu, 'attaque', $msgLieu, HE_AUCUN, HE_TOUS); } //Rafraichir le HE if (!DEBUG_MODE) { return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/herefresh.htm', __FILE__, __LINE__); } }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante $errorUrl1 = '?popup=1&m=Action_Lieu_Guichet'; $errorUrl2 = '?popup=1&m=Action_Lieu_Guichet2'; $errorUrl3 = '?popup=1&m=Action_Lieu_Guichet3historique'; //Vérifier l'état du perso if (!$perso->isAutonome()) { return fctErrorMSG('Votre n\'êtes pas en état d\'effectuer cette action.', $errorUrl1); } //Vérifier si une carte à été sélectionnée if (!isset($_POST['carteid'])) { return fctErrorMSG('Aucune carte sélectionnée.', $errorUrl1); } //Valider si le NIP a été saisi if (!isset($_POST['nip'])) { return fctErrorMSG('Aucun NIP spécifiée.', $errorUrl2, array('carteid' => $_POST['carteid'])); } if (!isset($_POST['trsid'])) { return fctErrorMSG('Transaction invalide (1).', $errorUrl3, array('carteid' => $_POST['carteid'], 'nip' => $_POST['nip'])); } //Créer la carte + compte $query = 'SELECT *' . ' FROM `' . DB_PREFIX . 'banque_cartes`' . ' LEFT JOIN `' . DB_PREFIX . 'banque_comptes` ON (`compte_banque` = `carte_banque` AND `compte_compte` = `carte_compte`)' . ' WHERE `carte_id` = :carteId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':carteId', $_POST['carteid'], PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si la carte existe dans la base de données if ($arr === false) { fctBugReport('Cette carte n\'existe pas', array('perso' => $perso, 'query' => $query), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } //Créer le compte bancaire $compte = new Member_BanqueCompte($arr); //Créer la carte $carte = $compte->getCarte($_POST['carteid'], $arr); //Valider si la carte est active ou non if (!$carte->isValid()) { return fctErrorMSG('Cette carte à été désactivée.', $errorUrl1); } //Valider le NIP if ($carte->getNip() != $_POST['nip']) { return fctErrorMSG('NIP invalide.', $errorUrl2, array('carteid' => $_POST['carteid'])); } //Charger l'historique des transactions $noCompte = $compte->getNoBanque() . '-' . $compte->getNoCompte(); $query = 'SELECT * ' . ' FROM `' . DB_PREFIX . 'banque_historique`' . ' WHERE `compte`=:noCompte' . ' AND `id`=:id;'; $prep = $db->prepare($query); $prep->bindValue(':noCompte', $noCompte, PDO::PARAM_STR); $prep->bindValue(':id', $_POST['trsid'], PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si la transaction existe dans la base de données if ($arr === false) { return fctErrorMSG('Transaction invalide (2).', $errorUrl3, array('carteid' => $_POST['carteid'], 'nip' => $_POST['nip'])); } //Récolter et formater les informations relative à la transaction $arr['date'] = fctToGameTime($arr['date'], false, true); $arr['solde'] = fctCreditFormat($arr['solde'], true); //Passer les informations au template $tpl->set('CARD_ID', $_POST['carteid']); $tpl->set('NIP', $_POST['nip']); $tpl->set('COMPTE', $compte->getNoBanque() . '-' . $compte->getNoCompte()); //Afficher la page adéquate selon le type de transaction switch ($arr['code']) { case "RETR": $arr['montant'] = fctCreditFormat($arr['retrait']); $tpl->set('TRANSACTION', $arr); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique_detailsdirect.htm', __FILE__, __LINE__); break; case "DPOT": $arr['montant'] = fctCreditFormat($arr['depot']); $tpl->set('TRANSACTION', $arr); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique_detailsdirect.htm', __FILE__, __LINE__); break; case "RTRF": $arr['montant'] = fctCreditFormat($arr['depot']); $tpl->set('TRANSACTION', $arr); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique_detailstransfert.htm', __FILE__, __LINE__); break; case "STRF": $arr['montant'] = fctCreditFormat($arr['retrait']); $tpl->set('TRANSACTION', $arr); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique_detailstransfert.htm', __FILE__, __LINE__); break; default: $tpl->set('TRANSACTION', $arr); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique_detailsnodetails.htm', __FILE__, __LINE__); break; } }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //BUT: Démarrer un template propre à cette page $errorUrl = '?popup=1&m=Action_Lieu_CasiersListe'; //Valider si un casier à été sélectionné if (!isset($_POST['id_casier'])) { return fctErrorMSG('Aucun casier sélectionné.', $errorUrl); } $tpl->set('ID_CASIER', $_POST['id_casier']); //LISTER TOUT LES CASIERS DU LIEU $i = 0; $found = false; while ($casier = $perso->getLieu()->getCasiers($i++)) { if ($casier->getId() == $_POST['id_casier']) { $found = true; break; } } //Valider si le casier se trouve dans le lieu actuel if (!$found) { return fctErrorMSG('Le casier #' . $_POST['id_casier'] . ' est introuvable.', $errorUrl); } //PROTECTION: vérifier la protection du casier if ($casier->getProtection() != NULL) { //Protection par digipass if ($casier->getProtection() == 'pass') { if (isset($_POST['pass']) && $_POST['pass'] != $casier->getPass()) { $tpl->set('WRONGPASS', true); } if (!isset($_POST['pass']) || $_POST['pass'] != $casier->getPass()) { return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Casier_digipass.htm', __FILE__, __LINE__); } $tpl->set('PASS', $_POST['pass']); //Protection par clef } elseif ($casier->getProtection() == 'clef') { $accesOk = false; //Trouver la clé $i = 0; $e = 0; $arrClefs = array(); while ($item = $perso->getInventaire($i++)) { if ($item instanceof Member_ItemClef) { $arrClefs[$e++] = $item; if (isset($_POST['clef']) && $item->getInvId() == $_POST['clef']) { if ($item->getCode() == $casier->getPass()) { $accesOk = true; $tpl->set('CLEF', $_POST['clef']); break; } } } } if (!$accesOk) { if (isset($_POST['clef'])) { $tpl->set('WRONGPASS', true); } if (count($arrClefs) > 0) { $tpl->set('CLEFS', $arrClefs); } return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Casier_clef.htm', __FILE__, __LINE__); } } else { fctBugReport('Une protection d\'un casier n\'est pas prise en charge par le système.', array('CasierId:' . $casier->getId(), 'Protection:' . $casier->getProtection()), __FILE__, __LINE__); } } //LISTER L'INVENTAIRE DU CASIER $i = 0; $e = 0; $arr = array(); while ($item = $casier->getInventaire($i++)) { $arr[$e++] = $item; } //Passer l'invantaire du casier au template, sauf s'il est vide (ne rien envoyer au template) if (count($arr) > 0) { $tpl->set('ITEMS', $arr); } //LISTER L'INVENTAIRE DU PERSO $i = 0; $items = array(); while ($item = $perso->getInventaire($i++)) { if (!$item instanceof Member_ItemDrogueDrogue) { //Pourquoi exclu t-on les drogues ? $items[$i] = $item; } } if (count($items) > 0) { $tpl->set('INV_PERSO', $items); } return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/CasierInv.htm', __FILE__, __LINE__); }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante $errorUrl1 = '?popup=1&m=Action_Lieu_Guichet'; $errorUrl2 = '?popup=1&m=Action_Lieu_Guichet2'; $errorUrl3 = '?popup=1&m=Action_Lieu_Guichet3'; //Vérifier l'état du perso if (!$perso->isAutonome()) { return fctErrorMSG('Votre n\'êtes pas en état d\'effectuer cette action.', $errorUrl1); } //Vérifier si une carte à été sélectionnée if (!isset($_POST['carteid']) || !is_numeric($_POST['carteid'])) { return fctErrorMSG('Aucune carte sélectionnée.', $errorUrl1); } //Vérifier si un NIP a été saisie if (!isset($_POST['nip'])) { return fctErrorMSG('Aucun NIP spécifiée.', $errorUrl, array('carteid' => $_POST['carteid'])); } //Créer la carte + compte $query = 'SELECT *' . ' FROM `' . DB_PREFIX . 'banque_cartes`' . ' LEFT JOIN `' . DB_PREFIX . 'banque_comptes` ON (`compte_banque` = `carte_banque` AND `compte_compte` = `carte_compte`)' . ' WHERE `carte_id` = :carteId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':carteId', $_POST['carteid'], PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si la carte existe if ($arr === false) { fctBugReport('Cette carte n\'existe pas', array('perso' => $perso, 'query' => $query), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } //Créer le compte de banque $compte = new Member_BanqueCompte($arr); //Créer la carte bancaire $carte = $compte->getCarte($_POST['carteid'], $arr); //Valider si la carte est active ou non if (!$carte->isValid()) { return fctErrorMSG('Cette carte à été désactivée.', $errorUrl1); } //Placer les informations sur l'accès dans le template $tpl->set('CARD_ID', $_POST['carteid']); $tpl->set('NIP', $_POST['nip']); $tpl->set('COMPTE', $compte->getNoBanque() . '-' . $compte->getNoCompte()); //Valider le montant d'argent à retirer $montant = round($_POST['retrait'], 2); if (!is_numeric($montant) || $montant <= 0) { return fctErrorMSG('Montant invalide.', '?m=Action_Lieu_Guichet3', array('carteid' => $_POST['carteid'], 'nip' => $_POST['nip'])); } //Valider si le montant if ($compte->getCash() < $montant && $compte->getCash() != -1) { return fctErrorMSG('Tentative de retrait supérieur au montant maximal autorisé.', $errorUrl3, array('carteid' => $_POST['carteid'], 'nip' => $_POST['nip'])); } //Retirer l'argent du compte $compte->changeCash('-', $montant); $compte->setCash(); //Ajouter l'argent au perso $perso->changeCash('+', $montant); $perso->setCash(); //Retirer les PA au perso $perso->changePa('-', 1); $perso->setPa(); //Ajouter le message à l'historique bancaire Member_BanqueCompte::addHist($noCompte, '', 'RGUI', $montant, 0, $compte->getCash() - $montant); //Copier le message dans les HE Member_He::add('', $perso->getId(), 'parler', "Vous effectuez un retrait de " . fctCreditFormat($montant, true) . " au guichet automatique."); //Rafraichir le HE return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/herefresh.htm', __FILE__, __LINE__); }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //BUT: Démarrer un template propre à cette page $errorUrl = '?popup=1&m=Action_Lieu_CasiersListe'; $errorUrlInv = '?popup=1&m=Action_Lieu_CasierInv'; //Valider si le casier est défini if (!isset($_POST['id_casier'])) { return fctErrorMSG('Aucun casier sélectionné.', $errorUrl); } //Valider si le casier appartient au lieu du perso $i = 0; $found = false; while ($casier = $perso->getLieu()->getCasiers($i++)) { if ($casier->getId() == $_POST['id_casier']) { $found = true; break; } } if (!$found) { return fctErrorMSG('Le casier #' . $_POST['id_casier'] . ' est introuvable.', $errorUrl); } //PROTECTION: vérifier la protection du casier if ($casier->getProtection() != NULL) { //Protection par digipass if ($casier->getProtection() == 'pass') { if (!isset($_POST['pass']) || $_POST['pass'] != $casier->getPass()) { return fctErrorMSG('Accès par mot de passe invalide. (Tentative de hack 1)', $errorUrl); } //Protection par clef } elseif ($casier->getProtection() == 'clef') { $accesOk = false; //Trouver la clé $i = 0; $e = 0; $arrClefs = array(); while ($item = $perso->getInventaire($i++)) { if ($item instanceof Member_ItemClef) { $arrClefs[$e++] = $item; if (isset($_POST['clef']) && $item->getInvId() == $_POST['clef']) { if ($item->getCode() == $casier->getPass()) { $accesOk = true; break; } } } } if (!$accesOk) { return fctErrorMSG('Accès par mot de passe invalide. (Tentative de hack 2)', $errorUrl); } } else { fctBugReport('Une protection d\'un casier n\'est pas prise en charge par le système.', array('CasierId:' . $casier->getId(), 'Protection:' . $casier->getProtection()), __FILE__, __LINE__); } } //LISTER L'INVENTAIRE DU CASIER une première fois pour valider les PR $i = 0; $itemsPr = 0; $nbrItems = 0; $arr = array(); while ($item = $perso->getInventaire($i++)) { if (isset($_POST['qte_' . $item->getInvId()]) && $_POST['qte_' . $item->getInvId()] > 0) { $itemsPr += $item->getPr(); $nbrItems += $_POST['qte_' . $item->getInvId()]; } } if ($casier->getPr() + $itemsPr > $casier->getCapacite()) { return fctErrorMSG('Le casier n\'a pas assez de PR de disponible pour transférer la sélection.', $errorUrlInv, array('id_casier' => $_POST['id_casier'])); } if ($nbrItems == 0) { return fctErrorMSG('Rien à transférer.', $errorUrlInv, array('id_casier' => $_POST['id_casier'])); } //Une seconde fois pour transférer $i = 0; $e = 0; $msg = 'Vous placez les items suivants dans le casier \'' . $casier->getNom() . '\': '; while ($item = $perso->getInventaire($i++)) { if (isset($_POST['qte_' . $item->getInvId()]) && $_POST['qte_' . $item->getInvId()] > 0) { if ($e > 0) { $msg .= ', '; } $msg .= $item->getNom(); $item->transfererVersCasier($casier, $_POST['qte_' . $item->getInvId()]); } } $msg .= '.'; Member_He::add(NULL, $perso->getId(), 'casier', $msg); //Rafraichir le HE return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/herefresh.htm', __FILE__, __LINE__); }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //BUT: Démarrer un template propre à cette page $errorUrl = '?popup=1&m=Action_Lieu_CasiersListe'; if (!isset($_POST['id_casier'])) { return fctErrorMSG('Aucun casier sélectionné.', $errorUrl); } //TROUVER LE CASIER $i = 0; $found = false; while ($casier = $perso->getLieu()->getCasiers($i++)) { if ($casier->getId() == $_POST['id_casier']) { $found = true; break; } } if (!$found) { return fctErrorMSG('Le casier #' . $_POST['id_casier'] . ' est introuvable.', $errorUrl); } //PROTECTION: vérifier la protection du casier if ($casier->getProtection() != NULL) { //Protection par digipass if ($casier->getProtection() == 'pass') { if (!isset($_POST['pass']) || $_POST['pass'] != $casier->getPass()) { return fctErrorMSG('Accès par mot de passe invalide. (Tentative de hack 1)', $errorUrl); } //Protection par clef } elseif ($casier->getProtection() == 'clef') { $accesOk = false; //Trouver la clé $i = 0; $e = 0; $arrClefs = array(); while ($item = $perso->getInventaire($i++)) { if ($item instanceof Member_ItemClef) { $arrClefs[$e++] = $item; if (isset($_POST['clef']) && $item->getInvId() == $_POST['clef']) { if ($item->getCode() == $casier->getPass()) { $accesOk = true; break; } } } } if (!$accesOk) { return fctErrorMSG('Accès par mot de passe invalide. (Tentative de hack 2)', $errorUrl); } } else { fctBugReport('Une protection d\'un casier n\'est pas prise en charge par le système.', array('CasierId:' . $casier->getId(), 'Protection:' . $casier->getProtection()), __FILE__, __LINE__); } } //LISTER L'INVENTAIRE DU CASIER une première fois pour valider les PR & calculer le nbr d'items à transférer $i = 0; $itemsPr = 0; $nbrItems = 0; $arr = array(); while ($item = $casier->getInventaire($i++)) { if (isset($_POST['qte_' . $item->getInvId()])) { $qte = $_POST['qte_' . $item->getInvId()]; //Valider si la quantité est possible if (!is_numeric($qte) || $qte < 0) { return fctErrorMSG('Vous devez choisir une quantité à transférer numérique et supérieure à 0.', $errorUrl, array('id_casier' => $_POST['id_casier'])); } if ($qte > 0) { if ($qte > $item->getQte()) { return fctErrorMSG('Vous ne pouvez transférer plus que vous possèdez.', $errorUrl, array('id_casier' => $_POST['id_casier'])); } $itemsPr += $item->getPr(); $nbrItems += $qte; } } } //Valider si le perso a assez de PR disponible pour transférer les items if ($perso->getPr() + $itemsPr > $perso->getPrMax()) { return fctErrorMSG('Vous n\'avez pas assez de PR de disponible pour transférer la sélection.', $errorUrl, array('id_casier' => $_POST['id_casier'])); } //Valider si on transfert quelque chose if ($nbrItems == 0) { return fctErrorMSG('Rien à transférer.', $errorUrl, array('id_casier' => $_POST['id_casier'])); } //Une seconde fois pour transférer $i = 0; $e = 0; $itemsList = ''; while ($item = $casier->getInventaire($i++)) { if (isset($_POST['qte_' . $item->getInvId()])) { $qte = $_POST['qte_' . $item->getInvId()]; if ($qte > 0) { //Ajouter le nom de l'item dans la liste $itemsList .= ($e++ > 0 ? ', ' : '') . $qte . 'x[i]' . $item->getNom() . '[/i]'; //Transférer l'item $item->transfererVersPerso($perso, $qte); } } } $msg = 'Vous ramassez les items suivants dans le casier \'' . $casier->getNom() . '\': ' . $itemsList . '.'; Member_He::add(NULL, $perso->getId(), 'casier', $msg); //Rafraichir le HE return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/herefresh.htm', __FILE__, __LINE__); }
/** * Charge la liste des liens du lieu. * * Selon le lieu actuel (de l'objet lieu), cette fonction créer/génère * le 'tableau des déplacements'. Chaque lien (ou déplacement) est en * soit un lieu. * * Cette fonction est apellée automatiquement par getLink() dans le cas * ou le 'tableau des déplacements' est innexistant. * * @todo: Si plusieurs perso sont banni d'un lieu, plusieurs liens identique seront créé. Il faut faire un sous-tableau. * @see getLink() * @param int $persoid Utile pour déterminer si un perso est banni d'accès au lieu. */ private function loadLinks($persoid = 0) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //Charger les informations générale du lien $query = 'SELECT ll.*, l.`nom_affiche`, l.`description`, l.`id` as lid, b.id as banid' . ' FROM ' . DB_PREFIX . 'lieu_lien as ll' . ' INNER JOIN ' . DB_PREFIX . 'lieu as l ON (l.`nom_technique`=ll.`to`)' . ' LEFT JOIN ' . DB_PREFIX . 'lieu_ban as b ON (b.lieu=l.`nom_technique` AND b.persoid=:persoId)' . ' WHERE `from`=:nomTech;'; $prep = $db->prepare($query); $prep->bindValue(':persoId', $persoid, PDO::PARAM_INT); $prep->bindValue(':nomTech', $this->nomTech, PDO::PARAM_STR); $prep->executePlus($db, __FILE__, __LINE__); $arrLien = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; foreach ($arrLien as $arr) { if ($arr['lid'] == '') { fctBugReport('Un lien existe, mais pas le lieu', array($query, $arr), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, false, false); } $this->liens[] = new Member_LieuLien($arr); } }
public static function go(&$account) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante $nextnow = mktime(date("H") - INNACTIVITE_TELEPORT_DELAY, date("i"), date("s"), date("m"), date("d"), date("Y")); $delExpir = mktime(date("H"), date("i"), date("s"), date("m"), date("d") - INNACTIVITE_DELETE_DELAY, date("Y")); try { //Trouver les innactifs $query = 'SELECT p.id' . ' FROM ' . DB_PREFIX . 'perso as p, ' . DB_PREFIX . 'account as a' . ' WHERE a.last_conn<:expiration' . ' AND p.userId = a.id' . ' AND p.lieu!=:lieu' . ' AND p.lieu!=:lieuVac' . ' LIMIT 5;'; $prep = $db->prepare($query); $prep->bindValue('expiration', $nextnow, PDO::PARAM_INT); $prep->bindValue('lieu', INNACTIVITE_TELEPORT_LOCATION, PDO::PARAM_STR); $prep->bindValue('lieuVac', INNACTIVITE_VOLUNTARY_LOCATION, PDO::PARAM_STR); $prep->execute($db, __FILE__, __LINE__); $arrPerso = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; if (count($arrPerso) == 0) { return; } //Ne pas essayer de supprimer des perso, on le fera au prochain innactif $query = 'UPDATE ' . DB_PREFIX . 'perso' . ' SET lieu=:lieu' . ' WHERE id=:persoId;'; $prep = $db->prepare($query); foreach ($arrPerso as &$id) { $id = (int) $id[0]; //Téléporter les innactifs $prep->bindValue('lieu', INNACTIVITE_TELEPORT_LOCATION, PDO::PARAM_STR); $prep->bindValue('persoId', $id, PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); Member_He::add('System', $id, 'innact', 'Votre personnage a été téléporté pour inactivité.'); } $prep->closeCursor(); $prep = NULL; } catch (Exception $e) { fctBugReport('Erreur', $e->getMessage(), __FILE__, __LINE__); } try { //Trouver les trop innactifs (les supprimer) $query = 'SELECT p.id, p.nom, a.email' . ' FROM ' . DB_PREFIX . 'perso as p, ' . DB_PREFIX . 'account as a' . ' WHERE a.last_conn<:expiration' . ' AND p.userId = a.id' . ' AND p.lieu != :lieuVac' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue('expiration', $delExpir, PDO::PARAM_INT); $prep->bindValue('lieuVac', INNACTIVITE_VOLUNTARY_LOCATION, PDO::PARAM_STR); $prep->execute($db, __FILE__, __LINE__); $arrPerso = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; if (count($arrPerso) == 0) { return; } //Ne pas essayer de supprimer des perso, on le fera au prochain innactif foreach ($arrPerso as &$arr) { //Apeller la fonction qui gère la suppression de perso. Mj_Perso_Del::delete($arr['id'], 'system'); $tpl = new Template($account); //Envoyer un email de bye bye $tpl->set('PERSO_NOM', stripslashes($arr['nom'])); $MSG = $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Visitor/innactivite_email.htm', __FILE__, __LINE__); $ret = @mail($arr['email'], "Cybercity 2034 - Suppression", $MSG, "From: robot@cybercity2034.com\n" . "MIME-Version: 1.0\n" . "Content-type: text/html; charset=utf-8\n"); } } catch (Exception $e) { fctBugReport('Erreur', $e->getMessage(), __FILE__, __LINE__); } }
/** * Cette fonction s'occupe de mettre à jours le compte des messages * dans le HE ainsi que sa taille totale. * * @param int $persoId Id du perso à qui le HE appartient. * @param int $qte Quantité de message ajoutés ou supprimés. * @param bool $deleted S'il sagit de la suppression d'un message. */ private static function changeStat($persoId, $qte = 1, $deleted = false, $extraInfo = null) { if ($qte == 0) { return; } $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante //Modifier les statistiques sur les message dans le HE. if ($deleted) { // le AND préviennent les 0-1 = VALEUR_MAX_DU_CHAMP $query = 'UPDATE `' . DB_PREFIX . 'perso`' . ' SET `heQte`=`heQte`-:qte1' . ' WHERE `id`=:persoId' . ' AND `heQte` >= :qte2' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':qte1', $qte, PDO::PARAM_INT); $prep->bindValue(':qte2', $qte, PDO::PARAM_INT); $prep->bindValue(':persoId', $persoId, PDO::PARAM_INT); } else { $query = 'UPDATE `' . DB_PREFIX . 'perso`' . ' SET `heQte`=`heQte`+:qte' . ' WHERE `id`=:persoId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':qte', $qte, PDO::PARAM_INT); $prep->bindValue(':persoId', $persoId, PDO::PARAM_INT); } $prep->execute($db, __FILE__, __LINE__); $affRow = $prep->rowCount(); $prep->closeCursor(); $prep = NULL; //Mettre à jour les stats du HE. if ($affRow == 0) { //Remettre le compteur à zéro. $query = 'UPDATE `' . DB_PREFIX . 'perso`' . ' SET `heQte`=0' . ' WHERE `id`=:persoId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':persoId', $persoId, PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $prep->closeCursor(); $prep = NULL; fctBugReport('Incohérence heQte détectée.', array($query, $extraInfo), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, false, false); } }
private function genMemberPage($file) { //Si aucun perso est chargé ET qu'on ne veux pas en charger un if ($this->session->getVar('persoId') === NULL && !isset($_GET['perso'])) { //Page n'ayant besoin d'être en train de jouer un perso $canAccessWithoutPerso = false; $pages = explode(',', str_replace(' ', '', ENGINE_ACCESS_WITHOUT_PERSO)); foreach ($pages as $page) { if ($page == $file) { $canAccessWithoutPerso = true; break; } } unset($pages, $page); if ($canAccessWithoutPerso) { return call_user_func_array(array('Member_' . $file, 'generatePage'), array(&$this->tpl, &$this->session, &$this->account)); } else { return fctErrorMSG('Aucun personnage sélectionné.'); } unset($canAccessWithoutPerso); } else { //S'il faudrait charger un perso mais que rien n'est demandé if ($this->session->getVar('persoId') === NULL && !isset($_GET['perso'])) { return fctErrorMSG('Vous devez sélectionner un personnage.'); } //Si aucun perso n'est actuellement joué, procéder à son chargement if (isset($_GET['perso']) && $_GET['perso'] != $this->session->getVar('persoId')) { //Rechercher parmis notre liste de personnage si celui demandé y est. $persoFound = false; foreach ($this->session->getVar('persoList') as $arrPerso) { if ($arrPerso['id'] == $_GET['perso']) { $persoFound = true; break; } } if (!$persoFound) { return fctErrorMSG('Tentative de jouer un perso qui ne vous appartiend pas. (cheat)'); } $this->session->setVar('persoId', (int) $_GET['perso']); } try { $perso = Member_Perso::load($this->session->getVar('persoId')); $this->tpl->set('CURRENT_PERSO_ID', $perso->getId()); if ($perso->getHeMsgCount() > 15000) { fctBugReport('Un problème avec le HE à été détecté. Un rapport d\'erreur à été créé et votre compte sera vérifié sous peu.', $perso, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, true, true, true); } //$this->session->setVar('perso', $perso); } catch (Exception $e) { return fctErrorMSG($e->getMessage()); } return call_user_func_array(array('Member_' . $file, 'generatePage'), array(&$this->tpl, &$this->session, &$this->account, &$perso)); } //Fin du if: Si un personnage à été sélection ou est sauvegardé }
/** * Gère les requêtes MySQL. * * Fait la requête, gère les statistiques sur le nombre de requêtes pour la page. * gère les erreurs et les rapports au besoin. * * Exemple d'utilisation - Exécute une requête et affiche le résultat * <code> * $query = 'SELECT * FROM ' . DB_PREFIX . 'perso WHERE id=801;'; * $result = $db->query($query,__FILE__,__LINE__,__FUNCTION__,__CLASS__,__METHOD__); * echo mysql_result($result,0); * </code> * * @see fctBugReport() * @param string $query Requête MySQL à effectuer * @param string $file En cas d'erreur, permet d'afficher le fichier qui procède à l'appel * @param string $line en cas d'erreur, permet d'afficher la ligne en cause du fichier d'appel * @param string $function en cas d'erreur, permet d'afficher la fonction en cause du fichier d'appel * @param string $class En cas d'erreur, permet d'afficher la classe qui procède à l'appel * @param string $method en cas d'erreur, permet d'afficher la méthode en cause du fichier d'appel * @return Ressource|false Ressource de mysql_query ou false en cas d'échec */ public function query($query, $file = null, $line = null, $function = null, $class = null, $method = null, $byPassCheck = false) { if (!$this->connectionId) { fctBugReport('Erreur de connexion', array('File' => $file, 'Line' => $line, 'ErrNo' => 'n/a', 'Error' => 'Aucune connexion n\'est établie.', 'query' => $query), $file, $line, $function, $class, $method); } if ($this->queryCount > 300 && !$byPassCheck) { fctBugReport('Le système semble être tombé dans une boucle infernale. Arrêt de la page par mesure préventive. Un rapport d\'erreur à été généré.', array('File' => $file, 'Line' => $line, 'ErrNo' => mysql_errno(), 'Error' => mysql_error(), 'query' => $query), $file, $line, $function, $class, $method); } $timerSQL = new Timer(); $timerSQL->start(); //Effectuer la requete $ret =& mysql_query($query, $this->connectionId); //Mettre à jour les statistiques $this->sqlTime += $timerSQL->finish(); $this->queryCount++; //Si la requête s'est mal déroulée, gérer l'erreur de requête. if ($ret === false) { fctBugReport('Erreur de requête', array('File' => $file, 'Line' => $line, 'ErrNo' => mysql_errno(), 'Error' => mysql_error(), 'query' => $query), $file, $line, $function, $class, $method); } //Retourner le résultat de la requête return $ret; }
public static function generatePage(&$tpl, &$session, &$account, &$perso) { $dbMgr = DbManager::getInstance(); //Instancier le gestionnaire $db = $dbMgr->getConn('game'); //Demander la connexion existante $errorUrl1 = '?popup=1&m=Action_Lieu_Guichet'; $errorUrl2 = '?popup=1&m=Action_Lieu_Guichet2'; //Vérifier l'état du perso if (!$perso->isAutonome()) { return fctErrorMSG('Votre n\'êtes pas en état d\'effectuer cette action.', $errorUrl1); } //Vérifier si une carte à été sélectionnée if (!isset($_POST['carteid'])) { return fctErrorMSG('Aucune carte sélectionnée.', $errorUrl1); } //Valider si le NIP a été saisi if (!isset($_POST['nip'])) { return fctErrorMSG('Aucun NIP spécifiée.', $errorUrl2, array('carteid' => $_POST['carteid'])); } //Créer la carte + compte $query = 'SELECT *' . ' FROM `' . DB_PREFIX . 'banque_cartes`' . ' LEFT JOIN `' . DB_PREFIX . 'banque_comptes` ON (`compte_banque` = `carte_banque` AND `compte_compte` = `carte_compte`)' . ' WHERE `carte_id` = :carteId' . ' LIMIT 1;'; $prep = $db->prepare($query); $prep->bindValue(':carteId', $_POST['carteid'], PDO::PARAM_INT); $prep->execute($db, __FILE__, __LINE__); $arr = $prep->fetch(); $prep->closeCursor(); $prep = NULL; //Valider si la carte existe if ($arr === false) { fctBugReport('Cette carte n\'existe pas', array('perso' => $perso, 'query' => $query), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } //Créer le compte bancaire $compte = new Member_BanqueCompte($arr); //Créer la carte $carte = $compte->getCarte($_POST['carteid'], $arr); //Valider si la carte est active ou non if (!$carte->isValid()) { return fctErrorMSG('Cette carte à été désactivée.', $errorUrl1); } //Valider le NIP if ($carte->getNip() != $_POST['nip']) { return fctErrorMSG('NIP invalide.', $errorUrl2, array('carteid' => $_POST['carteid'])); } //Charger l'historique des transactions $compteNo = $compte->getNoBanque() . '-' . $compte->getNoCompte(); $query = 'SELECT *' . ' FROM `' . DB_PREFIX . 'banque_historique`' . ' WHERE `compte`=:noCompte;'; $prep = $db->prepare($query); $prep->bindValue(':noCompte', $compteNo, PDO::PARAM_STR); $prep->execute($db, __FILE__, __LINE__); $arrAll = $prep->fetchAll(); $prep->closeCursor(); $prep = NULL; //Générer la liste de toutes les transactions et formater les données $historique = array(); foreach ($arrAll as &$arr) { $arr['date'] = fctToGameTime($arr['date']); $arr['retrait'] = fctCreditFormat($arr['retrait'], true); $arr['depot'] = fctCreditFormat($arr['depot'], true); $arr['solde'] = fctCreditFormat($arr['solde'], true); $historique[] = $arr; } //Passer les informations sur l'accès au template $tpl->set('COMPTE', $compte->getNoBanque() . '-' . $compte->getNoCompte()); $tpl->set('CARD_ID', $_POST['carteid']); $tpl->set('NIP', $_POST['nip']); $tpl->set('HISTORIQUE', $historique); return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Lieu/Banque_historique.htm', __FILE__, __LINE__); }