Files
TravianZ/GameEngine/Building.php
T
Pietro 757b41143d Fixed some building bugs
Fixed an error that could have shown if you had tried to build a not buildable building.
Buildings can no longer be built if in demolition.
Buildings can no longer be built above the max level (the previous fix was still hackable, through the waiting loop).
2018-04-03 15:39:48 +02:00

1075 lines
40 KiB
PHP
Executable File

<?php
#################################################################################
## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
## --------------------------------------------------------------------------- ##
## Project: TravianZ ##
## Version: 22.06.2015 ##
## Filename Building.php ##
## Developed by: Mr.php , Advocaite , brainiacX , yi12345 , Shadow , ronix ##
## Fixed by: Shadow - STARVATION , HERO FIXED COMPL., TPLinux ##
## Fixed by: InCube - double troops ##
## License: TravianZ Project ##
## Copyright: TravianZ (c) 2010-2015. All rights reserved. ##
## URLs: http://travian.shadowss.ro ##
## Source code: https://github.com/Shadowss/TravianZ ##
## ##
#################################################################################
class Building {
public $NewBuilding = false;
private $maxConcurrent;
private $allocated;
private $basic,$inner,$plus = 0;
public $buildArray = array();
public function __construct() {
global $session;
$this->maxConcurrent = BASIC_MAX;
if(ALLOW_ALL_TRIBE || $session->tribe == 1) {
$this->maxConcurrent += INNER_MAX;
}
if($session->plus) {
$this->maxConcurrent += PLUS_MAX;
}
$this->LoadBuilding();
foreach($this->buildArray as $build) {
if($build['master']==1){
$this->maxConcurrent += 1;
}
}
}
public function residenceOfPalaceBuildInProgress() {
global $database, $village;
$residenceOrPalaceInProgress = $database->getBuildingByType2($village->wid, '25, 26');
$residenceBuildInProgress = false;
$palaceBuildInProgress = false;
if (count($residenceOrPalaceInProgress)) {
foreach ($residenceOrPalaceInProgress as $record) {
if ($record == 25) {
$residenceBuildInProgress = true;
} else {
$palaceBuildInProgress = true;
}
}
}
return [
'residence' => $residenceBuildInProgress,
'palace' => $palaceBuildInProgress
];
}
/*
* Checks whether to allow building Wonder of the World
* above current level. This includes checks for WW upgrade
* currently in progress as well as current WW level
* and the right number of building plans in the alliance.
*/
public function allowWwUpgrade() {
global $database, $village, $session;
static $cached = null;
if ($cached === null) {
$wwHighestLevelFound = $village->resarray['f99'];
$wwBuildingProgress = $database->getBuildingByType( $village->wid, 99 );
if ( count( $wwBuildingProgress ) ) {
if ( $wwBuildingProgress[0]['level'] > $wwHighestLevelFound ) {
$wwHighestLevelFound = $wwBuildingProgress[0]['level'];
}
}
// check if we should allow building the WW this high
if ( $wwHighestLevelFound >= 50 ) {
$needed_plan = 2;
} else {
$needed_plan = 1;
}
// count building plans
if ( $needed_plan ) {
$wwbuildingplan = 0;
$planFoundInOwnersVillage = false;
$villages = $database->getVillagesID( $session->uid );
foreach ( $villages as $village1 ) {
$plan = count( $database->getOwnArtefactInfoByType2( $village1, 11 ) );
if ( $plan > 0 ) {
$wwbuildingplan = 1;
$planFoundInOwnersVillage = true;
}
}
if ( $session->alliance != 0 ) {
$alli_users = $database->getUserByAlliance( $session->alliance );
foreach ( $alli_users as $users ) {
$villages = $database->getVillagesID( $users['id'] );
if ( $users['id'] != $session->uid ) {
foreach ( $villages as $village1 ) {
$plan = count( $database->getOwnArtefactInfoByType2( $village1, 11 ) );
if ( $plan > 0 ) {
$wwbuildingplan += 1;
}
}
}
}
}
if ($needed_plan == 1) {
$cached = ($wwbuildingplan >= $needed_plan && $planFoundInOwnersVillage);
} else {
$cached = $wwbuildingplan >= $needed_plan;
}
} else {
// no need for building plans, we can still upgrade WW
$cached = true;
}
}
return $cached;
}
public function canProcess($id,$tid) {
//add fix by ronix
global $session, $database, $village;
if($session->access==BANNED){
header("Location: banned.php");
exit;
} else {
$levels = $database->getResourceLevel($village->wid);
$progresses = $this->residenceOfPalaceBuildInProgress();
if (
!(
// check if we're not trying to hack-build residence and palace together
(
!in_array($tid, [25, 26]) ||
(
($tid == 25 && $progresses['palace'] === false) ||
($tid == 26 && $progresses['residence'] === false)
)
) &&
// don't allow building WW to level 51 with a waiting loop
(
$tid != 99 ||
(
$tid == 99 &&
$this->allowWwUpgrade()
)
)
)
) {
$this->redirect($tid);
}
if (
// check that our ID actually exists within the buildings list
isset($village->resarray['f'.$tid.'t']) &&
// let's see if we should allow building what we want where we want to
// (prevent building resource fields in the village
(
($tid >= 1 && $tid <= 18 && $id >= 1 && $id <= 4) ||
($tid >= 19 && $id > 4)
) &&
// check that we're not trying to change a standing building type
(
$levels['f'.$tid.'t'] == $id ||
$levels['f'.$tid.'t'] == 0
)
) {
if ( !isset($_GET['master']) && $this->checkResource( $id, $tid ) != 4 ) {
$this->redirect($tid);
}
// check if the building will be built with the master builder
if(isset($_GET['master'])){
// if so, we have to check if it'll be built or upgraded
if($levels['f'.$tid.'t'] == 0)
{
// the building will be built, we have to check if we can build it
if(!$this->meetRequirement($id)){
$this->redirect($tid);
}
}else{
// the building will be upgraded, we have to check if we can upgrade it
if($this->isMax($id, $tid, $this->isLoop($tid) + $this->isCurrent($tid))){
$this->redirect($tid);
}
}
}
} else {
header('Location: '.$_SERVER['SCRIPT_NAME']);
exit;
}
}
}
/**
* Redirects to dorf1.php if we're building/upgrading resource fields otherwise in dorf2.php
*
* @param int $tid the id where the building is built/upgraded
*/
private function redirect($tid){
if ($tid >= 19) {
header("Location: dorf2.php");
exit;
} else {
header("Location: dorf1.php");
exit;
}
}
public function procBuild($get) {
global $session, $village, $database;
if(isset($get['a']) && $get['c'] == $session->checker && !isset($get['id'])) {
if($get['a'] == 0) {
$this->removeBuilding($get['d']);
}else {
$session->changeChecker();
$this->canProcess($village->resarray['f'.$get['a'].'t'],$get['a']);
$this->upgradeBuilding($get['a']);
}
}
if(isset($get['master']) && isset($get['id']) && isset($get['time']) && $session->gold >= 1 && $session->goldclub && $village->master == 0 && (isset($get['c']) && $get['c']== $session->checker)) {
$this->canProcess($get['master'],$get['id']);
$session->changeChecker();
if($session->access==BANNED){
header("Location: banned.php");
exit;
}
$level = $database->getResourceLevel( $village->wid );
$database->addBuilding( $village->wid, $get['id'], $get['master'], 1, $get['time'], 1, $level[ 'f' . $get['id'] ] + 1 + count( $database->getBuildingByField( $village->wid, $get['id'] ) ) );
$this->redirect($get['id']);
}
if(isset($get['a']) && $get['c'] == $session->checker && isset($get['id'])) {
if ($get['id'] > 18 && ($get['id'] < 41 || $get['id'] == 99)){
$session->changeChecker();
$this->canProcess($get['a'],$get['id']);
$this->constructBuilding($get['id'],$get['a']);
}
}
if(isset($get['buildingFinish']) && $session->plus) {
if(intval($session->gold) >= 2 && $session->sit == 0) {
$this->finishAll();
}
}
}
public function canBuild($id,$tid) {
global $village,$session,$database;
$demolition = $database->getDemolition($village->wid);
if((isset($demolition[0])) && $demolition[0]['buildnumber']==$id) { return 11; }
if($this->isMax($tid,$id)) {
return 1;
} else if($this->isMax($tid,$id,1) && ($this->isLoop($id) || $this->isCurrent($id))) {
return 10;
} else if($this->isMax($tid,$id,2) && $this->isLoop($id) && $this->isCurrent($id)) {
return 10;
} else if($this->isMax($tid,$id,3) && $this->isLoop($id) && $this->isCurrent($id) && count($database->getMasterJobs($village->wid)) > 0) {
return 10;
}
else {
if($this->allocated <= $this->maxConcurrent) {
$resRequired = $this->resourceRequired($id,$village->resarray['f'.$id.'t']);
$resRequiredPop = $resRequired['pop'];
if ($resRequiredPop == "") {
$buildarray = $GLOBALS["bid".$tid];
$resRequiredPop = $buildarray[1]['pop'];
}
$jobs = $database->getJobs($village->wid);
if ($jobs > 0) {
$soonPop = 0;
foreach ($jobs as $j) {
$buildarray = $GLOBALS["bid".$j['type']];
$soonPop += $buildarray[$database->getFieldLevel($village->wid,$j['field'])+1]['pop'];
}
}
if(($village->allcrop - $village->pop - $soonPop - $resRequiredPop) <= 1 && $village->resarray['f'.$id.'t'] <> 4) {
return 4;
}
else {
switch($this->checkResource($tid,$id)) {
case 1:
return 5;
break;
case 2:
return 6;
break;
case 3:
return 7;
break;
case 4:
if($id >= 19) {
if($session->tribe == 1 || ALLOW_ALL_TRIBE) {
if($this->inner == 0) {
return 8;
}
else {
if($session->plus or $tid==40) {
if($this->plus == 0) {
return 9;
}
else {
return 3;
}
}
else {
return 2;
}
}
}
else {
if($this->basic == 0) {
return 8;
}
else {
if($session->plus or $tid==40) {
if($this->plus == 0) {
return 9;
}
else {
return 3;
}
}
else {
return 2;
}
}
}
}
else {
if($this->basic == 1) {
if(($session->plus or $tid==40) && $this->plus == 0) {
return 9;
}
else {
return 3;
}
}
else {
return 8;
}
}
break;
}
}
}
else {
return 2;
}
}
}
public function walling() {
global $session;
$wall = array(31,32,33);
foreach($this->buildArray as $job) {
if(in_array($job['type'],$wall)) {
return "3".$session->tribe;
}
}
return false;
}
public function rallying() {
foreach($this->buildArray as $job) {
if($job['type'] == 16) {
return true;
}
}
return false;
}
public function procResType($ref) {
global $session;
switch($ref) {
case 1: $build = "Woodcutter"; break;
case 2: $build = "Clay Pit"; break;
case 3: $build = "Iron Mine"; break;
case 4: $build = "Cropland"; break;
case 5: $build = "Sawmill"; break;
case 6: $build = "Brickyard"; break;
case 7: $build = "Iron Foundry"; break;
case 8: $build = "Grain Mill"; break;
case 9: $build = "Bakery"; break;
case 10: $build = "Warehouse"; break;
case 11: $build = "Granary"; break;
case 12: $build = "Blacksmith"; break;
case 13: $build = "Armoury"; break;
case 14: $build = "Tournament Square"; break;
case 15: $build = "Main Building"; break;
case 16: $build = "Rally Point"; break;
case 17: $build = "Marketplace"; break;
case 18: $build = "Embassy"; break;
case 19: $build = "Barracks"; break;
case 20: $build = "Stable"; break;
case 21: $build = "Workshop"; break;
case 22: $build = "Academy"; break;
case 23: $build = "Cranny"; break;
case 24: $build = "Town Hall"; break;
case 25: $build = "Residence"; break;
case 26: $build = "Palace"; break;
case 27: $build = "Treasury"; break;
case 28: $build = "Trade Office"; break;
case 29: $build = "Great Barracks"; break;
case 30: $build = "Great Stable"; break;
case 31: $build = "City Wall"; break;
case 32: $build = "Earth Wall"; break;
case 33: $build = "Palisade"; break;
case 34: $build = "Stonemason's Lodge"; break;
case 35: $build = "Brewery"; break;
case 36: $build = "Trapper"; break;
case 37: $build = "Hero's Mansion"; break;
case 38: $build = "Great Warehouse"; break;
case 39: $build = "Great Granary"; break;
case 40: $build = "Wonder of the World"; break;
case 41: $build = "Horse Drinking Trough"; break;
case 42: $build = "Great Workshop"; break;
default: $build = "Error"; break;
}
return $build;
}
public function loadBuilding() {
global $database,$village,$session;
$this->buildArray = $database->getJobs($village->wid);
$this->allocated = count($this->buildArray);
if($this->allocated > 0) {
foreach($this->buildArray as $build) {
if($build['loopcon'] == 1) {
$this->plus = 1;
}
else {
if($build['field'] <= 18) {
$this->basic += 1;
}
else {
if($session->tribe == 1 || ALLOW_ALL_TRIBE) {
$this->inner += 1;
}
else {
$this->basic += 1;
}
}
}
}
// echo var_dump($this->buildArray);
$this->NewBuilding = true;
}else{
$this->NewBuilding = false;
}
}
private function removeBuilding($d) {
global $database,$village;
foreach($this->buildArray as $jobs) {
if($jobs['id'] == $d) {
$uprequire = $this->resourceRequired($jobs['field'],$jobs['type']);
if($database->removeBuilding($d)) {
if($jobs['master'] == 0){
$database->modifyResource($village->wid,$uprequire['wood'],$uprequire['clay'],$uprequire['iron'],$uprequire['crop'],1);
}
$this->redirect($jobs['field']);
}
}
}
}
private function upgradeBuilding($id) {
global $database,$village,$session,$logging,${'bid'.$village->resarray['f'.$id.'t']};
if($this->allocated < $this->maxConcurrent) {
$uprequire = $this->resourceRequired($id,$village->resarray['f'.$id.'t']);
$time = time() + $uprequire['time'];
$bindicate = $this->canBuild($id,$village->resarray['f'.$id.'t']);
// don't allow building above max levels and don't allow building if it's in demolition
if ($bindicate == 1 || $bindicate == 10 || $bindicate == 11) {
header("Location: dorf2.php");
exit;
}
$loop = ($bindicate == 9 ? 1 : 0);
$loopsame = 0;
if($loop == 1) {
foreach($this->buildArray as $build) {
if($build['field']==$id) {
$loopsame += 1;
$uprequire = $this->resourceRequired($id,$village->resarray['f'.$id.'t'],($loopsame>0?2:1));
}
}
if($session->tribe == 1 || ALLOW_ALL_TRIBE) {
if($id >= 19) {
foreach($this->buildArray as $build) {
if($build['field'] >= 19) {
$time = $build['timestamp'] + $uprequire['time'];
}
}
}
else {
foreach($this->buildArray as $build) {
if($build['field'] <= 18) {
$time = $build['timestamp'] + $uprequire['time'];
}
}
}
}
else {
$time = $this->buildArray[0]['timestamp'] + $uprequire['time'];
}
}
$level = $database->getResourceLevel($village->wid);
if($session->access!=BANNED){
if($database->addBuilding($village->wid,$id,$village->resarray['f'.$id.'t'],$loop,$time+($loop==1?ceil(60/SPEED):0),0,$level['f'.$id] + 1 + count($database->getBuildingByField($village->wid,$id)))) {
$database->modifyResource($village->wid,$uprequire['wood'],$uprequire['clay'],$uprequire['iron'],$uprequire['crop'],0);
$logging->addBuildLog($village->wid,$this->procResType($village->resarray['f'.$id.'t']),($village->resarray['f'.$id]+($loopsame>0?2:1)),0);
$this->redirect($id);
}
}else{
header("Location: banned.php");
exit;
}
}
}
private function downgradeBuilding($id) {
global $database,$village,$session,$logging;
if($this->allocated < $this->maxConcurrent) {
$name = "bid".$village->resarray['f'.$id.'t'];
global $$name;
$dataarray = $$name;
$time = time() + round($dataarray[$village->resarray['f'.$id]-1]['time'] / 4);
$loop = 0;
if($this->inner == 1 || $this->basic == 1) {
if(($session->plus or $village->resarray['f'.$id.'t']==40)&& $this->plus == 0) {
$loop = 1;
}
}
if($loop == 1) {
if($session->tribe == 1 || ALLOW_ALL_TRIBE) {
if($id >= 19) {
foreach($this->buildArray as $build) {
if($build['field'] >= 19) {
$time = $build['timestamp'] + round($dataarray[$village->resarray['f'.$id]-1]['time'] / 4);
}
}
}
}
else {
$time = $this->buildArray[0]['timestamp'] + round($dataarray[$village->resarray['f'.$id]-1]['time'] / 4);
}
}
if($session->access!=BANNED){
$level = $database->getResourceLevel($village->wid);
if($database->addBuilding($village->wid,$id,$village->resarray['f'.$id.'t'],$loop,$time,0,0,$level['f'.$id] + 1 + count($database->getBuildingByField($village->wid,$id)))) {
$logging->addBuildLog($village->wid,$this->procResType($village->resarray['f'.$id.'t']),($village->resarray['f'.$id]-1),2);
header("Location: dorf2.php");
exit;
}
}else{
header("Location: banned.php");
exit;
}
}
}
private function constructBuilding($id,$tid) {
global $database,$village,$session,$logging;
if($this->allocated < $this->maxConcurrent) {
// check if we're not trying to hack-build residence and palace together
if (
($progresses = $this->residenceOfPalaceBuildInProgress()) &&
(
!in_array($tid, [25, 26]) ||
(
($tid == 25 && $progresses['palace'] === false) ||
($tid == 26 && $progresses['residence'] === false)
)
)
) {
if ( $tid == 16 ) {
$id = 39;
} else if ( $tid == 31 || $tid == 32 || $tid == 33 ) {
$id = 40;
}
$uprequire = $this->resourceRequired( $id, $tid );
$time = time() + $uprequire['time'];
$bindicate = $this->canBuild( $id, $tid );
$loop = ( $bindicate == 9 ? 1 : 0 );
if ( $loop == 1 ) {
foreach ( $this->buildArray as $build ) {
if ( $build['field'] >= 19 || ( $session->tribe <> 1 && ! ALLOW_ALL_TRIBE ) ) {
$time = $build['timestamp'] + ceil( 60 / SPEED ) + $uprequire['time'];
}
}
}
if ( $this->meetRequirement( $tid ) ) {
if ( $session->access != BANNED ) {
$level = $database->getResourceLevel( $village->wid );
if ( $database->addBuilding( $village->wid, $id, $tid, $loop, $time, 0, $level[ 'f' . $id ] + 1 + count( $database->getBuildingByField( $village->wid, $id ) ) ) ) {
$logging->addBuildLog( $village->wid, $this->procResType( $tid ), ( $village->resarray[ 'f' . $id ] + 1 ), 1 );
$database->modifyResource( $village->wid, $uprequire['wood'], $uprequire['clay'], $uprequire['iron'], $uprequire['crop'], 0 );
header( "Location: dorf2.php" );
exit;
}
} else {
header( "Location: banned.php" );
exit;
}
} else {
header("location: dorf2.php");
exit;
}
} else {
header( "Location: dorf2.php" );
exit;
}
}
}
private function meetRequirement($id) {
global $village,$session,$database;
$isBuilt = $this->getTypeField($id);
switch ($id) {
case 1:
case 2:
case 3:
case 4: return true;
case 5: return $this->getTypeLevel(1) >= 10 && $this->getTypeLevel(15) >= 5 && !$isBuilt;
case 6: return $this->getTypeLevel(2) >= 10 && $this->getTypeLevel(15) >= 5 && !$isBuilt;
case 7: return $this->getTypeLevel(3) >= 10 && $this->getTypeLevel(15) >= 5 && !$isBuilt;
case 8: return $this->getTypeLevel(4) >= 5 && !$isBuilt;
case 9: return $this->getTypeLevel(15) >= 5 && $this->getTypeLevel(4) >= 10 && $this->getTypeLevel(8) >= 5 && !$isBuilt;
case 10:
case 11: return $this->getTypeLevel(15) >= 1 && (!$isBuilt || $this->getTypeLevel($id) == 20);
case 12: return $this->getTypeLevel(22) >= 3 && $this->getTypeLevel(15) >= 3 && !$isBuilt;
case 13: return $this->getTypeLevel(15) >= 3 && $this->getTypeLevel(22) >= 1 && !$isBuilt;
case 14: return $this->getTypeLevel(16) >= 15 && !$isBuilt;
case 15:
case 16: return !$isBuilt;
case 17: return $this->getTypeLevel(15) >= 3 && $this->getTypeLevel(10) >= 1 && $this->getTypeLevel(11) >= 1 && !$isBuilt;
case 18: return $this->getTypeLevel(15) >= 1 && !$isBuilt;
case 19: return $this->getTypeLevel(15) >= 3 && $this->getTypeLevel(16) >= 1 && !$isBuilt;
case 20: return $this->getTypeLevel(12) >= 3 && $this->getTypeLevel(22) >= 5 && !$isBuilt;
case 21: return $this->getTypeLevel(22) >= 10 && $this->getTypeLevel(15) >= 5 && !$isBuilt;
case 22: return $this->getTypeLevel(15) >= 3 && $this->getTypeLevel(19) >= 3 && !$isBuilt;
case 23: return !$isBuilt || $this->getTypeLevel($id) == 10;
case 24: return $this->getTypeLevel(22) >= 10 && $this->getTypeLevel(15) >= 10 && !$isBuilt;
case 25: return $this->getTypeLevel(15) >= 5 && $this->getTypeLevel(26) == 0 && !$isBuilt;
case 26: return $this->getTypeLevel(18) >= 1 && $this->getTypeLevel(15) >= 5 && $this->getTypeLevel(25) == 0 && !$isBuilt;
case 27: return $this->getTypeLevel(15) >= 10 && !$isBuilt;
case 28: return $this->getTypeLevel(17) == 20 && $this->getTypeLevel(20) >= 10 && !$isBuilt;
case 29: return $this->getTypeLevel(19) == 20 && $village->capital == 0 && !$isBuilt;
case 30: return $this->getTypeLevel(20) == 20 && $village->capital == 0 && !$isBuilt;
case 31: return $session->tribe == 1;
case 32: return $session->tribe == 2;
case 33: return $session->tribe == 3;
case 34: return $this->getTypeLevel(26) >= 3 && $this->getTypeLevel(15) >= 5 && $this->getTypeLevel(25) == 0 && $village->capital != 0 && !$isBuilt;
case 35: return $this->getTypeLevel(16) >= 10 && $this->getTypeLevel(11) == 20 && $session->tribe == 2 && $village->capital != 0 && !$isBuilt;
case 36: return $this->getTypeLevel(16) >= 1 && $session->tribe == 3 && (!$isBuilt || $this->getTypeLevel($id) == 20);
case 37: return $this->getTypeLevel(15) >= 3 && $this->getTypeLevel(16) >= 1 && !$isBuilt;
// great warehouse can only be built with artefact or only in Natar village
case 38: return $this->getTypeLevel(15) >= 10 && (!$isBuilt || $this->getTypeLevel($id) == 20) && ($village->natar == 1 || count($database->getOwnUniqueArtefactInfo2($session->uid, 6, 1, 0)) || count($database->getOwnUniqueArtefactInfo2($session->uid, 6, 2, 0)));
// great grannary can only be built with artefact or only in Natar village
case 39: return $this->getTypeLevel(15) >= 10 && (!$isBuilt || $this->getTypeLevel($id) == 20) && ($village->natar == 1 || count($database->getOwnUniqueArtefactInfo2($session->uid, 6, 1, 0)) || count($database->getOwnUniqueArtefactInfo2($session->uid, 6, 2, 0)));
case 40:
$wwlevel = $village->resarray['f99'];
if ( $wwlevel > 50 ) {
$needed_plan = 1;
} else {
$needed_plan = 0;
}
$wwbuildingplan = 0;
$villages = $database->getVillagesID( $session->uid );
foreach ( $villages as $village1 ) {
$plan = count( $database->getOwnArtefactInfoByType2( $village1, 11 ) );
if ( $plan > 0 ) {
$wwbuildingplan = 1;
}
}
if ( $session->alliance != 0 ) {
$alli_users = $database->getUserByAlliance( $session->alliance );
foreach ( $alli_users as $users ) {
$villages = $database->getVillagesID( $users['id'] );
if ( $users['id'] != $session->uid ) {
foreach ( $villages as $village1 ) {
$plan = count( $database->getOwnArtefactInfoByType2( $village1, 11 ) );
if ( $plan > 0 ) {
$wwbuildingplan += 1;
}
}
}
}
}
return $village->natar == 1 && $wwbuildingplan > $needed_plan;
case 41: return $this->getTypeLevel(16) >= 10 && $this->getTypeLevel(20) == 20 && $session->tribe == 1 && !$isBuilt;
case 42: return GREAT_WKS && $this->getTypeLevel(21) == 20 && $village->capital == 0 && !$isBuilt;
default: return false;
}
}
private function checkResource($tid,$id) {
$name = "bid".$tid;
global $village,$$name,$database;
$plus = 1;
foreach($this->buildArray as $job) {
if($job['type'] == $tid && $job['field'] == $id) {
$plus = 2;
}
}
$dataarray = $$name;
$wood = $dataarray[$village->resarray['f'.$id]+$plus]['wood'];
$clay = $dataarray[$village->resarray['f'.$id]+$plus]['clay'];
$iron = $dataarray[$village->resarray['f'.$id]+$plus]['iron'];
$crop = $dataarray[$village->resarray['f'.$id]+$plus]['crop'];
if($wood > $village->maxstore || $clay > $village->maxstore || $iron > $village->maxstore) {
return 1;
}
else {
if($crop > $village->maxcrop) {
return 2;
}
else {
if($wood > $village->awood || $clay > $village->aclay || $iron > $village->airon || $crop > $village->acrop) {
return 3;
}
else {
if($village->awood>=$wood && $village->aclay>=$clay && $village->airon>=$iron && $village->acrop>=$crop){
return 4;
}
else {
return 3;
}
}
}
}
}
public function isMax($id,$field,$loop=0) {
$name = "bid".$id;
global $$name,$village,$session;
$dataarray = $$name;
// special case for Multihunter login which mathematically (because of the resarray length)
// allows for building resource fields above level 20
if ($session->tribe == 0) {
return $village->resarray['f'.$field] == 20;
}
if($id <= 4) {
if($village->capital == 1) {
return ($village->resarray['f'.$field] == (count($dataarray) - 1 - $loop));
}
else {
return ($village->resarray['f'.$field] == (count($dataarray) - 11 - $loop));
}
}
else {
return ($village->resarray['f'.$field] == count($dataarray) - $loop);
}
}
public function getTypeLevel($tid,$vid=0) {
global $village,$database,$session;
// Support would not have a village, so this is irrelevant
if ($session->uid == 1) {
return 0;
}
$keyholder = array();
if($vid == 0) {
$resourcearray = $village->resarray;
} else {
$resourcearray = $database->getResourceLevel($vid);
}
foreach(array_keys($resourcearray,$tid) as $key) {
if(strpos($key,'t')) {
$key = preg_replace("/[^0-9]/", '', $key);
array_push($keyholder, $key);
}
}
$element = count($keyholder);
// if we count more than 1 instance of the building (mostly resource fields)
if($element >= 2) {
// resource field
if($tid <= 4) {
$temparray = array();
for($i=0;$i<=$element-1;$i++) {
// collect current field level
array_push($temparray,$resourcearray['f'.$keyholder[$i]]);
}
// find out the maximum field level for this village
$maValue = max($temparray);
foreach ($temparray as $key => $val) {
if ($val == $maValue) {
$target = $key;
}
}
}
// village building
else {
$target = 0;
// find the highest level built for this building type
for($i=1;$i<=$element-1;$i++) {
if($resourcearray['f'.$keyholder[$i]] > $resourcearray['f'.$keyholder[$target]]) {
$target = $i;
}
}
}
}
// if we count only a single building
else if($element == 1) {
$target = 0;
}
// no building matching search criteria
else {
return 0;
}
if($keyholder[$target] != "") {
return $resourcearray['f'.$keyholder[$target]];
}
else {
return 0;
}
}
public function isCurrent($id) {
foreach($this->buildArray as $build) {
if($build['field'] == $id && $build['loopcon'] <> 1) {
return true;
}
}
}
public function isLoop($id=0) {
foreach($this->buildArray as $build) {
if(($build['field'] == $id && $build['loopcon']) || ($build['loopcon'] == 1 && $id == 0)) {
return true;
}
}
return false;
}
public function finishAll($redirect_url = '') {
global $database,$session,$logging,$village,$bid18,$bid10,$bid11,$technology,$_SESSION;
if ($session->access!=BANNED) {
// will be true if we should decrease player's gold by 2
// for the immediate completion action
$countPlus2Gold = false;
// will be true if we should decrease player's gold by 1
// for master builder queue
$countMasterGold = false;
// number of jobs to finish
$buildcount = ($this->buildArray ? count($this->buildArray) : 0);
// will be true if the job was successfully finished
$jobFinishSuccess = false;
// IDs of successful jobs to delete
$deletIDs = [];
foreach ($this->buildArray as $jobs) {
if ($jobs['wid']==$village->wid) {
$wwvillage = $database->getResourceLevel($jobs['wid']);
if ($wwvillage['f99t']!=40) {
$level = $jobs['level'];
if ($jobs['type'] != 25 AND $jobs['type'] != 26 AND $jobs['type'] != 40) {
$resource = $this->resourceRequired($jobs['field'],$jobs['type']);
// master builder involved
if ($jobs['master'] != 0) {
if ($this->meetRequirement($jobs['field'])) {
// don't allow master builder to build anything
// if we only have 2 gold, since that would take us to -1 gold
if ( $session->gold > 2 ) {
$villwood = $database->getVillageField( $jobs['wid'], 'wood' );
$villclay = $database->getVillageField( $jobs['wid'], 'clay' );
$villiron = $database->getVillageField( $jobs['wid'], 'iron' );
$villcrop = $database->getVillageField( $jobs['wid'], 'crop' );
$type = $jobs['type'];
$buildarray = $GLOBALS[ "bid" . $type ];
$buildwood = $buildarray[ $level ]['wood'];
$buildclay = $buildarray[ $level ]['clay'];
$buildiron = $buildarray[ $level ]['iron'];
$buildcrop = $buildarray[ $level ]['crop'];
if ( $buildwood < $villwood && $buildclay < $villclay && $buildiron < $villiron && $buildcrop < $villcrop ) {
$jobFinishSuccess = true;
$countMasterGold = true;
$enought_res = 1;
// we need to subtract resources for this, if another 2 jobs are active,
// as we'd never subtract those otherwise
if ( $buildcount > 2 ) {
$database->setVillageField( $jobs['wid'],
['wood', 'clay', 'iron', 'crop'],
[( $villwood - $buildwood ), ( $villclay - $buildclay ), ( $villiron - $buildiron ), ( $villcrop - $buildcrop )]);
}
}
} else {
// if we only have 2 gold, we need to cancel this job, as there will never
// be enough gold now in our account to finish this up
$exclude_master = true;
$deletIDs[] = (int) $jobs['id'];
}
}
} else {
// non-master builder build, we should count +2 gold for it
$countPlus2Gold = true;
$jobFinishSuccess = true;
}
// update build level in the database
if ($jobFinishSuccess) {
$q = "UPDATE ".TB_PREFIX."fdata set f".$jobs['field']." = ".$jobs['level'].", f".$jobs['field']."t = ".$jobs['type']." where vref = ".$jobs['wid'];
}
if (!isset($exclude_master) && $database->query($q) && ($enought_res == 1 or $jobs['master'] == 0)) {
$database->modifyPop($jobs['wid'],$resource['pop'],0);
$database->addCP($jobs['wid'],$resource['cp']);
$deletIDs[] = (int) $jobs['id'];
if($jobs['type'] == 18) {
$owner = $database->getVillageField($jobs['wid'],"owner");
$max = $bid18[$level]['attri'];
$q = "UPDATE ".TB_PREFIX."alidata set max = $max where leader = $owner";
$database->query($q);
}
}
if (($jobs['field'] >= 19 && ($session->tribe == 1 || ALLOW_ALL_TRIBE)) || (!ALLOW_ALL_TRIBE && $session->tribe != 1)) {
$innertimestamp = $jobs['timestamp'];
}
}
}
}
// reset the flag for the next job
$jobFinishSuccess = false;
}
if (count($deletIDs)) {
$database->query("DELETE FROM " . TB_PREFIX . "bdata WHERE id IN(" . implode(', ', $deletIDs) . ")");
}
$demolition = $database->finishDemolition($village->wid);
$tech = $technology->finishTech();
if ($demolition > 0 || $tech > 0) {
$countPlus2Gold = true;
$logging->goldFinLog($village->wid);
}
// deduct the right amount of gold
if ($countMasterGold || $countPlus2Gold) {
$newgold = $session->gold - (($countMasterGold && $countPlus2Gold) ? 3 : 2);
$database->updateUserField($session->uid, "gold", $newgold, 1);
}
$stillbuildingarray = $database->getJobs($village->wid);
if (count($stillbuildingarray) == 1) {
if($stillbuildingarray[0]['loopcon'] == 1) {
//$q = "UPDATE ".TB_PREFIX."bdata SET loopcon=0,timestamp=".(time()+$stillbuildingarray[0]['timestamp']-$innertimestamp)." WHERE id=".$stillbuildingarray[0]['id'];
$q = "UPDATE ".TB_PREFIX."bdata SET loopcon=0 WHERE id=".(int) $stillbuildingarray[0]['id'];
$database->query($q);
}
}
header("Location: ".($redirect_url ? $redirect_url : $session->referrer));
exit;
} else {
header("Location: banned.php");
exit;
}
}
public function resourceRequired($id,$tid,$plus=1) {
$name = "bid".$tid;
global $$name,$village,$bid15;
$dataarray = $$name;
$wood = $dataarray[$village->resarray['f'.$id]+$plus]['wood'];
$clay = $dataarray[$village->resarray['f'.$id]+$plus]['clay'];
$iron = $dataarray[$village->resarray['f'.$id]+$plus]['iron'];
$crop = $dataarray[$village->resarray['f'.$id]+$plus]['crop'];
$pop = $dataarray[$village->resarray['f'.$id]+$plus]['pop'];
if ($tid == 15) {
if($this->getTypeLevel(15) == 0) {
$time = round($dataarray[$village->resarray['f'.$id]+$plus]['time']/ SPEED *5);
}
else {
$time = round($dataarray[$village->resarray['f'.$id]+$plus]['time'] / SPEED);
}
}
else {
if($this->getTypeLevel(15) != 0) {
$time = round($dataarray[$village->resarray['f'.$id]+$plus]['time'] * ($bid15[$this->getTypeLevel(15)]['attri']/100) / SPEED);
}
else {
$time = round($dataarray[$village->resarray['f'.$id]+$plus]['time']*5 / SPEED);
}
}
$cp = $dataarray[$village->resarray['f'.$id]+$plus]['cp'];
return array("wood"=>$wood,"clay"=>$clay,"iron"=>$iron,"crop"=>$crop,"pop"=>$pop,"time"=>$time,"cp"=>$cp);
}
public function getTypeField($type) {
global $village;
for($i=19;$i<=40;$i++) {
if($village->resarray['f'.$i.'t'] == $type) {
return $i;
}
}
}
public function calculateAvaliable($id,$tid,$plus=1) {
global $village,$generator;
$uprequire = $this->resourceRequired($id,$tid,$plus);
$rwood = $uprequire['wood']-$village->awood;
$rclay = $uprequire['clay']-$village->aclay;
$rcrop = $uprequire['crop']-$village->acrop;
$riron = $uprequire['iron']-$village->airon;
$rwtime = $rwood / $village->getProd("wood") * 3600;
$rcltime = $rclay / $village->getProd("clay")* 3600;
$rctime = $rcrop / $village->getProd("crop")* 3600;
$ritime = $riron / $village->getProd("iron")* 3600;
$reqtime = max($rwtime,$rctime,$rcltime,$ritime);
$reqtime += time();
return $generator->procMtime($reqtime);
}
};
?>