summaryrefslogtreecommitdiff
path: root/src/account-server/character.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/account-server/character.cpp')
-rw-r--r--src/account-server/character.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/account-server/character.cpp b/src/account-server/character.cpp
index 98fe9bd2..47bca5da 100644
--- a/src/account-server/character.cpp
+++ b/src/account-server/character.cpp
@@ -22,6 +22,9 @@
#include "account-server/account.h"
+#include "net/messagein.h"
+#include "net/messageout.h"
+
CharacterData::CharacterData(const std::string &name, int id):
mName(name),
mDatabaseID(id),
@@ -38,6 +41,164 @@ CharacterData::CharacterData(const std::string &name, int id):
{
}
+void CharacterData::serialize(MessageOut &msg)
+{
+ // general character properties
+ msg.writeInt8(getAccountLevel());
+ msg.writeInt8(getGender());
+ msg.writeInt8(getHairStyle());
+ msg.writeInt8(getHairColor());
+ msg.writeInt16(getAttributePoints());
+ msg.writeInt16(getCorrectionPoints());
+
+
+ const AttributeMap &attributes = getAttributes();
+ msg.writeInt16(attributes.size());
+ for (auto attributeIt : attributes)
+ {
+ msg.writeInt16(attributeIt.first);
+ msg.writeDouble(attributeIt.second.getBase());
+ }
+
+ // status effects currently affecting the character
+ msg.writeInt16(getStatusEffectSize());
+ std::map<int, Status>::const_iterator status_it;
+ for (status_it = getStatusEffectBegin(); status_it != getStatusEffectEnd(); status_it++)
+ {
+ msg.writeInt16(status_it->first);
+ msg.writeInt16(status_it->second.time);
+ }
+
+ // location
+ msg.writeInt16(getMapId());
+ const Point &pos = getPosition();
+ msg.writeInt16(pos.x);
+ msg.writeInt16(pos.y);
+
+ // kill count
+ msg.writeInt16(getKillCountSize());
+ std::map<int, int>::const_iterator kills_it;
+ for (kills_it = getKillCountBegin(); kills_it != getKillCountEnd(); kills_it++)
+ {
+ msg.writeInt16(kills_it->first);
+ msg.writeInt32(kills_it->second);
+ }
+
+ // character abilities
+ const std::set<int> &abilities = getAbilities();
+ msg.writeInt16(abilities.size());
+ for (auto &abilityId : abilities) {
+ msg.writeInt32(abilityId);
+ }
+
+ // 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 CharacterData::deserialize(MessageIn &msg)
+{
+ // general character properties
+ setAccountLevel(msg.readInt8());
+ 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(),
+ mod = msg.readDouble();
+ setAttribute(id, base);
+ setModAttribute(id, mod);
+ }
+
+ // 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();
+ applyStatusEffect(status, time);
+ }
+
+ // location
+ setMapId(msg.readInt16());
+
+ Point temporaryPoint;
+ temporaryPoint.x = msg.readInt16();
+ temporaryPoint.y = msg.readInt16();
+ setPosition(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();
+ clearAbilities();
+ for (int i = 0; i < abilitiesSize; i++)
+ {
+ const int id = msg.readInt32();
+ giveAbility(id);
+ }
+
+
+ Possessions &poss = getPossessions();
+ EquipData equipData;
+ int equipSlotsSize = msg.readInt16();
+ unsigned equipSlot;
+ EquipmentItem equipItem;
+ for (int j = 0; j < equipSlotsSize; ++j)
+ {
+ equipSlot = msg.readInt16();
+ equipItem.itemId = msg.readInt16();
+ equipItem.itemInstance = msg.readInt16();
+ equipData.insert(equipData.end(),
+ std::make_pair(equipSlot, 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 CharacterData::setAccount(Account *acc)
{
mAccount = acc;