disconnect on death

This commit is contained in:
Eduardo Bart 2012-01-07 03:10:02 -02:00
parent 56aa416fee
commit 806fb5995f
5 changed files with 33 additions and 13 deletions

1
TODO
View File

@ -66,6 +66,7 @@
[bart] draw lights using shaders [bart] draw lights using shaders
[bart] chat with tabs [bart] chat with tabs
[bart] limit FPS in options [bart] limit FPS in options
[baxnie] display 'You are dead.' message
[baxnie] do lua game event calls from Game instead from GameProtocol [baxnie] do lua game event calls from Game instead from GameProtocol
[baxnie] classic control [baxnie] classic control
[baxnie] trade window [baxnie] trade window

View File

@ -56,5 +56,9 @@ function Game.onConnectionError(message)
errorBox.onOk = CharacterList.show errorBox.onOk = CharacterList.show
end end
function Game.onDeath()
print('dead')
end
connect(Game, { onLogin = Game.createInterface }, true) connect(Game, { onLogin = Game.createInterface }, true)
connect(Game, { onLogout = Game.destroyInterface }) connect(Game, { onLogout = Game.destroyInterface })

View File

@ -32,6 +32,8 @@ Game g_game;
void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldHost, int worldPort, const std::string& characterName) void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldHost, int worldPort, const std::string& characterName)
{ {
m_online = false;
m_dead = false;
m_protocolGame = ProtocolGamePtr(new ProtocolGame); m_protocolGame = ProtocolGamePtr(new ProtocolGame);
m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName); m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName);
} }
@ -72,7 +74,6 @@ void Game::processLogin(const LocalPlayerPtr& localPlayer)
{ {
m_localPlayer = localPlayer; m_localPlayer = localPlayer;
m_online = true; m_online = true;
g_lua.callGlobalField("Game", "onLogin", m_localPlayer); g_lua.callGlobalField("Game", "onLogin", m_localPlayer);
} }
@ -91,6 +92,15 @@ void Game::processLogout()
} }
} }
void Game::processDeath()
{
m_dead = true;
g_lua.callGlobalField("Game","onDeath");
// force logout in five seconds
g_dispatcher.scheduleEvent(std::bind(&Game::forceLogout, &g_game), 5 * 1000);
}
void Game::processTextMessage(int type, const std::string& message) void Game::processTextMessage(int type, const std::string& message)
{ {
g_lua.callGlobalField("Game","onTextMessage", type, message); g_lua.callGlobalField("Game","onTextMessage", type, message);
@ -104,9 +114,17 @@ void Game::processInventoryChange(int slot, const ItemPtr& item)
g_lua.callGlobalField("Game","onInventoryChange", slot, item); g_lua.callGlobalField("Game","onInventoryChange", slot, item);
} }
void Game::processAttackCancel()
{
if(m_attackingCreature) {
m_attackingCreature->hideStaticSquare();
m_attackingCreature = nullptr;
}
}
void Game::walk(Otc::Direction direction) void Game::walk(Otc::Direction direction)
{ {
if(!m_online || !m_localPlayer->canWalk(direction) || !checkBotProtection()) if(!isOnline() || isDead() || !checkBotProtection() || !m_localPlayer->canWalk(direction))
return; return;
cancelFollow(); cancelFollow();
@ -205,14 +223,6 @@ void Game::cancelAttack()
} }
} }
void Game::onAttackCancelled()
{
if(m_attackingCreature) {
m_attackingCreature->hideStaticSquare();
m_attackingCreature = nullptr;
}
}
void Game::follow(const CreaturePtr& creature) void Game::follow(const CreaturePtr& creature)
{ {
if(!m_online || !creature || !checkBotProtection()) if(!m_online || !creature || !checkBotProtection())

View File

@ -31,20 +31,23 @@
class Game class Game
{ {
public: public:
// login/logout related
void loginWorld(const std::string& account, void loginWorld(const std::string& account,
const std::string& password, const std::string& password,
const std::string& worldHost, int worldPort, const std::string& worldHost, int worldPort,
const std::string& characterName); const std::string& characterName);
void cancelLogin(); void cancelLogin();
void logout(bool force); void logout(bool force);
void forceLogout() { logout(true); }
void cleanLogout() { logout(false); }
void processLoginError(const std::string& error); void processLoginError(const std::string& error);
void processConnectionError(const boost::system::error_code& error); void processConnectionError(const boost::system::error_code& error);
void processLogin(const LocalPlayerPtr& localPlayer); void processLogin(const LocalPlayerPtr& localPlayer);
void processLogout(); void processLogout();
void processDeath();
void processTextMessage(int type, const std::string& message); void processTextMessage(int type, const std::string& message);
void processInventoryChange(int slot, const ItemPtr& item); void processInventoryChange(int slot, const ItemPtr& item);
void processAttackCancel();
void walk(Otc::Direction direction); void walk(Otc::Direction direction);
void turn(Otc::Direction direction); void turn(Otc::Direction direction);
@ -63,7 +66,6 @@ public:
void addVip(const std::string& name); void addVip(const std::string& name);
void removeVip(int playerId); void removeVip(int playerId);
int getThingStackpos(const ThingPtr& thing); int getThingStackpos(const ThingPtr& thing);
void onAttackCancelled();
bool checkBotProtection(); bool checkBotProtection();
@ -71,6 +73,7 @@ public:
CreaturePtr getFollowingCreature() { return m_followingCreature; } CreaturePtr getFollowingCreature() { return m_followingCreature; }
bool isOnline() { return m_online; } bool isOnline() { return m_online; }
bool isDead() { return m_dead; }
void setServerBeat(int serverBeat) { m_serverBeat = serverBeat; } void setServerBeat(int serverBeat) { m_serverBeat = serverBeat; }
int getServerBeat() { return m_serverBeat; } int getServerBeat() { return m_serverBeat; }
@ -82,6 +85,7 @@ private:
LocalPlayerPtr m_localPlayer; LocalPlayerPtr m_localPlayer;
ProtocolGamePtr m_protocolGame; ProtocolGamePtr m_protocolGame;
bool m_online; bool m_online;
bool m_dead;
int m_serverBeat; int m_serverBeat;
CreaturePtr m_attackingCreature, m_followingCreature; CreaturePtr m_attackingCreature, m_followingCreature;

View File

@ -306,6 +306,7 @@ void ProtocolGame::parsePing(InputMessage&)
void ProtocolGame::parseDeath(InputMessage& msg) void ProtocolGame::parseDeath(InputMessage& msg)
{ {
msg.getU8(); // 100 is a fair death. < 100 is a unfair death. msg.getU8(); // 100 is a fair death. < 100 is a unfair death.
g_dispatcher.addEvent(std::bind(&Game::processDeath, &g_game));
} }
void ProtocolGame::parseMapDescription(InputMessage& msg) void ProtocolGame::parseMapDescription(InputMessage& msg)
@ -736,7 +737,7 @@ void ProtocolGame::parsePlayerIcons(InputMessage& msg)
void ProtocolGame::parsePlayerCancelAttack(InputMessage& msg) void ProtocolGame::parsePlayerCancelAttack(InputMessage& msg)
{ {
msg.getU32(); // unknown msg.getU32(); // unknown
g_game.onAttackCancelled(); g_dispatcher.addEvent(std::bind(&Game::processAttackCancel, &g_game));
} }
void ProtocolGame::parseCreatureSpeak(InputMessage& msg) void ProtocolGame::parseCreatureSpeak(InputMessage& msg)