johnsamir
Advanced OT User
Hi
Recently i was searching for few fixes for doors and i've found them updating doors
with this
the server that i use is tfs 1.5 downgraded by nekiro version 7.72
in this server there are un-walkable items ex: chest, so when there is an un-walkable item in front of a vertical or horizontal door, the player is pushed back of the door, the same occurs if there is a magic wall rune for example
and not i front of. is there a way make the player gets pushed above of these un-walkable items ?
this is the door.lua in rev script
This is the closingdoor.lua at movements
@Xikini Sorry by tag, but didn't know if you saw the new thread
Recently i was searching for few fixes for doors and i've found them updating doors
with this
Updating Doors. by Xikini · Pull Request #3300 · otland/forgottenserver
I'm a noob at github and broke my old repository by deleting items.xml.. then re-uploading the file, which then showed 36,000+ line changes. Couldn't figure out how to undo the change.. so ...
github.com
in this server there are un-walkable items ex: chest, so when there is an un-walkable item in front of a vertical or horizontal door, the player is pushed back of the door, the same occurs if there is a magic wall rune for example
and not i front of. is there a way make the player gets pushed above of these un-walkable items ?
this is the door.lua in rev script
Lua:
local positionOffsets = {
Position(1, 0, 0), -- east
Position(0, 1, 0), -- south
Position(-1, 0, 0), -- west
Position(0, -1, 0) -- north
}
--[[
When closing a door with a creature in it findPushPosition will find the most appropriate
adjacent position following a prioritization order.
The function returns the position of the first tile that fulfills all the checks in a round.
The function loops trough east -> south -> west -> north on each following line in that order.
In round 1 it checks if there's an unhindered walkable tile without any creature.
In round 2 it checks if there's a tile with a creature.
In round 3 it checks if there's a tile blocked by a movable tile-blocking item.
In round 4 it checks if there's a tile blocked by a magic wall or wild growth.
]]
local function findPushPosition(creature, round)
local pos = creature:getPosition()
for _, offset in ipairs(positionOffsets) do
local offsetPosition = pos + offset
local tile = Tile(offsetPosition)
if tile then
local creatureCount = tile:getCreatureCount()
if round == 1 then
if tile:queryAdd(creature) == RETURNVALUE_NOERROR and creatureCount == 0 then
if not tile:hasFlag(TILESTATE_PROTECTIONZONE) or (tile:hasFlag(TILESTATE_PROTECTIONZONE) and creature:canAccessPz()) then
return offsetPosition
end
end
elseif round == 2 then
if creatureCount > 0 then
if not tile:hasFlag(TILESTATE_PROTECTIONZONE) or (tile:hasFlag(TILESTATE_PROTECTIONZONE) and creature:canAccessPz()) then
return offsetPosition
end
end
elseif round == 3 then
local topItem = tile:getTopDownItem()
if topItem then
if topItem:getType():isMovable() then
return offsetPosition
end
end
else
if tile:getItemById(ITEM_MAGICWALL) or tile:getItemById(ITEM_WILDGROWTH) then
return offsetPosition
end
end
end
end
if round < 4 then
return findPushPosition(creature, round + 1)
end
end
local door = Action()
function door.onUse(player, item, fromPosition, target, toPosition, isHotkey)
local itemId = item:getId()
if table.contains(closedQuestDoors, itemId) then
if player:getStorageValue(item.actionid) ~= -1 or player:getGroup():getAccess() 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 table.contains(closedLevelDoors, itemId) then
if item.actionid > 0 and player:getLevel() >= item.actionid - actionIds.levelDoor or player:getGroup():getAccess() then
item:transform(itemId + 1)
player:teleportTo(toPosition, true)
else
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Only the worthy may pass.")
end
return true
elseif table.contains(keys, itemId) then
local tile = Tile(toPosition)
if not tile then
return false
end
target = tile:getTopVisibleThing()
if target.actionid == 0 then
return false
end
if table.contains(keys, target.itemid) then
return false
end
if not table.contains(openDoors, target.itemid) and not table.contains(closedDoors, target.itemid) and not table.contains(lockedDoors, target.itemid) then
return false
end
if item.actionid ~= target.actionid then
player:sendTextMessage(MESSAGE_STATUS_SMALL, "The key does not match.")
return true
end
local transformTo = target.itemid + 2
if table.contains(openDoors, target.itemid) then
transformTo = target.itemid - 2
elseif table.contains(closedDoors, target.itemid) then
transformTo = target.itemid - 1
end
target:transform(transformTo)
return true
elseif table.contains(lockedDoors, itemId) then
player:sendTextMessage(MESSAGE_INFO_DESCR, "It is locked.")
return true
elseif table.contains(openDoors, itemId) or table.contains(openExtraDoors, itemId) or table.contains(openHouseDoors, itemId) then
local creaturePositionTable = {}
local doorCreatures = Tile(toPosition):getCreatures()
if doorCreatures and #doorCreatures > 0 then
for _, doorCreature in pairs(doorCreatures) do
local pushPosition = findPushPosition(doorCreature, 1)
if not pushPosition then
player:sendCancelMessage(RETURNVALUE_NOTENOUGHROOM)
return true
end
table.insert(creaturePositionTable, {creature = doorCreature, position = pushPosition})
end
for _, tableCreature in ipairs(creaturePositionTable) do
tableCreature.creature:teleportTo(tableCreature.position, true)
end
end
item:transform(itemId - 1)
return true
elseif table.contains(closedDoors, itemId) or table.contains(closedExtraDoors, itemId) or table.contains(closedHouseDoors, itemId) then
item:transform(itemId + 1)
return true
end
return false
end
local doorTables = {keys, openDoors, closedDoors, lockedDoors, openExtraDoors, closedExtraDoors, openHouseDoors, closedHouseDoors, closedQuestDoors, closedLevelDoors}
for _, doors in pairs(doorTables) do
for _, doorId in pairs(doors) do
door:id(doorId)
end
end
door:register()
This is the closingdoor.lua at movements
Lua:
function onStepOut(creature, item, position, fromPosition)
local tile = Tile(position)
if tile:getCreatureCount() > 0 then
return true
end
local newPosition = {x = position.x + 1, y = position.y, z = position.z}
local query = Tile(newPosition):queryAdd(creature)
if query ~= RETURNVALUE_NOERROR or query == RETURNVALUE_NOTENOUGHROOM then
newPosition.x = newPosition.x - 1
newPosition.y = newPosition.y + 1
query = Tile(newPosition):queryAdd(creature)
end
if query == RETURNVALUE_NOERROR or query ~= RETURNVALUE_NOTENOUGHROOM then
doRelocate(position, newPosition)
end
local i, tileItem, tileCount = 1, true, tile:getThingCount()
while tileItem and i < tileCount do
tileItem = tile:getThing(i)
if tileItem and tileItem:getUniqueId() ~= item.uid and tileItem:getType():isMovable() then
tileItem:remove()
else
i = i + 1
end
end
item:transform(item.itemid - 1)
return true
end
Last edited: