From 90f898224531d50ef1504073cb030d024f26895e Mon Sep 17 00:00:00 2001 From: Martin Ambrus Date: Thu, 2 Nov 2017 23:59:03 +0100 Subject: [PATCH] fix: hero dying and revival doesn't work correctly with multiple heroes --- GameEngine/Admin/database.php | 2 +- GameEngine/Automation.php | 12 +++++------ GameEngine/Database.php | 39 +++++++++++++++++++++-------------- GameEngine/Units.php | 4 ++-- Templates/Build/37_hero.tpl | 27 +++++++++++------------- Templates/a2b/attack.tpl | 2 +- Templates/a2b/sendback_1.tpl | 2 +- Templates/a2b/sendback_2.tpl | 2 +- Templates/a2b/sendback_3.tpl | 2 +- Templates/a2b/sendback_4.tpl | 2 +- Templates/a2b/sendback_5.tpl | 2 +- a2b.php | 4 ++-- sql_updates.txt | 1 + var/db/struct.sql | 3 ++- 14 files changed, 56 insertions(+), 48 deletions(-) diff --git a/GameEngine/Admin/database.php b/GameEngine/Admin/database.php index d1d143e4..5b2fbded 100755 --- a/GameEngine/Admin/database.php +++ b/GameEngine/Admin/database.php @@ -618,7 +618,7 @@ class adm_DB { } if( intval($enforce['hero']) > 0){ - $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $result = mysqli_query($q); $hero_f=mysqli_fetch_array($result); $hero_unit=$hero_f['unit']; diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 963a1568..63ada840 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -1884,7 +1884,7 @@ class Automation { } } if ($herosend_att>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; @@ -2804,7 +2804,7 @@ class Automation { } if ($prisoner['t11']>0){ - $p_qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $p_owner.""; + $p_qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $p_owner." AND dead = 0"; $p_resulth = $database->query($p_qh); $p_hero_f=mysqli_fetch_array($p_resulth); $p_hero_unit=$p_hero_f['unit']; @@ -2978,7 +2978,7 @@ class Automation { } } if ($herosend_att>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; @@ -3259,7 +3259,7 @@ class Automation { } if (isset($post['t11'])){ if( $post['t11'] != '' && $post['t11'] > 0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; @@ -4894,8 +4894,8 @@ class Automation { if($herodata[0]['trainingtime'] <= time()) { if($herodata[0]['trainingtime'] != 0) { if($herodata[0]['dead'] == 0) { - mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "hero SET trainingtime = '0' WHERE uid = " . (int) $session->uid . ""); - mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $session->villages[0].""); + mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "hero SET trainingtime = '0' WHERE heroid = " . $herodata[0]['heroid']); + mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $session->villages[0]); } } } diff --git a/GameEngine/Database.php b/GameEngine/Database.php index c5aaf76b..56630bd5 100755 --- a/GameEngine/Database.php +++ b/GameEngine/Database.php @@ -3729,7 +3729,7 @@ class MYSQLi_DB implements IDbConnection { function getHeroField($uid,$field) { list($uid,$field) = $this->escape_input((int) $uid,$field); - $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = $uid"; + $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = $uid AND dead = 0"; $result = mysqli_query($this->dblink,$q); return $this->mysqli_fetch_all($result); } @@ -3751,11 +3751,11 @@ class MYSQLi_DB implements IDbConnection { list($column,$value,$uid,$mode) = $this->escape_input($column,$value,(int) $uid,$mode); if(!$mode) { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = '$value' WHERE uid = $uid"; + $q = "UPDATE `".TB_PREFIX."hero` SET $column = '$value' WHERE uid = $uid AND dead = 0"; } elseif($mode=1) { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column + ". (int) $value ." WHERE uid = $uid"; + $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column + ". (int) $value ." WHERE uid = $uid AND dead = 0"; } else { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column - ". (int) $value ." WHERE uid = $uid"; + $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column - ". (int) $value ." WHERE uid = $uid AND dead = 0"; } return mysqli_query($this->dblink,$q); } @@ -3763,7 +3763,7 @@ class MYSQLi_DB implements IDbConnection { function modifyHeroXp($column,$value,$heroid) { list($column,$value,$heroid) = $this->escape_input($column,(int) $value,(int) $heroid); - $q = "UPDATE ".TB_PREFIX."hero SET $column = $column + $value WHERE uid=$heroid"; + $q = "UPDATE ".TB_PREFIX."hero SET $column = $column + $value WHERE uid=$heroid AND dead = 0"; return mysqli_query($this->dblink,$q); } @@ -5121,10 +5121,13 @@ References: function getHeroDead($id) { list($id) = $this->escape_input((int) $id); - $q = "SELECT dead FROM " . TB_PREFIX . "hero WHERE `uid` = $id"; + $q = "SELECT dead FROM " . TB_PREFIX . "hero WHERE `uid` = $id WHERE dead = 0"; $result = mysqli_query($this->dblink,$q); - $notend= mysqli_fetch_array($result); - return $notend['dead']; + if (mysqli_num_rows($result) > 0) { + return 0; + } else { + return 1; + } } /*************************** @@ -5135,10 +5138,13 @@ References: function getHeroInRevive($id) { list($id) = $this->escape_input((int) $id); - $q = "SELECT inrevive FROM " . TB_PREFIX . "hero WHERE `uid` = $id"; + $q = "SELECT inrevive FROM " . TB_PREFIX . "hero WHERE `uid` = $id AND inrevive = 1"; $result = mysqli_query($this->dblink,$q); - $notend= mysqli_fetch_array($result); - return $notend['inrevive']; + if (mysqli_num_rows($result) > 0) { + return 1; + } else { + return 0; + } } /*************************** @@ -5149,10 +5155,13 @@ References: function getHeroInTraining($id) { list($id) = $this->escape_input((int) $id); - $q = "SELECT intraining FROM " . TB_PREFIX . "hero WHERE `uid` = $id"; + $q = "SELECT intraining FROM " . TB_PREFIX . "hero WHERE `uid` = $id AND intraining = 1"; $result = mysqli_query($this->dblink,$q); - $notend= mysqli_fetch_array($result); - return $notend['intraining']; + if (mysqli_num_rows($result) > 0) { + return 1; + } else { + return 0; + } } /*************************** @@ -5189,7 +5198,7 @@ References: function KillMyHero($id) { list($id) = $this->escape_input((int) $id); - $q = "UPDATE " . TB_PREFIX . "hero set dead = 1 where uid = ".$id; + $q = "UPDATE " . TB_PREFIX . "hero set dead = 1 where uid = ".$id." AND dead = 0"; return mysqli_query($this->dblink,$q); } diff --git a/GameEngine/Units.php b/GameEngine/Units.php index 335ac4f7..dbdd785c 100755 --- a/GameEngine/Units.php +++ b/GameEngine/Units.php @@ -283,7 +283,7 @@ class Units { } } if( intval($enforce['hero']) > 0){ - $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $result = mysqli_query($GLOBALS['link'],$q); $hero_f=mysqli_fetch_array($result); $hero_unit=$hero_f['unit']; @@ -616,7 +616,7 @@ if($session->access != BANNED){ } if (isset($post['t11'])){ if( $post['t11'] != '' && $post['t11'] > 0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $from['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/Templates/Build/37_hero.tpl b/Templates/Build/37_hero.tpl index 02bf3482..d80ee6df 100644 --- a/Templates/Build/37_hero.tpl +++ b/Templates/Build/37_hero.tpl @@ -14,13 +14,10 @@ global $database; if (isset($_POST['name'])) { $_POST['name'] = stripslashes($_POST['name']); - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `name`='".($database->escape($_POST['name']))."' where `uid`='".$database->escape($session->uid)."'") or die("ERROR:".mysqli_error($database->dblink)); - $hero = mysqli_query($database->dblink,"SELECT * FROM " . TB_PREFIX . "hero WHERE `uid` = " . (int) $session->uid . ""); - $hero_info = mysqli_fetch_array($hero); - echo "".NAME_CHANGED.""; - } - - $hero = $units->Hero($session->uid); + mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `name`='".($database->escape($_POST['name']))."' where `uid`='".$database->escape($session->uid)."' AND dead = 0") or die("ERROR:".mysqli_error($database->dblink)); + echo "".NAME_CHANGED.""; +} + $hero_info = $units->Hero($session->uid); ?> @@ -37,8 +34,8 @@ if (isset($_POST['name'])) { - - + + - - + + - - + + - - + +
<?php echo $hero['atk']; ?><?php echo $hero_info['atk']; ?> 0 && $hero_info['attack'] < 100){ @@ -57,8 +54,8 @@ if (isset($_POST['name'])) {
<?php echo ($hero['di']) . " title="" /><?php echo ($hero_info['di']) . " title="" /> 0 && $hero_info['defence'] < 100){ @@ -77,8 +74,8 @@ if (isset($_POST['name'])) {
%<?php echo ($hero['ob']-1)*100; ?>%%<?php echo ($hero_info['ob']-1)*100; ?>% 0 && $hero_info['attackbonus'] < 100){ @@ -98,8 +95,8 @@ if (isset($_POST['name'])) {
%<?php echo ($hero['db']-1)*100; ?>%%<?php echo ($hero_info['db']-1)*100; ?>% 0 && $hero_info['defencebonus'] < 100){ diff --git a/Templates/a2b/attack.tpl b/Templates/a2b/attack.tpl index 0fb319ac..18ed8247 100644 --- a/Templates/a2b/attack.tpl +++ b/Templates/a2b/attack.tpl @@ -380,7 +380,7 @@ $end = ($tribe*10); else { //$uid - $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $uid; + $q = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $uid." AND dead = 0"; $result = mysqli_query($GLOBALS['link'],$q); $hero_f=mysqli_fetch_array($result); $hero_unit=$hero_f['unit']; diff --git a/Templates/a2b/sendback_1.tpl b/Templates/a2b/sendback_1.tpl index f5e1a8dc..d3b99864 100644 --- a/Templates/a2b/sendback_1.tpl +++ b/Templates/a2b/sendback_1.tpl @@ -137,7 +137,7 @@ $tocoor = $database->getCoor($enforce['vref']); } } if ($enforce['hero']>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/Templates/a2b/sendback_2.tpl b/Templates/a2b/sendback_2.tpl index b22ab41a..ca3ddb39 100644 --- a/Templates/a2b/sendback_2.tpl +++ b/Templates/a2b/sendback_2.tpl @@ -138,7 +138,7 @@ $tocoor = $database->getCoor($enforce['vref']); } } if ($enforce['hero']>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/Templates/a2b/sendback_3.tpl b/Templates/a2b/sendback_3.tpl index 27274d05..a9bcece0 100644 --- a/Templates/a2b/sendback_3.tpl +++ b/Templates/a2b/sendback_3.tpl @@ -137,7 +137,7 @@ $tocoor = $database->getCoor($enforce['vref']); } } if ($enforce['hero']>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/Templates/a2b/sendback_4.tpl b/Templates/a2b/sendback_4.tpl index 3c9671da..3b1e0b3b 100644 --- a/Templates/a2b/sendback_4.tpl +++ b/Templates/a2b/sendback_4.tpl @@ -138,7 +138,7 @@ $tocoor = $database->getCoor($enforce['vref']); } } if ($enforce['hero']>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/Templates/a2b/sendback_5.tpl b/Templates/a2b/sendback_5.tpl index d16e1a8a..dab7e903 100644 --- a/Templates/a2b/sendback_5.tpl +++ b/Templates/a2b/sendback_5.tpl @@ -137,7 +137,7 @@ $tocoor = $database->getCoor($enforce['vref']); } } if ($enforce['hero']>0){ - $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner'].""; + $qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $to['owner']." AND dead = 0"; $resulth = mysqli_query($GLOBALS['link'],$qh); $hero_f=mysqli_fetch_array($resulth); $hero_unit=$hero_f['unit']; diff --git a/a2b.php b/a2b.php index 0aa7cdae..0978f46b 100644 --- a/a2b.php +++ b/a2b.php @@ -193,7 +193,7 @@ if(isset($_GET['o'])) { } if ($prisoner['t11']>0){ - $p_qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $p_owner.""; + $p_qh = "SELECT * FROM ".TB_PREFIX."hero WHERE uid = ".(int) $p_owner." AND dead = 0"; $p_resulth = mysqli_query($GLOBALS['link'],$p_qh); $p_hero_f=mysqli_fetch_array($p_resulth); $p_hero_unit=$p_hero_f['unit']; @@ -222,7 +222,7 @@ if(isset($_GET['o'])) { $troops = $prisoner['t1']+$prisoner['t2']+$prisoner['t3']+$prisoner['t4']+$prisoner['t5']+$prisoner['t6']+$prisoner['t7']+$prisoner['t8']+$prisoner['t9']+$prisoner['t10']+$prisoner['t11']; if($prisoner['t11'] > 0){ $p_owner = $database->getVillageField($prisoner['from'],"owner"); - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `dead` = '1', `health` = '0' WHERE `uid` = '".$p_owner."'"); + mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `dead` = '1', `health` = '0' WHERE `uid` = '".$p_owner."' AND dead = 0"); } $database->modifyUnit($prisoner['wref'],array("99o"),array($troops),array(0)); $database->deletePrisoners($prisoner['id']); diff --git a/sql_updates.txt b/sql_updates.txt index 0508a09a..3cf690cb 100644 --- a/sql_updates.txt +++ b/sql_updates.txt @@ -2,6 +2,7 @@ ALTER TABLE `s1_hero` ADD INDEX(`lastupdate`); ALTER TABLE `s1_hero` DROP INDEX `uid`, ADD INDEX `uid` (`uid`, `dead`) USING BTREE; ALTER TABLE `s1_hero` ADD INDEX(`inrevive`); +ALTER TABLE `s1_hero` ADD INDEX(`intraining`); -- 31.10.2017 -> Embassy and alliance updates ALTER TABLE `s1_ali_permission` ADD INDEX(`alliance`); diff --git a/var/db/struct.sql b/var/db/struct.sql index 7111c1c1..5a3869e6 100644 --- a/var/db/struct.sql +++ b/var/db/struct.sql @@ -916,7 +916,8 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%hero` ( PRIMARY KEY (`heroid`), KEY `uid` (`uid`, `dead`) USING BTREE, KEY `lastupdate` (`lastupdate`), - KEY `inrevive` (`inrevive`) + KEY `inrevive` (`inrevive`), + KEY `intraining` (`intraining`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; --