summaryrefslogtreecommitdiff
path: root/src/net/manaserv/charhandler.h
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-02-19 22:38:59 +0100
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-02-19 23:37:36 +0100
commit363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe (patch)
tree117ce95d3587f913a64b71fe4dcdee716b8aea7e /src/net/manaserv/charhandler.h
parent432d16435774cafd630e287321e882f3e8510d16 (diff)
downloadmana-client-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.gz
mana-client-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.bz2
mana-client-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.xz
mana-client-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.zip
Fixed a crash when trying to switch servers
Ownership of the charInfo global variable wasn't well defined. It was being locked, unlocked and generally modified from a lot of places, and somewhere in this mess it ended up crashing when switching servers. Now the CharHandler instances, for eAthena and manaserv respectively, own this list of characters. A new class, Net::Character wraps up the slot index in combination with the player dummy. The list is passed on to the CharSelectDialog each time it changes. Both related and unrelated cleanups were made as well. Reviewed-by: Jared Adams
Diffstat (limited to 'src/net/manaserv/charhandler.h')
-rw-r--r--src/net/manaserv/charhandler.h57
1 files changed, 36 insertions, 21 deletions
diff --git a/src/net/manaserv/charhandler.h b/src/net/manaserv/charhandler.h
index 74f68f55..4a1af307 100644
--- a/src/net/manaserv/charhandler.h
+++ b/src/net/manaserv/charhandler.h
@@ -42,11 +42,6 @@ class CharHandler : public MessageHandler, public Net::CharHandler
void handleMessage(Net::MessageIn &msg);
- void setCharInfo(LockedArray<LocalPlayer*> *charInfo)
- {
- mCharInfo = charInfo;
- }
-
void setCharSelectDialog(CharSelectDialog *window);
/**
@@ -56,32 +51,52 @@ class CharHandler : public MessageHandler, public Net::CharHandler
*/
void setCharCreateDialog(CharCreateDialog *window);
- void getCharacters();
+ void requestCharacters();
- void chooseCharacter(int slot, LocalPlayer* character);
+ void chooseCharacter(Net::Character *character);
void newCharacter(const std::string &name, int slot,
- bool gender, int hairstyle, int hairColor,
- std::vector<int> stats);
+ bool gender, int hairstyle, int hairColor,
+ const std::vector<int> &stats);
- void deleteCharacter(int slot, LocalPlayer* character);
+ void deleteCharacter(Net::Character *character);
void switchCharacter();
- unsigned int baseSprite() const;
-
- unsigned int hairSprite() const;
-
- unsigned int maxSprite() const;
+ int baseSprite() const;
- protected:
- void handleCharCreateResponse(Net::MessageIn &msg);
+ int hairSprite() const;
- void handleCharSelectResponse(Net::MessageIn &msg);
+ int maxSprite() const;
- LockedArray<LocalPlayer*> *mCharInfo;
- CharSelectDialog *mCharSelectDialog;
- CharCreateDialog *mCharCreateDialog;
+ private:
+ /**
+ * Character information needs to be cached since we receive it before
+ * we have loaded the dynamic data, so we can't resolve load any
+ * sprites yet.
+ */
+ struct CachedCharacterInfo {
+ int slot;
+ std::string name;
+ Gender gender;
+ int hairStyle;
+ int hairColor;
+ int level;
+ int characterPoints;
+ int correctionPoints;
+ int money;
+ int attribute[7];
+ };
+
+ void handleCharacterInfo(Net::MessageIn &msg);
+ void handleCharacterCreateResponse(Net::MessageIn &msg);
+ void handleCharacterDeleteResponse(Net::MessageIn &msg);
+ void handleCharacterSelectResponse(Net::MessageIn &msg);
+
+ void updateCharacters();
+
+ /** Cached character information */
+ std::vector<CachedCharacterInfo> mCachedCharacterInfos;
};
} // namespace ManaServ