• 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!

TFS 1.0 max tile items limit

24ffhoh.png
are you sure you have the script correct?
it wouldn't compare a number with table unless you removed the # from #tile:getItems(), since # will return the size of the table (which is a number)
Code:
function Player:onMoveItem(item, count, fromPosition, toPosition)
    local tile = Tile(toPosition)
    local max = 1
    if tile then
        if #tile:getItems() >= max then
            self:sendTextMessage(MESSAGE_STATUS_SMALL, 'This tile has the max amount of items on it already.')
            return false
        end
    end
    return true
end
 
are you sure you have the script correct?
it wouldn't compare a number with table unless you removed the # from #tile:getItems(), since # will return the size of the table (which is a number)
Code:
function Player:onMoveItem(item, count, fromPosition, toPosition)
    local tile = Tile(toPosition)
    local max = 1
    if tile then
        if #tile:getItems() >= max then
            self:sendTextMessage(MESSAGE_STATUS_SMALL, 'This tile has the max amount of items on it already.')
            return false
        end
    end
    return true
end
Yes i use this, go test in your server and see...
 
i did test it and it works fine
i threw a sword into water lol

Look my player.lua

function Player:eek:nLook(thing, position, distance)
local description = "You see " .. thing:getDescription(distance)
if LOOK_MARRIAGE_DESCR and thing:isCreature() then
if thing:isPlayer() then
description = description .. self:getMarriageDescription(thing)
end
end
if self:getGroup():getAccess() then
if thing:isItem() then
description = string.format("%s\nItem ID: %d", description, thing:getId())

local actionId = thing:getActionId()
if actionId ~= 0 then
description = string.format("%s, Action ID: %d", description, actionId)
end

local uniqueId = thing:getAttribute(ITEM_ATTRIBUTE_UNIQUEID)
if uniqueId > 0 and uniqueId < 65536 then
description = string.format("%s, Unique ID: %d", description, uniqueId)
end

local itemType = thing:getType()

local transformEquipId = itemType:getTransformEquipId()
local transformDeEquipId = itemType:getTransformDeEquipId()
if transformEquipId ~= 0 then
description = string.format("%s\nTransforms to: %d (onEquip)", description, transformEquipId)
elseif transformDeEquipId ~= 0 then
description = string.format("%s\nTransforms to: %d (onDeEquip)", description, transformDeEquipId)
end

local decayId = itemType:getDecayId()
if decayId ~= -1 then
description = string.format("%s\nDecays to: %d", description, decayId)
end
elseif thing:isCreature() then
local str = "%s\nHealth: %d / %d"
if thing:getMaxMana() > 0 then
str = string.format("%s, Mana: %d / %d", str, thing:getMana(), thing:getMaxMana())
end
description = string.format(str, description, thing:getHealth(), thing:getMaxHealth()) .. "."
end

local position = thing:getPosition()
description = string.format(
"%s\nPosition: %d, %d, %d",
description, position.x, position.y, position.z
)

if thing:isCreature() then
if thing:isPlayer() then
description = string.format("%s\nIP: %s.", description, Game.convertIpToString(thing:getIp()))
end
end

end
self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

function Player:eek:nLookInBattleList(creature, distance)
local description = "You see " .. creature:getDescription(distance)
if self:getGroup():getAccess() then
local str = "%s\nHealth: %d / %d"
if creature:getMaxMana() > 0 then
str = string.format("%s, Mana: %d / %d", str, creature:getMana(), creature:getMaxMana())
end
description = string.format(str, description, creature:getHealth(), creature:getMaxHealth()) .. "."

local position = creature:getPosition()
description = string.format(
"%s\nPosition: %d, %d, %d",
description, position.x, position.y, position.z
)

if creature:isPlayer() then
description = string.format("%s\nIP: %s", description, Game.convertIpToString(creature:getIp()))
end
end
self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

function Player:eek:nLookInTrade(partner, item, distance)
self:sendTextMessage(MESSAGE_INFO_DESCR, "You see " .. item:getDescription(distance))
end

function Player:eek:nLookInShop(itemType, count)
return true
end

function Player:eek:nMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)

if item:getActionId() == NOT_MOVEABLE_ACTION then
self:sendCancelMessage('Sorry, not possible.')
return false
end

if toPosition.x ~= CONTAINER_POSITION then
return true
end

if item:getTopParent() == self and bit.band(toPosition.y, 0x40) == 0 then
local itemType, moveItem = ItemType(item:getId())
if bit.band(itemType:getSlotPosition(), SLOTP_TWO_HAND) ~= 0 and toPosition.y == CONST_SLOT_LEFT then
moveItem = self:getSlotItem(CONST_SLOT_RIGHT)
elseif itemType:getWeaponType() == WEAPON_SHIELD and toPosition.y == CONST_SLOT_RIGHT then
moveItem = self:getSlotItem(CONST_SLOT_LEFT)
if moveItem and bit.band(ItemType(moveItem:getId()):getSlotPosition(), SLOTP_TWO_HAND) == 0 then
return true
end
end

