Artifacts fixes part 2

+Artifacts are now activated after a certain amount of time (based on
the official Travian Rules and the server speed) and not immediately
after the conquer
+Artifacts are now activated based on official Travian Rules, you can
only have 1 unique/account active artifacts

Changes in 27_show.tpl:
+Added the text "Can't be activated" to not-activable artifacts

Changes in Automation.php:
+Added a new method which activate activable artifacts

Changes in Database.php:
+Added some methods to support the new artifacts activation system
This commit is contained in:
iopietro
2018-04-25 15:13:24 +02:00
parent 26cb03cdb6
commit 0011d2abcb
4 changed files with 162 additions and 15 deletions
+3 -3
View File
@@ -93,15 +93,15 @@ class funct {
header("Location: admin.php?p=player&uid=".$get['uid'].$error);
exit;
case "reviveHero":
$livingHeroesCount = mysqli_fetch_array($database->query("SELECT Count(*) as Total FROM ".TB_PREFIX."hero WHERE uid=".(int) $get['uid']." AND (dead = 0 OR inrevive = 1)"), MYSQLI_ASSOC);
$livingHeroesCount = mysqli_fetch_array($database->query("SELECT Count(*) as Total FROM ".TB_PREFIX."hero WHERE uid=".(int) $get['uid']." AND (dead = 0 OR inrevive = 1 OR intraining = 1)"), MYSQLI_ASSOC);
if ($livingHeroesCount['Total'] > 0) {
header("Location: admin.php?p=player&uid=".$get['uid']."&re=1");
exit;
}
$result=$database->query("SELECT * FROM ".TB_PREFIX."hero WHERE heroid = ".(int) $get['hid']." AND uid=".(int) $get['uid']);
$hdata=mysqli_fetch_array($result);
$result = $database->query("SELECT * FROM ".TB_PREFIX."hero WHERE heroid = ".(int) $get['hid']." AND uid=".(int) $get['uid']);
$hdata = mysqli_fetch_array($result);
$database->query("UPDATE ".TB_PREFIX."units SET hero = 1 WHERE vref = ".(int) $hdata['wref']);
$database->query("UPDATE ".TB_PREFIX."hero SET `dead` = '0', `inrevive` = '0', `health` = '100', `lastupdate` = ".time()." WHERE `heroid` = ".(int) $get['hid']." AND `uid` = ".(int) $get['uid']);
header("Location: admin.php?p=player&uid=".$get['uid']."&rc=1");
+75
View File
@@ -89,6 +89,9 @@ class Automation {
if(!file_exists("GameEngine/Prevention/settlers.txt") or time()-filemtime("GameEngine/Prevention/settlers.txt")>50) {
$this->sendSettlersComplete();
}
if(!file_exists("GameEngine/Prevention/artifacts.txt") or time() - filemtime("GameEngine/Prevention/artifacts.txt") > 60) {
$this->activateArtifacts();
}
$this->updateGeneralAttack();
$this->checkInvitedPlayes();
$this->updateStore();
@@ -3700,6 +3703,78 @@ class Automation {
unlink("GameEngine/Prevention/settlers.txt");
}
}
private function activateArtifacts() {
global $database, $autoprefix;
if(file_exists($autoprefix."GameEngine/Prevention/artifacts.txt")) {
unlink($autoprefix."GameEngine/Prevention/artifacts.txt");
}
//Check if there's at least one artifact, if not, return
if(!$database->areArtifactsSpawned()) return;
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/artifacts.txt", 'w');
fclose($ourFileHandle);
//Get all inactive artifacts that have to be activated --> (24 hours / Speed of the server)
$time = time();
$artifacts = $database->getInactiveArtifacts(round($time - (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED)))));
if(!empty($artifacts)){
//Cache inactive artifacts by owner
$inactiveArtifactsCache = [];
foreach($artifacts as $artifact) $inactiveArtifactsCache[$artifact['owner']][] = $artifact;
foreach($inactiveArtifactsCache as $owner => $inactiveArtifacts){
//Initialize the array
$activeArtifacts = [];
//Get cached active artifacts
$ownArtifacts = $database->getOwnArtifactsSum($owner, true);
//Activate activable artifacts
foreach($inactiveArtifacts as $artifact){
if($ownArtifacts['totals'] < 3) {
if($artifact['size'] == 1){ //Village effect
$database->activateArtifact($artifact['id']);
$ownArtifacts['totals']++;
$ownArtifacts['small']++;
}elseif($artifact['size'] == 2 && !$ownArtifacts['great']){ //Account effect
$database->activateArtifact($artifact['id']);
$ownArtifacts['totals']++;
$ownArtifacts['great']++;
}elseif($artifact['size'] == 3 && !$ownArtifacts['unique']){ //Unique effect
$database->activateArtifact($artifact['id']);
$ownArtifacts['totals']++;
$ownArtifacts['unique']++;
}
}elseif($ownArtifacts['small'] == 3 && $artifact['size'] > 1){
//If we've 3 village effect artifacts activated and at least one account/unique effect not activated
//then we need to deactivate the most recent village effect artifact and activate the oldest account
//or unique effect artifact
//Deactivate the most recent village effect artifact
$database->activateArtifact($database->getNewestArtifactBySize($owner, 1)['id'], 0);
//Activate the great/unique artifact
$database->activateArtifact($artifact['id']);
$ownArtifacts['small']--;
$ownArtifacts['totals']++;
if($size == 2) $ownArtifacts['great']++;
else $ownArtifacts['unique']++;
}
}
}
}
if(file_exists("GameEngine/Prevention/artifacts.txt")) {
unlink("GameEngine/Prevention/artifacts.txt");
}
}
private function researchComplete() {
global $database, $autoprefix;
+80 -11
View File
@@ -7018,7 +7018,7 @@ References: User ID/Message ID, Mode
return (isset($cachedValue[$type.$size]) ? $cachedValue[$type.$size] : []);
}
$q = "SELECT * FROM " . TB_PREFIX . "artefacts WHERE owner = $id";
$q = "SELECT * FROM " . TB_PREFIX . "artefacts WHERE owner = $id ";
$result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q));
// cache all types and return the requested one
@@ -7139,7 +7139,7 @@ References: User ID/Message ID, Mode
list($vref, $ovref, $id) = $this->escape_input((int) $vref, (int) $ovref, (int) $id);
$time = time();
$q = "UPDATE " . TB_PREFIX . "artefacts SET vref = $vref, owner = $id, conquered = $time, active = 1 WHERE vref = $ovref";
$q = "UPDATE " . TB_PREFIX . "artefacts SET vref = $vref, owner = $id, conquered = $time, active = 0 WHERE vref = $ovref";
if(mysqli_query($this->dblink, $q))
{
@@ -7179,15 +7179,90 @@ References: User ID/Message ID, Mode
return mysqli_query($this->dblink, $q);
}
/**
*
* @return bool Returns if artefacts are already out or not
*/
function areArtifactsSpawned(){
$q = "SELECT Count(*) as Total FROM ".TB_PREFIX."artefacts LIMIT 1";
$result = mysqli_fetch_array(mysqli_query($this->dblink, $q), MYSQLI_ASSOC);
return $result['Total'] > 0;
}
/**
* Get all inactive artifacts which can be activated
*
* @return bool Returns all inactive artifacts
*/
function getInactiveArtifacts($time){
list($time) = $this->escape_input($time);
$q = "SELECT * FROM ".TB_PREFIX."artefacts WHERE active = 0 AND owner > 5 AND conquered < $time ORDER BY conquered ASC, size ASC";
$result = mysqli_query($this->dblink, $q);
return $this->mysqli_fetch_all($result);
}
/**
* Get the sum of active artifacts by user ID, divided by: total, great, small and unique
*
* @param int $uid The User ID of the player
* @param bool $mode True if you want only active artifacts, false if you want all artifacts
* @return array Returns the artifacts sum of the account, divided by: total, great, small and unique
*/
function getOwnArtifactsSum($uid, $mode = false){
list($uid) = $this->escape_input((int) $uid, $mode);
$q = "SELECT Count(size) AS totals,
SUM(IF(size = '1', 1, 0)) small,
SUM(IF(size = '2', 1, 0)) great,
SUM(IF(size = '3', 1, 0)) `unique`
FROM " . TB_PREFIX . "artefacts WHERE owner = ".(int) $uid.($mode ? " AND active = 1" : "");
$result = mysqli_query($this->dblink, $q);
return $this->mysqli_fetch_all($result)[0];
}
/**
* Activate an artifact by his id
*
* @param int $id The id of the artifact
* @return bool Returns true if the query was successful, false otherwise
*/
function activateArtifact($id, $mode = 1){
list($id) = $this->escape_input((int) $id);
$time = time();
$q = "UPDATE " . TB_PREFIX . "artefacts SET active = $mode WHERE id = $id";
return mysqli_query($this->dblink, $q);
}
/**
* Get the newest active artifact by size
*
* @param int $size The size of the artifcat (village, account, unique)
* @return array Returns the newest active artifact infomations by size
*/
function getNewestArtifactBySize($id, $size){
list($id, $size) = $this->escape_input((int) $id, (int) $size);
$q = "SELECT * FROM ".TB_PREFIX."artefacts WHERE active = 1 AND owner = $id AND size = $size ORDER BY conquered DESC LIMIT 1";
$result = mysqli_query($this->dblink, $q);
return mysqli_fetch_array($result);
}
// no need to cache this method
public function canClaimArtifact($from,$vref,$size,$type) {
public function canClaimArtifact($from, $vref, $size, $type) {
list($size,$type) = $this->escape_input((int) $size,(int) $type);
//fix by Ronix
global $session, $form;
$size1 = $size2 = $size3 = 0;
$artifact = $this->getOwnArtefactInfo( $from );
$artifact = $this->getOwnArtefactInfo($from);
if (!empty($artifact)) {
$form->addError( "error", "Treasury is full. Your hero could not claim the artefact" );
return false;
@@ -7196,13 +7271,7 @@ References: User ID/Message ID, Mode
$uid = $this->getVillageField($from, "owner");
$vuid = $this->getVillageField($vref, "owner");
$q = "SELECT Count(size) AS totals,
SUM(IF(size = '1',1,0)) small,
SUM(IF(size = '2',1,0)) great,
SUM(IF(size = '3',1,0)) `unique`
FROM " . TB_PREFIX . "artefacts WHERE owner = " . (int) $uid;
$result = mysqli_query( $this->dblink, $q );
$artifact = $this->mysqli_fetch_all( $result )[0];
$artifact = $database->getOwnArtifactsSum($uid);
if ( $artifact['totals'] < 3 || $uid == $vuid) {
$DefenderFields = $this->getResourceLevel( $vref );
+4 -1
View File
@@ -8,8 +8,11 @@ if($artefact['size'] == 1 && $artefact['type'] != 11){
$effect = ACCOUNT;
}
$activationTime = 86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED));
if($artefact['owner'] == 3) $active = "-";
elseif (!$artefact['active']) $active = date("Y-m-d H:i:s",$artefact['conquered'] + 86400);
elseif(!$artefact['active'] && $artefact['conquered'] < time() - $activationTime) $active = "<b>Can't be activated</b>";
elseif (!$artefact['active']) $active = date("Y-m-d H:i:s", $artefact['conquered'] + $activationTime);
else $active = "<b>".ACTIVE."</b>";
//// Added by brainiac - thank you