Skip to content

Commit

Permalink
shared_ptr || reload
Browse files Browse the repository at this point in the history
  • Loading branch information
beats-dh committed Mar 25, 2024
1 parent 144fed2 commit 3ebef93
Show file tree
Hide file tree
Showing 14 changed files with 101 additions and 91 deletions.
31 changes: 15 additions & 16 deletions src/creatures/appearance/outfit/outfit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
#include "utils/tools.hpp"
#include "game/game.hpp"

bool Outfits::reload(){
for (auto& outfitsVector : outfits) {
outfitsVector.clear();
}
return loadFromXml();
}

bool Outfits::loadFromXml() {
pugi::xml_document doc;
auto folder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__) + "/XML/outfits.xml";
Expand Down Expand Up @@ -68,10 +75,12 @@ bool Outfits::loadFromXml() {
}

std::shared_ptr<Outfit> Outfits::getOutfitByLookType(PlayerSex_t sex, uint16_t lookType) const {
for (const auto &outfit : outfits[sex]) {
if (outfit->lookType == lookType) {
return outfit;
}
auto it = std::ranges::find_if(outfits[sex], [&lookType](const auto& outfit) {
return outfit->lookType == lookType;
});

if (it != outfits[sex].end()) {
return *it;
}
return nullptr;
}
Expand All @@ -83,17 +92,7 @@ std::shared_ptr<Outfit> Outfits::getOutfitByLookType(PlayerSex_t sex, uint16_t l
* @return <b>const</b> pointer to the outfit or <b>nullptr</b> if it could not be found.
*/

std::shared_ptr<Outfit> Outfits::getOpositeSexOutfitByLookType(PlayerSex_t sex, uint16_t lookType) {
std::shared_ptr<Outfit> Outfits::getOpositeSexOutfitByLookType(PlayerSex_t sex, uint16_t lookType) const {
PlayerSex_t searchSex = (sex == PLAYERSEX_MALE) ? PLAYERSEX_FEMALE : PLAYERSEX_MALE;

for (uint16_t i = 0; i < outfits[sex].size(); i++) {
if (outfits[sex].at(i)->lookType == lookType) {
if (outfits[searchSex].size() > i) {
return outfits[searchSex].at(i);
} else { // looktype found but the oposite sex array doesn't have this index.
return nullptr;
}
}
}
return nullptr;
return getOutfitByLookType(searchSex, lookType);
}
13 changes: 11 additions & 2 deletions src/creatures/appearance/outfit/outfit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,17 @@
#include "declarations.hpp"
#include "lib/di/container.hpp"

struct OutfitEntry {
constexpr OutfitEntry(uint16_t initLookType, uint8_t initAddons) :
lookType(initLookType), addons(initAddons) { }

uint16_t lookType;
uint8_t addons;
};

struct Outfit {
Outfit(std::string initName, uint16_t initLookType, bool initPremium, bool initUnlocked, std::string initFrom) :
name(initName), lookType(initLookType), premium(initPremium), unlocked(initUnlocked), from(initFrom) { }
name(std::move(initName)), lookType(initLookType), premium(initPremium), unlocked(initUnlocked), from(std::move(initFrom)) { }

std::string name;
uint16_t lookType;
Expand All @@ -38,9 +46,10 @@ class Outfits {
return inject<Outfits>();
}

std::shared_ptr<Outfit> getOpositeSexOutfitByLookType(PlayerSex_t sex, uint16_t lookType);
std::shared_ptr<Outfit> getOpositeSexOutfitByLookType(PlayerSex_t sex, uint16_t lookType) const;

bool loadFromXml();
bool reload();

[[nodiscard]] std::shared_ptr<Outfit> getOutfitByLookType(PlayerSex_t sex, uint16_t lookType) const;
[[nodiscard]] const std::vector<std::shared_ptr<Outfit>> &getOutfits(PlayerSex_t sex) const {
Expand Down
27 changes: 0 additions & 27 deletions src/creatures/creatures_definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1411,20 +1411,6 @@ struct VIPEntry {
bool notify;
};

struct OutfitEntry {
constexpr OutfitEntry(uint16_t initLookType, uint8_t initAddons) :
lookType(initLookType), addons(initAddons) { }

uint16_t lookType;
uint8_t addons;
};

struct FamiliarEntry {
constexpr explicit FamiliarEntry(uint16_t initLookType) :
lookType(initLookType) { }
uint16_t lookType;
};

struct Skill {
uint64_t tries = 0;
uint16_t level = 10;
Expand Down Expand Up @@ -1535,19 +1521,6 @@ using ItemsTierCountList = std::map<uint16_t, std::map<uint8_t, uint32_t>>;
| ...
*/

struct Familiar {
Familiar(std::string initName, uint16_t initLookType, bool initPremium, bool initUnlocked, std::string initType) :
name(initName), lookType(initLookType),
premium(initPremium), unlocked(initUnlocked),
type(initType) { }

std::string name;
uint16_t lookType;
bool premium;
bool unlocked;
std::string type;
};

struct ProtocolFamiliars {
ProtocolFamiliars(const std::string &initName, uint16_t initLookType) :
name(initName), lookType(initLookType) { }
Expand Down
19 changes: 13 additions & 6 deletions src/creatures/players/grouping/familiars.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
#include "utils/pugicast.hpp"
#include "utils/tools.hpp"

bool Familiars::reload() {
for (auto& familiarsVector : familiars) {
familiarsVector.clear();
}
return loadFromXml();
}

bool Familiars::loadFromXml() {
pugi::xml_document doc;
auto folder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__) + "/XML/familiars.xml";
Expand Down Expand Up @@ -47,24 +54,24 @@ bool Familiars::loadFromXml() {
continue;
}

familiars[vocation].emplace_back(
familiars[vocation].emplace_back(std::make_shared<Familiar>(
familiarsNode.attribute("name").as_string(),
pugi::cast<uint16_t>(lookTypeAttribute.value()),
familiarsNode.attribute("premium").as_bool(),
familiarsNode.attribute("unlocked").as_bool(true),
familiarsNode.attribute("type").as_string()
);
));
}
for (uint16_t vocation = VOCATION_NONE; vocation <= VOCATION_LAST; ++vocation) {
familiars[vocation].shrink_to_fit();
}
return true;
}

const Familiar* Familiars::getFamiliarByLookType(uint16_t vocation, uint16_t lookType) const {
for (const Familiar &familiar : familiars[vocation]) {
if (familiar.lookType == lookType) {
return &familiar;
std::shared_ptr<Familiar> Familiars::getFamiliarByLookType(uint16_t vocation, uint16_t lookType) const {
for (const auto &familiar : familiars[vocation]) {
if (familiar->lookType == lookType) {
return familiar;
}
}
return nullptr;
Expand Down
30 changes: 26 additions & 4 deletions src/creatures/players/grouping/familiars.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,42 @@

#pragma once

#include "declarations.hpp"
#include "lib/di/container.hpp"

struct FamiliarEntry {
constexpr explicit FamiliarEntry(uint16_t initLookType) :
lookType(initLookType) { }
uint16_t lookType;
};

struct Familiar {
Familiar(std::string initName, uint16_t initLookType, bool initPremium, bool initUnlocked, std::string initType) :
name(std::move(initName)), lookType(initLookType),
premium(initPremium), unlocked(initUnlocked),
type(std::move(initType)) { }

std::string name;
uint16_t lookType;
bool premium;
bool unlocked;
std::string type;
};

class Familiars {
public:
static Familiars &getInstance() {
return inject<Familiars>();
}

bool loadFromXml();
const std::vector<Familiar> &getFamiliars(uint16_t vocation) const {
bool reload();

std::vector<std::shared_ptr<Familiar>> &getFamiliars(uint16_t vocation) {
return familiars[vocation];
}
const Familiar* getFamiliarByLookType(uint16_t vocation, uint16_t lookType) const;

std::shared_ptr<Familiar> getFamiliarByLookType(uint16_t vocation, uint16_t lookType) const;

private:
std::vector<Familiar> familiars[VOCATION_LAST + 1];
std::vector<std::shared_ptr<Familiar>> familiars[VOCATION_LAST + 1];
};
10 changes: 5 additions & 5 deletions src/creatures/players/grouping/groups.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,16 @@ bool Groups::load() {
// Parsing group flags
parseGroupFlags(group, groupNode);

groups_vector.push_back(group);
groups_vector.emplace_back(std::make_shared<Group>(group));
}
groups_vector.shrink_to_fit();
return true;
}

Group* Groups::getGroup(uint16_t id) {
for (Group &group : groups_vector) {
if (group.id == id) {
return &group;
std::shared_ptr<Group> Groups::getGroup(uint16_t id) {
for (const auto &group : groups_vector) {
if (group->id == id) {
return group;
}
}
return nullptr;
Expand Down
6 changes: 3 additions & 3 deletions src/creatures/players/grouping/groups.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ class Groups {
static PlayerFlags_t getFlagFromNumber(uint8_t value);
bool reload() const;
bool load();
Group* getGroup(uint16_t id);
std::vector<Group> &getGroups() {
std::shared_ptr<Group> getGroup(uint16_t id);
std::vector<std::shared_ptr<Group>> &getGroups() {
return groups_vector;
}

private:
std::vector<Group> groups_vector;
std::vector<std::shared_ptr<Group>> groups_vector;
};
10 changes: 5 additions & 5 deletions src/creatures/players/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5002,7 +5002,7 @@ bool Player::canFamiliar(uint16_t lookType) const {
return true;
}

const Familiar* familiar = Familiars::getInstance().getFamiliarByLookType(getVocationId(), lookType);
const auto &familiar = Familiars::getInstance().getFamiliarByLookType(getVocationId(), lookType);
if (!familiar) {
return false;
}
Expand Down Expand Up @@ -5043,24 +5043,24 @@ bool Player::removeFamiliar(uint16_t lookType) {
return false;
}

bool Player::getFamiliar(const Familiar &familiar) const {
bool Player::getFamiliar(const std::shared_ptr<Familiar> &familiar) const {
if (group->access) {
return true;
}

if (familiar.premium && !isPremium()) {
if (familiar->premium && !isPremium()) {
return false;
}

for (const FamiliarEntry &familiarEntry : familiars) {
if (familiarEntry.lookType != familiar.lookType) {
if (familiarEntry.lookType != familiar->lookType) {
continue;
}

return true;
}

if (!familiar.unlocked) {
if (!familiar->unlocked) {
return false;
}

Expand Down
8 changes: 4 additions & 4 deletions src/creatures/players/player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,10 +510,10 @@ class Player final : public Creature, public Cylinder, public Bankable {

void genReservedStorageRange();

void setGroup(Group* newGroup) {
void setGroup(std::shared_ptr<Group> newGroup) {
group = newGroup;
}
Group* getGroup() const {
std::shared_ptr<Group> getGroup() const {
return group;
}

Expand Down Expand Up @@ -1022,7 +1022,7 @@ class Player final : public Creature, public Cylinder, public Bankable {
bool canFamiliar(uint16_t lookType) const;
void addFamiliar(uint16_t lookType);
bool removeFamiliar(uint16_t lookType);
bool getFamiliar(const Familiar &familiar) const;
bool getFamiliar(const std::shared_ptr<Familiar> &familiar) const;
void setFamiliarLooktype(uint16_t familiarLooktype) {
this->defaultOutfit.lookFamiliarsType = familiarLooktype;
}
Expand Down Expand Up @@ -2755,7 +2755,7 @@ class Player final : public Creature, public Cylinder, public Bankable {
std::shared_ptr<BedItem> bedItem = nullptr;
std::shared_ptr<Guild> guild = nullptr;
GuildRank_ptr guildRank;
Group* group = nullptr;
std::shared_ptr<Group> group = nullptr;
std::shared_ptr<Inbox> inbox;
std::shared_ptr<Item> imbuingItem = nullptr;
std::shared_ptr<Item> tradeItem = nullptr;
Expand Down
4 changes: 2 additions & 2 deletions src/io/functions/iologindata_load_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ bool IOLoginDataLoad::preLoadPlayer(std::shared_ptr<Player> player, const std::s
}

player->setGUID(result->getNumber<uint32_t>("id"));
Group* group = g_game().groups.getGroup(result->getNumber<uint16_t>("group_id"));
std::shared_ptr<Group> group = g_game().groups.getGroup(result->getNumber<uint16_t>("group_id"));
if (!group) {
g_logger().error("Player {} has group id {} which doesn't exist", player->name, result->getNumber<uint16_t>("group_id"));
return false;
Expand Down Expand Up @@ -118,7 +118,7 @@ bool IOLoginDataLoad::loadPlayerFirst(std::shared_ptr<Player> player, DBResult_p
player->setAccount(result->getNumber<uint32_t>("account_id"));
}

Group* group = g_game().groups.getGroup(result->getNumber<uint16_t>("group_id"));
std::shared_ptr<Group> group = g_game().groups.getGroup(result->getNumber<uint16_t>("group_id"));
if (!group) {
g_logger().error("Player {} has group id {} which doesn't exist", player->name, result->getNumber<uint16_t>("group_id"));
return false;
Expand Down
Loading

0 comments on commit 3ebef93

Please sign in to comment.