waiting list, u16 effects feature, protocolsend uses clientversion

This commit is contained in:
Henrique Santiago 2012-06-05 20:46:36 -03:00
parent 3cb5216858
commit 86cade0aa9
5 changed files with 124 additions and 15 deletions

View File

@ -5,21 +5,9 @@ local charactersWindow
local loadBox local loadBox
local characterList local characterList
local errorBox local errorBox
local waitingWindow
-- private functions -- private functions
local function onCharactersWindowKeyPress(self, keyCode, keyboardModifiers)
if keyboardModifiers == KeyboardNoModifier then
if keyCode == KeyUp then
characterList:focusPreviousChild(KeyboardFocusReason)
return true
elseif keyCode == KeyDown or keyCode == KeyTab then
characterList:focusNextChild(KeyboardFocusReason)
return true
end
end
return false
end
local function tryLogin(charInfo, tries) local function tryLogin(charInfo, tries)
tries = tries or 1 tries = tries or 1
@ -53,6 +41,67 @@ local function tryLogin(charInfo, tries)
Settings.set('lastUsedCharacter', charInfo.characterName) Settings.set('lastUsedCharacter', charInfo.characterName)
end end
local function updateWait()
if waitingWindow then
if waitingWindow.elapsedTime <= waitingWindow.totalTime then
local percent = (waitingWindow.elapsedTime / waitingWindow.totalTime) * 100
local timeStr = string.format("%.0f", (waitingWindow.totalTime - waitingWindow.elapsedTime))
local progressBar = waitingWindow:getChildById('progressBar')
progressBar:setPercent(percent)
local label = waitingWindow:getChildById('timeLabel')
label:setText('Trying to reconnect in ' .. timeStr .. ' seconds.')
waitingWindow.elapsedTime = waitingWindow.elapsedTime + (waitingWindow.totalTime / 100)
scheduleEvent(updateWait, (waitingWindow.totalTime / 100) * 1000)
end
end
end
local function resendWait()
if waitingWindow then
waitingWindow:destroy()
waitingWindow = nil
if charactersWindow then
local selected = charactersWindow:getChildById('characterList'):getFocusedChild()
if selected then
local charInfo = { worldHost = selected.worldHost,
worldPort = selected.worldPort,
characterName = selected.characterName }
tryLogin(charInfo)
end
end
end
end
local function onLoginWait(message, time)
waitingWindow = displayUI('waitinglist.otui')
local label = waitingWindow:getChildById('infoLabel')
label:setText(message)
waitingWindow.elapsedTime = 0
waitingWindow.totalTime = time
scheduleEvent(updateWait, 0)
scheduleEvent(resendWait, time * 1000)
end
local function onCharactersWindowKeyPress(self, keyCode, keyboardModifiers)
if keyboardModifiers == KeyboardNoModifier then
if keyCode == KeyUp then
characterList:focusPreviousChild(KeyboardFocusReason)
return true
elseif keyCode == KeyDown or keyCode == KeyTab then
characterList:focusNextChild(KeyboardFocusReason)
return true
end
end
return false
end
function onGameLoginError(message) function onGameLoginError(message)
CharacterList.destroyLoadBox() CharacterList.destroyLoadBox()
errorBox = displayErrorBox(tr("Login Error"), message) errorBox = displayErrorBox(tr("Login Error"), message)
@ -80,6 +129,7 @@ function CharacterList.init()
connect(g_game, { onLoginError = onGameLoginError }) connect(g_game, { onLoginError = onGameLoginError })
connect(g_game, { onConnectionError = onGameConnectionError }) connect(g_game, { onConnectionError = onGameConnectionError })
connect(g_game, { onGameStart = CharacterList.destroyLoadBox }) connect(g_game, { onGameStart = CharacterList.destroyLoadBox })
connect(g_game, { onLoginWait = onLoginWait })
connect(g_game, { onGameEnd = CharacterList.showAgain }) connect(g_game, { onGameEnd = CharacterList.showAgain })
if G.characters then if G.characters then
@ -91,6 +141,7 @@ function CharacterList.terminate()
disconnect(g_game, { onLoginError = onGameLoginError }) disconnect(g_game, { onLoginError = onGameLoginError })
disconnect(g_game, { onConnectionError = onGameConnectionError }) disconnect(g_game, { onConnectionError = onGameConnectionError })
disconnect(g_game, { onGameStart = CharacterList.destroyLoadBox }) disconnect(g_game, { onGameStart = CharacterList.destroyLoadBox })
disconnect(g_game, { onLoginWait = onLoginWait })
disconnect(g_game, { onGameEnd = CharacterList.showAgain }) disconnect(g_game, { onGameEnd = CharacterList.showAgain })
characterList = nil characterList = nil
charactersWindow:destroy() charactersWindow:destroy()
@ -189,3 +240,12 @@ function CharacterList.destroyLoadBox()
loadBox = nil loadBox = nil
end end
end end
function CharacterList.cancelWait()
if waitingWindow then
waitingWindow:destroy()
waitingWindow = nil
CharacterList.destroyLoadBox()
CharacterList.showAgain()
end
end

View File

@ -0,0 +1,44 @@
MainWindow
id: waitingWindow
!text: tr('Waiting List')
size: 260 160
@onEscape: CharacterList.cancelWait()
Label
id: infoLabel
anchors.top: parent.top
anchors.bottom: progressBar.top
anchors.left: parent.left
anchors.right: parent.right
text-wrap: true
ProgressBar
id: progressBar
height: 15
background-color: #4444ff
anchors.bottom: timeLabel.top
anchors.left: parent.left
anchors.right: parent.right
margin-bottom: 10
Label
id: timeLabel
anchors.bottom: separator.bottom
anchors.left: parent.left
anchors.right: parent.right
margin-bottom: 10
HorizontalSeparator
id: separator
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: next.top
margin-bottom: 10
Button
id: buttonCancel
!text: tr('Cancel')
width: 64
anchors.right: parent.right
anchors.bottom: parent.bottom
@onClick: CharacterList.cancelWait()

View File

@ -312,6 +312,7 @@ namespace Otc
GameItemAnimationPhase, GameItemAnimationPhase,
GameTrucatedPingOpcode, GameTrucatedPingOpcode,
GameReverseCreatureStack, GameReverseCreatureStack,
GameMagicEffectU16,
LastGameFeature LastGameFeature
}; };
} }

View File

@ -659,7 +659,11 @@ void ProtocolGame::parseWorldLight(const InputMessagePtr& msg)
void ProtocolGame::parseMagicEffect(const InputMessagePtr& msg) void ProtocolGame::parseMagicEffect(const InputMessagePtr& msg)
{ {
Position pos = getPosition(msg); Position pos = getPosition(msg);
int effectId = msg->getU8(); int effectId;
if(g_game.getFeature(Otc::GameMagicEffectU16))
effectId = msg->getU16();
else
effectId = msg->getU8();
EffectPtr effect = EffectPtr(new Effect()); EffectPtr effect = EffectPtr(new Effect());
effect->setId(effectId); effect->setId(effectId);

View File

@ -50,7 +50,7 @@ void ProtocolGame::sendLoginPacket(uint challangeTimestamp, uint8 challangeRando
msg->addU8(Proto::ClientEnterGame); msg->addU8(Proto::ClientEnterGame);
msg->addU16(Proto::ClientOs); msg->addU16(Proto::ClientOs);
msg->addU16(Proto::ClientVersion); msg->addU16(g_game.getClientVersion());
int paddingBytes = 128; int paddingBytes = 128;
msg->addU8(0); // first RSA byte must be 0 msg->addU8(0); // first RSA byte must be 0