More walk control optimization and fixes:
* Finished off the walking control optimization! (Should be smooth controlling now). * Fixed issue #151 * Fixed an issue with the character list. * Fixed a bug in the g_keyboard.isKeySetPressed function.
This commit is contained in:
parent
1782de7336
commit
abf0ee4303
|
@ -231,17 +231,13 @@ function CharacterList.create(characters, account, otui)
|
|||
end
|
||||
|
||||
function CharacterList.destroy()
|
||||
charactersWindow:hide()
|
||||
CharacterList.hide(true)
|
||||
|
||||
if charactersWindow then
|
||||
characterList = nil
|
||||
charactersWindow:destroy()
|
||||
charactersWindow = nil
|
||||
end
|
||||
|
||||
if EnterGame and not g_game.isOnline() then
|
||||
EnterGame.show()
|
||||
end
|
||||
end
|
||||
|
||||
function CharacterList.show()
|
||||
|
@ -252,8 +248,13 @@ function CharacterList.show()
|
|||
end
|
||||
end
|
||||
|
||||
function CharacterList.hide()
|
||||
function CharacterList.hide(showLogin)
|
||||
showLogin = showLogin or false
|
||||
charactersWindow:hide()
|
||||
|
||||
if showLogin and EnterGame and not g_game.isOnline() then
|
||||
EnterGame.show()
|
||||
end
|
||||
end
|
||||
|
||||
function CharacterList.showAgain()
|
||||
|
|
|
@ -46,7 +46,7 @@ MainWindow
|
|||
size: 250 248
|
||||
visible: false
|
||||
@onEnter: CharacterList.doLogin()
|
||||
@onEscape: CharacterList.hide()
|
||||
@onEscape: CharacterList.hide(true)
|
||||
@onSetup: |
|
||||
g_keyboard.bindKeyPress('Up', function() self:getChildById('characters'):focusPreviousChild(KeyboardFocusReason) end, self)
|
||||
g_keyboard.bindKeyPress('Down', function() self:getChildById('characters'):focusNextChild(KeyboardFocusReason) end, self)
|
||||
|
@ -113,4 +113,4 @@ MainWindow
|
|||
width: 64
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
@onClick: CharacterList.destroy()
|
||||
@onClick: CharacterList.hide(true)
|
||||
|
|
|
@ -196,9 +196,9 @@ function g_keyboard.isKeySetPressed(keys, all)
|
|||
local result = {}
|
||||
for k,v in pairs(keys) do
|
||||
if type(v) == 'string' then
|
||||
key = getKeyCode(v)
|
||||
v = getKeyCode(v)
|
||||
end
|
||||
if g_window.isKeyPressed(key) then
|
||||
if g_window.isKeyPressed(v) then
|
||||
if not all then
|
||||
return true
|
||||
end
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
WALK_AUTO_REPEAT_DELAY = 80
|
||||
WALK_AUTO_REPEAT_DELAY = 150
|
||||
|
||||
gameRootPanel = nil
|
||||
gameMapPanel = nil
|
||||
|
@ -14,7 +14,7 @@ bottomSplitter = nil
|
|||
|
||||
lastWalkDir = nil
|
||||
arrowKeys = {
|
||||
[North] = "Up",
|
||||
[North] = 'Up',
|
||||
[South] = 'Down',
|
||||
[East] = 'Right',
|
||||
[West] = 'Left',
|
||||
|
@ -182,7 +182,6 @@ function tryLogout()
|
|||
end
|
||||
|
||||
function smartWalk(defaultDir)
|
||||
--[[ TODO: Add walk event stack ]]
|
||||
local rebindKey = false
|
||||
local lastKey = arrowKeys[lastWalkDir]
|
||||
|
||||
|
@ -229,11 +228,7 @@ function smartWalk(defaultDir)
|
|||
g_game.forceWalk(dir)
|
||||
end
|
||||
else
|
||||
--if g_game.getLocalPlayer():canWalk(dir) then
|
||||
g_game.walk(dir)
|
||||
--else
|
||||
|
||||
--end
|
||||
end
|
||||
|
||||
if rebindKey then
|
||||
|
@ -284,7 +279,7 @@ function onUseWith(clickedWidget, mousePosition)
|
|||
if clickedWidget:getClassName() == 'UIMap' then
|
||||
local tile = clickedWidget:getTile(mousePosition)
|
||||
if tile then
|
||||
g_game.useWith(selectedThing, tile:getTopMultiUseThing())
|
||||
g_game.useWith(selectedThing, tile:getTopMultiUseThing(false))
|
||||
end
|
||||
elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then
|
||||
g_game.useWith(selectedThing, clickedWidget:getItem())
|
||||
|
|
|
@ -89,6 +89,8 @@ public:
|
|||
Position getLastStepFromPosition() { return m_lastStepFromPosition; }
|
||||
Position getLastStepToPosition() { return m_lastStepToPosition; }
|
||||
float getStepProgress() { return m_walkTimer.ticksElapsed() / getStepDuration(); }
|
||||
float getStepTicksLeft() { return getStepDuration() - m_walkTimer.ticksElapsed(); }
|
||||
ticks_t getWalkTicksElapsed() { return m_walkTimer.ticksElapsed(); }
|
||||
double getSpeedFormula(Otc::SpeedFormula formula) { return m_speedFormula[formula]; }
|
||||
bool hasSpeedFormula();
|
||||
std::array<double, Otc::LastSpeedFormula> getSpeedFormulaArray() { return m_speedFormula; }
|
||||
|
|
|
@ -76,6 +76,11 @@ void Game::resetGameStates()
|
|||
m_pingEvent = nullptr;
|
||||
}
|
||||
|
||||
if(m_walkEvent) {
|
||||
m_walkEvent->cancel();
|
||||
m_walkEvent = nullptr;
|
||||
}
|
||||
|
||||
m_containers.clear();
|
||||
m_vips.clear();
|
||||
m_gmActions.clear();
|
||||
|
@ -501,8 +506,21 @@ bool Game::walk(Otc::Direction direction)
|
|||
return false;
|
||||
}
|
||||
|
||||
if(!m_localPlayer->canWalk(direction))
|
||||
// must add a new walk event
|
||||
if(!m_localPlayer->canWalk(direction)) {
|
||||
if(m_lastWalkDir != direction) {
|
||||
float ticks = m_localPlayer->getStepTicksLeft();
|
||||
if(ticks < 0)
|
||||
ticks = 0;
|
||||
|
||||
if(m_walkEvent) {
|
||||
m_walkEvent->cancel();
|
||||
m_walkEvent = nullptr;
|
||||
}
|
||||
m_walkEvent = g_dispatcher.scheduleEvent([=] { walk(direction); }, ticks);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Position toPos = m_localPlayer->getPosition().translatedToDirection(direction);
|
||||
TilePtr toTile = g_map.getTile(toPos);
|
||||
|
@ -546,6 +564,7 @@ bool Game::walk(Otc::Direction direction)
|
|||
g_lua.callGlobalField("g_game", "onWalk", direction);
|
||||
|
||||
forceWalk(direction);
|
||||
m_lastWalkDir = direction;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -307,6 +307,7 @@ private:
|
|||
uint m_seq;
|
||||
Otc::FightModes m_fightMode;
|
||||
Otc::ChaseModes m_chaseMode;
|
||||
Otc::Direction m_lastWalkDir;
|
||||
bool m_safeFight;
|
||||
bool m_canReportBugs;
|
||||
std::vector<uint8> m_gmActions;
|
||||
|
@ -314,6 +315,7 @@ private:
|
|||
std::string m_worldName;
|
||||
std::bitset<Otc::LastGameFeature> m_features;
|
||||
ScheduledEventPtr m_pingEvent;
|
||||
ScheduledEventPtr m_walkEvent;
|
||||
int m_protocolVersion;
|
||||
int m_clientVersion;
|
||||
};
|
||||
|
|
|
@ -364,6 +364,10 @@ void OTClient::registerLuaFunctions()
|
|||
g_lua.bindClassMemberFunction<Creature>("setOutfit", &Creature::setOutfit);
|
||||
g_lua.bindClassMemberFunction<Creature>("getOutfit", &Creature::getOutfit);
|
||||
g_lua.bindClassMemberFunction<Creature>("getDirection", &Creature::getDirection);
|
||||
g_lua.bindClassMemberFunction<Creature>("getStepDuration", &Creature::getStepDuration);
|
||||
g_lua.bindClassMemberFunction<Creature>("getStepProgress", &Creature::getStepProgress);
|
||||
g_lua.bindClassMemberFunction<Creature>("getWalkTicksElapsed", &Creature::getWalkTicksElapsed);
|
||||
g_lua.bindClassMemberFunction<Creature>("getStepTicksLeft", &Creature::getStepTicksLeft);
|
||||
g_lua.bindClassMemberFunction<Creature>("setDirection", &Creature::setDirection);
|
||||
g_lua.bindClassMemberFunction<Creature>("setSkullTexture", &Creature::setSkullTexture);
|
||||
g_lua.bindClassMemberFunction<Creature>("setShieldTexture", &Creature::setShieldTexture);
|
||||
|
|
|
@ -433,15 +433,17 @@ ThingPtr Tile::getTopMoveThing()
|
|||
return m_things[0];
|
||||
}
|
||||
|
||||
ThingPtr Tile::getTopMultiUseThing()
|
||||
ThingPtr Tile::getTopMultiUseThing(bool ignoreCreature)
|
||||
{
|
||||
// this is related to classic controls, getting top item, forceuse or creature
|
||||
// this is related to classic controls, getting top item, forceuse for creature
|
||||
if(isEmpty())
|
||||
return nullptr;
|
||||
|
||||
for(uint i = 0; i < m_things.size(); ++i) {
|
||||
ThingPtr thing = m_things[i];
|
||||
if(thing->isForceUse() || (!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop() && !thing->isCreature())) {
|
||||
if(thing->isForceUse() || (!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop())) {
|
||||
if(thing->isCreature() && ignoreCreature)
|
||||
continue;
|
||||
if(i > 0 && thing->isSplash())
|
||||
return m_things[i-1];
|
||||
return thing;
|
||||
|
@ -450,9 +452,12 @@ ThingPtr Tile::getTopMultiUseThing()
|
|||
|
||||
for(uint i = 0; i < m_things.size(); ++i) {
|
||||
ThingPtr thing = m_things[i];
|
||||
if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop() && !thing->isCreature())
|
||||
if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop()) {
|
||||
if(thing->isCreature() && ignoreCreature)
|
||||
continue;
|
||||
return thing;
|
||||
}
|
||||
}
|
||||
|
||||
return m_things[0];
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ public:
|
|||
ThingPtr getTopUseThing();
|
||||
CreaturePtr getTopCreature();
|
||||
ThingPtr getTopMoveThing();
|
||||
ThingPtr getTopMultiUseThing();
|
||||
ThingPtr getTopMultiUseThing(bool ignoreCreature = true);
|
||||
|
||||
const Position& getPosition() { return m_position; }
|
||||
int getDrawElevation() { return m_drawElevation; }
|
||||
|
|
Loading…
Reference in New Issue