Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
9년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
0 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
331 행
복사
2 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
333 행
복사
bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
{
{
if (!result) {
if (!result) {
return false;
return false;
}
}
Database& db = Database::getInstance();
Database& db = Database::getInstance();
uint32_t accno = result->getNumber<uint32_t>("account_id");
uint32_t accno = result->getNumber<uint32_t>("account_id");
Account acc = loadAccount(accno);
Account acc = loadAccount(accno);
player->setGUID(result->getNumber<uint32_t>("id"));
player->setGUID(result->getNumber<uint32_t>("id"));
player->name = result->getString("name");
player->name = result->getString("name");
player->accountNumber = accno;
player->accountNumber = accno;
player->accountType = acc.accountType;
player->accountType = acc.accountType;
if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) {
if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) {
player->premiumDays = std::numeric_limits<uint16_t>::max();
player->premiumDays = std::numeric_limits<uint16_t>::max();
} else {
} else {
player->premiumDays = acc.premiumDays;
player->premiumDays = acc.premiumDays;
}
}
Group* group = g_game.groups.getGroup(result->getNumber<uint16_t>("group_id"));
Group* group = g_game.groups.getGroup(result->getNumber<uint16_t>("group_id"));
if (!group) {
if (!group) {
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Group ID " << result->getNumber<uint16_t>("group_id") << " which doesn't exist" << std::endl;
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Group ID " << result->getNumber<uint16_t>("group_id") << " which doesn't exist" << std::endl;
return false;
return false;
}
}
player->setGroup(group);
player->setGroup(group);
player->bankBalance = result->getNumber<uint64_t>("balance");
player->bankBalance = result->getNumber<uint64_t>("balance");
player->setSex(static_cast<PlayerSex_t>(result->getNumber<uint16_t>("sex")));
player->setSex(static_cast<PlayerSex_t>(result->getNumber<uint16_t>("sex")));
player->level = std::max<uint32_t>(1, result->getNumber<uint32_t>("level"));
player->level = std::max<uint32_t>(1, result->getNumber<uint32_t>("level"));
복사
복사됨
복사
복사됨
//custom edit: passive damage bonus
player->passiveDamageBonus = result->getNumber<uint16_t>("passivedamagebonus");
uint64_t experience = result->getNumber<uint64_t>("experience");
uint64_t experience = result->getNumber<uint64_t>("experience");
uint64_t currExpCount = Player::getExpForLevel(player->level);
uint64_t currExpCount = Player::getExpForLevel(player->level);
uint64_t nextExpCount = Player::getExpForLevel(player->level + 1);
uint64_t nextExpCount = Player::getExpForLevel(player->level + 1);
if (experience < currExpCount || experience > nextExpCount) {
if (experience < currExpCount || experience > nextExpCount) {
experience = currExpCount;
experience = currExpCount;
}
}
player->experience = experience;
player->experience = experience;
if (currExpCount < nextExpCount) {
if (currExpCount < nextExpCount) {
player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount);
player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount);
} else {
} else {
player->levelPercent = 0;
player->levelPercent = 0;
}
}
player->soul = result->getNumber<uint16_t>("soul");
player->soul = result->getNumber<uint16_t>("soul");
player->capacity = result->getNumber<uint32_t>("cap") * 100;
player->capacity = result->getNumber<uint32_t>("cap") * 100;
player->blessings = result->getNumber<uint16_t>("blessings");
player->blessings = result->getNumber<uint16_t>("blessings");
unsigned long conditionsSize;
unsigned long conditionsSize;
const char* conditions = result->getStream("conditions", conditionsSize);
const char* conditions = result->getStream("conditions", conditionsSize);
PropStream propStream;
PropStream propStream;
propStream.init(conditions, conditionsSize);
propStream.init(conditions, conditionsSize);
Condition* condition = Condition::createCondition(propStream);
Condition* condition = Condition::createCondition(propStream);
while (condition) {
while (condition) {
if (condition->unserialize(propStream)) {
if (condition->unserialize(propStream)) {
player->storedConditionList.push_front(condition);
player->storedConditionList.push_front(condition);
} else {
} else {
delete condition;
delete condition;
}
}
condition = Condition::createCondition(propStream);
condition = Condition::createCondition(propStream);
}
}
if (!player->setVocation(result->getNumber<uint16_t>("vocation"))) {
if (!player->setVocation(result->getNumber<uint16_t>("vocation"))) {
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Vocation ID " << result->getNumber<uint16_t>("vocation") << " which doesn't exist" << std::endl;
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Vocation ID " << result->getNumber<uint16_t>("vocation") << " which doesn't exist" << std::endl;
return false;
return false;
}
}
player->mana = result->getNumber<uint32_t>("mana");
player->mana = result->getNumber<uint32_t>("mana");
player->manaMax = result->getNumber<uint32_t>("manamax");
player->manaMax = result->getNumber<uint32_t>("manamax");
player->magLevel = result->getNumber<uint32_t>("maglevel");
player->magLevel = result->getNumber<uint32_t>("maglevel");
uint64_t nextManaCount = player->vocation->getReqMana(player->magLevel + 1);
uint64_t nextManaCount = player->vocation->getReqMana(player->magLevel + 1);
uint64_t manaSpent = result->getNumber<uint64_t>("manaspent");
uint64_t manaSpent = result->getNumber<uint64_t>("manaspent");
if (manaSpent > nextManaCount) {
if (manaSpent > nextManaCount) {
manaSpent = 0;
manaSpent = 0;
}
}
player->manaSpent = manaSpent;
player->manaSpent = manaSpent;
player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount);
player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount);
player->health = result->getNumber<int32_t>("health");
player->health = result->getNumber<int32_t>("health");
player->healthMax = result->getNumber<int32_t>("healthmax");
player->healthMax = result->getNumber<int32_t>("healthmax");
player->defaultOutfit.lookType = result->getNumber<uint16_t>("looktype");
player->defaultOutfit.lookType = result->getNumber<uint16_t>("looktype");
player->defaultOutfit.lookHead = result->getNumber<uint16_t>("lookhead");
player->defaultOutfit.lookHead = result->getNumber<uint16_t>("lookhead");
player->defaultOutfit.lookBody = result->getNumber<uint16_t>("lookbody");
player->defaultOutfit.lookBody = result->getNumber<uint16_t>("lookbody");
player->defaultOutfit.lookLegs = result->getNumber<uint16_t>("looklegs");
player->defaultOutfit.lookLegs = result->getNumber<uint16_t>("looklegs");
player->defaultOutfit.lookFeet = result->getNumber<uint16_t>("lookfeet");
player->defaultOutfit.lookFeet = result->getNumber<uint16_t>("lookfeet");
player->defaultOutfit.lookAddons = result->getNumber<uint16_t>("lookaddons");
player->defaultOutfit.lookAddons = result->getNumber<uint16_t>("lookaddons");
player->currentOutfit = player->defaultOutfit;
player->currentOutfit = player->defaultOutfit;
if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) {
if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) {
const time_t skullSeconds = result->getNumber<time_t>("skulltime") - time(nullptr);
const time_t skullSeconds = result->getNumber<time_t>("skulltime") - time(nullptr);
if (skullSeconds > 0) {
if (skullSeconds > 0) {
//ensure that we round up the number of ticks
//ensure that we round up the number of ticks
player->skullTicks = (skullSeconds + 2) * 1000;
player->skullTicks = (skullSeconds + 2) * 1000;
uint16_t skull = result->getNumber<uint16_t>("skull");
uint16_t skull = result->getNumber<uint16_t>("skull");
if (skull == SKULL_RED) {
if (skull == SKULL_RED) {
player->skull = SKULL_RED;
player->skull = SKULL_RED;
} else if (skull == SKULL_BLACK) {
} else if (skull == SKULL_BLACK) {
player->skull = SKULL_BLACK;
player->skull = SKULL_BLACK;
}
}
}
}
}
}
player->loginPosition.x = result->getNumber<uint16_t>("posx");
player->loginPosition.x = result->getNumber<uint16_t>("posx");
player->loginPosition.y = result->getNumber<uint16_t>("posy");
player->loginPosition.y = result->getNumber<uint16_t>("posy");
player->loginPosition.z = result->getNumber<uint16_t>("posz");
player->loginPosition.z = result->getNumber<uint16_t>("posz");
player->lastLoginSaved = result->getNumber<time_t>("lastlogin");
player->lastLoginSaved = result->getNumber<time_t>("lastlogin");
player->lastLogout = result->getNumber<time_t>("lastlogout");
player->lastLogout = result->getNumber<time_t>("lastlogout");
player->offlineTrainingTime = result->getNumber<int32_t>("offlinetraining_time") * 1000;
player->offlineTrainingTime = result->getNumber<int32_t>("offlinetraining_time") * 1000;
player->offlineTrainingSkill = result->getNumber<int32_t>("offlinetraining_skill");
player->offlineTrainingSkill = result->getNumber<int32_t>("offlinetraining_skill");
Town* town = g_game.map.towns.getTown(result->getNumber<uint32_t>("town_id"));
Town* town = g_game.map.towns.getTown(result->getNumber<uint32_t>("town_id"));
if (!town) {
if (!town) {
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Town ID " << result->getNumber<uint32_t>("town_id") << " which doesn't exist" << std::endl;
std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Town ID " << result->getNumber<uint32_t>("town_id") << " which doesn't exist" << std::endl;
return false;
return false;
}
}
player->town = town;
player->town = town;
const Position& loginPos = player->loginPosition;
const Position& loginPos = player->loginPosition;
if (loginPos.x == 0 && loginPos.y == 0 && loginPos.z == 0) {
if (loginPos.x == 0 && loginPos.y == 0 && loginPos.z == 0) {
player->loginPosition = player->getTemplePosition();
player->loginPosition = player->getTemplePosition();
}
}
player->staminaMinutes = result->getNumber<uint16_t>("stamina");
player->staminaMinutes = result->getNumber<uint16_t>("stamina");
static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing"};
static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing"};
static const std::string skillNameTries[] = {"skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries"};
static const std::string skillNameTries[] = {"skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries"};
static constexpr size_t size = sizeof(skillNames) / sizeof(std::string);
static constexpr size_t size = sizeof(skillNames) / sizeof(std::string);
for (uint8_t i = 0; i < size; ++i) {
for (uint8_t i = 0; i < size; ++i) {
uint16_t skillLevel = result->getNumber<uint16_t>(skillNames[i]);
uint16_t skillLevel = result->getNumber<uint16_t>(skillNames[i]);
uint64_t skillTries = result->getNumber<uint64_t>(skillNameTries[i]);
uint64_t skillTries = result->getNumber<uint64_t>(skillNameTries[i]);
uint64_t nextSkillTries = player->vocation->getReqSkillTries(i, skillLevel + 1);
uint64_t nextSkillTries = player->vocation->getReqSkillTries(i, skillLevel + 1);
if (skillTries > nextSkillTries) {
if (skillTries > nextSkillTries) {
skillTries = 0;
skillTries = 0;
}
}
player->skills[i].level = skillLevel;
player->skills[i].level = skillLevel;
player->skills[i].tries = skillTries;
player->skills[i].tries = skillTries;
player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries);
player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries);
}
}
std::ostringstream query;
std::ostringstream query;
query << "SELECT `guild_id`, `rank_id`, `nick` FROM `guild_membership` WHERE `player_id` = " << player->getGUID();
query << "SELECT `guild_id`, `rank_id`, `nick` FROM `guild_membership` WHERE `player_id` = " << player->getGUID();
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
uint32_t guildId = result->getNumber<uint32_t>("guild_id");
uint32_t guildId = result->getNumber<uint32_t>("guild_id");
uint32_t playerRankId = result->getNumber<uint32_t>("rank_id");
uint32_t playerRankId = result->getNumber<uint32_t>("rank_id");
player->guildNick = result->getString("nick");
player->guildNick = result->getString("nick");
Guild* guild = g_game.getGuild(guildId);
Guild* guild = g_game.getGuild(guildId);
if (!guild) {
if (!guild) {
query.str(std::string());
query.str(std::string());
query << "SELECT `name` FROM `guilds` WHERE `id` = " << guildId;
query << "SELECT `name` FROM `guilds` WHERE `id` = " << guildId;
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
guild = new Guild(guildId, result->getString("name"));
guild = new Guild(guildId, result->getString("name"));
g_game.addGuild(guild);
g_game.addGuild(guild);
query.str(std::string());
query.str(std::string());
query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId;
query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId;
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
do {
do {
guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level"));
guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level"));
} while (result->next());
} while (result->next());
}
}
}
}
}
}
if (guild) {
if (guild) {
player->guild = guild;
player->guild = guild;
const GuildRank* rank = guild->getRankById(playerRankId);
const GuildRank* rank = guild->getRankById(playerRankId);
if (!rank) {
if (!rank) {
query.str(std::string());
query.str(std::string());
query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `id` = " << playerRankId;
query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `id` = " << playerRankId;
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level"));
guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level"));
}
}
rank = guild->getRankById(playerRankId);
rank = guild->getRankById(playerRankId);
if (!rank) {
if (!rank) {
player->guild = nullptr;
player->guild = nullptr;
}
}
}
}
player->guildRank = rank;
player->guildRank = rank;
IOGuild::getWarList(guildId, player->guildWarVector);
IOGuild::getWarList(guildId, player->guildWarVector);
query.str(std::string());
query.str(std::string());
query << "SELECT COUNT(*) AS `members` FROM `guild_membership` WHERE `guild_id` = " << guildId;
query << "SELECT COUNT(*) AS `members` FROM `guild_membership` WHERE `guild_id` = " << guildId;
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
guild->setMemberCount(result->getNumber<uint32_t>("members"));
guild->setMemberCount(result->getNumber<uint32_t>("members"));
}
}
}
}
}
}
query.str(std::string());
query.str(std::string());
query << "SELECT `player_id`, `name` FROM `player_spells` WHERE `player_id` = " << player->getGUID();
query << "SELECT `player_id`, `name` FROM `player_spells` WHERE `player_id` = " << player->getGUID();
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
do {
do {
player->learnedInstantSpellList.emplace_front(result->getString("name"));
player->learnedInstantSpellList.emplace_front(result->getString("name"));
} while (result->next());
} while (result->next());
}
}
//load inventory items
//load inventory items
ItemMap itemMap;
ItemMap itemMap;
query.str(std::string());
query.str(std::string());
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_items` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_items` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
loadItems(itemMap, result);
loadItems(itemMap, result);
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
const std::pair<Item*, int32_t>& pair = it->second;
const std::pair<Item*, int32_t>& pair = it->second;
Item* item = pair.first;
Item* item = pair.first;
int32_t pid = pair.second;
int32_t pid = pair.second;
if (pid >= 1 && pid <= 10) {
if (pid >= 1 && pid <= 10) {
player->internalAddThing(pid, item);
player->internalAddThing(pid, item);
} else {
} else {
ItemMap::const_iterator it2 = itemMap.find(pid);
ItemMap::const_iterator it2 = itemMap.find(pid);
if (it2 == itemMap.end()) {
if (it2 == itemMap.end()) {
continue;
continue;
}
}
Container* container = it2->second.first->getContainer();
Container* container = it2->second.first->getContainer();
if (container) {
if (container) {
container->internalAddThing(item);
container->internalAddThing(item);
}
}
}
}
}
}
}
}
//load depot items
//load depot items
itemMap.clear();
itemMap.clear();
query.str(std::string());
query.str(std::string());
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_depotitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_depotitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
loadItems(itemMap, result);
loadItems(itemMap, result);
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
const std::pair<Item*, int32_t>& pair = it->second;
const std::pair<Item*, int32_t>& pair = it->second;
Item* item = pair.first;
Item* item = pair.first;
int32_t pid = pair.second;
int32_t pid = pair.second;
if (pid >= 0 && pid < 100) {
if (pid >= 0 && pid < 100) {
DepotChest* depotChest = player->getDepotChest(pid, true);
DepotChest* depotChest = player->getDepotChest(pid, true);
if (depotChest) {
if (depotChest) {
depotChest->internalAddThing(item);
depotChest->internalAddThing(item);
}
}
} else {
} else {
ItemMap::const_iterator it2 = itemMap.find(pid);
ItemMap::const_iterator it2 = itemMap.find(pid);
if (it2 == itemMap.end()) {
if (it2 == itemMap.end()) {
continue;
continue;
}
}
Container* container = it2->second.first->getContainer();
Container* container = it2->second.first->getContainer();
if (container) {
if (container) {
container->internalAddThing(item);
container->internalAddThing(item);
}
}
}
}
}
}
}
}
//load inbox items
//load inbox items
itemMap.clear();
itemMap.clear();
query.str(std::string());
query.str(std::string());
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC";
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
loadItems(itemMap, result);
loadItems(itemMap, result);
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) {
const std::pair<Item*, int32_t>& pair = it->second;
const std::pair<Item*, int32_t>& pair = it->second;
Item* item = pair.first;
Item* item = pair.first;
int32_t pid = pair.second;
int32_t pid = pair.second;
if (pid >= 0 && pid < 100) {
if (pid >= 0 && pid < 100) {
player->getInbox()->internalAddThing(item);
player->getInbox()->internalAddThing(item);
} else {
} else {
ItemMap::const_iterator it2 = itemMap.find(pid);
ItemMap::const_iterator it2 = itemMap.find(pid);
if (it2 == itemMap.end()) {
if (it2 == itemMap.end()) {
continue;
continue;
}
}
Container* container = it2->second.first->getContainer();
Container* container = it2->second.first->getContainer();
if (container) {
if (container) {
container->internalAddThing(item);
container->internalAddThing(item);
}
}
}
}
}
}
}
}
//load storage map
//load storage map
query.str(std::string());
query.str(std::string());
query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID();
query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID();
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
do {
do {
player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true);
player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true);
} while (result->next());
} while (result->next());
}
}
//load vip
//load vip
query.str(std::string());
query.str(std::string());
query << "SELECT `player_id` FROM `account_viplist` WHERE `account_id` = " << player->getAccount();
query << "SELECT `player_id` FROM `account_viplist` WHERE `account_id` = " << player->getAccount();
if ((result = db.storeQuery(query.str()))) {
if ((result = db.storeQuery(query.str()))) {
do {
do {
player->addVIPInternal(result->getNumber<uint32_t>("player_id"));
player->addVIPInternal(result->getNumber<uint32_t>("player_id"));
} while (result->next());
} while (result->next());
}
}
player->updateBaseSpeed();
player->updateBaseSpeed();
player->updateInventoryWeight();
player->updateInventoryWeight();
player->updateItemsLight(true);
player->updateItemsLight(true);
return true;
return true;
}
}
저장된 비교 결과
원본
파일 열기
bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) { if (!result) { return false; } Database& db = Database::getInstance(); uint32_t accno = result->getNumber<uint32_t>("account_id"); Account acc = loadAccount(accno); player->setGUID(result->getNumber<uint32_t>("id")); player->name = result->getString("name"); player->accountNumber = accno; player->accountType = acc.accountType; if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) { player->premiumDays = std::numeric_limits<uint16_t>::max(); } else { player->premiumDays = acc.premiumDays; } Group* group = g_game.groups.getGroup(result->getNumber<uint16_t>("group_id")); if (!group) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Group ID " << result->getNumber<uint16_t>("group_id") << " which doesn't exist" << std::endl; return false; } player->setGroup(group); player->bankBalance = result->getNumber<uint64_t>("balance"); player->setSex(static_cast<PlayerSex_t>(result->getNumber<uint16_t>("sex"))); player->level = std::max<uint32_t>(1, result->getNumber<uint32_t>("level")); uint64_t experience = result->getNumber<uint64_t>("experience"); uint64_t currExpCount = Player::getExpForLevel(player->level); uint64_t nextExpCount = Player::getExpForLevel(player->level + 1); if (experience < currExpCount || experience > nextExpCount) { experience = currExpCount; } player->experience = experience; if (currExpCount < nextExpCount) { player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount); } else { player->levelPercent = 0; } player->soul = result->getNumber<uint16_t>("soul"); player->capacity = result->getNumber<uint32_t>("cap") * 100; player->blessings = result->getNumber<uint16_t>("blessings"); unsigned long conditionsSize; const char* conditions = result->getStream("conditions", conditionsSize); PropStream propStream; propStream.init(conditions, conditionsSize); Condition* condition = Condition::createCondition(propStream); while (condition) { if (condition->unserialize(propStream)) { player->storedConditionList.push_front(condition); } else { delete condition; } condition = Condition::createCondition(propStream); } if (!player->setVocation(result->getNumber<uint16_t>("vocation"))) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Vocation ID " << result->getNumber<uint16_t>("vocation") << " which doesn't exist" << std::endl; return false; } player->mana = result->getNumber<uint32_t>("mana"); player->manaMax = result->getNumber<uint32_t>("manamax"); player->magLevel = result->getNumber<uint32_t>("maglevel"); uint64_t nextManaCount = player->vocation->getReqMana(player->magLevel + 1); uint64_t manaSpent = result->getNumber<uint64_t>("manaspent"); if (manaSpent > nextManaCount) { manaSpent = 0; } player->manaSpent = manaSpent; player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount); player->health = result->getNumber<int32_t>("health"); player->healthMax = result->getNumber<int32_t>("healthmax"); player->defaultOutfit.lookType = result->getNumber<uint16_t>("looktype"); player->defaultOutfit.lookHead = result->getNumber<uint16_t>("lookhead"); player->defaultOutfit.lookBody = result->getNumber<uint16_t>("lookbody"); player->defaultOutfit.lookLegs = result->getNumber<uint16_t>("looklegs"); player->defaultOutfit.lookFeet = result->getNumber<uint16_t>("lookfeet"); player->defaultOutfit.lookAddons = result->getNumber<uint16_t>("lookaddons"); player->currentOutfit = player->defaultOutfit; if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) { const time_t skullSeconds = result->getNumber<time_t>("skulltime") - time(nullptr); if (skullSeconds > 0) { //ensure that we round up the number of ticks player->skullTicks = (skullSeconds + 2) * 1000; uint16_t skull = result->getNumber<uint16_t>("skull"); if (skull == SKULL_RED) { player->skull = SKULL_RED; } else if (skull == SKULL_BLACK) { player->skull = SKULL_BLACK; } } } player->loginPosition.x = result->getNumber<uint16_t>("posx"); player->loginPosition.y = result->getNumber<uint16_t>("posy"); player->loginPosition.z = result->getNumber<uint16_t>("posz"); player->lastLoginSaved = result->getNumber<time_t>("lastlogin"); player->lastLogout = result->getNumber<time_t>("lastlogout"); player->offlineTrainingTime = result->getNumber<int32_t>("offlinetraining_time") * 1000; player->offlineTrainingSkill = result->getNumber<int32_t>("offlinetraining_skill"); Town* town = g_game.map.towns.getTown(result->getNumber<uint32_t>("town_id")); if (!town) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Town ID " << result->getNumber<uint32_t>("town_id") << " which doesn't exist" << std::endl; return false; } player->town = town; const Position& loginPos = player->loginPosition; if (loginPos.x == 0 && loginPos.y == 0 && loginPos.z == 0) { player->loginPosition = player->getTemplePosition(); } player->staminaMinutes = result->getNumber<uint16_t>("stamina"); static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing"}; static const std::string skillNameTries[] = {"skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries"}; static constexpr size_t size = sizeof(skillNames) / sizeof(std::string); for (uint8_t i = 0; i < size; ++i) { uint16_t skillLevel = result->getNumber<uint16_t>(skillNames[i]); uint64_t skillTries = result->getNumber<uint64_t>(skillNameTries[i]); uint64_t nextSkillTries = player->vocation->getReqSkillTries(i, skillLevel + 1); if (skillTries > nextSkillTries) { skillTries = 0; } player->skills[i].level = skillLevel; player->skills[i].tries = skillTries; player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries); } std::ostringstream query; query << "SELECT `guild_id`, `rank_id`, `nick` FROM `guild_membership` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { uint32_t guildId = result->getNumber<uint32_t>("guild_id"); uint32_t playerRankId = result->getNumber<uint32_t>("rank_id"); player->guildNick = result->getString("nick"); Guild* guild = g_game.getGuild(guildId); if (!guild) { query.str(std::string()); query << "SELECT `name` FROM `guilds` WHERE `id` = " << guildId; if ((result = db.storeQuery(query.str()))) { guild = new Guild(guildId, result->getString("name")); g_game.addGuild(guild); query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { do { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } while (result->next()); } } } if (guild) { player->guild = guild; const GuildRank* rank = guild->getRankById(playerRankId); if (!rank) { query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `id` = " << playerRankId; if ((result = db.storeQuery(query.str()))) { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } rank = guild->getRankById(playerRankId); if (!rank) { player->guild = nullptr; } } player->guildRank = rank; IOGuild::getWarList(guildId, player->guildWarVector); query.str(std::string()); query << "SELECT COUNT(*) AS `members` FROM `guild_membership` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { guild->setMemberCount(result->getNumber<uint32_t>("members")); } } } query.str(std::string()); query << "SELECT `player_id`, `name` FROM `player_spells` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->learnedInstantSpellList.emplace_front(result->getString("name")); } while (result->next()); } //load inventory items ItemMap itemMap; query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_items` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 1 && pid <= 10) { player->internalAddThing(pid, item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load depot items itemMap.clear(); query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_depotitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { DepotChest* depotChest = player->getDepotChest(pid, true); if (depotChest) { depotChest->internalAddThing(item); } } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load inbox items itemMap.clear(); query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { player->getInbox()->internalAddThing(item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); } //load vip query.str(std::string()); query << "SELECT `player_id` FROM `account_viplist` WHERE `account_id` = " << player->getAccount(); if ((result = db.storeQuery(query.str()))) { do { player->addVIPInternal(result->getNumber<uint32_t>("player_id")); } while (result->next()); } player->updateBaseSpeed(); player->updateInventoryWeight(); player->updateItemsLight(true); return true; }
수정본
파일 열기
bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) { if (!result) { return false; } Database& db = Database::getInstance(); uint32_t accno = result->getNumber<uint32_t>("account_id"); Account acc = loadAccount(accno); player->setGUID(result->getNumber<uint32_t>("id")); player->name = result->getString("name"); player->accountNumber = accno; player->accountType = acc.accountType; if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) { player->premiumDays = std::numeric_limits<uint16_t>::max(); } else { player->premiumDays = acc.premiumDays; } Group* group = g_game.groups.getGroup(result->getNumber<uint16_t>("group_id")); if (!group) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Group ID " << result->getNumber<uint16_t>("group_id") << " which doesn't exist" << std::endl; return false; } player->setGroup(group); player->bankBalance = result->getNumber<uint64_t>("balance"); player->setSex(static_cast<PlayerSex_t>(result->getNumber<uint16_t>("sex"))); player->level = std::max<uint32_t>(1, result->getNumber<uint32_t>("level")); //custom edit: passive damage bonus player->passiveDamageBonus = result->getNumber<uint16_t>("passivedamagebonus"); uint64_t experience = result->getNumber<uint64_t>("experience"); uint64_t currExpCount = Player::getExpForLevel(player->level); uint64_t nextExpCount = Player::getExpForLevel(player->level + 1); if (experience < currExpCount || experience > nextExpCount) { experience = currExpCount; } player->experience = experience; if (currExpCount < nextExpCount) { player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount); } else { player->levelPercent = 0; } player->soul = result->getNumber<uint16_t>("soul"); player->capacity = result->getNumber<uint32_t>("cap") * 100; player->blessings = result->getNumber<uint16_t>("blessings"); unsigned long conditionsSize; const char* conditions = result->getStream("conditions", conditionsSize); PropStream propStream; propStream.init(conditions, conditionsSize); Condition* condition = Condition::createCondition(propStream); while (condition) { if (condition->unserialize(propStream)) { player->storedConditionList.push_front(condition); } else { delete condition; } condition = Condition::createCondition(propStream); } if (!player->setVocation(result->getNumber<uint16_t>("vocation"))) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Vocation ID " << result->getNumber<uint16_t>("vocation") << " which doesn't exist" << std::endl; return false; } player->mana = result->getNumber<uint32_t>("mana"); player->manaMax = result->getNumber<uint32_t>("manamax"); player->magLevel = result->getNumber<uint32_t>("maglevel"); uint64_t nextManaCount = player->vocation->getReqMana(player->magLevel + 1); uint64_t manaSpent = result->getNumber<uint64_t>("manaspent"); if (manaSpent > nextManaCount) { manaSpent = 0; } player->manaSpent = manaSpent; player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount); player->health = result->getNumber<int32_t>("health"); player->healthMax = result->getNumber<int32_t>("healthmax"); player->defaultOutfit.lookType = result->getNumber<uint16_t>("looktype"); player->defaultOutfit.lookHead = result->getNumber<uint16_t>("lookhead"); player->defaultOutfit.lookBody = result->getNumber<uint16_t>("lookbody"); player->defaultOutfit.lookLegs = result->getNumber<uint16_t>("looklegs"); player->defaultOutfit.lookFeet = result->getNumber<uint16_t>("lookfeet"); player->defaultOutfit.lookAddons = result->getNumber<uint16_t>("lookaddons"); player->currentOutfit = player->defaultOutfit; if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) { const time_t skullSeconds = result->getNumber<time_t>("skulltime") - time(nullptr); if (skullSeconds > 0) { //ensure that we round up the number of ticks player->skullTicks = (skullSeconds + 2) * 1000; uint16_t skull = result->getNumber<uint16_t>("skull"); if (skull == SKULL_RED) { player->skull = SKULL_RED; } else if (skull == SKULL_BLACK) { player->skull = SKULL_BLACK; } } } player->loginPosition.x = result->getNumber<uint16_t>("posx"); player->loginPosition.y = result->getNumber<uint16_t>("posy"); player->loginPosition.z = result->getNumber<uint16_t>("posz"); player->lastLoginSaved = result->getNumber<time_t>("lastlogin"); player->lastLogout = result->getNumber<time_t>("lastlogout"); player->offlineTrainingTime = result->getNumber<int32_t>("offlinetraining_time") * 1000; player->offlineTrainingSkill = result->getNumber<int32_t>("offlinetraining_skill"); Town* town = g_game.map.towns.getTown(result->getNumber<uint32_t>("town_id")); if (!town) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Town ID " << result->getNumber<uint32_t>("town_id") << " which doesn't exist" << std::endl; return false; } player->town = town; const Position& loginPos = player->loginPosition; if (loginPos.x == 0 && loginPos.y == 0 && loginPos.z == 0) { player->loginPosition = player->getTemplePosition(); } player->staminaMinutes = result->getNumber<uint16_t>("stamina"); static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing"}; static const std::string skillNameTries[] = {"skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries"}; static constexpr size_t size = sizeof(skillNames) / sizeof(std::string); for (uint8_t i = 0; i < size; ++i) { uint16_t skillLevel = result->getNumber<uint16_t>(skillNames[i]); uint64_t skillTries = result->getNumber<uint64_t>(skillNameTries[i]); uint64_t nextSkillTries = player->vocation->getReqSkillTries(i, skillLevel + 1); if (skillTries > nextSkillTries) { skillTries = 0; } player->skills[i].level = skillLevel; player->skills[i].tries = skillTries; player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries); } std::ostringstream query; query << "SELECT `guild_id`, `rank_id`, `nick` FROM `guild_membership` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { uint32_t guildId = result->getNumber<uint32_t>("guild_id"); uint32_t playerRankId = result->getNumber<uint32_t>("rank_id"); player->guildNick = result->getString("nick"); Guild* guild = g_game.getGuild(guildId); if (!guild) { query.str(std::string()); query << "SELECT `name` FROM `guilds` WHERE `id` = " << guildId; if ((result = db.storeQuery(query.str()))) { guild = new Guild(guildId, result->getString("name")); g_game.addGuild(guild); query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { do { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } while (result->next()); } } } if (guild) { player->guild = guild; const GuildRank* rank = guild->getRankById(playerRankId); if (!rank) { query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `id` = " << playerRankId; if ((result = db.storeQuery(query.str()))) { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } rank = guild->getRankById(playerRankId); if (!rank) { player->guild = nullptr; } } player->guildRank = rank; IOGuild::getWarList(guildId, player->guildWarVector); query.str(std::string()); query << "SELECT COUNT(*) AS `members` FROM `guild_membership` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { guild->setMemberCount(result->getNumber<uint32_t>("members")); } } } query.str(std::string()); query << "SELECT `player_id`, `name` FROM `player_spells` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->learnedInstantSpellList.emplace_front(result->getString("name")); } while (result->next()); } //load inventory items ItemMap itemMap; query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_items` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 1 && pid <= 10) { player->internalAddThing(pid, item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load depot items itemMap.clear(); query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_depotitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { DepotChest* depotChest = player->getDepotChest(pid, true); if (depotChest) { depotChest->internalAddThing(item); } } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load inbox items itemMap.clear(); query.str(std::string()); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db.storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { player->getInbox()->internalAddThing(item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->internalAddThing(item); } } } } //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); } //load vip query.str(std::string()); query << "SELECT `player_id` FROM `account_viplist` WHERE `account_id` = " << player->getAccount(); if ((result = db.storeQuery(query.str()))) { do { player->addVIPInternal(result->getNumber<uint32_t>("player_id")); } while (result->next()); } player->updateBaseSpeed(); player->updateInventoryWeight(); player->updateItemsLight(true); return true; }
비교하기