00001 #ifndef ERIS_PLAYER_H
00002 #define ERIS_PLAYER_H
00003
00004 #include <Eris/Types.h>
00005 #include <Eris/Timeout.h>
00006
00007 #include <sigc++/object.h>
00008
00009 namespace Atlas {
00010 namespace Objects {
00011 namespace Operation {
00012 class Error;
00013 class Logout;
00014 }
00015 namespace Entity {
00016 class GameEntity;
00017 class Player;
00018 }
00019 }
00020 }
00021
00022 namespace Eris
00023 {
00024
00025
00026 class Lobby;
00027 class Connection;
00028 class World;
00029 class Avatar;
00030
00033 typedef enum {
00034 LOGIN_INVALID = 0,
00035 LOGIN_DUPLICATE_ACCOUNT,
00036 LOGIN_BAD_ACCOUNT,
00037 LOGIN_UNKNOWN_ACCOUNT,
00038 LOGIN_BAD_PASSWORD,
00039 LOGIN_DUPLICATE_CONNECT
00040 } LoginFailureType;
00041
00043 typedef std::map<std::string, Atlas::Objects::Entity::GameEntity> CharacterMap;
00044
00046
00054 class Player : virtual public SigC::Object
00055 {
00056 public:
00059 Player(Connection *con);
00060 ~Player();
00061
00065
00071 void login(const std::string &uname,
00072 const std::string &pwd);
00073
00079
00080
00081
00082
00083 void createAccount(const std::string &uname,
00084 const std::string &name,
00085 const std::string &pwd);
00086
00089 void logout();
00090
00094 const CharacterMap& getCharacters();
00095
00101 void refreshCharacterInfo();
00102
00105 Avatar* takeCharacter(const std::string &id);
00106
00108 Avatar* createCharacter(const Atlas::Objects::Entity::GameEntity &character);
00109
00111 void createCharacter();
00112
00114 bool canCreateCharacter() {return false;}
00115
00117 const std::string& getAccountID() const;
00118
00119 Connection* getConnection() const {return _con;}
00120
00121
00123 SigC::Signal1<void, const Atlas::Objects::Entity::GameEntity&> GotCharacterInfo;
00124
00126 SigC::Signal0<void> GotAllCharacters;
00127
00129 SigC::Signal2<void, LoginFailureType, const std::string &> LoginFailure;
00130
00131 SigC::Signal0<void> LoginSuccess;
00132
00136 SigC::Signal1<void, bool> LogoutComplete;
00137
00139 SigC::Signal1<void, Avatar*> NewCharacter;
00140 protected:
00141 void recvOpError(const Atlas::Objects::Operation::Error &err);
00142 void recvSightCharacter(const Atlas::Objects::Entity::GameEntity &ge);
00143 void loginComplete(const Atlas::Objects::Entity::Player &p);
00144
00145 void internalLogin(const std::string &unm, const std::string &pwd);
00146 void internalLogout(bool clean);
00147
00149 void netConnected();
00150
00152 bool netDisconnecting();
00153 void netFailure(const std::string& msg);
00154
00155 void recvLogoutInfo(const Atlas::Objects::Operation::Logout &lo);
00156 void handleLogoutTimeout();
00157 void recvRemoteLogout(const Atlas::Objects::Operation::Logout &lo);
00158
00159 void createCharacterHandler(long serialno);
00160
00161 Connection* _con;
00162 std::string _account;
00163
00164 CharacterMap _characters;
00165 StringSet m_characterIds;
00166 bool m_doingCharacterRefresh;
00167
00168 std::string _username,
00169 _pass;
00170
00172 std::string _currentAction;
00173 long _currentSerial;
00174
00175 Timeout* _logoutTimeout;
00176
00177 Lobby* _lobby;
00178 };
00179
00180 }
00181
00182 #endif