diff --git a/GameEngine/Database.php b/GameEngine/Database.php
index f6ced345..d72f48c1 100755
--- a/GameEngine/Database.php
+++ b/GameEngine/Database.php
@@ -4467,8 +4467,8 @@ References: User ID/Message ID, Mode
global $building, $village, $session;
- // check if we're not demolishing an Embassy
- if ($this->getFieldType($wid,$field) == 18) {
+ // check if we're not demolishing an Embassy if the player is in an alliance
+ if ($this->getFieldType($wid,$field) == 18 && $session->alliance) {
// get field level, alliance members count and the minimum
// level of Embassy to be able to hold this number of people
@@ -4636,267 +4636,269 @@ References: User ID/Message ID, Mode
// TODO: refactor this and break it into more smaler methods
global $session;
- // check whether this player is an alliance owner
- $isOwner = ($userData['alliance'] && $this->isAllianceOwner($userData['id'], $use_cache) == $userData['alliance']);
+ if ($userData['alliance']) {
+ // check whether this player is an alliance owner
+ $isOwner = ($userData['alliance'] && $this->isAllianceOwner($userData['id'], $use_cache) == $userData['alliance']);
- // for demolition, the Embassy was already destroyed, so we need at least 1
- // Embassy still standing... for battle, the Embassy is still standing
- // and will only be deleted upon finalizing battle calculations, so we need
- // to check for at least 2 Embassies
- $minimumExistingEmbassyRecords = ($demolition ? 1 : 2);
+ // for demolition, the Embassy was already destroyed, so we need at least 1
+ // Embassy still standing... for battle, the Embassy is still standing
+ // and will only be deleted upon finalizing battle calculations, so we need
+ // to check for at least 2 Embassies
+ $minimumExistingEmbassyRecords = ($demolition ? 1 : 2);
- // if they are not an alliance owner, simply check whether we have any Embassies
- // at lvl 1+ standing somewhere
- if (!$isOwner) {
- // TODO: replace magic numbers by constants (18 = Embassy)
- if ($this->getSingleFieldTypeCount($userData['id'], 18, '>=', 1, $use_cache) < $minimumExistingEmbassyRecords) {
+ // if they are not an alliance owner, simply check whether we have any Embassies
+ // at lvl 1+ standing somewhere
+ if (!$isOwner) {
+ // TODO: replace magic numbers by constants (18 = Embassy)
+ if ($this->getSingleFieldTypeCount($userData['id'], 18, '>=', 1, $use_cache) < $minimumExistingEmbassyRecords) {
- // the player has no more Embassies, evict them from the alliance
- mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$userData['id']);
+ // the player has no more Embassies, evict them from the alliance
+ mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$userData['id']);
- // unset the alliance in session, if we're evicting
- // currently logged-in player
- if ($session->uid == $userData['id']) {
- $_SESSION['alliance_user'] = 0;
- }
+ // unset the alliance in session, if we're evicting
+ // currently logged-in player
+ if ($session->uid == $userData['id']) {
+ $_SESSION['alliance_user'] = 0;
+ }
- // notify them via in-game messaging, if we come from a demolition,
- // otherwise return a result which can be used in battle reports
- if ($demolition) {
- $this->sendMessage(
- $userData['id'],
- 4,
- 'You left the alliance',
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a finished demolition of your last Embassy, you have now successfully left your alliance.\n\nYours sincerely,\nServer Robot :)"),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- } else {
- // player has been removed from the alliance
- $this->sendMessage(
- $userData['id'],
- 4,
- 'An attack has forced you to leave the alliance',
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack and destruction of your last Embassy, you have been forced to leave your alliance.\n\nTo re-establish your position in this alliance, you will need to build a new Embassy and ask the leader to send you an invite again.\n\nYours sincerely,\nServer Robot :)"),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
+ // notify them via in-game messaging, if we come from a demolition,
+ // otherwise return a result which can be used in battle reports
+ if ($demolition) {
+ $this->sendMessage(
+ $userData['id'],
+ 4,
+ 'You left the alliance',
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a finished demolition of your last Embassy, you have now successfully left your alliance.\n\nYours sincerely,\nServer Robot :)"),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
+ } else {
+ // player has been removed from the alliance
+ $this->sendMessage(
+ $userData['id'],
+ 4,
+ 'An attack has forced you to leave the alliance',
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack and destruction of your last Embassy, you have been forced to leave your alliance.\n\nTo re-establish your position in this alliance, you will need to build a new Embassy and ask the leader to send you an invite again.\n\nYours sincerely,\nServer Robot :)"),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
- return 0;
- }
+ return 0;
+ }
- }
- } else {
- // the player IS an alliance owner, check if we need to take any action
- $membersCount = $this->countAllianceMembers($userData['alliance'], $use_cache);
- $minAllianceEmbassyLevel = $this->getMinEmbassyLevel($membersCount);
+ }
+ } else {
+ // the player IS an alliance owner, check if we need to take any action
+ $membersCount = $this->countAllianceMembers($userData['alliance'], $use_cache);
+ $minAllianceEmbassyLevel = $this->getMinEmbassyLevel($membersCount);
- // in this case, the minimum Embassy level cannot go below 3,
- // since this player is a leader and as such, he needs at least
- // a level 3 Embassy
- if ($minAllianceEmbassyLevel < 3) {
- $minAllianceEmbassyLevel = 3;
- }
+ // in this case, the minimum Embassy level cannot go below 3,
+ // since this player is a leader and as such, he needs at least
+ // a level 3 Embassy
+ if ($minAllianceEmbassyLevel < 3) {
+ $minAllianceEmbassyLevel = 3;
+ }
- $takeAction = (
- // was the Embassy taken below a threshold level?
- ($userData['lvl'] <= $minAllianceEmbassyLevel)
- &&
- // check for standing Embassies with sufficient level
- // TODO: replace magic numbers by constants (18 = Embassy)
- ($this->getSingleFieldTypeCount($userData['id'], 18, '>=', $minAllianceEmbassyLevel, false, $use_cache) < $minimumExistingEmbassyRecords)
- );
+ $takeAction = (
+ // was the Embassy taken below a threshold level?
+ ($userData['lvl'] <= $minAllianceEmbassyLevel)
+ &&
+ // check for standing Embassies with sufficient level
+ // TODO: replace magic numbers by constants (18 = Embassy)
+ ($this->getSingleFieldTypeCount($userData['id'], 18, '>=', $minAllianceEmbassyLevel, false, $use_cache) < $minimumExistingEmbassyRecords)
+ );
- // the Embassy got damaged below a sufficient level and there are no more Embassies
- // at that level standing on this player's account, additional actions are needed
- if ($takeAction) {
+ // the Embassy got damaged below a sufficient level and there are no more Embassies
+ // at that level standing on this player's account, additional actions are needed
+ if ($takeAction) {
- // load all alliance members
- $members = $this->getAllMember($userData['alliance'], 0, $use_cache);
+ // load all alliance members
+ $members = $this->getAllMember($userData['alliance'], 0, $use_cache);
- // if we come from demolition, we need to evict all new members
- // that accepted an invitation while level 3 of the last
- // Embassy was already under demolition. The demolition dialog itself
- // already checks if there are no more people other than the owner
- // present before the demolition is allowed.
- if ($demolition) {
- $evicts = [];
- foreach ($members as $member) {
- // evict the player from the alliance
- $evicts[] = $member['id'];
+ // if we come from demolition, we need to evict all new members
+ // that accepted an invitation while level 3 of the last
+ // Embassy was already under demolition. The demolition dialog itself
+ // already checks if there are no more people other than the owner
+ // present before the demolition is allowed.
+ if ($demolition) {
+ $evicts = [];
+ foreach ($members as $member) {
+ // evict the player from the alliance
+ $evicts[] = $member['id'];
- // notify them via in-game messaging
- $this->sendMessage(
- $member['id'],
- 4,
- 'Your alliance was disbanded',
- (
- ($member['id'] == $userData['id'])
- ?
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a finished demolition of your last Embassy at level 3, and the fact that you were the leader of your alliance, this alliance has been disbanded.\n\nIn order to found a new alliance, please build a level 3 Embassy again in one of your villages.\n\nYours sincerely,\nServer Robot :)")
- :
- $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a demolition of your alliance founder's last Embassy below level 3, this alliance has been disbanded.\n\n\You can now accept invitations from other alliances or found a new alliance yourself.\n\nYours sincerely,\nServer Robot :)")
- ),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- }
-
- mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id IN('.implode(',', $evicts).")");
- } else {
- // we come from a battle result, therefore we need to check
- // for the first player in the alliance who has a sufficient
- // level Embassy and to which we can auto-reassign the leadership
- $newLeaderFound = false;
-
- // in case we'll need these later to disband the alliance,
- // we'll collect them inside this foeach loop
- $memberIDs = [];
-
- // no need for this whole foreach loop if this player is the lone
- // founder and member of their alliance
- if ($membersCount > 1) {
- foreach ($members as $member) {
- if (!$newLeaderFound && $this->getSingleFieldTypeCount($member['id'], 18, '>=', $minAllianceEmbassyLevel) >= 1) {
- // found a new leader for the alliance
- $newLeaderFound = true;
- $newleader = $member['id'];
- $q = "UPDATE " . TB_PREFIX . "alidata set leader = ".(int) $newleader." where id = ".(int) $userData['alliance'];
- $this->query($q);
- $this->updateAlliPermissions($newleader, $userData['alliance'], "Leader", 1, 1, 1, 1, 1, 1, 1);
- Automation::updateMax($newleader);
-
- // update permissions for the old leader
- $this->updateAlliPermissions($userData['id'], $userData['alliance'], "Former Leader", 0, 0, 0, 0, 0, 0, 0);
-
- // notify new leader via in-game messaging
- $this->sendMessage(
- $newleader,
- 4,
- 'You are now the alliance leader',
- $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that there was a successful attack on player ".$userData['username']." which has damaged their Embassy badly enough that they are no longer able to sustain the leadership of your alliance.\n\nSince your Embassy level is of a sufficient level, you have been auto-elected to the position of a new leader of your alliance with all duties and responsibilities thereof.\n\nYours sincerely,\nServer Robot :)"),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- }
-
- $memberIDs[] = $member['id'];
- }
- } else {
- // if there is only 1 member and it's the actual founder
- $memberIDs[] = $userData['id'];
- }
-
- // if there wasn't anyone with a sufficient level of Embassy
- // among the existing members, disperse this alliance
- if (!$newLeaderFound) {
-
- // evict all members from the alliance
- mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id IN('.implode(',', $memberIDs).")");
-
- // notify all of them via in-game messaging
- foreach ($members as $member) {
- $this->sendMessage(
- $member['id'],
- 4,
- 'Your alliance was dispersed',
- (
- ($member['id'] == $userData['id'])
- ?
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack that has degraded your last Embassy to a level ".($membersCount > 1 ? "which is unable to hold all ".$membersCount." alliance members, and because there was no other alliance member with an Embassy on a high enough level to overtake the leadership," : "lower then 3 - which is required to found and hold your own alliance - ")." your alliance has been dispersed.\n\nYours sincerely,\nServer Robot :)")
- :
- $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a successful attack on your alliance leader's Embassy by another player that degraded it below threshold allowed to hold all ".$membersCount." alliance members, and because there was no other alliance member with an Embassy on a high enough level to overtake the leadership, your alliance has been dispersed.\n\nYours sincerely,\nServer Robot :)")
- ),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- }
- } else {
- // let's determine whether to keep currently attacked player
- // in the alliance or not
- if ($userData['lvl'] > 0 || $this->getSingleFieldTypeCount($member['id'], 18, '>=', 1, $use_cache) >= $minimumExistingEmbassyRecords) {
- $keepCurrentPlayer = true;
- } else {
- $keepCurrentPlayer = false;
+ // notify them via in-game messaging
+ $this->sendMessage(
+ $member['id'],
+ 4,
+ 'Your alliance was disbanded',
+ (
+ ($member['id'] == $userData['id'])
+ ?
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a finished demolition of your last Embassy at level 3, and the fact that you were the leader of your alliance, this alliance has been disbanded.\n\nIn order to found a new alliance, please build a level 3 Embassy again in one of your villages.\n\nYours sincerely,\nServer Robot :)")
+ :
+ $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a demolition of your alliance founder's last Embassy below level 3, this alliance has been disbanded.\n\n\You can now accept invitations from other alliances or found a new alliance yourself.\n\nYours sincerely,\nServer Robot :)")
+ ),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
}
- // if a new leader was found, notify all alliance member of this change
- // notify all of them via in-game messaging
- foreach ($members as $member) {
- // don't send duplicate messages to the new leader
- if ($member['id'] != $newleader) {
- // also, don't send to the attacked player if we're
- // not keeping them in alliance
- if ($keepCurrentPlayer || (!$keepCurrentPlayer && $member['id'] != $userData['id']))
- $this->sendMessage(
- $member['id'],
- 4,
- 'Your alliance has a new leader',
- (
- ($member['id'] == $userData['id'])
- ?
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack that has degraded your last Embassy to a level which is unable to hold all ".$membersCount." alliance members, another alliance member who meets these criteria has been auto-elected as a new alliance leader.\n\nAdditionally - due to the Embassy destruction - you have been forcefuly evicted from your alliance.\n\nPlease re-establish the connection with your alliance by building a new Embassy and contacting the new leader for an invitation.\n\nYours sincerely,\nServer Robot :)")
- :
- $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a successful attack on your alliance leader's Embassy by another player, another alliance member with enough Embassy capacity has been auto-elected as the new alliance leader.\n\nYours sincerely,\nServer Robot :)")
- ),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- }
- }
+ mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id IN('.implode(',', $evicts).")");
+ } else {
+ // we come from a battle result, therefore we need to check
+ // for the first player in the alliance who has a sufficient
+ // level Embassy and to which we can auto-reassign the leadership
+ $newLeaderFound = false;
- // evict current player from the alliance
- // if this was their last Embassy and was completely destroyed
- if (!$keepCurrentPlayer) {
- mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$userData['id']);
+ // in case we'll need these later to disband the alliance,
+ // we'll collect them inside this foeach loop
+ $memberIDs = [];
- // unset the alliance in session, if we're evicting
- // currently logged-in player
- if ($session->uid == $userData['id']) {
- $_SESSION['alliance_user'] = 0;
- }
+ // no need for this whole foreach loop if this player is the lone
+ // founder and member of their alliance
+ if ($membersCount > 1) {
+ foreach ($members as $member) {
+ if (!$newLeaderFound && $this->getSingleFieldTypeCount($member['id'], 18, '>=', $minAllianceEmbassyLevel) >= 1) {
+ // found a new leader for the alliance
+ $newLeaderFound = true;
+ $newleader = $member['id'];
+ $q = "UPDATE " . TB_PREFIX . "alidata set leader = ".(int) $newleader." where id = ".(int) $userData['alliance'];
+ $this->query($q);
+ $this->updateAlliPermissions($newleader, $userData['alliance'], "Leader", 1, 1, 1, 1, 1, 1, 1);
+ Automation::updateMax($newleader);
- // notify the evicted player
- $this->sendMessage(
- $userData['id'],
- 4,
- 'An attack has forced you to leave the alliance',
- $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack and destruction of your last Embassy, you have been forced to leave your alliance.\n\nTo re-establish your position in this alliance, you will need to build a new Embassy and ask the newly auto-elected leader to send you an invite again.\n\nYours sincerely,\nServer Robot :)"),
- 0,
- 0,
- 0,
- 0,
- 0,
- true);
- }
- }
- }
+ // update permissions for the old leader
+ $this->updateAlliPermissions($userData['id'], $userData['alliance'], "Former Leader", 0, 0, 0, 0, 0, 0, 0);
- // execute a method that will delete an alliance
- // if no members are left in it
- $this->deleteAlliance($userData['alliance']);
+ // notify new leader via in-game messaging
+ $this->sendMessage(
+ $newleader,
+ 4,
+ 'You are now the alliance leader',
+ $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that there was a successful attack on player ".$userData['username']." which has damaged their Embassy badly enough that they are no longer able to sustain the leadership of your alliance.\n\nSince your Embassy level is of a sufficient level, you have been auto-elected to the position of a new leader of your alliance with all duties and responsibilities thereof.\n\nYours sincerely,\nServer Robot :)"),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
+ }
- return ((isset($newLeaderFound) && $newLeaderFound === true) ? true : false);
- }
- }
+ $memberIDs[] = $member['id'];
+ }
+ } else {
+ // if there is only 1 member and it's the actual founder
+ $memberIDs[] = $userData['id'];
+ }
+
+ // if there wasn't anyone with a sufficient level of Embassy
+ // among the existing members, disperse this alliance
+ if (!$newLeaderFound) {
+
+ // evict all members from the alliance
+ mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id IN('.implode(',', $memberIDs).")");
+
+ // notify all of them via in-game messaging
+ foreach ($members as $member) {
+ $this->sendMessage(
+ $member['id'],
+ 4,
+ 'Your alliance was dispersed',
+ (
+ ($member['id'] == $userData['id'])
+ ?
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack that has degraded your last Embassy to a level ".($membersCount > 1 ? "which is unable to hold all ".$membersCount." alliance members, and because there was no other alliance member with an Embassy on a high enough level to overtake the leadership," : "lower then 3 - which is required to found and hold your own alliance - ")." your alliance has been dispersed.\n\nYours sincerely,\nServer Robot :)")
+ :
+ $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a successful attack on your alliance leader's Embassy by another player that degraded it below threshold allowed to hold all ".$membersCount." alliance members, and because there was no other alliance member with an Embassy on a high enough level to overtake the leadership, your alliance has been dispersed.\n\nYours sincerely,\nServer Robot :)")
+ ),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
+ }
+ } else {
+ // let's determine whether to keep currently attacked player
+ // in the alliance or not
+ if ($userData['lvl'] > 0 || $this->getSingleFieldTypeCount($member['id'], 18, '>=', 1, $use_cache) >= $minimumExistingEmbassyRecords) {
+ $keepCurrentPlayer = true;
+ } else {
+ $keepCurrentPlayer = false;
+ }
+
+ // if a new leader was found, notify all alliance member of this change
+ // notify all of them via in-game messaging
+ foreach ($members as $member) {
+ // don't send duplicate messages to the new leader
+ if ($member['id'] != $newleader) {
+ // also, don't send to the attacked player if we're
+ // not keeping them in alliance
+ if ($keepCurrentPlayer || (!$keepCurrentPlayer && $member['id'] != $userData['id']))
+ $this->sendMessage(
+ $member['id'],
+ 4,
+ 'Your alliance has a new leader',
+ (
+ ($member['id'] == $userData['id'])
+ ?
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack that has degraded your last Embassy to a level which is unable to hold all ".$membersCount." alliance members, another alliance member who meets these criteria has been auto-elected as a new alliance leader.\n\nAdditionally - due to the Embassy destruction - you have been forcefuly evicted from your alliance.\n\nPlease re-establish the connection with your alliance by building a new Embassy and contacting the new leader for an invitation.\n\nYours sincerely,\nServer Robot :)")
+ :
+ $this->escape("Hi, ".$member['username']."!\n\nThis is to inform you that due to a successful attack on your alliance leader's Embassy by another player, another alliance member with enough Embassy capacity has been auto-elected as the new alliance leader.\n\nYours sincerely,\nServer Robot :)")
+ ),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
+ }
+ }
+
+ // evict current player from the alliance
+ // if this was their last Embassy and was completely destroyed
+ if (!$keepCurrentPlayer) {
+ mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$userData['id']);
+
+ // unset the alliance in session, if we're evicting
+ // currently logged-in player
+ if ($session->uid == $userData['id']) {
+ $_SESSION['alliance_user'] = 0;
+ }
+
+ // notify the evicted player
+ $this->sendMessage(
+ $userData['id'],
+ 4,
+ 'An attack has forced you to leave the alliance',
+ $this->escape("Hi, ".$userData['username']."!\n\nThis is to inform you that due to a successful attack and destruction of your last Embassy, you have been forced to leave your alliance.\n\nTo re-establish your position in this alliance, you will need to build a new Embassy and ask the newly auto-elected leader to send you an invite again.\n\nYours sincerely,\nServer Robot :)"),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ true);
+ }
+ }
+ }
+
+ // execute a method that will delete an alliance
+ // if no members are left in it
+ $this->deleteAlliance($userData['alliance']);
+
+ return ((isset($newLeaderFound) && $newLeaderFound === true) ? true : false);
+ }
+ }
+ }
// no changes in player-to-alliance relationship
return true;