Account IOAccount::loadAccount(uint32_t accno) { Account acc; Database* db = Database::instance(); DBQuery query; DBResult* result; query << "SELECT `id`, `password`, `premend`, `warnings` FROM `accounts` WHERE `id` = " << accno; if((result = db->storeQuery(query.str()))){ acc.accnumber = result->getDataInt("id"); acc.password = result->getDataString("password"); acc.premEnd = result->getDataInt("premend"); acc.warnings = result->getDataInt("warnings"); db->freeResult(result); query.str(""); query << "SELECT `name` FROM `players` WHERE `account_id` = " << accno; if((result = db->storeQuery(query.str()))){ do { std::string ss = result->getDataString("name"); acc.charList.push_back(ss.c_str()); } while(result->next()); acc.charList.sort(); db->freeResult(result); } } return acc; }
bool IOMapSerialize::updateAuctions() { Database* db = Database::getInstance(); DBQuery query; time_t now = time(NULL); query << "SELECT `house_id`, `player_id`, `bid` FROM `house_auctions` WHERE `endtime` < " << now; DBResult* result; if(!(result = db->storeQuery(query.str()))) return true; bool success = true; House* house = NULL; do { query.str(""); query << "DELETE FROM `house_auctions` WHERE `house_id` = " << result->getDataInt("house_id"); if(!(house = Houses::getInstance()->getHouse(result->getDataInt( "house_id"))) || !db->query(query.str())) { success = false; continue; } house->setOwner(result->getDataInt("player_id")); Houses::getInstance()->payHouse(house, now, result->getDataInt("bid")); } while(result->next()); result->free(); return success; }
GuildWarList IOGuild::getWarList(uint32_t guildId) { GuildWarList guildWarList; Database* db = Database::getInstance(); DBQuery query; DBResult* result; query << "SELECT `guild1` FROM `guild_wars` WHERE `guild2` = " << guildId << " AND `ended` = 0 AND `status` = 1;"; if((result = db->storeQuery(query.str()))) { do { guildWarList.push_back(result->getDataInt("guild1")); } while (result->next()); db->freeResult(result); } query.str(""); query << "SELECT `guild2` FROM `guild_wars` WHERE `guild1` = " << guildId << " AND `ended` = 0 AND `status` = 1;"; if((result = db->storeQuery(query.str()))) { do { guildWarList.push_back(result->getDataInt("guild2")); } while (result->next()); db->freeResult(result); } return guildWarList; }
const PlayerGroup* IOPlayer::getPlayerGroup(uint32_t groupid) { PlayerGroupMap::const_iterator it = playerGroupMap.find(groupid); if(it != playerGroupMap.end()){ return it->second; } else{ Database* db = Database::instance(); DBQuery query; DBResult* result; query << "SELECT * FROM `groups` WHERE `id`= " << groupid; if((result = db->storeQuery(query.str()))){ PlayerGroup* group = new PlayerGroup; group->m_name = result->getDataString("name"); group->m_flags = result->getDataLong("flags"); group->m_access = result->getDataInt("access"); group->m_maxDepotItems = result->getDataInt("maxdepotitems"); group->m_maxVip = result->getDataInt("maxviplist"); playerGroupMap[groupid] = group; db->freeResult(result); return group; } } return NULL; }
std::list<VIPEntry> IOLoginData::getVIPEntries(uint32_t accountId) { std::list<VIPEntry> entries; Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `player_id`, (SELECT `name` FROM `players` WHERE `id` = `player_id`) AS `name`, `description`, `icon`, `notify` FROM `account_viplist` WHERE `account_id` = " << accountId; DBResult* result; if ((result = db->storeQuery(query.str()))) { do { VIPEntry entry; entry.guid = result->getDataInt("player_id"); entry.name = result->getDataString("name"); entry.description = result->getDataString("description"); entry.icon = result->getDataInt("icon"); entry.notify = result->getDataInt("notify") != 0; entries.push_back(entry); } while (result->next()); db->freeResult(result); } return entries; }
MarketOfferList IOMarket::getOwnOffers(MarketAction_t action, uint32_t playerId) { Database* db = Database::getInstance(); DBQuery query; query << "SELECT `id`, `amount`, `price`, `created`, `anonymous`, `itemtype` FROM `market_offers` WHERE `player_id` = " << playerId << " AND `sale` = " << action << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << ";"; DBResult* result; if(!(result = db->storeQuery(query.str()))) return MarketOfferList(); MarketOfferList offerList; do { MarketOffer offer; offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.timestamp = result->getDataInt("created") + g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); offer.counter = result->getDataInt("id") & 0xFFFF; offer.itemId = result->getDataInt("itemtype"); offerList.push_back(offer); } while(result->next()); result->free(); return offerList; }
MarketOfferList IOMarket::getOwnOffers(MarketAction_t action, uint32_t playerId) { MarketOfferList offerList; const int32_t marketOfferDuration = g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); std::ostringstream query; query << "SELECT `id`, `amount`, `price`, `created`, `anonymous`, `itemtype` FROM `market_offers` WHERE `player_id` = " << playerId << " AND `sale` = " << action; Database* db = Database::getInstance(); DBResult* result = db->storeQuery(query.str()); if (!result) { return offerList; } do { MarketOffer offer; offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.timestamp = result->getDataInt("created") + marketOfferDuration; offer.counter = result->getDataInt("id") & 0xFFFF; offer.itemId = result->getDataInt("itemtype"); offerList.push_back(offer); } while (result->next()); db->freeResult(result); return offerList; }
bool IOLoginData::getGuidByNameEx(uint32_t& guid, bool& specialVip, std::string& name) { Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `name`, `id`, `group_id`, `account_id` FROM `players` WHERE `name` = " << db->escapeString(name); DBResult* result = db->storeQuery(query.str()); if (!result) { return false; } name = result->getDataString("name"); guid = result->getDataInt("id"); Group* group = g_game.getGroup(result->getDataInt("group_id")); db->freeResult(result); uint64_t flags; if (group) { flags = group->flags; } else { flags = 0; } specialVip = (0 != (flags & ((uint64_t)1 << PlayerFlag_SpecialVIP))); return true; }
ExpiredMarketOfferList IOMarket::getExpiredOffers(MarketAction_t action) { ExpiredMarketOfferList offerList; const time_t lastExpireDate = time(nullptr) - g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); std::ostringstream query; query << "SELECT `id`, `amount`, `price`, `itemtype`, `player_id` FROM `market_offers` WHERE `sale` = " << action << " AND `created` <= " << lastExpireDate; Database* db = Database::getInstance(); DBResult* result = db->storeQuery(query.str()); if (!result) { return offerList; } do { ExpiredMarketOffer offer; offer.id = result->getDataInt("id"); offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.itemId = result->getDataInt("itemtype"); offer.playerId = result->getDataInt("player_id"); offerList.push_back(offer); } while (result->next()); db->freeResult(result); return offerList; }
const PlayerGroup* IOLoginData::getPlayerGroup(uint32_t groupid) { PlayerGroupMap::const_iterator it = playerGroupMap.find(groupid); if (it != playerGroupMap.end()) { return it->second; } Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `name`, `flags`, `access`, `maxdepotitems`, `maxviplist` FROM `groups` WHERE `id` = " << groupid; DBResult* result = db->storeQuery(query.str()); if (!result) { return NULL; } PlayerGroup* group = new PlayerGroup; group->m_name = result->getDataString("name"); group->m_flags = result->getDataLong("flags"); group->m_access = result->getDataInt("access"); group->m_maxdepotitems = result->getDataInt("maxdepotitems"); group->m_maxviplist = result->getDataInt("maxviplist"); db->freeResult(result); playerGroupMap[groupid] = group; return group; }
bool IOGuild::updateWar(War_t& war) { Database* db = Database::getInstance(); DBResult* result; DBQuery query; query << "SELECT `g`.`name` AS `guild_name`, `e`.`name` AS `enemy_name`, `w`.* FROM `guild_wars` w LEFT JOIN `guilds` g ON `w`.`guild_id` = `g`.`id` LEFT JOIN `guilds` e ON `w`.`enemy_id` = `e`.`id` WHERE `w`.`id` = " << war.war; if(!(result = db->storeQuery(query.str()))) return false; war.ids[WAR_GUILD] = result->getDataInt("guild_id"); war.ids[WAR_ENEMY] = result->getDataInt("enemy_id"); war.names[WAR_GUILD] = result->getDataString("guild_name"); war.names[WAR_ENEMY] = result->getDataString("enemy_name"); war.frags[WAR_GUILD] = result->getDataInt("guild_kills"); war.frags[WAR_ENEMY] = result->getDataInt("enemy_kills"); war.frags[war.type]++; war.limit = result->getDataInt("frags"); war.payment = result->getDataInt("payment"); result->free(); if(war.frags[WAR_GUILD] >= war.limit || war.frags[WAR_ENEMY] >= war.limit) { Scheduler::getInstance().addEvent(createSchedulerTask(1000, boost::bind(&IOGuild::finishWar, this, war, true))); return true; } query.str(""); query << "UPDATE `guild_wars` SET `guild_kills` = " << war.frags[WAR_GUILD] << ", `enemy_kills` = " << war.frags[WAR_ENEMY] << " WHERE `id` = " << war.war; return db->query(query.str()); }
HistoryMarketOfferList IOMarket::getOwnHistory(MarketAction_t action, uint32_t playerId) { Database* db = Database::getInstance(); DBQuery query; query << "SELECT `id`, `itemtype`, `amount`, `price`, `expires_at`, `state` FROM `market_history` WHERE `player_id` = " << playerId << " AND `sale` = " << action << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << ";"; DBResult* result; if(!(result = db->storeQuery(query.str()))) return HistoryMarketOfferList(); HistoryMarketOfferList offerList; do { HistoryMarketOffer offer; offer.itemId = result->getDataInt("itemtype"); offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.timestamp = result->getDataInt("expires_at"); MarketOfferState_t offerState = (MarketOfferState_t)result->getDataInt("state"); if(offerState == OFFERSTATE_ACCEPTEDEX) offerState = OFFERSTATE_ACCEPTED; offer.state = offerState; offerList.push_back(offer); } while(result->next()); result->free(); return offerList; }
ExpiredMarketOfferList IOMarket::getExpiredOffers(MarketAction_t action) { Database* db = Database::getInstance(); DBQuery query; query << "SELECT `id`, `amount`, `price`, `itemtype`, `player_id` FROM `market_offers` WHERE `sale` = " << action << " AND `created` <= " << (time(NULL) - g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION)) << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << ";"; DBResult* result; if(!(result = db->storeQuery(query.str()))) return ExpiredMarketOfferList(); ExpiredMarketOfferList offerList; do { ExpiredMarketOffer offer; offer.id = result->getDataInt("id"); offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.itemId = result->getDataInt("itemtype"); offer.playerId = result->getDataInt("player_id"); offerList.push_back(offer); } while(result->next()); result->free(); return offerList; }
HistoryMarketOfferList IOMarket::getOwnHistory(MarketAction_t action, uint32_t playerId) { HistoryMarketOfferList offerList; std::ostringstream query; query << "SELECT `id`, `itemtype`, `amount`, `price`, `expires_at`, `state` FROM `market_history` WHERE `player_id` = " << playerId << " AND `sale` = " << action; Database* db = Database::getInstance(); DBResult* result = db->storeQuery(query.str()); if (!result) { return offerList; } do { HistoryMarketOffer offer; offer.itemId = result->getDataInt("itemtype"); offer.amount = result->getDataInt("amount"); offer.price = result->getDataInt("price"); offer.timestamp = result->getDataInt("expires_at"); MarketOfferState_t offerState = (MarketOfferState_t)result->getDataInt("state"); if (offerState == OFFERSTATE_ACCEPTEDEX) { offerState = OFFERSTATE_ACCEPTED; } offer.state = offerState; offerList.push_back(offer); } while (result->next()); db->freeResult(result); return offerList; }
std::vector<Ban> BanManager::getBans(const BanType_t& type) { assert(type == BAN_IPADDRESS || type == BAN_PLAYER || type == BAN_ACCOUNT || type == BAN_NOTATION); Database* db = Database::instance(); DBQuery query; query << "SELECT " "`id`, " "`value`, " "`param`, " "`expires`, " "`added`, " "`admin_id`, " "`comment`, " "`reason`, " "`action`, " "`statement` " "FROM " "`bans` " "WHERE " "`type` = " << type << " AND " "`active` = 1 AND " << "(`expires` >= " << std::time(NULL) << " OR `expires` = 0)"; std::vector<Ban> vec; DBResult* result; if (!(result = db->storeQuery(query.str()))) { return vec; } do { Ban ban; ban.type = type; ban.id = result->getDataInt("id"); ban.value = result->getDataString("value"); ban.param = result->getDataString("param"); ban.expires = result->getDataLong("expires"); ban.added = (uint32_t)result->getDataLong("id"); ban.adminId = result->getDataInt("admin_id"); ban.reason = result->getDataInt("reason"); ban.action = (violationAction_t)result->getDataInt("action"); ban.comment = result->getDataString("comment"); ban.statement = result->getDataString("statement"); vec.push_back(ban); } while (result->next()); db->freeResult(result); return vec; }
MarketOfferEx IOMarket::getOfferById(uint32_t id) { Database* db = Database::getInstance(); DBQuery query; query << "SELECT `id`, `sale`, `itemtype`, `amount`, `created`, `price`, `player_id`, `anonymous` FROM `market_offers` WHERE `id` = " << id << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << ";"; DBResult* result; if(!(result = db->storeQuery(query.str()))) return MarketOfferEx(); MarketOfferEx offer; offer.type = (MarketAction_t)result->getDataInt("sale"); offer.amount = result->getDataInt("amount"); offer.counter = result->getDataInt("id") & 0xFFFF; offer.timestamp = result->getDataInt("created"); offer.price = result->getDataInt("price"); offer.itemId = result->getDataInt("itemtype"); int32_t playerId = result->getDataInt("player_id"); offer.playerId = playerId; if(!result->getDataInt("anonymous")) { IOLoginData::getInstance()->getNameByGuid(playerId, offer.playerName); if(offer.playerName.empty()) offer.playerName = "Anonymous"; } else offer.playerName = "Anonymous"; result->free(); return offer; }
MarketOfferEx IOMarket::getOfferById(uint32_t id) { MarketOfferEx offer; std::ostringstream query; query << "SELECT `id`, `sale`, `itemtype`, `amount`, `created`, `price`, `player_id`, `anonymous` FROM `market_offers` WHERE `id` = " << id; Database* db = Database::getInstance(); DBResult* result = db->storeQuery(query.str()); if (result) { offer.type = (MarketAction_t)result->getDataInt("sale"); offer.amount = result->getDataInt("amount"); offer.counter = result->getDataInt("id") & 0xFFFF; offer.timestamp = result->getDataInt("created"); offer.price = result->getDataInt("price"); offer.itemId = result->getDataInt("itemtype"); int32_t playerId = result->getDataInt("player_id"); offer.playerId = playerId; if (result->getDataInt("anonymous") == 0) { IOLoginData::getInstance()->getNameByGuid(playerId, offer.playerName); if (offer.playerName.empty()) { offer.playerName = "Anonymous"; } } else { offer.playerName = "Anonymous"; } db->freeResult(result); } return offer; }
bool BanManager::isIpBanished(uint32_t clientip, uint32_t mask /*= 0xFFFFFFFF*/) const { if(clientip == 0) return false; Database* db = Database::instance(); DBQuery query; query << "SELECT " "COUNT(*) AS `count` " "FROM " "`bans` " "WHERE " "`type` = " << BAN_IPADDRESS << " AND " "((" << clientip << " & " << mask << " & `param`) = (`value` & `param` & " << mask << ")) AND " "`active` = 1 AND " "(`expires` >= " << std::time(NULL) << " OR `expires` <= 0)"; DBResult* result; if(!(result = db->storeQuery(query.str()))) return false; int t = result->getDataInt("count"); db->freeResult(result); return t > 0; }
bool IOLoginData::getGuidByName(uint32_t& guid, std::string& name) { GuidCacheMap::const_iterator it = guidCacheMap.find(name); if (it != guidCacheMap.end()) { name = it->first; guid = it->second; return true; } Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `id`, `name` FROM `players` WHERE `name` = " << db->escapeString(name); DBResult* result = db->storeQuery(query.str()); if (!result) { return false; } name = result->getDataString("name"); guid = result->getDataInt("id"); db->freeResult(result); guidCacheMap[name] = guid; return true; }
bool BanManager::isPlayerBanished(const uint32_t& playerId) const { Database* db = Database::instance(); DBQuery query; query << "SELECT " "COUNT(*) AS `count` " "FROM " "`bans` " "WHERE " "`type` = " << BAN_PLAYER << " AND " "`value` = " << playerId << " AND " "`active` = 1 AND " "(`expires` >= " << std::time(NULL) << " OR `expires` <= 0)"; DBResult* result; if (!(result = db->storeQuery(query.str()))) { return false; } int t = result->getDataInt("count"); db->freeResult(result); return t > 0; }
bool IOGuild::joinGuild(Player* player, uint32_t guildId) { Database* db = Database::getInstance(); DBQuery query; DBResult* result; query << "SELECT `id`, `name` FROM `guild_ranks` WHERE `guild_id` = " << guildId << " AND `level` = 1 LIMIT 1"; if(!(result = db->storeQuery(query.str()))) return false; query.str(""); player->setGuildRank(result->getDataString("name")); player->setGuildId(guildId); query << "UPDATE `players` SET `rank_id` = " << result->getDataInt("id") << " WHERE `id` = " << player->getGUID() << db->getUpdateLimiter(); if(!db->executeQuery(query.str())) return false; query.str(""); player->setGuildName(getGuildNameById(guildId)); query << "SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " << guildId << " AND `level` = 1 LIMIT 1;"; if(!(result = db->storeQuery(query.str()))) return false; player->setGuildLevel(GUILDLEVEL_MEMBER); player->invitedToGuildsList.clear(); return true; }
bool IOGuild::changeRank(uint32_t guild, const std::string& oldName, const std::string& newName) { Database* db = Database::getInstance(); DBResult* result; DBQuery query; query << "SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " << guild << " AND `name` " << db->getStringComparer() << db->escapeString(oldName) << " LIMIT 1"; if(!(result = db->storeQuery(query.str()))) return false; const uint32_t id = result->getDataInt("id"); result->free(); query.str(""); query << "UPDATE `guild_ranks` SET `name` = " << db->escapeString(newName) << " WHERE `id` = " << id << db->getUpdateLimiter(); if(!db->query(query.str())) return false; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { if(it->second->getRankId() == id) it->second->setRankName(newName); } return true; }
bool Database::connect() { // connection handle initialization m_handle = mysql_init(nullptr); if (!m_handle) { std::cout << std::endl << "Failed to initialize MySQL connection handle." << std::endl; return false; } // automatic reconnect my_bool reconnect = true; mysql_options(m_handle, MYSQL_OPT_RECONNECT, &reconnect); // connects to database if (!mysql_real_connect(m_handle, g_config.getString(ConfigManager::MYSQL_HOST).c_str(), g_config.getString(ConfigManager::MYSQL_USER).c_str(), g_config.getString(ConfigManager::MYSQL_PASS).c_str(), g_config.getString(ConfigManager::MYSQL_DB).c_str(), g_config.getNumber(ConfigManager::SQL_PORT), nullptr, 0)) { std::cout << std::endl << "MySQL Error Message: " << mysql_error(m_handle) << std::endl; return false; } m_connected = true; DBResult* result = storeQuery("SHOW variables LIKE 'max_allowed_packet'"); if (result) { int32_t max_query = result->getDataInt("Value"); freeResult(result); if (max_query < 16777216) { std::cout << std::endl << "[Warning] max_allowed_packet might too low for house item storage" << std::endl; std::cout << "Use the following query to raise max_allow_packet: "; std::cout << "SET GLOBAL max_allowed_packet = 16777216"; } } return true; }
void IOLoginData::updateHouseOwners() { Database* db = Database::getInstance(); std::ostringstream query; DBResult* result; query << "SELECT `id`, `highest_bidder`, `last_bid` FROM `houses` WHERE `owner` = 0 AND `bid_end` != 0 AND `bid_end` < " << time(nullptr); if ((result = db->storeQuery(query.str()))) { do { House* house = Houses::getInstance().getHouse(result->getDataInt("id")); if (house) { DBResult* result2; query.str(""); query << "SELECT `balance` FROM `players` WHERE `id` = " << result->getDataInt("highest_bidder"); bool canPay = false; if ((result2 = db->storeQuery(query.str()))) { if (result2->getDataInt("balance") >= result->getDataInt("last_bid")) { canPay = true; } db->freeResult(result2); } if (canPay) { query.str(""); query << "UPDATE `players` SET `balance` = `balance` - " << result->getDataInt("last_bid") << " WHERE `id` = " << result->getDataInt("highest_bidder"); db->executeQuery(query.str()); house->setHouseOwner(result->getDataInt("highest_bidder")); } query.str(""); query << "UPDATE `houses` SET `last_bid` = 0, `bid_end` = 0, `highest_bidder` = 0, `bid` = 0 WHERE `id` = " << result->getDataInt("id"); db->executeQuery(query.str()); } } while (result->next()); db->freeResult(result); } }
bool BanManager::isAccountBanished(uint32_t accountId) const { Database* db = Database::instance(); DBQuery query; DBResult* result; int32_t t = 0; //Check for banishments query << "SELECT " "COUNT(*) AS `count` " "FROM " "`bans` " "WHERE " "`type` = " << BAN_ACCOUNT << " AND " "`value` = " << accountId << " AND " "`active` = 1 AND " "(`expires` >= " << std::time(NULL) << " OR `expires` <= 0)"; if((result = db->storeQuery(query.str()))){ t += result->getDataInt("count"); db->freeResult(result); } //Check if account is blocked query.str(""); query << "SELECT " "COUNT(*) AS `count` " "FROM " "`accounts` " "WHERE " "`id` = " << accountId << " AND " "`blocked` = 1"; if((result = db->storeQuery(query.str()))){ t += result->getDataInt("count"); db->freeResult(result); } return t > 0; }
bool IOLoginData::loginserverAuthentication(const std::string& name, const std::string& password, Account& account) { if (name.empty()) { return true; } Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `id`, `name`, `password`, `type`, `premdays`, `lastday` FROM `accounts` WHERE `name` = " << db->escapeString(name); DBResult* result = db->storeQuery(query.str()); if (!result) { return false; } if (transformToSHA1(password) != result->getDataString("password")) { db->freeResult(result); return false; } account.id = result->getDataInt("id"); account.name = result->getDataString("name"); account.accountType = (AccountType_t)result->getDataInt("type"); account.premiumDays = result->getDataInt("premdays"); account.lastDay = result->getDataInt("lastday"); db->freeResult(result); query.str(""); query << "SELECT `name`, `deletion` FROM `players` WHERE `account_id` = " << account.id; result = db->storeQuery(query.str()); if (result) { do { if (result->getDataInt("deletion") == 0) { account.charList.push_back(result->getDataString("name")); } } while (result->next()); db->freeResult(result); account.charList.sort(); } return true; }
bool IOMapSerialize::loadMap(Map* map) { int64_t start = OTSYS_TIME(); Database* db = Database::getInstance(); std::ostringstream query; DBResult* result = db->storeQuery("SELECT `id` FROM `houses`"); if (!result) { return true; } do { query.str(""); query << "SELECT `data` FROM `tile_store` WHERE `house_id` = " << result->getDataInt("id"); DBResult* tileResult = db->storeQuery(query.str()); if (!tileResult) { continue; } do { unsigned long attrSize = 0; const char* attr = tileResult->getDataStream("data", attrSize); PropStream propStream; propStream.init(attr, attrSize); uint16_t x = 0, y = 0; uint8_t z = 0; propStream.GET_USHORT(x); propStream.GET_USHORT(y); propStream.GET_UCHAR(z); if (x == 0 || y == 0) { continue; } Tile* tile = map->getTile(x, y, z); if (!tile) { continue; } uint32_t item_count = 0; propStream.GET_ULONG(item_count); while (item_count--) { loadItem(propStream, tile); } } while (tileResult->next()); db->freeResult(tileResult); } while (result->next()); db->freeResult(result); std::cout << "> Loaded house items in: " << (OTSYS_TIME() - start) / (1000.) << " s" << std::endl; return true; }
uint32_t IOGuild::getGuildId(uint32_t guid) { Database* db = Database::getInstance(); DBQuery query; DBResult* result; query << "SELECT `rank_id` FROM `players` WHERE `id` = " << guid << ";"; if(!(result = db->storeQuery(query.str()))) return 0; query.str(""); query << "SELECT `guild_id` FROM `guild_ranks` WHERE `id` = " << result->getDataInt("rank_id") << ";"; db->freeResult(result); if(!(result = db->storeQuery(query.str()))) return 0; uint32_t guildId = result->getDataInt("guild_id"); db->freeResult(result); return guildId; }
int8_t IOGuild::getGuildLevel(uint32_t guid) { Database* db = Database::getInstance(); DBQuery query; DBResult* result; query << "SELECT `rank_id` FROM `players` WHERE `id` = " << guid << " LIMIT 1;"; if(!(result = db->storeQuery(query.str()))) return 0; query.str(""); query << "SELECT `level` FROM `guild_ranks` WHERE `id` = " << result->getDataInt("rank_id") << " LIMIT 1;"; db->freeResult(result); if(!(result = db->storeQuery(query.str()))) return 0; int8_t level = result->getDataInt("level"); db->freeResult(result); return level; }
bool IOMapSerialize::loadHouseInfo() { Database* db = Database::getInstance(); DBResult* result = db->storeQuery("SELECT `id`, `owner`, `paid`, `warnings` FROM `houses`"); if (!result) { return false; } do { House* house = Houses::getInstance().getHouse(result->getDataInt("id")); if (house) { house->setOwner(result->getDataInt("owner"), false); house->setPaidUntil(result->getDataInt("paid")); house->setPayRentWarnings(result->getDataInt("warnings")); } } while (result->next()); db->freeResult(result); result = db->storeQuery("SELECT `house_id`, `listid`, `list` FROM `house_lists`"); if (result) { do { House* house = Houses::getInstance().getHouse(result->getDataInt("house_id")); if (house) { house->setAccessList(result->getDataInt("listid"), result->getDataString("list")); } } while (result->next()); db->freeResult(result); } return true; }