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

[8.0] [TFS 1.2] - Server Global Full [Real Map]

does somebody know how to fix invalid count max? im using this datapack in tfs 1.5
also monster are 8.6 not 8.0 does anybody has the right monsters datapack?
nice release
Is it not possible to use the monster datapack from TFS 1.5 8.0 downgrade version?

I still cant figure out why monsters wont ignore GM characters even with ignoredbymonsters="1" activated
lol
Post automatically merged:

Sorry for double posting but I got balance, withdraw and deposit to work by editing in data/lib/miscellaneous/050-functions
With this everything will work except for transfering money. I still can't figure out that part.

Lua:
function isNumber(str)
     return tonumber(str) ~= nil
end

function getAccountNumberByPlayerName(name)
    local player = Player(name)
    if player ~= nil then
        return player:getAccountId()
    end

    local resultId = db.storeQuery("SELECT `account_id` FROM `players` WHERE `name` = " .. db.escapeString(name))
    if resultId ~= false then
        local accountId = result.getNumber(resultId, "account_id")
        result.free(resultId)
        return accountId
    end
    return 0
end

function clearBossRoom(playerId, bossId, centerPosition, rangeX, rangeY, exitPosition)
    local spectators, spectator = Game.getSpectators(centerPosition, false, false, rangeX, rangeX, rangeY, rangeY)
    for i = 1, #spectators do
        spectator = spectators[i]
        if spectator:isPlayer() and spectator.uid == playerId then
            spectator:teleportTo(exitPosition)
            exitPosition:sendMagicEffect(CONST_ME_TELEPORT)
        end

        if spectator:isMonster() then
            spectator:remove()
        end
    end
end

function doAddExp(cid, amount, useExpStages, customColor, ...)
    local player = cid:getPlayer()
    if not player then
        return false
    else
        if useExpStages then amount = amount * Game.getExperienceStage(player:getLevel()) end
        if not customColor then customColor = TEXTCOLOR_WHITE_EXP end
        Game.sendAnimatedText(amount, getCreaturePosition(cid), customColor)
        return doPlayerAddExp(cid, amount)
    end
end

function doScanContainer(item, backpack, tables, count)
    if isContainer(item.uid) then
        for i = 0, getContainerSize(item.uid) do
            local item = getContainerItem(item.uid, i)
            if not(isContainer(item.uid)) then
                table.insert(tables, item.itemid)
                table.insert(count, item.type)
            else
                table.insert(backpack, item.itemid)
                doScanContainer(item, backpack, tables, count)
            end
        end
    end
end

function clearRoom(centerPosition, rangeX, rangeY, exitPosition)
    local spectators, spectator = Game.getSpectators(centerPosition, false, false, rangeX, rangeX, rangeY, rangeY)
    for i = 1, #spectators do
        spectator = spectators[i]
        if spectator:isMonster() then
            spectator:remove()
        end
    end
end

function roomIsOccupied(centerPosition, rangeX, rangeY)
    local spectators = Game.getSpectators(centerPosition, false, true, rangeX, rangeX, rangeY, rangeY)
    if #spectators ~= 0 then
        return true
    end

    return false
end

function clearForgotten(fromPosition, toPosition, exitPosition, storage)
    for x = fromPosition.x, toPosition.x do
        for y = fromPosition.y, toPosition.y do
            for z = fromPosition.z, toPosition.z do
                if Tile(Position(x, y, z)) then
                    local creature = Tile(Position(x, y, z)):getTopCreature()
                    if creature then
                        if creature:isPlayer() then
                            creature:teleportTo(exitPosition)
                            exitPosition:sendMagicEffect(CONST_ME_TELEPORT)
                            creature:say('Time out! You were teleported out by strange forces.', TALKTYPE_MONSTER_SAY)
                        elseif creature:isMonster() then
                            creature:remove()
                        end
                    end
                end
            end
        end
    end
    Game.setStorageValue(storage, 0)
end

