mirror of
https://github.com/Shadowss/TravianZ.git
synced 2026-08-20 18:21:00 +00:00
refactor: alliance and Embassy mechanics refactoring, stage 2 of 3
Everything is now prepared for the last stage, where the code to handle Embassy destruction during a battle will be added and tested :) A few Embassy-demolition-related issues have been ironed-out in this commit as well.
This commit is contained in:
@@ -437,7 +437,11 @@ class Alliance {
|
|||||||
} else {
|
} else {
|
||||||
// check whether this is not the founder leaving and if he is, see whether
|
// check whether this is not the founder leaving and if he is, see whether
|
||||||
// his replacement has been selected
|
// his replacement has been selected
|
||||||
if ($session->alliance && $database->isAllianceOwner($session->uid) == $session->alliance) {
|
if (
|
||||||
|
$session->alliance &&
|
||||||
|
$database->isAllianceOwner($session->uid) == $session->alliance &&
|
||||||
|
$database->countAllianceMembers($session->alliance) > 1
|
||||||
|
) {
|
||||||
// check that we have a valid new founder
|
// check that we have a valid new founder
|
||||||
if (!isset($post['new_founder'])) {
|
if (!isset($post['new_founder'])) {
|
||||||
$form->addError("founder", 'founder was not selected');
|
$form->addError("founder", 'founder was not selected');
|
||||||
@@ -461,11 +465,11 @@ class Alliance {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$newleader = $post['new_founder'];
|
$newleader = (int) $post['new_founder'];
|
||||||
$q = "UPDATE " . TB_PREFIX . "alidata set leader = ".(int) $newleader." where id = ".(int) $session->alliance."";
|
$q = "UPDATE " . TB_PREFIX . "alidata set leader = ".$newleader." where id = ".(int) $session->alliance;
|
||||||
$_SESSION['alliance_user'] = 0;
|
$_SESSION['alliance_user'] = 0;
|
||||||
$database->query($q);
|
$database->query($q);
|
||||||
$database->updateAlliPermissions($newleader, 1, 1, 1, 1, 1, 1, 1, 1, 1);
|
$database->createAlliPermissions($newleader, $session->alliance, 'Alliance Leader', 1, 1, 1, 1, 1, 1, 1, 1);
|
||||||
$this->updateMax($newleader);
|
$this->updateMax($newleader);
|
||||||
|
|
||||||
// send the new founder an in-game message, notifying them of their election
|
// send the new founder an in-game message, notifying them of their election
|
||||||
|
|||||||
@@ -1996,6 +1996,7 @@ class Automation {
|
|||||||
}
|
}
|
||||||
if ($tbgid==18){
|
if ($tbgid==18){
|
||||||
$this->updateMax($database->getVillageField($data['to'],'owner'));
|
$this->updateMax($database->getVillageField($data['to'],'owner'));
|
||||||
|
//$p_alliance = $database->getUserField($data['to'],"alliance",0);
|
||||||
}
|
}
|
||||||
if ($isoasis == 0) {
|
if ($isoasis == 0) {
|
||||||
$pop=$this->recountPop($data['to']);
|
$pop=$this->recountPop($data['to']);
|
||||||
@@ -4750,7 +4751,7 @@ $wallimg = "<img src=\"".GP_LOCATE."img/g/g3".$targettribe."Icon.gif\" height=\"
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function updateMax($leader) {
|
public function updateMax($leader) {
|
||||||
global $bid18, $database;
|
global $bid18, $database;
|
||||||
$q = mysqli_query($GLOBALS['link'],"SELECT * FROM " . TB_PREFIX . "alidata where leader = ". (int) $leader);
|
$q = mysqli_query($GLOBALS['link'],"SELECT * FROM " . TB_PREFIX . "alidata where leader = ". (int) $leader);
|
||||||
if(mysqli_num_rows($q) > 0){
|
if(mysqli_num_rows($q) > 0){
|
||||||
|
|||||||
+293
-59
@@ -1710,7 +1710,7 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getAlliance($id) {
|
function getAlliance($id) {
|
||||||
list($id) = $this->escape_input((int) $id);
|
$id = (int) $id;
|
||||||
|
|
||||||
$q = "SELECT * from " . TB_PREFIX . "alidata where id = $id";
|
$q = "SELECT * from " . TB_PREFIX . "alidata where id = $id";
|
||||||
$result = mysqli_query($this->dblink,$q);
|
$result = mysqli_query($this->dblink,$q);
|
||||||
@@ -1825,13 +1825,28 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
function deleteAlliance($aid) {
|
function deleteAlliance($aid) {
|
||||||
list($aid) = $this->escape_input((int) $aid);
|
list($aid) = $this->escape_input((int) $aid);
|
||||||
|
|
||||||
$result = mysqli_query($this->dblink,"SELECT * FROM " . TB_PREFIX . "users where alliance = $aid");
|
$result = mysqli_fetch_array(mysqli_query($this->dblink,"SELECT Count(*) as Total FROM " . TB_PREFIX . "users where alliance = $aid", MYSQLI_ASSOC));
|
||||||
$num_rows = mysqli_num_rows($result);
|
if ($result['Total'] == 0) {
|
||||||
if($num_rows == 0) {
|
// remove the alliance
|
||||||
$q = "DELETE FROM " . TB_PREFIX . "alidata WHERE id = $aid";
|
$q = "DELETE FROM " . TB_PREFIX . "alidata WHERE id = $aid";
|
||||||
mysqli_query($this->dblink,$q);
|
mysqli_query($this->dblink,$q);
|
||||||
return mysqli_insert_id($this->dblink);
|
|
||||||
}
|
// remove all permissions for that alliance
|
||||||
|
$q = "DELETE FROM " . TB_PREFIX . "ali_permission WHERE alliance = $aid";
|
||||||
|
mysqli_query($this->dblink,$q);
|
||||||
|
|
||||||
|
// remove all logs for that alliance
|
||||||
|
$q = "DELETE FROM " . TB_PREFIX . "ali_log WHERE aid = $aid";
|
||||||
|
mysqli_query($this->dblink,$q);
|
||||||
|
|
||||||
|
// remove all medals for that alliance
|
||||||
|
$q = "DELETE FROM " . TB_PREFIX . "allimedal WHERE allyid = $aid";
|
||||||
|
mysqli_query($this->dblink,$q);
|
||||||
|
|
||||||
|
// remove all invitations for that alliance
|
||||||
|
$q = "DELETE FROM " . TB_PREFIX . "ali_invite WHERE alliance = $aid";
|
||||||
|
mysqli_query($this->dblink,$q);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************
|
/*****************************************
|
||||||
@@ -2168,7 +2183,7 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
return $row["f" . $field];
|
return $row["f" . $field];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSingleFieldTypeCount($uid, $field, $lvl = false, $lvlComparisonSign = '=') {
|
function getSingleFieldTypeCount($uid, $field, $lvlComparisonSign = '=', $lvl = false) {
|
||||||
$uid = (int) $uid;
|
$uid = (int) $uid;
|
||||||
$field = (int) $field;
|
$field = (int) $field;
|
||||||
$lvl = ($lvl === false ? $lvl : (int) $lvl);
|
$lvl = ($lvl === false ? $lvl : (int) $lvl);
|
||||||
@@ -2788,17 +2803,29 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
|
|
||||||
global $building, $village, $session;
|
global $building, $village, $session;
|
||||||
|
|
||||||
$fLevel = $this->getFieldLevel($wid,$field);
|
// check if we're not demolishing an Embassy
|
||||||
|
if ($this->getFieldType($wid,$field) == 18) {
|
||||||
|
|
||||||
|
// get field level, alliance members count and the minimum
|
||||||
|
// level of Embassy to be able to hold this number of people
|
||||||
|
$fLevel = $this->getFieldLevel($wid,$field);
|
||||||
|
$membersCount = $this->countAllianceMembers($session->alliance);
|
||||||
|
$minEmbassyLevel = $this->getMinEmbassyLevel($membersCount);
|
||||||
|
$isOwner = $this->isAllianceOwner($session->uid) == $session->alliance;
|
||||||
|
|
||||||
|
// make sure minimum Embassy level is 3 of the player is alliance owner
|
||||||
|
if ($isOwner && $minEmbassyLevel < 3) {
|
||||||
|
$minEmbassyLevel = 3;
|
||||||
|
}
|
||||||
|
|
||||||
// check if we're not demolishing an Embassy at level 3
|
|
||||||
if ($fLevel == 3 && $this->getFieldType($wid,$field) == 18) {
|
|
||||||
// check if this user is the founder of the alliance
|
// check if this user is the founder of the alliance
|
||||||
if ($session->alliance && $this->isAllianceOwner($session->uid) == $session->alliance) {
|
// and whether we're not trying to demolish under the lowest level
|
||||||
|
// which can hold current number of members
|
||||||
|
if ($fLevel == $minEmbassyLevel && $session->alliance && $isOwner) {
|
||||||
// check if we have any other players in this alliance left
|
// check if we have any other players in this alliance left
|
||||||
$membersCount = $this->countAllianceMembers($session->alliance);
|
|
||||||
if ($membersCount > 1) {
|
if ($membersCount > 1) {
|
||||||
// check if this player has only 1 last Embassy on level 3
|
// check if this player has only 1 last Embassy on a sufficient level
|
||||||
if ($this->getSingleFieldTypeCount($session->uid, 18, 3, '>=') == 1) {
|
if ($this->getSingleFieldTypeCount($session->uid, 18, '>=', $minEmbassyLevel) == 1) {
|
||||||
// cannot demolish Embassy further until the player quits the alliance,
|
// cannot demolish Embassy further until the player quits the alliance,
|
||||||
// as they are founder and there are still other players in the alliance,
|
// as they are founder and there are still other players in the alliance,
|
||||||
// thus destroying Embassy would evict this player from the alliance
|
// thus destroying Embassy would evict this player from the alliance
|
||||||
@@ -2849,12 +2876,12 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
if ($checkEmbassy) {
|
if ($checkEmbassy) {
|
||||||
// check if we've demolished an Embassy
|
// check if we've demolished an Embassy
|
||||||
// and select the user it belonged to as well,
|
// and select the user it belonged to as well,
|
||||||
// so we can potentially disconnect them from the alliance
|
// so we can potentially evict them from the alliance
|
||||||
// and remove it - if they don't have any more Embassies
|
// and remove it - if they don't have any more Embassies
|
||||||
// or if the they are founder and they have no more lvl 3+ Embassies
|
// or if the they are founder and they have no more lvl 3+ Embassies
|
||||||
$q = '
|
$q = '
|
||||||
SELECT
|
SELECT
|
||||||
u.id, u.alliance, d.buildnumber, d.lvl
|
u.id, u.username, u.alliance, d.buildnumber, d.lvl
|
||||||
FROM
|
FROM
|
||||||
'.TB_PREFIX.'demolition d
|
'.TB_PREFIX.'demolition d
|
||||||
LEFT JOIN '.TB_PREFIX.'vdata v ON d.vref = v.wref
|
LEFT JOIN '.TB_PREFIX.'vdata v ON d.vref = v.wref
|
||||||
@@ -2863,64 +2890,271 @@ class MYSQLi_DB implements IDbConnection {
|
|||||||
|
|
||||||
$res = mysqli_fetch_all(mysqli_query($this->dblink, $q), MYSQLI_ASSOC);
|
$res = mysqli_fetch_all(mysqli_query($this->dblink, $q), MYSQLI_ASSOC);
|
||||||
foreach ($res as $key) {
|
foreach ($res as $key) {
|
||||||
// if this building was demolished completely, there is no record of what it was
|
// if this building being demolished is an Embassy or was demolished completely
|
||||||
// therefore, we need to check status of Embassies in case we've just demolished
|
// and the player is in an alliance, check and update their alliance status
|
||||||
// an Embassy and should disconnect a player from an alliance
|
if (($key['alliance'] > 0) && ($key['lvl'] == 0 || $this->getFieldType($wid, $key['buildnumber']) == 18)) {
|
||||||
if ($key['lvl'] == 0 && $key['alliance'] > 0 && $this->getSingleFieldTypeCount($key['id'], 18, 1, '>=') == 0) {
|
$this->checkAllianceEmbassiesStatus($key, true);
|
||||||
// if we have no more Embassies and this player is in an alliance,
|
}
|
||||||
// disconnect him from that alliance
|
}
|
||||||
mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$key['id']);
|
}
|
||||||
$_SESSION['alliance_user'] = 0;
|
|
||||||
|
|
||||||
// notify them via in-game messaging
|
$q = "DELETE FROM " . TB_PREFIX . "demolition WHERE vref=" . $wid;
|
||||||
$this->sendMessage(
|
return mysqli_query($this->dblink,$q);
|
||||||
$key['id'],
|
}
|
||||||
2,
|
|
||||||
'You left the alliance',
|
/**
|
||||||
"Hi!\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,\n<i>Server Robot :)</i>",
|
* Returns a minimum level for an Embassy in order to accomodate
|
||||||
0,
|
* the given number of members.
|
||||||
0,
|
*
|
||||||
0,
|
* @param int $membersCount Number of members for an alliance to accomodate.
|
||||||
0,
|
* Maximum = 60
|
||||||
0,
|
*
|
||||||
true);
|
* @return number Returns the level of Embassy required to accomodate
|
||||||
|
* the given number of members.
|
||||||
|
*/
|
||||||
|
public function getMinEmbassyLevel($membersCount) {
|
||||||
|
$membersCount = (int) $membersCount;
|
||||||
|
|
||||||
|
if ($membersCount > 60) {
|
||||||
|
$membersCount = 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($membersCount < 0) {
|
||||||
|
$membersCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ceil((20 / 60) * $membersCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Returns the number of members an alliance can hold
|
||||||
|
* with the current level of leader's Embassy.
|
||||||
|
*
|
||||||
|
* @param int $embassyLevel Level of leader's Embassy building.
|
||||||
|
*
|
||||||
|
* @return number Returns the number of members an alliance
|
||||||
|
* can hold with the current level of leader's Embassy.
|
||||||
|
*/
|
||||||
|
public function getAllianceCapacity($embassyLevel) {
|
||||||
|
$embassyLevel = (int) $embassyLevel;
|
||||||
|
|
||||||
|
if ($embassyLevel > 20) {
|
||||||
|
$embassyLevel = 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($embassyLevel < 0) {
|
||||||
|
$embassyLevel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ceil is not really necessary but to make sure
|
||||||
|
// decimals won't crack this up, it's here
|
||||||
|
return ceil((60 / 20) * $embassyLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks and potentially updates the status of a player-alliance
|
||||||
|
* relationship given the user input.
|
||||||
|
*
|
||||||
|
* @param array $userData Data of the user for which we want to check
|
||||||
|
* the player-alliance relationship.
|
||||||
|
* @param boolean $demolition Determines whether the request came from
|
||||||
|
* a buiding demolition (true) or from a battle
|
||||||
|
* report (false).
|
||||||
|
*
|
||||||
|
* @return boolean Returns TRUE if there was no change
|
||||||
|
* to the player-alliance relationship
|
||||||
|
* FALSE otherwise.
|
||||||
|
*/
|
||||||
|
public function checkAllianceEmbassiesStatus($userData, $demolition = false) {
|
||||||
|
// TODO: refactor this and break it into more smaler methods
|
||||||
|
global $session, $automation;
|
||||||
|
|
||||||
|
// check whether this player is an alliance owner
|
||||||
|
$isOwner = ($userData['alliance'] && $this->isAllianceOwner($userData['id']) == $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);
|
||||||
|
|
||||||
|
// 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) < $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']);
|
||||||
|
|
||||||
|
// 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'],
|
||||||
|
2,
|
||||||
|
'You left the alliance',
|
||||||
|
"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,\n<i>Server Robot :)</i>",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
true);
|
||||||
} else {
|
} else {
|
||||||
$fType = $this->getFieldType($wid, $key['buildnumber']);
|
// player has been removed from the alliance
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// we're actually demolishing an Embassy
|
}
|
||||||
if ($fType == 18) {
|
} else {
|
||||||
$isOwner = ($key['alliance'] && $this->isAllianceOwner($key['id']) == $key['alliance']);
|
// the player IS an alliance owner, check if we need to take any action
|
||||||
|
$membersCount = $this->countAllianceMembers($userData['alliance']);
|
||||||
|
$minAllianceEmbassyLevel = $this->getMinEmbassyLevel($membersCount);
|
||||||
|
|
||||||
// in case the player is an alliance founder,
|
// in this case, the minimum Embassy level cannot go below 3,
|
||||||
// we demolished a lvl 3 Embasy
|
// since this player is a leader and as such, he needs at least
|
||||||
// and there are no more lvl 3+ Embassies left for them
|
// a level 3 Embassy
|
||||||
// disconnect them from the alliance and delete it
|
if ($minAllianceEmbassyLevel < 3) {
|
||||||
// because alliance can only be founded with a lvl 3+ Embassy
|
$minAllianceEmbassyLevel = 3;
|
||||||
if ($isOwner && $key['lvl'] == 2 && $this->getSingleFieldTypeCount($key['id'], 18, 3, '>=') == 0) {
|
}
|
||||||
mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$key['id']);
|
|
||||||
$this->deleteAlliance($key['alliance']);
|
|
||||||
$_SESSION['alliance_user'] = 0;
|
|
||||||
|
|
||||||
// notify them via in-game messaging
|
$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) < $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) {
|
||||||
|
|
||||||
|
// load all alliance members
|
||||||
|
$members = $this->getAllMember($userData['alliance']);
|
||||||
|
|
||||||
|
// 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) {
|
||||||
|
foreach ($members as $member) {
|
||||||
|
// evict the player from the alliance
|
||||||
|
mysqli_query($this->dblink, 'UPDATE '.TB_PREFIX.'users SET alliance = 0 WHERE id = '.$member['id']);
|
||||||
|
|
||||||
|
// notify them via in-game messaging
|
||||||
|
$this->sendMessage(
|
||||||
|
$member['id'],
|
||||||
|
2,
|
||||||
|
'Your alliance was disbanded',
|
||||||
|
(
|
||||||
|
($member['id'] == $userData['id'])
|
||||||
|
?
|
||||||
|
"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,\n<i>Server Robot :)</i>"
|
||||||
|
:
|
||||||
|
"Hi, ".$userData['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,\n<i>Server Robot :)</i>"
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
} 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 = [];
|
||||||
|
|
||||||
|
foreach ($member as $member) {
|
||||||
|
if (!$newLeaderFound && $this->getSingleFieldTypeCount($member['id'], 18, '>=', $minAllianceEmbassyLevel) >= $minimumExistingEmbassyRecords) {
|
||||||
|
// 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,
|
||||||
|
2,
|
||||||
|
'You are now an alliance leader',
|
||||||
|
"Hi, ".$userData['username']."!\n\nThis is to inform you that there was a successful attack on player <a href=\"spieler.php?uid=".$userData['id']."\">".$userData['username']."</a> 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,\n<i>Server Robot :)</i>",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memberIDs[] = $member['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 ($memberIDs as $id) {
|
||||||
$this->sendMessage(
|
$this->sendMessage(
|
||||||
$key['id'],
|
$id,
|
||||||
2,
|
2,
|
||||||
'Your alliance was disbanded',
|
'Your alliance was dispersed',
|
||||||
"Hi!\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\n\In order to found a new alliance, please build a level 3 Embassy again in one of your villages.\n\nYours sincerely,\n<i>Server Robot :)</i>",
|
(
|
||||||
|
($id == $userData['id'])
|
||||||
|
?
|
||||||
|
"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, 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,\n<i>Server Robot :)</i>"
|
||||||
|
:
|
||||||
|
"Hi, ".$userData['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,\n<i>Server Robot :)</i>"
|
||||||
|
),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// execute a method that will delete an alliance
|
||||||
|
// if no members are left in it
|
||||||
|
$this->deleteAlliance($userData['alliance']);
|
||||||
|
|
||||||
|
// unset the alliance in session, if we're evicting
|
||||||
|
// currently logged-in player
|
||||||
|
if ($userData['alliance'] == $userData['id']) {
|
||||||
|
$_SESSION['alliance_user'] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$q = "DELETE FROM " . TB_PREFIX . "demolition WHERE vref=" . $wid;
|
// no changes in player-to-alliance relationship
|
||||||
return mysqli_query($this->dblink,$q);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getJobs($wid) {
|
function getJobs($wid) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ include("alli_menu.tpl");
|
|||||||
</tr>
|
</tr>
|
||||||
</thead><tbody>
|
</thead><tbody>
|
||||||
<?php
|
<?php
|
||||||
if ($isOwner && $membersCount > 0) {
|
if ($isOwner && $membersCount > 1) {
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" class="info">
|
<td colspan="2" class="info">
|
||||||
@@ -45,8 +45,13 @@ include("alli_menu.tpl");
|
|||||||
<select name="new_founder" class="name dropdown">
|
<select name="new_founder" class="name dropdown">
|
||||||
<?php
|
<?php
|
||||||
$canQuit = false;
|
$canQuit = false;
|
||||||
|
$minEmbassyLevel = $database->getMinEmbassyLevel( $database->countAllianceMembers($session->alliance) );
|
||||||
|
if ($minEmbassyLevel < 3) {
|
||||||
|
$minEmbassyLevel = 3;
|
||||||
|
}
|
||||||
|
|
||||||
foreach($memberlist as $member) {
|
foreach($memberlist as $member) {
|
||||||
if (($member['id'] != $session->uid) && ($database->getSingleFieldTypeCount($member['id'], 18, 3, '>=') >= 1)) {
|
if (($member['id'] != $session->uid) && ($database->getSingleFieldTypeCount($member['id'], 18, '>=', $minEmbassyLevel) >= 1)) {
|
||||||
echo "<option value=\"".$member['id']."\">".$member['username']."</option>";
|
echo "<option value=\"".$member['id']."\">".$member['username']."</option>";
|
||||||
$canQuit = true;
|
$canQuit = true;
|
||||||
}
|
}
|
||||||
@@ -60,6 +65,8 @@ include("alli_menu.tpl");
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
|
} else {
|
||||||
|
$canQuit = true;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -83,7 +90,7 @@ include("alli_menu.tpl");
|
|||||||
?>
|
?>
|
||||||
<span style="color: red">
|
<span style="color: red">
|
||||||
<br />
|
<br />
|
||||||
Unfortunately, there are no members of the alliance with Embassy at level 3 or more. In this case, you will not be able
|
Unfortunately, there are no members of the alliance with Embassy at level <?php echo $minEmbassyLevel; ?> or more. In this case, you will not be able
|
||||||
to reassign the founder role. You can still <a href="allianz.php?s=5">kick all members</a> and quit the alliance afterwards,
|
to reassign the founder role. You can still <a href="allianz.php?s=5">kick all members</a> and quit the alliance afterwards,
|
||||||
if you wish.
|
if you wish.
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
+41
-10
@@ -11,6 +11,12 @@ if($session->access != BANNED){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($session->alliance) {
|
||||||
|
$memberCount = $database->countAllianceMembers($session->alliance);
|
||||||
|
} else {
|
||||||
|
$memberCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if(!empty($_REQUEST["demolish"]) && $_REQUEST["c"] == $session->mchecker) {
|
if(!empty($_REQUEST["demolish"]) && $_REQUEST["c"] == $session->mchecker) {
|
||||||
if($session->access != BANNED){
|
if($session->access != BANNED){
|
||||||
if($_REQUEST["type"] != null) {
|
if($_REQUEST["type"] != null) {
|
||||||
@@ -54,9 +60,10 @@ echo "</b>";
|
|||||||
switch ($_GET['nodemolish']) {
|
switch ($_GET['nodemolish']) {
|
||||||
case 18:
|
case 18:
|
||||||
echo '<p style="color: #ff0000; text-align: left">
|
echo '<p style="color: #ff0000; text-align: left">
|
||||||
Because you are the founder of your alliance, demolition of a lvl 3 Embassy cannot be started.
|
Because you are the leader of your alliance, demolition of your current Embassy cannot be started,
|
||||||
You can still <a href="allianz.php?s=5">quit the alliance</a>, while selecting a new leader
|
since it still holds all of your <b>'.$memberCount.'</b> alliance members.
|
||||||
in the "quit alliance" form.
|
You can, however <a href="allianz.php?s=5">quit the alliance</a>, while selecting a new leader
|
||||||
|
in the "quit alliance" form, then continue the demolition.
|
||||||
</p>';
|
</p>';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -85,20 +92,44 @@ echo "</select><input id=\"btn_demolish\" name=\"demolish\" class=\"dynamic_img\
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
function verify_demolition() {
|
function verify_demolition() {
|
||||||
dType = document.getElementById('demolition_type');
|
var dType = document.getElementById('demolition_type');
|
||||||
if (dType.options[dType.selectedIndex].text.indexOf('Embassy (lvl 3)') > -1) {
|
var warnLvl3 = <?php
|
||||||
|
if (
|
||||||
|
$session->alliance &&
|
||||||
|
$database->isAllianceOwner($session->uid) == $session->alliance &&
|
||||||
|
// don't show the OK/Cancel warning if we have more members, since
|
||||||
|
// that will be handled by the returned value
|
||||||
|
$memberCount == 1 &&
|
||||||
|
$database->getSingleFieldTypeCount($session->uid, 18, '>=', 3) == 1
|
||||||
|
) {
|
||||||
|
echo 'true';
|
||||||
|
} else {
|
||||||
|
echo 'false';
|
||||||
|
}
|
||||||
|
?>;
|
||||||
|
var warnLvl1 = <?php
|
||||||
|
if ($session->alliance && $database->getSingleFieldTypeCount($session->uid, 18, '>=', 1) == 1) {
|
||||||
|
echo 'true';
|
||||||
|
} else {
|
||||||
|
echo 'false';
|
||||||
|
}
|
||||||
|
?>;
|
||||||
|
|
||||||
|
if (warnLvl3 && dType.options[dType.selectedIndex].text.indexOf('Embassy (lvl 3)') > -1) {
|
||||||
// check if we really want to demolish a lvl 3 embassy
|
// check if we really want to demolish a lvl 3 embassy
|
||||||
if (!window.confirm('WARNING!\n'
|
if (!window.confirm('WARNING!\n'
|
||||||
+ 'You are about to demolish an Embassy at lvl 3!\n\n'
|
+ 'You are about to demolish the last lvl3 Embassy!\n\n'
|
||||||
+ 'If you are the founder of your alliance and this is your last Embassy and your alliance has no additional members, the alliance will be deleted.\n\n'
|
+ 'Since you are the leader of your alliance and because there are no additional members left, the alliance will be disbanded once the demolition completes.\n\n'
|
||||||
|
+ 'After that happens, you can found a new alliance or join one that already exists.\n\n'
|
||||||
+ 'Click OK to confirm or Cancel to stop.')) {
|
+ 'Click OK to confirm or Cancel to stop.')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (dType.options[dType.selectedIndex].text.indexOf('Embassy (lvl 1)') > -1) {
|
} else if (warnLvl1 && dType.options[dType.selectedIndex].text.indexOf('Embassy (lvl 1)') > -1) {
|
||||||
// check if we really want to demolish a lvl 1 embassy
|
// check if we really want to demolish a lvl 1 embassy
|
||||||
if (!window.confirm('WARNING!\n'
|
if (!window.confirm('WARNING!\n'
|
||||||
+ 'You are about to demolish an Embassy at lvl 1!\n\n'
|
+ 'You are about to demolish your last Embassy!\n\n'
|
||||||
+ 'If you are in an alliance and this is your last Embassy in game, you will automatically quit that alliance when the demolition is complete.\n\n'
|
+ 'Since you are in an alliance, you will automatically quit that alliance once the demolition completes.\n\n'
|
||||||
|
+ 'After that happens, you can found or join an alliance again.\n\n'
|
||||||
+ 'Click OK to confirm or Cancel to stop.')) {
|
+ 'Click OK to confirm or Cancel to stop.')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -1,6 +1,13 @@
|
|||||||
-- 27.10.2018 -> SQL optimizations
|
-- 31.10.2017 -> Embassy and alliance updates
|
||||||
|
ALTER TABLE `s1_ali_permission` ADD INDEX(`alliance`);
|
||||||
|
ALTER TABLE `s1_allimedal` ADD INDEX(`allyid`);
|
||||||
|
ALTER TABLE `s1_ali_permission` DROP INDEX `uid-alliance`, ADD UNIQUE `uid-alliance` (`uid`, `alliance`) USING BTREE;
|
||||||
|
|
||||||
|
|
||||||
|
-- 27.10.2017 -> SQL optimizations
|
||||||
ALTER TABLE `s1_route` ADD INDEX `uid-timestamp` (`uid`, `timestamp`);
|
ALTER TABLE `s1_route` ADD INDEX `uid-timestamp` (`uid`, `timestamp`);
|
||||||
|
|
||||||
|
|
||||||
-- 24.10.2017 -> SQL optimizations
|
-- 24.10.2017 -> SQL optimizations
|
||||||
ALTER TABLE `s1_users` ADD INDEX(`sit1`);
|
ALTER TABLE `s1_users` ADD INDEX(`sit1`);
|
||||||
ALTER TABLE `s1_users` ADD INDEX(`sit2`);
|
ALTER TABLE `s1_users` ADD INDEX(`sit2`);
|
||||||
|
|||||||
+4
-2
@@ -174,7 +174,8 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%allimedal` (
|
|||||||
`img` varchar(255) NULL,
|
`img` varchar(255) NULL,
|
||||||
`del` tinyint(1) NULL DEFAULT '0',
|
`del` tinyint(1) NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `week` (`week`)
|
KEY `week` (`week`),
|
||||||
|
KEY `allyid` (`allyid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
@@ -309,7 +310,8 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%ali_permission` (
|
|||||||
`opt7` int(1) NULL DEFAULT '0',
|
`opt7` int(1) NULL DEFAULT '0',
|
||||||
`opt8` int(1) NULL DEFAULT '0',
|
`opt8` int(1) NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `uid-alliance` (`uid`, `alliance`)
|
UNIQUE KYE `uid-alliance` (`uid`, `alliance`) USING BTREE,
|
||||||
|
KEY `alliance` (`alliance`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
Reference in New Issue
Block a user