some protocol changes for more compatibility

master
Eduardo Bart 12 years ago
parent 5584bfdd99
commit d586bb5e93

@ -41,7 +41,7 @@
Creature::Creature() : Thing() Creature::Creature() : Thing()
{ {
m_id = 0; m_id = 1;
m_healthPercent = 100; m_healthPercent = 100;
m_speed = 200; m_speed = 200;
m_direction = Otc::South; m_direction = Otc::South;

@ -49,6 +49,7 @@ void Game::resetGameStates()
m_safeFight = true; m_safeFight = true;
m_followingCreature = nullptr; m_followingCreature = nullptr;
m_attackingCreature = nullptr; m_attackingCreature = nullptr;
m_localPlayer = nullptr;
for(auto& it : m_containers) { for(auto& it : m_containers) {
const ContainerPtr& container = it.second; const ContainerPtr& container = it.second;
@ -76,11 +77,8 @@ void Game::processConnectionError(const boost::system::error_code& error)
void Game::processDisconnect() void Game::processDisconnect()
{ {
if(isOnline()) { if(isOnline())
m_localPlayer = nullptr;
processGameEnd(); processGameEnd();
}
if(m_protocolGame) { if(m_protocolGame) {
m_protocolGame->disconnect(); m_protocolGame->disconnect();
@ -144,28 +142,6 @@ void Game::processGMActions(const std::vector<uint8>& actions)
g_lua.callGlobalField("g_game", "onGMActions", actions); g_lua.callGlobalField("g_game", "onGMActions", actions);
} }
void Game::processPlayerStats(double health, double maxHealth,
double freeCapacity, double experience,
double level, double levelPercent,
double mana, double maxMana,
double magicLevel, double magicLevelPercent,
double soul, double stamina)
{
if(!m_localPlayer) {
logTraceError("there is no local player");
return;
}
m_localPlayer->setHealth(health, maxHealth);
m_localPlayer->setFreeCapacity(freeCapacity);
m_localPlayer->setExperience(experience);
m_localPlayer->setLevel(level, levelPercent);
m_localPlayer->setMana(mana, maxMana);
m_localPlayer->setMagicLevel(magicLevel, magicLevelPercent);
m_localPlayer->setStamina(stamina);
m_localPlayer->setSoul(soul);
}
void Game::processPing() void Game::processPing()
{ {
g_lua.callGlobalField("g_game", "onPing"); g_lua.callGlobalField("g_game", "onPing");

@ -53,13 +53,6 @@ protected:
void processDeath(int penality); void processDeath(int penality);
void processGMActions(const std::vector<uint8>& actions); void processGMActions(const std::vector<uint8>& actions);
void processPlayerStats(double health, double maxHealth,
double freeCapacity, double experience,
double level, double levelPercent,
double mana, double maxMana,
double magicLevel, double magicLevelPercent,
double soul, double stamina);
void processInventoryChange(int slot, const ItemPtr& item); void processInventoryChange(int slot, const ItemPtr& item);
void processCreatureMove(const CreaturePtr& creature, const Position& oldPos, const Position& newPos); void processCreatureMove(const CreaturePtr& creature, const Position& oldPos, const Position& newPos);
void processCreatureTeleport(const CreaturePtr& creature); void processCreatureTeleport(const CreaturePtr& creature);

@ -52,6 +52,20 @@ namespace Proto {
constexpr int ClientVersion = PROTOCOL; constexpr int ClientVersion = PROTOCOL;
constexpr int PicSignature = 0x4E119CBF; constexpr int PicSignature = 0x4E119CBF;
enum OsTypes {
OsWindows = 1,
OsLinux = 2,
OsMac = 3
};
#ifdef OSTYPE
constexpr int ClientOs = OSTYPE;
#elif defined WIN32
constexpr int ClientOs = OsWindows;
#else
constexpr int ClientOs = OsLinux;
#endif
#if PROTOCOL>=860 #if PROTOCOL>=860
constexpr int NumViolationReasons = 20; constexpr int NumViolationReasons = 20;
#elif PROTOCOL>=854 #elif PROTOCOL>=854
@ -60,13 +74,6 @@ namespace Proto {
constexpr int NumViolationReasons = 32; constexpr int NumViolationReasons = 32;
#endif #endif
enum OsTypes {
OsWindows = 1,
OsLinux = 2,
OsMac = 3,
OsBrowser = 4
};
enum LoginServerOpts { enum LoginServerOpts {
LoginServerError = 10, LoginServerError = 10,
LoginServerMotd = 20, LoginServerMotd = 20,

@ -24,6 +24,7 @@
#include <otclient/core/game.h> #include <otclient/core/game.h>
#include <otclient/core/player.h> #include <otclient/core/player.h>
#include <otclient/core/item.h> #include <otclient/core/item.h>
#include <otclient/core/localplayer.h>
void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName) void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName)
{ {
@ -43,6 +44,9 @@ void ProtocolGame::onConnect()
{ {
recv(); recv();
// must create local player before parsing anything
m_localPlayer = LocalPlayerPtr(new LocalPlayer);
#if PROTOCOL>=854 #if PROTOCOL>=854
m_waitingLoginPacket = true; m_waitingLoginPacket = true;
#else #else

@ -196,6 +196,7 @@ private:
private: private:
Boolean<false> m_waitingLoginPacket; Boolean<false> m_waitingLoginPacket;
Boolean<true> m_firstPacket;
std::string m_accountName; std::string m_accountName;
std::string m_accountPassword; std::string m_accountPassword;
std::string m_characterName; std::string m_characterName;

@ -42,6 +42,12 @@ void ProtocolGame::parseMessage(InputMessage& msg)
while(!msg.eof()) { while(!msg.eof()) {
opcode = msg.getU8(); opcode = msg.getU8();
if(m_firstPacket) {
if(opcode != Proto::GameServerInitGame)
logWarning("first server network opcode is not GameServerInitGame");
m_firstPacket = false;
}
switch(opcode) { switch(opcode) {
case Proto::GameServerInitGame: case Proto::GameServerInitGame:
parseInitGame(msg); parseInitGame(msg);
@ -271,7 +277,7 @@ void ProtocolGame::parseMessage(InputMessage& msg)
parseExtendedOpcode(msg); parseExtendedOpcode(msg);
break; break;
default: default:
Fw::throwException("unknown opcode ", opcode, ", previous opcode is ", prevOpcode); Fw::throwException("unknown opcode");
break; break;
} }
prevOpcode = opcode; prevOpcode = opcode;
@ -287,9 +293,7 @@ void ProtocolGame::parseInitGame(InputMessage& msg)
int serverBeat = msg.getU16(); int serverBeat = msg.getU16();
bool canReportBugs = msg.getU8(); bool canReportBugs = msg.getU8();
m_localPlayer = LocalPlayerPtr(new LocalPlayer);
m_localPlayer->setId(playerId); m_localPlayer->setId(playerId);
g_game.processGameStart(m_localPlayer, serverBeat, canReportBugs); g_game.processGameStart(m_localPlayer, serverBeat, canReportBugs);
} }
@ -595,7 +599,12 @@ void ProtocolGame::parseWorldLight(InputMessage& msg)
void ProtocolGame::parseMagicEffect(InputMessage& msg) void ProtocolGame::parseMagicEffect(InputMessage& msg)
{ {
Position pos = parsePosition(msg); Position pos = parsePosition(msg);
#if PROTOCOL>=854
// newer tibia decreased the max effects number, why???
int effectId = msg.getU8(); int effectId = msg.getU8();
#else
int effectId = msg.getU16();
#endif
EffectPtr effect = EffectPtr(new Effect()); EffectPtr effect = EffectPtr(new Effect());
effect->setId(effectId); effect->setId(effectId);
@ -781,12 +790,14 @@ void ProtocolGame::parsePlayerStats(InputMessage& msg)
double soul = msg.getU8(); double soul = msg.getU8();
double stamina = msg.getU16(); double stamina = msg.getU16();
g_game.processPlayerStats(health, maxHealth, m_localPlayer->setHealth(health, maxHealth);
freeCapacity, experience, m_localPlayer->setFreeCapacity(freeCapacity);
level, levelPercent, m_localPlayer->setExperience(experience);
mana, maxMana, m_localPlayer->setLevel(level, levelPercent);
magicLevel, magicLevelPercent, m_localPlayer->setMana(mana, maxMana);
soul, stamina); m_localPlayer->setMagicLevel(magicLevel, magicLevelPercent);
m_localPlayer->setStamina(stamina);
m_localPlayer->setSoul(soul);
} }
void ProtocolGame::parsePlayerSkills(InputMessage& msg) void ProtocolGame::parsePlayerSkills(InputMessage& msg)

@ -28,13 +28,7 @@ void ProtocolGame::sendLoginPacket(uint timestamp, uint8 unknown)
OutputMessage msg; OutputMessage msg;
msg.addU8(Proto::ClientEnterGame); msg.addU8(Proto::ClientEnterGame);
msg.addU16(Proto::ClientOs);
#ifdef WIN32
msg.addU16(Proto::OsWindows);
#else
msg.addU16(Proto::OsLinux);
#endif
msg.addU16(Proto::ClientVersion); msg.addU16(Proto::ClientVersion);
int paddingBytes = 128; int paddingBytes = 128;

@ -86,11 +86,7 @@ void ProtocolLogin::sendLoginPacket()
OutputMessage msg; OutputMessage msg;
msg.addU8(Proto::ClientEnterAccount); msg.addU8(Proto::ClientEnterAccount);
#ifdef WIN32 msg.addU16(Proto::ClientOs);
msg.addU16(Proto::OsWindows);
#else
msg.addU16(Proto::OsLinux);
#endif
msg.addU16(Proto::ClientVersion); msg.addU16(Proto::ClientVersion);
msg.addU32(g_thingsType.getSignature()); // data signature msg.addU32(g_thingsType.getSignature()); // data signature

Loading…
Cancel
Save