function getMoneyCount(string)
    local b, e = string:find("%d+")
    local money = b and e and tonumber(string:sub(b, e)) or -1
    if isValidMoney(money) then
        return money
    end
    return -1
end

--function getBankMoney(cid, amount)
 --local player = Player(cid)
 --if player:getBankBalance() >= amount then
 -- player:setBankBalance(player:getBankBalance() - amount)
 -- player:sendTextMessage(MESSAGE_INFO_DESCR, "Paid " .. amount .. " gold from bank account. Your account balance is now " .. player:getBankBalance() .. " gold.")
 -- return true
-- end
 --return false
--end

function getMoneyWeight(money)
    local gold = money
    local crystal = math.floor(gold / 10000)
    gold = gold - crystal * 10000
    local platinum = math.floor(gold / 100)
    gold = gold - platinum * 100
    return (ItemType(2160):getWeight() * crystal) + (ItemType(2152):getWeight() * platinum) + (ItemType(2148):getWeight() * gold)
end

function getRealDate()
    local month = tonumber(os.date("%m", os.time()))
    local day = tonumber(os.date("%d", os.time()))

    if month < 10 then
        month = '0' .. month
    end
    if day < 10 then
        day = '0' .. day
    end
    return day .. '/' .. month
end

function getRealTime()
    local hours = tonumber(os.date("%H", os.time()))
    local minutes = tonumber(os.date("%M", os.time()))

    if hours < 10 then
        hours = '0' .. hours
    end
    if minutes < 10 then
        minutes = '0' .. minutes
    end
    return hours .. ':' .. minutes
end

function isValidMoney(money)
    return isNumber(money) and money > 0 and money < 4294967296
end

function iterateArea(func, from, to)
    for z = from.z, to.z do
        for y = from.y, to.y do
            for x = from.x, to.x do
                func(Position(x, y, z))
            end
        end
    end
end

function playerExists(name)
    local resultId = db.storeQuery('SELECT `name` FROM `players` WHERE `name` = ' .. db.escapeString(name))
    if resultId then
        result.free(resultId)
        return true
    end
    return false
end

function checkWallArito(item, toPosition)
    if (not item:isItem()) then
        return false
    end
    local wallTile = Tile(Position(33206, 32536, 6))
    if not wallTile or wallTile:getItemCountById(8210) > 0 then
        return false
    end
    local checkEqual = {
        [2016] = {Position(33207, 32537, 6), {5858, -1}, Position(33205, 32537, 6)},
        [2419] = {Position(33205, 32537, 6), {2016, 1}, Position(33207, 32537, 6),5858}
    }
    local it = checkEqual[item:getId()]
    if(it and it[1] == toPosition and Tile(it[3]):getItemCountById(it[2][1], it[2][2]) > 0)then
        wallTile:getItemById(877):transform(8210)

        if(it[4])then
            item:transform(it[4])
        end

        addEvent(
            function()
                if(Tile(Position(33206, 32536, 6)):getItemCountById(8210) > 0) then
                    Tile(Position(33206, 32536, 6)):getItemById(8210):transform(877)
                end
                if(Tile(Position(33205, 32537, 6)):getItemCountById(5858) > 0) then
                    Tile(Position(33205, 32537, 6)):getItemById(5858):remove()
                end
            end, 5*60*1000
        )
    else
        if(it and it[4] and it[1] == toPosition)then
            item:transform(it[4])
        end
    end
end

function placeSpawnRandom(fromPositon, toPosition, monsterName, ammount, hasCall, storage, value, removestorage, sharedHP, event, message)
    for _x = fromPositon.x, toPosition.x do
        for _y = fromPositon.y, toPosition.y do
            for _z = fromPositon.z, toPosition.z do
                local tile = Tile(Position(_x,_y,_z))
                if not removestorage then
                    if tile and tile:getTopCreature() and tile:getTopCreature():isMonster() and tile:getTopCreature():getName() == monsterName then
                        tile:getTopCreature():remove()
                    end
                else
                    if tile and tile:getTopCreature() and tile:getTopCreature():isMonster() and tile:getTopCreature():getStorageValue(storage) == value then
                        tile:getTopCreature():remove()
                    end
                end
            end
        end
    end
        if ammount and ammount > 0 then
            local summoned = 0
            local tm = os.time()
            repeat
                local tile = false
                -- repeat
                    local position = {x = math.random(fromPositon.x, toPosition.x), y = math.random(fromPositon.y, toPosition.y), z = math.random(fromPositon.z, toPosition.z)}
                    -- tile = Tile(position)
                    -- passando = tile and #tile:getItems() <= 0
                -- until (passando == true)
                local monster = Game.createMonster(monsterName, position)
                if monster then
                    summoned = summoned + 1
                    -- setando o primeiro spawn
                    monster:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
                    if(hasCall) then
                        monster:setStorage(storage, value)
                        if sharedHP then
                            monster:beginSharedLife(tm)
                            monster:registerEvent("sharedLife")
                        end
                        if event then
                            monster:registerEvent(event)
                        end
                        local function SendMessage(mit, message)
                            if not Monster(mit) then
                                return false
                            end
                            Monster(mit):say(message, TALKTYPE_MONSTER_SAY)
                        end
                        if message then
                            addEvent(SendMessage, 200,monster:getId(), message)
                        end
                    end
                end
            until (summoned == ammount)
        end
end

function getMonstersInArea(fromPos, toPos, monsterName, ignoreMonsterId)
    local monsters = {}
    for _x = fromPos.x, toPos.x do
        for _y = fromPos.y, toPos.y do
            for _z = fromPos.z, toPos.z do
                local tile = Tile(Position(_x,_y,_z))
                if tile and tile:getTopCreature() then
                    for _, pid in pairs(tile:getCreatures()) do
                        local mt = Monster(pid)
                        if not ignoreMonsterId then
                            if(mt and mt:isMonster() and mt:getName():lower() == monsterName:lower() and not mt:getMaster() )then
                                monsters[#monsters + 1] = mt
                            end
                        else
                            if(mt and mt:isMonster() and mt:getName():lower() == monsterName:lower() and not mt:getMaster() and ignoreMonsterId ~= mt:getId())then
                                monsters[#monsters + 1] = mt
                            end
                        end
                    end
                end
            end
        end
    end
    return monsters
end

function isPlayerInArea(fromPos, toPos)
    for _x = fromPos.x, toPos.x do
        for _y = fromPos.y, toPos.y do
            for _z = fromPos.z, toPos.z do
                creature = getTopCreature({x = _x, y = _y, z = _z})
                    if (isPlayer(creature.uid)) then
                    return true
                end
            end
        end
    end
    return false
end

function cleanAreaQuest(frompos, topos, itemtable, blockmonsters)
    if not itemtable then
        itemtable = {}
    end
    if not blockmonsters then
        blockmonsters = {}
    end
    for _x = frompos.x, topos.x do
        for _y = frompos.y, topos.y do
            for _z = frompos.z, topos.z do
                local tile = Tile(Position(_x, _y, _z))
                if tile then
                    local itc = tile:getItems()
                    if itc and tile:getItemCount() > 0 then
                        for _, pid in pairs(itc) do
                            local itp = ItemType(pid:getId())
                            if itp and itp:isCorpse() then
                                pid:remove()
                            end
                        end
                    end
                    for _, pid in pairs(itemtable) do
                        local _until = tile:getItemCountById(pid)
                        if _until > 0 then
                            for i = 1, _until do
                                local it = tile:getItemById(pid)
                                if it then
                                    it:remove()
                                end
                            end
                        end
                    end
                    local mtempc = tile:getCreatures()
                    if mtempc and tile:getCreatureCount() > 0 then
                        for _, pid in pairs(mtempc) do
                            if pid:isMonster() and not isInArray(blockmonsters, pid:getName():lower()) then
                                -- broadcastMessage(pid:getName())
                                pid:remove()
                            end
                        end
                    end
                end
            end
        end
    end
    return true
end

function kickerPlayerRoomAfferMin(playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, firstCall, itemtable, blockmonsters)
    local players = false
    if type(playername) == table then
        players = true
    end
    local player = false
    if not players then
        player = Player(playername)
    end
    local monster = {}
    if monsterName ~= '' then
        monster = getMonstersInArea(fromPosition, toPosition, monsterName)
    end
    if player == false and players == false then
        return false
    end
    if not players and player then
        if player:getPosition():isInRange(fromPosition, toPosition) and minutes == 0 then
            if monsterName ~= '' then
                for _, pid in pairs(monster) do
                    if pid:isMonster() then
                        if pid:getStorageValue("playername") == playername then
                            pid:remove()
                        end
                    end
                end
            else
                if not itemtable then
                    itemtable = {}
                end
                if not blockmonsters then
                    blockmonsters = {}
                end
                cleanAreaQuest( fromPosition, toPosition, itemtable, blockmonsters)
            end
            player:teleportTo(teleportPos, true)
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message)
            return true
        end
    else
        if  minutes == 0 then
            if monsterName ~= '' then
                for _, pid in pairs(monster) do
                    if pid:isMonster() then
                        if pid:getStorageValue("playername") == playername then
                            pid:remove()
                        end
                    end
                end
            else
                if not itemtable then
                    itemtable = {}
                end
                if not blockmonsters then
                    blockmonsters = {}
                end
                cleanAreaQuest( fromPosition, toPosition, itemtable, blockmonsters)
            end
            for _, pid in pairs(playername) do
                local player = Player(pid)
                if player and player:getPosition():isInRange(fromPosition, toPosition)then
                    player:teleportTo(teleportPos, true)
                    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message)
                end
            end
            return true
        end
    end
    local min = 60 -- use o 60 para 1 minuto
    if(firstCall)then
        addEvent(kickerPlayerRoomAfferMin, 1000,playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, false, itemtable, blockmonsters)
        -- broadcastMessage("Comecou contar em ".. minutes .." minutoss")
    else
        local subt = minutes-1
        if(monsterName ~= '')then
            if minutes > 3 and table.maxn(monster) == 0 then
                subt = 2
            end
        end
        addEvent(kickerPlayerRoomAfferMin, min*1000,playername, fromPosition, toPosition, teleportPos, message, monsterName, subt, false, itemtable, blockmonsters)
    end
end
 
Last edited:
calm down guys I'm going to update, the server had almost no help in the server test.
if you want to start a proyect message me im going to make a server 8.6 too i have experience with others protocols but it's almost the same.
like 7.72 as example 10.98 , tibia etc. but im sure that what players does want to play is mytic 8.6 ofcourse if everything is cloase as possible as tibia it would be better I know how to add target strategies to the server and monsters and change the values to old protocols in order to make it fit with the old real formulas, i've worked on linux windows, vps and more
if you're interested message me. this and the next week im super busy but after that will have a lot of free time
I'm planning to use tfs 1.5 and downgrade orts datapack, and maybe copy paste actions, movements from this map to another or maybe convert it with peonso tool. it's a lot of work anyway but it has everything addons, sotrages, quests and more.
 
if you want to start a proyect message me im going to make a server 8.6 too i have experience with others protocols but it's almost the same.
like 7.72 as example 10.98 , tibia etc. but im sure that what players does want to play is mytic 8.6 ofcourse if everything is cloase as possible as tibia it would be better I know how to add target strategies to the server and monsters and change the values to old protocols in order to make it fit with the old real formulas, i've worked on linux windows, vps and more
if you're interested message me. this and the next week im super busy but after that will have a lot of free time
I'm planning to use tfs 1.5 and downgrade orts datapack, and maybe copy paste actions, movements from this map to another or maybe convert it with peonso tool. it's a lot of work anyway but it has everything addons, sotrages, quests and more.
Did you manage to get this datapack to work with tfs 1.5? Did you fix the problem you had before?
 
Noticed that when I made a new character it would crash the official 8.0 player client.
Tested it abit and found that any character below level 21 will crash the client. Haven't figured out why.
If anyone got a clue please let me know :)

Edit: To be clear, it does not crash the server. Just the official 8.0 client.
 
Thanks for sharing the server, but it really needs some adjustments on the map, on god, the bugs are even noticing it invisible among other things, such as god is like a common player, in thais in the south area, in the dos area minotaurs, I noticed that the Minotaur Guard is stuck among other things, I'm just reporting, but thanks again for sharing the server.
 
does somebody know how to fix invalid count max? im using this datapack in tfs 1.5
also monster are 8.6 not 8.0 does anybody has the right monsters datapack?
nice release
The monsters are 8.00 and not 8.60, there are only files with 8.60 monsters that don't work, just delete them.
 

@Shiris undrin Alguma novidade sobre isso?

Still no updated version? :eek:
The server is almost 100% in terms of the game, missions, quests... I'm waiting for more bugs to be reported like for example npcs, I map level more than 1 year to build the server without anyone's help, I have to adapt many scripts for this server, now I don't have any more time, but I hope they report more bugs.
 
The server is almost 100% in terms of the game, missions, quests... I'm waiting for more bugs to be reported like for example npcs, I map level more than 1 year to build the server without anyone's help, I have to adapt many scripts for this server, now I don't have any more time, but I hope they report more bugs.

Well, for some reason you cannot login to the game with a character, that's under level 21. When you create a new character, it debugs and crashes the client when you login. Or if you die on a character on level 21 and downgrade to level 20, you cannot login to the character anymore, since it debugs the client if you do. Any idea what might cause it? I scrolled through all the files for hours but couldn't locate the problem. I'm using the official Tibia 8.0 client for now.

Also, I cannot create items on a God character. How is the account type/character group_id/groups.xml access/type is supposed to work? Sometimes it changes my God character back to player character and sometimes to a Gamemaster. Also, I can attack monsters and monsters attack me, no matter if I'm on a GM or a God character.
 
Well, for some reason you cannot login to the game with a character, that's under level 21. When you create a new character, it debugs and crashes the client when you login. Or if you die on a character on level 21 and downgrade to level 20, you cannot login to the character anymore, since it debugs the client if you do. Any idea what might cause it? I scrolled through all the files for hours but couldn't locate the problem. I'm using the official Tibia 8.0 client for now.

Also, I cannot create items on a God character. How is the account type/character group_id/groups.xml access/type is supposed to work? Sometimes it changes my God character back to player character and sometimes to a Gamemaster. Also, I can attack monsters and monsters attack me, no matter if I'm on a GM or a God character.
Remove adventureblessings in creaturescripts it should fix ur problem as adventureblessing isn't a thing in 8.0 therefore it causes the client to debug (OP probably used OTclient when testing and never found this issue)

There is quite a few bugs but as OP is stating he did this all by himself so all this considered it's a really nice release.
People just have to put in time and effort themselves to fix stuff, (you can do this yourself and find fixes on your own without spamming this thread for an update, I'm sure OP will release an update once he is ready or feels like it, no offense to anyone I understand your eager and probably don't have time to do this but such is life) <-- this is not directed to anyone personally it's for everyone :p so really no offense guys

EDIT: It's good that Harbinger actually reported bugs and errors so that second part of my response was not directly aimed at him, it was more aimed at the people asking for updates without actually mentioning what their problem with the distro is. He actually did something good reporting an issue and as community we help with solutions!
 
Last edited:
The server is almost 100% in terms of the game, missions, quests... I'm waiting for more bugs to be reported like for example npcs, I map level more than 1 year to build the server without anyone's help, I have to adapt many scripts for this server, now I don't have any more time, but I hope they report more bugs.

Do you have a updated version that covers the ones reported so far?
 
Back
Top