summaryrefslogtreecommitdiff
path: root/src/game-server
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server')
-rw-r--r--src/game-server/accountconnection.cpp3
-rw-r--r--src/game-server/being.cpp7
-rw-r--r--src/game-server/being.h7
-rw-r--r--src/game-server/character.cpp164
-rw-r--r--src/game-server/character.h226
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;