Just got it…
def check_connection
recv # receive packets
case @state
when STATE_NOT_CONNECTED
reconnect
when STATE_CONNECTED_TO_LOGIN
@packets.pop do |packet|
case packet
when Com::AnkamaGames::Dofus::Network::Messages::Handshake::ProtocolRequired
if packet.requiredVersion > $config.protocol_build
log("Current protocol build: #{$config.protocol_build}, required build: #{packet.requiredVersion}", Logger::FATAL)
end
if packet.currentVersion < $config.protocol_required_build
log("Current protocol build: #{$config.protocol_required_build}, is too new for the server version: #{packet.currentVersion}", Logger::FATAL)
end
when HelloConnectMessage
$config.session_key = packet.sessionKey
im = IdentificationMessage.new
bytes = im.build!({
username: $config.username,
password: $config.password,
version: $config.version,
session_key: $config.session_key
})
send_data bytes
when Com::AnkamaGames::Dofus::Network::Messages::Queues::LoginQueueStatusMessage
l("Position in login queue: #{packet.position} / #{packet.total}")
when IdentificationSuccessMessage
l('Authentification successful', Logger::OK)
@state = STATE_SERVERS_LIST
else
l("Incorrect packet at $net.STATE_CONNECTED_TO_LOGIN: #{packet.class}", Logger::FATAL)
end
end
when STATE_SERVERS_LIST
@packets.pop do |packet|
case packet
when ServersListMessage
if !$config.server_id
"Select server:".to_block(10) {
packet.servers.select { |s| s.status == s.class::STATUS_ONLINE }.each do |s|
printf("%5d %s %d %s\n", s.id, "-", s.charactersCount, s.status_t)
end
}
while line = gets do
line.strip!
next if line.empty?
exit if line.to_i == 0
server = packet.servers.find { |s| s.id == line.to_i }
next unless server
$config.server_id = server.id
break
end
end
ssm = ServerSelectionMessage.new.build!($config.server_id)
send_data ssm
when SelectedServerDataMessage
@ip = packet.address
@port = packet.port
$config.ticket = packet.ticket
reconnect
@state = STATE_CONNECTED_TO_GAME
else
l("Incorrect packet at $net.STATE_SERVERS_LIST: #{packet.class}", Logger::FATAL)
end
end
when STATE_CONNECTED_TO_GAME
@packets.pop do |packet|
case packet
when Com::AnkamaGames::Dofus::Network::Messages::Handshake::ProtocolRequired
if packet.requiredVersion > $config.protocol_build
log("Current protocol build: #{$config.protocol_build}, required build: #{packet.requiredVersion}", Logger::FATAL)
end
if packet.currentVersion < $config.protocol_required_build
log("Current protocol build: #{$config.protocol_required_build}, is too new for the server version: #{packet.currentVersion}", Logger::FATAL)
end
when HelloGameMessage
atm = AuthenticationTicketMessage.new.build!('en', $config.ticket)
send_data atm
when AuthenticationTicketAcceptedMessage
l("Ticket accepted", Logger::OK)
when Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicTimeMessage
# nothing to do, just ignore
when Com::AnkamaGames::Dofus::Network::Messages::Game::Approach::AccountCapabilitiesMessage
$config.account_id = packet.account_id
clrm = Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharactersListRequestMessage.new.build!
send_data clrm
@state = STATE_CHARACTER_SELECTION
else
l("Incorrect packet at $net.STATE_CONNECTED_TO_GAME: #{packet.class}", Logger::FATAL)
end
end
when STATE_CHARACTER_SELECTION
@packets.pop do |packet|
case packet
when Com::AnkamaGames::Dofus::Network::Messages::Queues::QueueStatusMessage
l("Position in character selection queue: #{packet.position} / #{packet.total}")
when Com::AnkamaGames::Dofus::Network::Messages::Secure::TrustStatusMessage,
Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicNoOperationMessage
# nothing to do, ignore
when Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharactersListMessage
characters = packet.characters
if !$config.character_id && characters.size > 0
puts "Choose your character:"
fields = sprintf("%20s | %5s | %5s | %6s", 'Name', 'Level', 'Class', 'Sex')
puts fields, '-' * fields.size
characters.each do |c|
puts sprintf("%20s | %5d | %5d | %6s", c.name, c.level, c.breed, c.sex ? 'Male' : 'Female')
end
while line = gets do
line.strip!
break if line.empty?
character = characters.find { |c| c.name.downcase == line.downcase }
next unless character
$config.character_id = character.id
break
end
csm = Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharacterSelectionMessage.new.build!($config.character_id)
send_data csm
@state = STATE_IN_GAME
elsif characters.size == 0
l("No character created", Logger::FATAL)
exit
end
else
l("Incorrect packet at $net.STATE_CHARACTER_SELECTION: #{packet.class}", Logger::FATAL)
end
end
when STATE_IN_GAME
else
l("Unknown state #{state} for $net", Logger::FATAL);
exit
end
end
Output
[user host-122 ~/Documents/Projects/dofus] ./run.rb
[ INFO] [D2O] Parsing Servers.d2o
[ INFO] Connected
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Handshake::ProtocolRequired
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::HelloConnectMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::IdentificationMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::IdentificationSuccessMessage
[ OK] Authentification successful
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::ServersListMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::ServerSelectionMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Connection::SelectedServerDataMessage
[ INFO] Connected
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Handshake::ProtocolRequired
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Approach::HelloGameMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Approach::AuthenticationTicketMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Approach::AuthenticationTicketAcceptedMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicTimeMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Approach::AccountCapabilitiesMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Secure::TrustStatusMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicNoOperationMessage
[ OK] Ticket accepted
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharactersListRequestMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Queues::QueueStatusMessage
[ INFO] Position in character selection queue: 1 / 1
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Queues::QueueStatusMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicNoOperationMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Queues::QueueStatusMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharactersListMessage
[ INFO] Position in character selection queue: 0 / 0
[ INFO] Position in character selection queue: 0 / 0
Choose your character:
Name | Level | Class | Sex
---------------------------------------------
Char1 | 2 | 5 | Male
Char2 | 4 | 3 | Female
Char3 | 19 | 9 | Female
Char1
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharacterSelectionMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::BasicNoOperationMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Context::Notification::NotificationListMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Character::Choice::CharacterSelectedSuccessMessage
[ INFO] Selected character: [------] Char1 (2)
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Inventory::Items::InventoryContentMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Inventory::Items::SetUpdateMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Shortcut::ShortcutBarContentMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Shortcut::ShortcutBarContentMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Context::Roleplay::Emote::EmoteListMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Pvp::AlignmentRankUpdateMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Pvp::AlignmentSubAreasListMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Chat::Channel::EnabledChannelsMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Inventory::Spells::SpellListMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Shortcut::ShortcutBarContentMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Initialization::SetCharacterRestrictionsMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Inventory::Items::InventoryWeightMessage
[ INFO] Character weight: 14 / 1000
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Friend::FriendWarnOnConnectionStateMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Friend::GuildMemberWarnOnConnectionStateMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Friend::FriendWarnOnLevelGainStateMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::TextInformationMessage
[ WARN] Check Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::TextInformationMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::TextInformationMessage
[ WARN] Check Com::AnkamaGames::Dofus::Network::Messages::Game::Basic::TextInformationMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Initialization::ServerExperienceModificatorMessage
[DEBUG] Com::AnkamaGames::Dofus::Network::Messages::Game::Friend::SpouseStatusMessage
P.S. Please don’t blame my ugly code :)