diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-02-19 22:38:59 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-02-19 23:37:36 +0100 |
commit | 363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe (patch) | |
tree | 117ce95d3587f913a64b71fe4dcdee716b8aea7e /src/net/charhandler.h | |
parent | 432d16435774cafd630e287321e882f3e8510d16 (diff) | |
download | mana-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.gz mana-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.bz2 mana-363527d0f95963ba3f4a6d25c8eabc1bb3ad4efe.tar.xz mana-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/charhandler.h')
-rw-r--r-- | src/net/charhandler.h | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/src/net/charhandler.h b/src/net/charhandler.h index a55e8d86..dfe0882f 100644 --- a/src/net/charhandler.h +++ b/src/net/charhandler.h @@ -23,7 +23,6 @@ #define CHARHANDLER_H #include "localplayer.h" -#include "lockedarray.h" #include "logindata.h" #include <iosfwd> @@ -35,34 +34,73 @@ class LocalPlayer; namespace Net { +/** + * A structure to hold information about a character. + */ +struct Character +{ + Character() : + slot(0), + dummy(new LocalPlayer) + { + } + + ~Character() + { + delete dummy; + } + + int slot; /**< The index in the list of characters */ + LocalPlayer *dummy; /**< A dummy representing this character */ +}; + +typedef std::list<Character*> Characters; + class CharHandler { public: - virtual void setCharInfo(LockedArray<LocalPlayer*> *charInfo) = 0; - virtual void setCharSelectDialog(CharSelectDialog *window) = 0; virtual void setCharCreateDialog(CharCreateDialog *window) = 0; - virtual void getCharacters() = 0; + virtual void requestCharacters() = 0; - virtual void chooseCharacter(int slot, LocalPlayer *character) = 0; + virtual void chooseCharacter(Net::Character *character) = 0; virtual void newCharacter(const std::string &name, int slot, - bool gender, int hairstyle, int hairColor, - std::vector<int> stats) = 0; + bool gender, int hairstyle, int hairColor, + const std::vector<int> &stats) = 0; - virtual void deleteCharacter(int slot, LocalPlayer* character) = 0; + virtual void deleteCharacter(Net::Character *character) = 0; virtual void switchCharacter() = 0; - virtual unsigned int baseSprite() const = 0; + virtual int baseSprite() const = 0; - virtual unsigned int hairSprite() const = 0; + virtual int hairSprite() const = 0; - virtual unsigned int maxSprite() const = 0; + virtual int maxSprite() const = 0; virtual ~CharHandler() {} + + protected: + CharHandler(): + mSelectedCharacter(0), + mCharSelectDialog(0), + mCharCreateDialog(0) + {} + + void updateCharSelectDialog(); + void unlockCharSelectDialog(); + + /** The list of available characters. */ + Net::Characters mCharacters; + + /** The selected character. */ + Net::Character *mSelectedCharacter; + + CharSelectDialog *mCharSelectDialog; + CharCreateDialog *mCharCreateDialog; }; } // namespace Net |