• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Problem with doors actionId

Joined
Jul 18, 2014
Messages
193
Solutions
2
Reaction score
15
Hi, i want to edit the doors.lua script. My script is about storages in actionId's, and if you have the actionId (storage) with value 1 or higher, you can enter, but if you dont have it, you cant enter. So, i want to edit it putting an exception about some actionid's. For example, if the door haves the actionId 12279 or 12702 or 12278, you cant pass through the door because you need necessarily the storage with value 1 or higher, but if the door doesn't have any of those actionid's, you can pass without problem.

This is the original script:
Code:
unlockedDoors = { }

local function isDoorLocked(keyId, position)
    if keyId == 0 then
        return false
    end

    if unlockedDoors[keyId] then
        for i = 1, #unlockedDoors[keyId] do
            if position == unlockedDoors[keyId][i] then
                return false
            end
        end
    end

    return true
end

local function toggleDoorLock(doorItem, locked)
    local doorId = doorItem:getId()
    local keyId = doorItem:getActionId()
    local doorPosition = doorItem:getPosition()

    if locked then
        for i = #unlockedDoors[keyId], 1, -1 do
            if unlockedDoors[keyId][i] == doorPosition then
                table.remove(unlockedDoors[keyId], i)
            end
        end

        if not doors[doorId] then
            doorItem:transform(doorId - 1)
        end
        return
    end

    if not unlockedDoors[keyId] then
        unlockedDoors[keyId] = {}
    end

    doorItem:transform(doors[doorId])
    unlockedDoors[keyId][#unlockedDoors[keyId] + 1] = doorPosition
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local itemId, actionId = item:getId(), item:getActionId()
    if isInArray(questDoors, itemId) then
        if player:getStorageValue(actionId) ~= -1 then
            item:transform(itemId + 1)
            player:teleportTo(toPosition, true)
        else
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The door seems to be sealed against unwanted intruders.")
        end
        return true

    elseif isInArray(levelDoors, itemId) then
        if actionId > 0 and player:getLevel() >= actionId - 1000 then
            item:transform(itemId + 1)
            player:teleportTo(toPosition, true)
        else
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Only the worthy may pass.")
        end
        return true

    elseif isInArray(keys, itemId) then
        if not target
                or not target:isItem()
                or not target:getType():isDoor()
                or Tile(toPosition):getHouse() then
            return false
        end

        local targetId = target:getId()
        if isInArray(openSpecialDoors, targetId)
                or isInArray(questDoors, targetId)
                or isInArray(levelDoors, targetId) then
            return false
        end

        local targetActionId = target:getActionId()
        if targetActionId > 0 and actionId == targetActionId then
            if not isDoorLocked(targetActionId, toPosition) then
                toggleDoorLock(target, true)
            elseif doors[targetId] then
                toggleDoorLock(target, false)
            end
        else
            player:sendCancelMessage("The key does not match.")
        end

        return true
    end

    if isInArray(horizontalOpenDoors, itemId) or isInArray(verticalOpenDoors, itemId) then
        local doorCreature = Tile(toPosition):getTopCreature()
        if doorCreature then
            toPosition.x = toPosition.x + 1
            local query = Tile(toPosition):queryAdd(doorCreature, bit.bor(FLAG_IGNOREBLOCKCREATURE, FLAG_PATHFINDING))
            if query ~= RETURNVALUE_NOERROR then
                toPosition.x = toPosition.x - 1
                toPosition.y = toPosition.y + 1
                query = Tile(toPosition):queryAdd(doorCreature, bit.bor(FLAG_IGNOREBLOCKCREATURE, FLAG_PATHFINDING))
            end

            if query ~= RETURNVALUE_NOERROR then
                player:sendCancelMessage(query)
                return true
            end

            doorCreature:teleportTo(toPosition, true)
        end
        if not isInArray(openSpecialDoors, itemId) then
            item:transform(itemId - 1)
        end
        return true
    end

    if doors[itemId] then
        if not isDoorLocked(actionId, toPosition) then
            item:transform(doors[itemId])
        else
            player:sendTextMessage(MESSAGE_INFO_DESCR, "It is locked.")
        end
        return true
    end

    return false
end

And this is my modified script:
Code:
unlockedDoors = { }

local function isDoorLocked(keyId, position)
    if keyId == 0 then
        return false
    end

    if unlockedDoors[keyId] then
        for i = 1, #unlockedDoors[keyId] do
            if position == unlockedDoors[keyId][i] then
                return false
            end
        end
    end

    return true
end

local function toggleDoorLock(doorItem, locked)
    local doorId = doorItem:getId()
    local keyId = doorItem:getActionId()
    local doorPosition = doorItem:getPosition()

    if locked then
        for i = #unlockedDoors[keyId], 1, -1 do
            if unlockedDoors[keyId][i] == doorPosition then
                table.remove(unlockedDoors[keyId], i)
            end
        end

        if not doors[doorId] then
            doorItem:transform(doorId - 1)
        end
        return
    end

    if not unlockedDoors[keyId] then
        unlockedDoors[keyId] = {}
    end

    doorItem:transform(doors[doorId])
    unlockedDoors[keyId][#unlockedDoors[keyId] + 1] = doorPosition
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local itemId, actionId = item:getId(), item:getActionId()
  -- I MODIFIED FROM HERE
  if isInArray(questDoors, itemId) then
    local ids = {
    [12279] = {enterfree = true}
    }
        if player:getStorageValue(ids[item.actionid]) >= 1 then
            item:transform(itemId + 1)
            player:teleportTo(toPosition, true)
        else
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The door seems to be sealed against unwanted intruders.")
        end
        if player:getStorageValue(actionId) == -1 or player:getStorageValue(actionId) == 1 then
            item:transform(itemId + 1)
            player:teleportTo(toPosition, true)
        else
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The door seems to be sealed against unwanted intruders.")
        end
-- TO HERE

    elseif isInArray(levelDoors, itemId) then
        if actionId > 0 and player:getLevel() >= actionId - 1000 then
            item:transform(itemId + 1)
            player:teleportTo(toPosition, true)
        else
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Only the worthy may pass.")
        end
        return true

    elseif isInArray(keys, itemId) then
        if not target
                or not target:isItem()
                or not target:getType():isDoor()
                or Tile(toPosition):getHouse() then
            return false
        end

        local targetId = target:getId()
        if isInArray(openSpecialDoors, targetId)
                or isInArray(questDoors, targetId)
                or isInArray(levelDoors, targetId) then
            return false
        end

        local targetActionId = target:getActionId()
        if targetActionId > 0 and actionId == targetActionId then
            if not isDoorLocked(targetActionId, toPosition) then
                toggleDoorLock(target, true)
            elseif doors[targetId] then
                toggleDoorLock(target, false)
            end
        else
            player:sendCancelMessage("The key does not match.")
        end

        return true
    end

    if isInArray(horizontalOpenDoors, itemId) or isInArray(verticalOpenDoors, itemId) then
        local doorCreature = Tile(toPosition):getTopCreature()
        if doorCreature then
            toPosition.x = toPosition.x + 1
            local query = Tile(toPosition):queryAdd(doorCreature, bit.bor(FLAG_IGNOREBLOCKCREATURE, FLAG_PATHFINDING))
            if query ~= RETURNVALUE_NOERROR then
                toPosition.x = toPosition.x - 1
                toPosition.y = toPosition.y + 1
                query = Tile(toPosition):queryAdd(doorCreature, bit.bor(FLAG_IGNOREBLOCKCREATURE, FLAG_PATHFINDING))
            end

            if query ~= RETURNVALUE_NOERROR then
                player:sendCancelMessage(query)
                return true
            end

            doorCreature:teleportTo(toPosition, true)
        end
        if not isInArray(openSpecialDoors, itemId) then
            item:transform(itemId - 1)
        end
        return true
    end

    if doors[itemId] then
        if not isDoorLocked(actionId, toPosition) then
            item:transform(doors[itemId])
        else
            player:sendTextMessage(MESSAGE_INFO_DESCR, "It is locked.")
        end
        return true
    end

    return false
end

Please help me, thanks:)
 
Back
Top