if moveItem then
local parent = item:getParent()
if parent:getSize() == parent:getCapacity() then
self:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_CONTAINERNOTENOUGHROOM))
return false
else
return moveItem:moveTo(parent)
end
end
end

if toPosition.x == CONTAINER_POSITION then
local containerId = toPosition.y - 64
local container = self:getContainerById(containerId)
if not container then
return true
end

-- Do not let the player insert items into either the Reward Container or the Reward Chest
local itemId = container:getId()
if itemId == ITEM_REWARD_CONTAINER or itemId == ITEM_REWARD_CHEST then
self:sendCancelMessage('Sorry, not possible.')
return false
end

-- The player also shouldn't be able to insert items into the boss corpse
local tile = Tile(container:getPosition())
for _, item in ipairs(tile:getItems()) do
if item:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == 2^31 - 1 and item:getName() == container:getName() then
self:sendCancelMessage('Sorry, not possible.')
return false
end
end
end

-- Do not let the player move the boss corpse.
if item:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == 2^31 - 1 then
self:sendCancelMessage('Sorry, not possible.')
return false
end

return true
end

function Player:eek:nMoveItem(item, count, fromPosition, toPosition)
local tile = Tile(toPosition)
local max = 20
if tile then
if #tile:getItems() >= max then
self:sendTextMessage(MESSAGE_STATUS_SMALL, 'This tile has the max amount of items on it already.')
return false
end
end
return true
end


function Player:eek:nTurn(direction)
if self:getGroup():getAccess() and self:getDirection() == direction then
local nextPosition = self:getPosition()
nextPosition:getNextPosition(direction)

self:teleportTo(nextPosition, true)
end

return true
end

function Player:eek:nTradeRequest(target, item)
return true
end

function Player:eek:nTradeAccept(target, item, targetItem)
return true
end

local soulCondition = Condition(CONDITION_SOUL, CONDITIONID_DEFAULT)
soulCondition:setTicks(4 * 60 * 1000)
soulCondition:setParameter(CONDITION_PARAM_SOULGAIN, 1)

local function useStamina(player)
local staminaMinutes = player:getStamina()
if staminaMinutes == 0 then
return
end

local playerId = player:getId()
local currentTime = os.time()
local timePassed = currentTime - nextUseStaminaTime[playerId]
if timePassed <= 0 then
return
end

if timePassed > 60 then
if staminaMinutes > 2 then
staminaMinutes = staminaMinutes - 2
else
staminaMinutes = 0
end
nextUseStaminaTime[playerId] = currentTime + 120
else
staminaMinutes = staminaMinutes - 1
nextUseStaminaTime[playerId] = currentTime + 60
end
player:setStamina(staminaMinutes)
end

function Player:eek:nGainExperience(source, exp, rawExp)
if not source or source:isPlayer() then
return exp
end

-- Soul regeneration
local vocation = self:getVocation()
if self:getSoul() < vocation:getMaxSoul() and exp >= self:getLevel() then
soulCondition:setParameter(CONDITION_PARAM_SOULTICKS, vocation:getSoulGainTicks() * 1000)
self:addCondition(soulCondition)
end

-- Apply experience stage multiplier
exp = exp * Game.getExperienceStage(self:getLevel())

-- Stamina modifier
if configManager.getBoolean(configKeys.STAMINA_SYSTEM) then
useStamina(self)

local staminaMinutes = self:getStamina()
if staminaMinutes > 2400 and self:isPremium() then
exp = exp * 1.5
elseif staminaMinutes <= 840 then
exp = exp * 0.5
end
end

return exp
end

function Player:eek:nLoseExperience(exp)
return exp
end

function Player:eek:nGainSkillTries(skill, tries)
if APPLY_SKILL_MULTIPLIER == false then
return tries
end

if skill == SKILL_MAGLEVEL then
return tries * configManager.getNumber(configKeys.RATE_MAGIC)
end
return tries * configManager.getNumber(configKeys.RATE_SKILL)
end
 
Code:
function Player:onMoveItem(item, count, fromPosition, toPosition)
    local tile = Tile(toPosition)
    local max = 10
    if(tile) then
        local tileItems = tile:getItems()
        if(tileItems and #tileItems >= max) then
            self:sendTextMessage(MESSAGE_STATUS_SMALL, 'This tile has the max amount of items on it already.')
            return false
        end
    end
    return true
end
tile:getItems() - return nil in case there aren't any top or down items
 
Code:
function Player:onMoveItem(item, count, fromPosition, toPosition)
    local tile = Tile(toPosition)
    local max = 10
    if(tile) then
        local tileItems = tile:getItems()
        if(tileItems and #tileItems >= max) then
            self:sendTextMessage(MESSAGE_STATUS_SMALL, 'This tile has the max amount of items on it already.')
            return false
        end
    end
    return true
end
tile:getItems() - return nil in case there aren't any top or down items
no, it returns 0 (for me at least)
Code:
08:33 Xeraphus: > print(#Tile(player:getPosition()):getItems())
08:33 0
 
Back
Top