local target local targetTile DoublePushConfig = { tab= "War", markHotkey="F9", triggerHotkey = "F10" } setDefaultTab(DoublePushConfig.tab) local function matchPosition(p1, p2) return (p1.x == p2.x and p1.y == p2.y) end local function isInFront(pos1, pos2) if pos1.x == pos2.x and pos1.y + 1 == pos2.y then return true elseif pos1.x == pos2.x and pos1.y - 1 == pos2.y then return true elseif pos1.y == pos2.y and pos1.x + 1 == pos2.x then return true elseif pos1.y == pos2.y and pos1.x - 1 == pos2.x then return true end return false end local function findFirstTileToPush(targetPos, targetTilePos) for i, tile in pairs(g_map.getTiles(posz())) do if tile:isWalkable() and not tile:hasCreature() then if getDistanceBetween(targetPos, tile:getPosition()) == 1 and getDistanceBetween(targetTilePos, tile:getPosition()) == 1 then if isInFront(targetPos, tile:getPosition()) then return tile end end end end end local function clearTarget() if target then for i, tile in pairs(g_map.getTiles(posz())) do tile:setText("") end target = nil end end local function clearDestination() if targetTile then targetTile:setText("") targetTile = nil end end hotkey(DoublePushConfig.triggerHotkey, "Double Push", function() if target and targetTile then if not matchPosition(target:getPosition(), targetTile:getPosition()) then local distance = getDistanceBetween(target:getPosition(), targetTile:getPosition()) if distance >= 2 then if findPath(player:getPosition(), target:getPosition(), 15, { ignoreNonPathable = false, precision = 1, ignoreCreatures = false }) then local firstTile = findFirstTileToPush(target:getPosition(), targetTile:getPosition()) if not firstTile then return end g_game.move(target, targetTile:getPosition()) schedule(200, function() g_game.move(target, firstTile:getPosition()) clearTarget() end) delay(1300) clearDestination() end elseif distance == 1 then g_game.move(target, targetTile:getPosition()) delay(1100) clearTarget() clearDestination() end end end end) local resetTimer = now local resetTiles = false onKeyDown(function(keys) if keys == DoublePushConfig.markHotkey and resetTimer == 0 then if not target then local tile = getTileUnderCursor() if tile:getCreatures()[1] then target = tile:getCreatures()[1] tile:setText("TARGET") end elseif not targetTile then local tile = getTileUnderCursor() if tile and not tile:getCreatures()[1] then targetTile = tile tile:setText("PUSH HERE") end end resetTimer = now end end) onKeyPress(function(keys) if keys == DoublePushConfig.markHotkey and (resetTimer - now) < -1000 then if target then g_map.getTile(target:getPosition()):setText("") end clearTarget() clearDestination() resetTimer = 0 else resetTimer = 0 end end) onCreaturePositionChange(function(creature, newPos, oldPos) if target then if creature:getId() == target:getId() then if oldPos and newPos then local oldTile = g_map.getTile(oldPos) local newTile = g_map.getTile(newPos) oldTile:setText("") newTile:setText("TARGET") end end end end)