diff --git a/sabrehaven.sql b/sabrehaven.sql index e0a2b8b..c1c1ce6 100644 --- a/sabrehaven.sql +++ b/sabrehaven.sql @@ -93,7 +93,8 @@ CREATE TABLE `guilds` ( `name` varchar(255) NOT NULL, `ownerid` int(11) NOT NULL, `creationdata` int(11) NOT NULL, - `motd` varchar(255) NOT NULL DEFAULT '' + `motd` varchar(255) NOT NULL DEFAULT '', + `balance` bigint(20) UNSIGNED NOT NULL DEFAULT '0', ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- diff --git a/src/behaviourdatabase.cpp b/src/behaviourdatabase.cpp index 0351fa4..9e9ec33 100644 --- a/src/behaviourdatabase.cpp +++ b/src/behaviourdatabase.cpp @@ -541,6 +541,9 @@ NpcBehaviourNode* BehaviourDatabase::readValue(ScriptReader& script) } else if (identifier == "balance") { node = new NpcBehaviourNode(); node->type = BEHAVIOUR_TYPE_BALANCE; + } else if (identifier == "guildbalance") { + node = new NpcBehaviourNode(); + node->type = BEHAVIOUR_TYPE_GUILDBALANCE; } else if (identifier == "transfertoplayernamestate") { node = new NpcBehaviourNode(); node->type = BEHAVIOUR_TYPE_MESSAGE_TRANSFERTOPLAYERNAME_STATE; @@ -1254,6 +1257,14 @@ int32_t BehaviourDatabase::evaluate(NpcBehaviourNode* node, Player* player, cons return checkOperation(player, node, message); case BEHAVIOUR_TYPE_BALANCE: return player->getBankBalance(); + case BEHAVIOUR_TYPE_GUILDBALANCE: { + const Guild* playerGuild = player->getGuild(); + if (!playerGuild) { + return false; + } + + return IOLoginData::getGuildBalance(playerGuild->getId()); + } case BEHAVIOUR_TYPE_CLIENTVERSION: return g_game.getClientVersion(); case BEHAVIOUR_TYPE_MESSAGE_TRANSFERTOPLAYERNAME_STATE: { diff --git a/src/behaviourdatabase.h b/src/behaviourdatabase.h index 3309694..3f9a0c5 100644 --- a/src/behaviourdatabase.h +++ b/src/behaviourdatabase.h @@ -81,6 +81,7 @@ enum NpcBehaviourType_t BEHAVIOUR_TYPE_SUMMON, // summons a monster BEHAVIOUR_TYPE_EXPERIENCE, // grant experience to a player BEHAVIOUR_TYPE_BALANCE, // return player balance + BEHAVIOUR_TYPE_GUILDBALANCE, // return guild balance BEHAVIOUR_TYPE_WITHDRAW, // withdraw from player bank balance BEHAVIOUR_TYPE_DEPOSIT, // deposit x amount of gold BEHAVIOUR_TYPE_TRANSFER, // transfer x amount of gold diff --git a/src/iologindata.cpp b/src/iologindata.cpp index ebe3a04..2e4f24f 100644 --- a/src/iologindata.cpp +++ b/src/iologindata.cpp @@ -829,6 +829,18 @@ uint32_t IOLoginData::getGuidByName(const std::string& name) return result->getNumber("id"); } +uint64_t IOLoginData::getGuildBalance(uint32_t id) +{ + std::ostringstream query; + query << "SELECT `balance` FROM `guilds` WHERE `id` = " << id; + DBResult_ptr result = Database::getInstance()->storeQuery(query.str()); + if (!result) { + return 0; + } + + return result->getNumber("balance"); +} + // Return 0 means player not found, 1 player is without vocation, 2 player with vocation uint16_t IOLoginData::canTransferMoneyToByName(const std::string& name) { diff --git a/src/iologindata.h b/src/iologindata.h index 6bfbecd..934e70b 100644 --- a/src/iologindata.h +++ b/src/iologindata.h @@ -45,6 +45,7 @@ class IOLoginData static bool loadPlayer(Player* player, DBResult_ptr result); static bool savePlayer(Player* player); static uint32_t getGuidByName(const std::string& name); + static uint64_t getGuildBalance(uint32_t id); static uint16_t canTransferMoneyToByName(const std::string& name); static bool getGuidByNameEx(uint32_t& guid, bool& specialVip, std::string& name); static std::string getNameByGuid(uint32_t guid);