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