diff options
Diffstat (limited to 'src/game-server')
| -rw-r--r-- | src/game-server/accountconnection.cpp | 3 | ||||
| -rw-r--r-- | src/game-server/being.cpp | 7 | ||||
| -rw-r--r-- | src/game-server/being.h | 7 | ||||
| -rw-r--r-- | src/game-server/character.cpp | 164 | ||||
| -rw-r--r-- | src/game-server/character.h | 226 |
5 files changed, 166 insertions, 241 deletions
diff --git a/src/game-server/accountconnection.cpp b/src/game-server/accountconnection.cpp index 06674780..eed02b89 100644 --- a/src/game-server/accountconnection.cpp +++ b/src/game-server/accountconnection.cpp @@ -32,7 +32,6 @@ #include "game-server/quest.h" #include "game-server/state.h" #include "net/messagein.h" -#include "serialize/characterdata.h" #include "utils/logger.h" #include "utils/tokendispenser.h" #include "utils/tokencollector.h" @@ -107,7 +106,7 @@ void AccountConnection::sendCharacterData(Entity *p) MessageOut msg(GAMSG_PLAYER_DATA); auto *characterComponent = p->getComponent<CharacterComponent>(); msg.writeInt32(characterComponent->getDatabaseID()); - serializeCharacterData(CharacterData(p, characterComponent), msg); + characterComponent->serialize(*p, msg); send(msg); } diff --git a/src/game-server/being.cpp b/src/game-server/being.cpp index b49e3cba..9b45608c 100644 --- a/src/game-server/being.cpp +++ b/src/game-server/being.cpp @@ -405,13 +405,6 @@ double BeingComponent::getModifiedAttribute(unsigned id) const return ret->second.getModifiedAttribute(); } -void BeingComponent::setModAttribute(unsigned, double) -{ - // No-op to satisfy shared structure. - // The game-server calculates this manually. - return; -} - void BeingComponent::recalculateBaseAttribute(Entity &entity, unsigned attr) { LOG_DEBUG("Being: Received update attribute recalculation request for " diff --git a/src/game-server/being.h b/src/game-server/being.h index 8e245a34..f542e3ab 100644 --- a/src/game-server/being.h +++ b/src/game-server/being.h @@ -173,13 +173,6 @@ class BeingComponent : public Component double getModifiedAttribute(unsigned id) const; /** - * No-op to satisfy shared structure. - * @note The game server calculates this manually, so nothing happens - * here. - */ - void setModAttribute(unsigned, double); - - /** * Checks whether or not an attribute exists in this being. * @returns True if the attribute is present in the being, false otherwise. */ diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp index 48621ef4..a08b07ff 100644 --- a/src/game-server/character.cpp +++ b/src/game-server/character.cpp @@ -36,7 +36,6 @@ #include "scripting/scriptmanager.h" #include "net/messagein.h" #include "net/messageout.h" -#include "serialize/characterdata.h" #include "utils/logger.h" @@ -105,8 +104,7 @@ CharacterComponent::CharacterComponent(Entity &entity, MessageIn &msg): mDatabaseID = msg.readInt32(); beingComponent->setName(msg.readString()); - CharacterData characterData(&entity, this); - deserializeCharacterData(characterData, msg); + deserialize(entity, msg); Inventory(&entity, mPossessions).initialize(); modifiedAllAttributes(entity);; @@ -123,6 +121,166 @@ CharacterComponent::~CharacterComponent() delete mNpcThread; } +void CharacterComponent::deserialize(Entity &entity, MessageIn &msg) +{ + auto *beingComponent = entity.getComponent<BeingComponent>(); + + // general character properties + setAccountLevel(msg.readInt8()); + beingComponent->setGender(ManaServ::getGender(msg.readInt8())); + setHairStyle(msg.readInt8()); + setHairColor(msg.readInt8()); + setAttributePoints(msg.readInt16()); + setCorrectionPoints(msg.readInt16()); + + // character attributes + unsigned attrSize = msg.readInt16(); + for (unsigned i = 0; i < attrSize; ++i) + { + unsigned id = msg.readInt16(); + double base = msg.readDouble(); + beingComponent->setAttribute(entity, id, base); + } + + // status effects currently affecting the character + int statusSize = msg.readInt16(); + + for (int i = 0; i < statusSize; i++) + { + int status = msg.readInt16(); + int time = msg.readInt16(); + beingComponent->applyStatusEffect(status, time); + } + + // location + auto *map = MapManager::getMap(msg.readInt16()); + entity.setMap(map); + + Point temporaryPoint; + temporaryPoint.x = msg.readInt16(); + temporaryPoint.y = msg.readInt16(); + entity.getComponent<ActorComponent>()->setPosition(entity, temporaryPoint); + + // kill count + int killSize = msg.readInt16(); + for (int i = 0; i < killSize; i++) + { + int monsterId = msg.readInt16(); + int kills = msg.readInt32(); + setKillCount(monsterId, kills); + } + + // character abilities + int abilitiesSize = msg.readInt16(); + for (int i = 0; i < abilitiesSize; i++) + { + const int id = msg.readInt32(); + entity.getComponent<AbilityComponent>()->giveAbility(id); + } + + + Possessions &poss = getPossessions(); + EquipData equipData; + int equipSlotsSize = msg.readInt16(); + unsigned eqSlot; + EquipmentItem equipItem; + for (int j = 0; j < equipSlotsSize; ++j) + { + eqSlot = msg.readInt16(); + equipItem.itemId = msg.readInt16(); + equipItem.itemInstance = msg.readInt16(); + equipData.insert(equipData.end(), + std::make_pair(eqSlot, equipItem)); + } + poss.setEquipment(equipData); + + // Loads inventory - must be last because size isn't transmitted + InventoryData inventoryData; + while (msg.getUnreadLength()) + { + InventoryItem i; + int slotId = msg.readInt16(); + i.itemId = msg.readInt16(); + i.amount = msg.readInt16(); + inventoryData.insert(inventoryData.end(), std::make_pair(slotId, i)); + } + poss.setInventory(inventoryData); +} + +void CharacterComponent::serialize(Entity &entity, MessageOut &msg) +{ + auto *beingComponent = entity.getComponent<BeingComponent>(); + + // general character properties + msg.writeInt8(getAccountLevel()); + msg.writeInt8(beingComponent->getGender()); + msg.writeInt8(getHairStyle()); + msg.writeInt8(getHairColor()); + msg.writeInt16(getAttributePoints()); + msg.writeInt16(getCorrectionPoints()); + + + const AttributeMap &attributes = beingComponent->getAttributes(); + msg.writeInt16(attributes.size()); + for (auto attributeIt : attributes) + { + msg.writeInt16(attributeIt.first); + msg.writeDouble(attributeIt.second.getBase()); + msg.writeDouble(attributeIt.second.getModifiedAttribute()); + } + + // status effects currently affecting the character + auto &statusEffects = beingComponent->getStatusEffects(); + msg.writeInt16(statusEffects.size()); + for (auto &statusIt : statusEffects) + { + msg.writeInt16(statusIt.first); + msg.writeInt16(statusIt.second.time); + } + + // location + msg.writeInt16(entity.getMap()->getID()); + const Point &pos = entity.getComponent<ActorComponent>()->getPosition(); + msg.writeInt16(pos.x); + msg.writeInt16(pos.y); + + // kill count + msg.writeInt16(getKillCountSize()); + for (auto &killCountIt : mKillCount) + { + msg.writeInt16(killCountIt.first); + msg.writeInt32(killCountIt.second); + } + + // character abilities + auto &abilities = entity.getComponent<AbilityComponent>()->getAbilities(); + msg.writeInt16(abilities.size()); + for (auto &abilityIt : abilities) { + msg.writeInt32(abilityIt.first); + } + + // inventory - must be last because size isn't transmitted + const Possessions &poss = getPossessions(); + const EquipData &equipData = poss.getEquipment(); + msg.writeInt16(equipData.size()); // number of equipment + for (EquipData::const_iterator k = equipData.begin(), + k_end = equipData.end(); k != k_end; ++k) + { + msg.writeInt16(k->first); // Equip slot id + msg.writeInt16(k->second.itemId); // ItemId + msg.writeInt16(k->second.itemInstance); // Item Instance id + } + + const InventoryData &inventoryData = poss.getInventory(); + for (InventoryData::const_iterator j = inventoryData.begin(), + j_end = inventoryData.end(); j != j_end; ++j) + { + msg.writeInt16(j->first); // slot id + msg.writeInt16(j->second.itemId); // item id + msg.writeInt16(j->second.amount); // amount + } +} + void CharacterComponent::update(Entity &entity) { // Dead character: don't regenerate anything else diff --git a/src/game-server/character.h b/src/game-server/character.h index 860d53e2..799b0817 100644 --- a/src/game-server/character.h +++ b/src/game-server/character.h @@ -47,59 +47,6 @@ class MessageOut; class Point; class Trade; - -class CharacterData -{ -public: - CharacterData(Entity *entity, CharacterComponent *characterComponent); - - void setGender(BeingGender); - BeingGender getGender() const; - - void setMapId(int id); - int getMapId() const; - void setPosition(Point &point); - const Point &getPosition() const; - - void setAttribute(int id, int base); - void setModAttribute(int id, int mod); - const AttributeMap &getAttributes() const; - void setAttributePoints(int characterPoints); - int getAttributePoints() const; - void setCorrectionPoints(int correctionPoints); - int getCorrectionPoints() const; - - int getAccountLevel() const; - - void setHairStyle(int style); - int getHairStyle() const; - void setHairColor(int color); - int getHairColor() const; - - void setAccountLevel(int level); - - void applyStatusEffect(int status, int time); - int getStatusEffectSize() const; - const std::map<int, Status>::const_iterator getStatusEffectBegin() const; - const std::map<int, Status>::const_iterator getStatusEffectEnd() const; - - int getKillCountSize() const; - const std::map<int, int>::const_iterator getKillCountBegin() const; - const std::map<int, int>::const_iterator getKillCountEnd() const; - void setKillCount(int monsterId, int kills); - - void clearAbilities(); - void giveAbility(int id); - const std::set<int> getAbilities() const; - - Possessions &getPossessions() const; - -private: - Entity *mEntity; - CharacterComponent *mCharacterComponent; -}; - - /** * The representation of a player's character in the game world. */ @@ -336,7 +283,11 @@ class CharacterComponent : public Component sigc::signal<void, Entity &> signal_disconnected; + void serialize(Entity &entity, MessageOut &msg); + private: + void deserialize(Entity &entity, MessageIn &msg); + double getAttrBase(AttributeMap::const_iterator it) const { return it->second.getBase(); } double getAttrMod(AttributeMap::const_iterator it) const @@ -406,175 +357,6 @@ class CharacterComponent : public Component }; -inline CharacterData::CharacterData(Entity *entity, - CharacterComponent *characterComponent): - mEntity(entity), - mCharacterComponent(characterComponent) -{} - -inline void CharacterData::setGender(BeingGender gender) -{ - mEntity->getComponent<BeingComponent>()->setGender(gender); -} - -inline BeingGender CharacterData::getGender() const -{ - return mEntity->getComponent<BeingComponent>()->getGender(); -} - -inline void CharacterData::setMapId(int id) -{ - mEntity->setMap(MapManager::getMap(id)); -} - -inline int CharacterData::getMapId() const -{ - return mEntity->getMap()->getID(); -} - -inline void CharacterData::setPosition(Point &point) -{ - mEntity->getComponent<ActorComponent>()->setPosition(*mEntity, point); -} - -inline const Point &CharacterData::getPosition() const -{ - return mEntity->getComponent<ActorComponent>()->getPosition(); -} - -inline void CharacterData::setAttribute(int id, int base) -{ - mEntity->getComponent<BeingComponent>()->setAttribute(*mEntity, id, base); -} - -inline void CharacterData::setModAttribute(int id, int mod) -{ - mEntity->getComponent<BeingComponent>()->setModAttribute(id, mod); -} - -inline const AttributeMap &CharacterData::getAttributes() const -{ - return mEntity->getComponent<BeingComponent>()->getAttributes(); -} - -inline void CharacterData::setAttributePoints(int characterPoints) -{ - mCharacterComponent->setAttributePoints(characterPoints); -} - -inline int CharacterData::getAttributePoints() const -{ - return mCharacterComponent->getAttributePoints(); -} - -inline void CharacterData::setCorrectionPoints(int correctionPoints) -{ - mCharacterComponent->setCorrectionPoints(correctionPoints); -} - -inline int CharacterData::getCorrectionPoints() const -{ - return mCharacterComponent->getCorrectionPoints(); -} - -inline int CharacterData::getAccountLevel() const -{ - return mCharacterComponent->getAccountLevel(); -} - -inline void CharacterData::setHairStyle(int style) -{ - mCharacterComponent->setHairStyle(style); -} - -inline int CharacterData::getHairStyle() const -{ - return mCharacterComponent->getHairStyle(); -} - -inline void CharacterData::setHairColor(int color) -{ - mCharacterComponent->setHairColor(color); -} - -inline int CharacterData::getHairColor() const -{ - return mCharacterComponent->getHairColor(); -} - -inline void CharacterData::setAccountLevel(int level) -{ - mCharacterComponent->setAccountLevel(level); -} - -inline void CharacterData::applyStatusEffect(int status, int time) -{ - mEntity->getComponent<BeingComponent>()->applyStatusEffect(status, time); -} - -inline int CharacterData::getStatusEffectSize() const -{ - return mEntity->getComponent<BeingComponent>()->getStatusEffects().size(); -} - -inline const std::map<int, Status>::const_iterator CharacterData::getStatusEffectBegin() const -{ - return mEntity->getComponent<BeingComponent>()->getStatusEffects().begin(); -} - -inline const std::map<int, Status>::const_iterator CharacterData::getStatusEffectEnd() const -{ - return mEntity->getComponent<BeingComponent>()->getStatusEffects().end(); -} - -inline int CharacterData::getKillCountSize() const -{ - return mCharacterComponent->getKillCountSize(); -} - -inline const std::map<int, int>::const_iterator CharacterData::getKillCountBegin() const -{ - return mCharacterComponent->getKillCountBegin(); -} - -inline const std::map<int, int>::const_iterator CharacterData::getKillCountEnd() const -{ - return mCharacterComponent->getKillCountEnd(); -} - -inline void CharacterData::setKillCount(int monsterId, int kills) -{ - mCharacterComponent->setKillCount(monsterId, kills); -} - -inline void CharacterData::clearAbilities() -{ - mEntity->getComponent<AbilityComponent>()->clearAbilities(); -} - -inline void CharacterData::giveAbility(int id) -{ - mEntity->getComponent<AbilityComponent>()->giveAbility(id); -} - -inline const std::set<int> CharacterData::getAbilities() const -{ - // TODO: remove this coping when removing the shared characterdata.h - std::set<int> abilities; - - for (auto &it : mEntity->getComponent<AbilityComponent>()->getAbilities()) { - abilities.insert(it.first); - } - - return abilities; -} - -inline Possessions &CharacterData::getPossessions() const -{ - return mCharacterComponent->getPossessions(); -} - - inline void CharacterComponent::setAttributePoints(int points) { mSendAttributePointsStatus = true; |