From 1d515c62d747900a727aae79dc6997ee69a70e4b Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 02:33:24 -0300 Subject: [PATCH 1/9] Preview store outfits and mounts --- src/server/network/protocol/protocolgame.cpp | 56 ++++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index cf8c3e6c438..0a813e715b2 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -5987,16 +5987,44 @@ void ProtocolGame::sendOutfitWindow() for (const Outfit& outfit : outfits) { uint8_t addons; - if (!player->getOutfitAddons(outfit, addons)) { - continue; - } - - msg.add(outfit.lookType); - msg.addString(outfit.name); - msg.addByte(addons); - msg.addByte(0x00); - if (++outfitSize == limitOutfits) { - break; + if (player->getOutfitAddons(outfit, addons)) { + msg.add(outfit.lookType); + msg.addString(outfit.name); + msg.addByte(addons); + msg.addByte(0x00); + if (++outfitSize == limitOutfits) { + break; + } + } else if (outfit.lookType == 1210 || outfit.lookType == 1211) { + msg.add(outfit.lookType); + msg.addString(outfit.name); + msg.addByte(3); + msg.addByte(0x02); + if (++outfitSize == limitOutfits) { + break; + } + } else if (outfit.lookType == 1456 || outfit.lookType == 1457) { + msg.add(outfit.lookType); + msg.addString(outfit.name); + msg.addByte(3); + msg.addByte(0x03); + if (++outfitSize == limitOutfits) { + break; + } + } else if (outfit.from == "store") { + msg.add(outfit.lookType); + msg.addString(outfit.name); + uint8_t addonsCount = 0; + if (outfit.lookType >= 962 && outfit.lookType <= 974) { + msg.addByte(0); + } else { + msg.addByte(3); + } + msg.addByte(0x01); + msg.add(0x00); + if (++outfitSize == limitOutfits) { + break; + } } } @@ -6019,6 +6047,14 @@ void ProtocolGame::sendOutfitWindow() if (++mountSize == limitMounts) { break; } + } else if (mount.type == "store") { + msg.add(mount.clientId); + msg.addString(mount.name); + msg.addByte(0x01); + msg.add(0x00); + if (++mountSize == limitMounts) { + break; + } } } From 0bbed07aa23b35c2d09d4f5542ba5664dc9529dd Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 14:59:34 -0300 Subject: [PATCH 2/9] Random mount outfit window feature --- data-otservbr-global/migrations/16.lua | 2 +- data-otservbr-global/migrations/24.lua | 4 ++- data-otservbr-global/migrations/25.lua | 3 ++ schema.sql | 1 + src/creatures/players/player.cpp | 30 ++++++++++++++++++++ src/creatures/players/player.h | 10 +++++++ src/game/game.cpp | 9 +++++- src/game/game.h | 2 +- src/io/iologindata.cpp | 2 ++ src/server/network/protocol/protocolgame.cpp | 5 ++-- 10 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 data-otservbr-global/migrations/25.lua diff --git a/data-otservbr-global/migrations/16.lua b/data-otservbr-global/migrations/16.lua index 7c6e195e3cb..36e62b20e9b 100644 --- a/data-otservbr-global/migrations/16.lua +++ b/data-otservbr-global/migrations/16.lua @@ -1,5 +1,5 @@ function onUpdateDatabase() - print("> Updating database to version 17 (Tutorial support)") + print("Updating database to version 17 (Tutorial support)") db.query("ALTER TABLE `players` ADD `istutorial` SMALLINT(1) NOT NULL DEFAULT '0'") return true -- true = There are others migrations file | false = this is the last migration file end diff --git a/data-otservbr-global/migrations/24.lua b/data-otservbr-global/migrations/24.lua index 86a6d8ffec1..54e76b3e44f 100644 --- a/data-otservbr-global/migrations/24.lua +++ b/data-otservbr-global/migrations/24.lua @@ -1,3 +1,5 @@ function onUpdateDatabase() - return false -- true = There are others migrations file | false = this is the last migration file + Spdlog.info("Updating database to version 25 (random mount outfit window)") + db.query("ALTER TABLE `players` ADD `randomize_mount` SMALLINT(1) NOT NULL DEFAULT '0'") + return true end diff --git a/data-otservbr-global/migrations/25.lua b/data-otservbr-global/migrations/25.lua new file mode 100644 index 00000000000..86a6d8ffec1 --- /dev/null +++ b/data-otservbr-global/migrations/25.lua @@ -0,0 +1,3 @@ +function onUpdateDatabase() + return false -- true = There are others migrations file | false = this is the last migration file +end diff --git a/schema.sql b/schema.sql index 8a786cf94ff..ae7ea26c4c9 100644 --- a/schema.sql +++ b/schema.sql @@ -142,6 +142,7 @@ CREATE TABLE IF NOT EXISTS `players` ( `istutorial` tinyint(1) NOT NULL DEFAULT '0', `forge_dusts` bigint(21) NOT NULL DEFAULT '0', `forge_dust_level` bigint(21) NOT NULL DEFAULT '100', + `randomize_mount` tinyint(1) NOT NULL DEFAULT '0', INDEX `account_id` (`account_id`), INDEX `vocation` (`vocation`), CONSTRAINT `players_pk` PRIMARY KEY (`id`), diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 22700bac7d9..1965fc473e8 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -5163,6 +5163,32 @@ void Player::setCurrentMount(uint8_t mount) addStorageValue(PSTRG_MOUNTS_CURRENTMOUNT, mount); } +bool Player::hasAnyMount() const +{ + const auto& mounts = g_game().mounts.getMounts(); + for (const Mount& mount : mounts) { + if (hasMount(&mount)) { + return true; + } + } + return false; +} + +uint16_t Player::getRandomMountId() const { + std::vector playerMounts; + + for (const auto& mounts = g_game().mounts.getMounts(); + const Mount& mount : mounts) { + if (hasMount(&mount)) { + playerMounts.push_back(mount.id); + } + } + + uint16_t playerMountsCount = std::max(0, playerMounts.size() - 1); + uint16_t randomId = uniform_random(0, playerMountsCount); + return randomId; +} + bool Player::toggleMount(bool mount) { if ((OTSYS_TIME() - lastToggleMount) < 3000 && !wasMounted) { @@ -5191,6 +5217,10 @@ bool Player::toggleMount(bool mount) return false; } + if (isRandomMounted()) { + currentMountId = getRandomMountId(); + } + const Mount* currentMount = g_game().mounts.getMountByID(currentMountId); if (!currentMount) { return false; diff --git a/src/creatures/players/player.h b/src/creatures/players/player.h index ec795a1abe3..5fdc6575500 100644 --- a/src/creatures/players/player.h +++ b/src/creatures/players/player.h @@ -141,8 +141,17 @@ class Player final : public Creature, public Cylinder bool tameMount(uint8_t mountId); bool untameMount(uint8_t mountId); bool hasMount(const Mount* mount) const; + bool hasAnyMount() const; + uint16_t getRandomMountId() const; void dismount(); + uint8_t isRandomMounted() const { + return randomMount; + } + void setRandomMount(uint8_t isMountRandomized) { + randomMount = isMountRandomized; + } + void sendFYIBox(const std::string& message) { if (client) { client->sendFYIBox(message); @@ -2383,6 +2392,7 @@ class Player final : public Creature, public Cylinder int32_t idleTime = 0; uint32_t coinBalance = 0; uint16_t expBoostStamina = 0; + uint8_t randomMount = 0; uint16_t lastStatsTrainingTime = 0; uint16_t staminaMinutes = 2520; diff --git a/src/game/game.cpp b/src/game/game.cpp index 9f10e78a575..5dc64792f1a 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -4908,7 +4908,7 @@ void Game::playerToggleMount(uint32_t playerId, bool mount) player->toggleMount(mount); } -void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit) +void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMountRandomized/* = 0*/) { if (!g_configManager().getBoolean(ALLOW_CHANGEOUTFIT)) { return; @@ -4919,6 +4919,8 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit) return; } + player->setRandomMount(isMountRandomized); + const Outfit* playerOutfit = Outfits::getInstance().getOutfitByLookType(player->getSex(), outfit.lookType); if (!playerOutfit) { outfit.lookMount = 0; @@ -4956,6 +4958,11 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit) return; } + if (player->randomMount && player->hasAnyMount()) { + auto mount = mounts.getMountByID(player->getRandomMountId()); + outfit.lookMount = mount->clientId; + } + internalCreatureChangeOutfit(player, outfit); } } diff --git a/src/game/game.h b/src/game/game.h index 031b509f3b2..fb36dbf67d7 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -373,7 +373,7 @@ class Game void playerShowQuestLine(uint32_t playerId, uint16_t questId); void playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text); - void playerChangeOutfit(uint32_t playerId, Outfit_t outfit); + void playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMountRandomized = 0); void playerInviteToParty(uint32_t playerId, uint32_t invitedId); void playerJoinParty(uint32_t playerId, uint32_t leaderId); void playerRevokePartyInvitation(uint32_t playerId, uint32_t invitedId); diff --git a/src/io/iologindata.cpp b/src/io/iologindata.cpp index d08ab2dab00..242d23fb197 100644 --- a/src/io/iologindata.cpp +++ b/src/io/iologindata.cpp @@ -307,6 +307,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) player->staminaMinutes = result->getNumber("stamina"); player->setStoreXpBoost(result->getNumber("xpboost_value")); player->setExpBoostStamina(result->getNumber("xpboost_stamina")); + player->setRandomMount(result->getNumber("randomize_mount")); static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing", "skill_critical_hit_chance", "skill_critical_hit_damage", "skill_life_leech_chance", "skill_life_leech_amount", "skill_mana_leech_chance", "skill_mana_leech_amount"}; 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", "skill_critical_hit_chance_tries", "skill_critical_hit_damage_tries", "skill_life_leech_chance_tries", "skill_life_leech_amount_tries", "skill_mana_leech_chance_tries", "skill_mana_leech_amount_tries"}; @@ -970,6 +971,7 @@ bool IOLoginData::savePlayer(Player* player) query << "`max_manashield` = " << player->getMaxManaShield() << ','; query << "`xpboost_value` = " << player->getStoreXpBoost() << ','; query << "`xpboost_stamina` = " << player->getExpBoostStamina() << ','; + query << "`randomize_mount` = " << player->isRandomMounted() << ','; query << "`quickloot_fallback` = " << (player->quickLootFallbackToMainContainer ? 1 : 0) << ','; if (!player->isOffline()) { diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index 0a813e715b2..63b5bc9031e 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -1229,7 +1229,8 @@ void ProtocolGame::parseSetOutfit(NetworkMessage &msg) newOutfit.lookMountLegs = std::min(132, msg.getByte()); newOutfit.lookMountFeet = std::min(132, msg.getByte()); newOutfit.lookFamiliarsType = msg.get(); - g_game().playerChangeOutfit(player->getID(), newOutfit); + uint8_t isMountRandomized = msg.getByte(); + g_game().playerChangeOutfit(player->getID(), newOutfit, isMountRandomized); } else if (outfitType == 1) { @@ -6092,7 +6093,7 @@ void ProtocolGame::sendOutfitWindow() msg.addByte(mounted ? 0x01 : 0x00); // Version 12.81 - Random outfit 'bool' - msg.addByte(0); + msg.addByte(player->isRandomMounted()); writeToOutputBuffer(msg); } From 154a4af1c28cc295a1f6eeaf6ede902329967a3c Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 22:58:05 -0300 Subject: [PATCH 3/9] Fix some logic --- src/creatures/players/player.cpp | 13 +++--- src/creatures/players/player.h | 2 +- src/game/game.cpp | 17 ++++---- src/io/iologindata.cpp | 12 +++--- src/server/network/protocol/protocolgame.cpp | 43 ++++++++------------ 5 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 1965fc473e8..273193437c6 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -5165,8 +5165,8 @@ void Player::setCurrentMount(uint8_t mount) bool Player::hasAnyMount() const { - const auto& mounts = g_game().mounts.getMounts(); - for (const Mount& mount : mounts) { + for (const auto& mounts = g_game().mounts.getMounts(); + const Mount& mount : mounts) { if (hasMount(&mount)) { return true; } @@ -5174,7 +5174,8 @@ bool Player::hasAnyMount() const return false; } -uint16_t Player::getRandomMountId() const { +uint8_t Player::getRandomMountId() const +{ std::vector playerMounts; for (const auto& mounts = g_game().mounts.getMounts(); @@ -5184,9 +5185,9 @@ uint16_t Player::getRandomMountId() const { } } - uint16_t playerMountsCount = std::max(0, playerMounts.size() - 1); - uint16_t randomId = uniform_random(0, playerMountsCount); - return randomId; + auto playerMountsCount =std::max(0, playerMounts.size() - 1); + auto randomIndex = uniform_random(0, playerMountsCount); + return playerMounts[randomIndex]; } bool Player::toggleMount(bool mount) diff --git a/src/creatures/players/player.h b/src/creatures/players/player.h index 5fdc6575500..d99362893bd 100644 --- a/src/creatures/players/player.h +++ b/src/creatures/players/player.h @@ -142,7 +142,7 @@ class Player final : public Creature, public Cylinder bool untameMount(uint8_t mountId); bool hasMount(const Mount* mount) const; bool hasAnyMount() const; - uint16_t getRandomMountId() const; + uint8_t getRandomMountId() const; void dismount(); uint8_t isRandomMounted() const { diff --git a/src/game/game.cpp b/src/game/game.cpp index 5dc64792f1a..d03f9c61063 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -4921,6 +4921,11 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun player->setRandomMount(isMountRandomized); + if (isMountRandomized && player->hasAnyMount()) { + auto randomMount = mounts.getMountByID(player->getRandomMountId()); + outfit.lookMount = randomMount->clientId; + } + const Outfit* playerOutfit = Outfits::getInstance().getOutfitByLookType(player->getSex(), outfit.lookType); if (!playerOutfit) { outfit.lookMount = 0; @@ -4941,12 +4946,9 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun if (prevMount) { changeSpeed(player, mount->speed - prevMount->speed); } - - player->setCurrentMount(mount->id); - } else { - player->setCurrentMount(mount->id); - outfit.lookMount = 0; } + + player->setCurrentMount(mount->id); } else if (player->isMounted()) { player->dismount(); } @@ -4958,11 +4960,6 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun return; } - if (player->randomMount && player->hasAnyMount()) { - auto mount = mounts.getMountByID(player->getRandomMountId()); - outfit.lookMount = mount->clientId; - } - internalCreatureChangeOutfit(player, outfit); } } diff --git a/src/io/iologindata.cpp b/src/io/iologindata.cpp index 242d23fb197..9845ed9f27a 100644 --- a/src/io/iologindata.cpp +++ b/src/io/iologindata.cpp @@ -105,7 +105,7 @@ bool IOLoginData::preloadPlayer(Player* player, const std::string& name) player->setGUID(result->getNumber("id")); Group* group = g_game().groups.getGroup(result->getNumber("group_id")); if (!group) { - SPDLOG_ERROR("Player {} has group id {} whitch doesn't exist", player->name, + SPDLOG_ERROR("Player {} has group id {} which doesn't exist", player->name, result->getNumber("group_id")); return false; } @@ -164,7 +164,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) Group* group = g_game().groups.getGroup(result->getNumber("group_id")); if (!group) { - SPDLOG_ERROR("Player {} has group id {} whitch doesn't exist", player->name, result->getNumber("group_id")); + SPDLOG_ERROR("Player {} has group id {} which doesn't exist", player->name, result->getNumber("group_id")); return false; } player->setGroup(group); @@ -216,7 +216,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) } if (!player->setVocation(result->getNumber("vocation"))) { - SPDLOG_ERROR("Player {} has vocation id {} whitch doesn't exist", + SPDLOG_ERROR("Player {} has vocation id {} which doesn't exist", player->name, result->getNumber("vocation")); return false; } @@ -282,6 +282,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) player->addTaskHuntingPoints(result->getNumber("task_points")); player->addForgeDusts(result->getNumber("forge_dusts")); player->addForgeDustLevel(result->getNumber("forge_dust_level")); + player->setRandomMount(result->getNumber("randomize_mount")); player->lastLoginSaved = result->getNumber("lastlogin"); player->lastLogout = result->getNumber("lastlogout"); @@ -292,7 +293,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) Town* town = g_game().map.towns.getTown(result->getNumber("town_id")); if (!town) { - SPDLOG_ERROR("Player {} has town id {} whitch doesn't exist", player->name, + SPDLOG_ERROR("Player {} has town id {} which doesn't exist", player->name, result->getNumber("town_id")); return false; } @@ -307,7 +308,6 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) player->staminaMinutes = result->getNumber("stamina"); player->setStoreXpBoost(result->getNumber("xpboost_value")); player->setExpBoostStamina(result->getNumber("xpboost_stamina")); - player->setRandomMount(result->getNumber("randomize_mount")); static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing", "skill_critical_hit_chance", "skill_critical_hit_damage", "skill_life_leech_chance", "skill_life_leech_amount", "skill_mana_leech_chance", "skill_mana_leech_amount"}; 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", "skill_critical_hit_chance_tries", "skill_critical_hit_damage_tries", "skill_life_leech_chance_tries", "skill_life_leech_amount_tries", "skill_mana_leech_chance_tries", "skill_mana_leech_amount_tries"}; @@ -892,6 +892,7 @@ bool IOLoginData::savePlayer(Player* player) query << "`task_points` = " << player->getTaskHuntingPoints() << ','; query << "`forge_dusts` = " << player->getForgeDusts() << ','; query << "`forge_dust_level` = " << player->getForgeDustLevel() << ','; + query << "`randomize_mount` = " << static_cast(player->isRandomMounted()) << ','; query << "`cap` = " << (player->capacity / 100) << ','; query << "`sex` = " << static_cast(player->sex) << ','; @@ -971,7 +972,6 @@ bool IOLoginData::savePlayer(Player* player) query << "`max_manashield` = " << player->getMaxManaShield() << ','; query << "`xpboost_value` = " << player->getStoreXpBoost() << ','; query << "`xpboost_stamina` = " << player->getExpBoostStamina() << ','; - query << "`randomize_mount` = " << player->isRandomMounted() << ','; query << "`quickloot_fallback` = " << (player->quickLootFallbackToMainContainer ? 1 : 0) << ','; if (!player->isOffline()) { diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index 63b5bc9031e..b217c960c6f 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -5993,39 +5993,30 @@ void ProtocolGame::sendOutfitWindow() msg.addString(outfit.name); msg.addByte(addons); msg.addByte(0x00); - if (++outfitSize == limitOutfits) { - break; - } + ++outfitSize; } else if (outfit.lookType == 1210 || outfit.lookType == 1211) { msg.add(outfit.lookType); msg.addString(outfit.name); msg.addByte(3); msg.addByte(0x02); - if (++outfitSize == limitOutfits) { - break; - } + ++outfitSize; } else if (outfit.lookType == 1456 || outfit.lookType == 1457) { msg.add(outfit.lookType); msg.addString(outfit.name); msg.addByte(3); msg.addByte(0x03); - if (++outfitSize == limitOutfits) { - break; - } + ++outfitSize; } else if (outfit.from == "store") { msg.add(outfit.lookType); msg.addString(outfit.name); - uint8_t addonsCount = 0; - if (outfit.lookType >= 962 && outfit.lookType <= 974) { - msg.addByte(0); - } else { - msg.addByte(3); - } + msg.addByte(outfit.lookType >= 962 && outfit.lookType <= 974 ? 0 : 3); msg.addByte(0x01); msg.add(0x00); - if (++outfitSize == limitOutfits) { - break; - } + ++outfitSize; + } + + if (outfitSize == limitOutfits) { + break; } } @@ -6045,17 +6036,17 @@ void ProtocolGame::sendOutfitWindow() msg.add(mount.clientId); msg.addString(mount.name); msg.addByte(0x00); - if (++mountSize == limitMounts) { - break; - } + ++mountSize; } else if (mount.type == "store") { msg.add(mount.clientId); msg.addString(mount.name); msg.addByte(0x01); msg.add(0x00); - if (++mountSize == limitMounts) { - break; - } + ++mountSize; + } + + if (mountSize == limitMounts) { + break; } } @@ -6092,8 +6083,8 @@ void ProtocolGame::sendOutfitWindow() msg.addByte(0x00); //Try outfit msg.addByte(mounted ? 0x01 : 0x00); - // Version 12.81 - Random outfit 'bool' - msg.addByte(player->isRandomMounted()); + // Version 12.81 - Random mount 'bool' + msg.addByte(player->isRandomMounted() ? 0x01 : 0x00); writeToOutputBuffer(msg); } From dc35986e44cfcc521a622fe234521a2e3d778d81 Mon Sep 17 00:00:00 2001 From: murilo09 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:02:23 -0300 Subject: [PATCH 4/9] Space --- src/creatures/players/player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 273193437c6..3f2f95fba4a 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -5185,7 +5185,7 @@ uint8_t Player::getRandomMountId() const } } - auto playerMountsCount =std::max(0, playerMounts.size() - 1); + auto playerMountsCount = std::max(0, playerMounts.size() - 1); auto randomIndex = uniform_random(0, playerMountsCount); return playerMounts[randomIndex]; } From 5921cb39f04f48a7a9cc4fe98bdc77ddb7bb8add Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:35:44 -0300 Subject: [PATCH 5/9] Fix sonar --- src/creatures/players/player.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 3f2f95fba4a..77973f158c7 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -5176,7 +5176,7 @@ bool Player::hasAnyMount() const uint8_t Player::getRandomMountId() const { - std::vector playerMounts; + std::vector playerMounts; for (const auto& mounts = g_game().mounts.getMounts(); const Mount& mount : mounts) { @@ -5185,9 +5185,9 @@ uint8_t Player::getRandomMountId() const } } - auto playerMountsCount = std::max(0, playerMounts.size() - 1); - auto randomIndex = uniform_random(0, playerMountsCount); - return playerMounts[randomIndex]; + auto playerMountsSize = static_cast(playerMounts.size() - 1); + auto randomIndex = uniform_random(0, std::max(0, playerMountsSize)); + return playerMounts.at(randomIndex); } bool Player::toggleMount(bool mount) From 2e69ae6586bf583128b5ad9ff0ca7201af666945 Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:54:02 -0300 Subject: [PATCH 6/9] Fix logic Outfit Window --- src/creatures/players/player.cpp | 1 + src/game/game.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 77973f158c7..37b621ef6bd 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -5244,6 +5244,7 @@ bool Player::toggleMount(bool mount) } defaultOutfit.lookMount = currentMount->clientId; + setCurrentMount(currentMount->id); if (currentMount->speed != 0) { g_game().changeSpeed(this, currentMount->speed); diff --git a/src/game/game.cpp b/src/game/game.cpp index d03f9c61063..75f80cda86d 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -4921,7 +4921,7 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun player->setRandomMount(isMountRandomized); - if (isMountRandomized && player->hasAnyMount()) { + if (isMountRandomized && outfit.lookMount != 0 && player->hasAnyMount()) { auto randomMount = mounts.getMountByID(player->getRandomMountId()); outfit.lookMount = randomMount->clientId; } From 9f9e70190fd138725bd566d250e3f9ebf46dcbab Mon Sep 17 00:00:00 2001 From: murilo09 <78226931+murilo09@users.noreply.github.com> Date: Mon, 16 Jan 2023 10:49:41 -0300 Subject: [PATCH 7/9] Change migrations version --- schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema.sql b/schema.sql index ae7ea26c4c9..4cf99ad3968 100644 --- a/schema.sql +++ b/schema.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `server_config` ( CONSTRAINT `server_config_pk` PRIMARY KEY (`config`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '24'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); +INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '25'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); -- Table structure `accounts` CREATE TABLE IF NOT EXISTS `accounts` ( From 5291f65c52966c12ef6c02377c16e5b9e377a998 Mon Sep 17 00:00:00 2001 From: murilooo1 <78226931+murilo09@users.noreply.github.com> Date: Mon, 16 Jan 2023 21:14:32 -0300 Subject: [PATCH 8/9] Fix mount in Protection Zone --- src/game/game.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/game/game.cpp b/src/game/game.cpp index 75f80cda86d..31d1cbd047b 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -4941,6 +4941,15 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun return; } + const Tile* playerTile = player->getTile(); + if (!playerTile) { + return; + } + + if (playerTile->hasFlag(TILESTATE_PROTECTIONZONE)) { + outfit.lookMount = 0; + } + if (player->isMounted()) { Mount* prevMount = mounts.getMountByID(player->getCurrentMount()); if (prevMount) { From 2d302e38e987dc512cbb095fb0e7967cb2b1d70f Mon Sep 17 00:00:00 2001 From: murilo09 <78226931+murilo09@users.noreply.github.com> Date: Tue, 31 Jan 2023 20:23:20 -0300 Subject: [PATCH 9/9] Fix Female Retro Citizen --- src/server/network/protocol/protocolgame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index cba7b7be482..f2d705dcbe1 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -6009,7 +6009,7 @@ void ProtocolGame::sendOutfitWindow() } else if (outfit.from == "store") { msg.add(outfit.lookType); msg.addString(outfit.name); - msg.addByte(outfit.lookType >= 962 && outfit.lookType <= 974 ? 0 : 3); + msg.addByte(outfit.lookType >= 962 && outfit.lookType <= 975 ? 0 : 3); msg.addByte(0x01); msg.add(0x00); ++outfitSize;