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

C++ [TFS 1.3] CTRL+ARROW KEY (Make the GODS / GM go through the walls)

Kuantikum

Member
Joined
Jul 3, 2015
Messages
219
Solutions
1
Reaction score
20
HELLO!!! :p

I don't know if it's a code in the sources or a simple scrip, but I'm looking for the code to be able to make the GODS / GM go through the walls with the key combination CTRL + ARROW KEYS for TFS 1.3 please. Can anybody help me ? I'm very grateful 😍😘🥰
 
Solution
Replace Player:onTurn(direction) (data/events/scripts/player.lua) with this:
Lua:
local times = {}

function Player:onTurn(direction)
    if not (self:getAccountType() >= 3) then
        return true
    end
    local cid = self:getId()
    if (self:getDirection() == direction) or times[cid] and (os.mtime() - times[cid] < 100) then
        local pos = self:getPosition():getNextPosition(direction)
        if not Tile(pos) then
            Game.createTile(pos)
        end
        self:teleportTo(pos, true)
        times[cid] = os.mtime()
    end
    return true
end
Replace Player:onTurn(direction) (data/events/scripts/player.lua) with this:
Lua:
local times = {}

function Player:onTurn(direction)
    if not (self:getAccountType() >= 3) then
        return true
    end
    local cid = self:getId()
    if (self:getDirection() == direction) or times[cid] and (os.mtime() - times[cid] < 100) then
        local pos = self:getPosition():getNextPosition(direction)
        if not Tile(pos) then
            Game.createTile(pos)
        end
        self:teleportTo(pos, true)
        times[cid] = os.mtime()
    end
    return true
end
 
Solution
Replace Player:onTurn(direction) (data/events/scripts/player.lua) with this:
Lua:
local times = {}

function Player:onTurn(direction)
    if not (self:getAccountType() >= 3) then
        return true
    end
    local cid = self:getId()
    if (self:getDirection() == direction) or times[cid] and (os.mtime() - times[cid] < 100) then
        local pos = self:getPosition():getNextPosition(direction)
        if not Tile(pos) then
            Game.createTile(pos)
        end
        self:teleportTo(pos, true)
        times[cid] = os.mtime()
    end
    return true
end


Done, but nothing happens, ive checked the adm account type, it is TYPE 5 in mysql
 
HEHE done 😬😬
Set enabled="1" in events.xml for onTurn event.


Now i get this erros: 😵😵😱
Lua:
Lua Script Error: [Event Interface]
data/events/scripts/player.lua:Player@onTurn
attempt to index a nil value
stack traceback:
        [C]: at 0x7ff680971bd0
        [C]: in function 'teleportTo'
        data/events/scripts/player.lua:239: in function <data/events/scripts/player.lua:229>

My player events:

Lua:
function Player:onBrowseField(position)
    return true
end


function Player:onToggleMount(mountid, mount)
    if mount then
        if isInArray(FlyingMounts, mountid) then
            if isInArray({"high", "medium"}, PvpRestrictions:lower()) and self:isPzLocked() then
                self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You cannot start flying now.")
                return false
            end
            self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You are now flying.")
            self:activateFly()
        end
    elseif self:isFlying() then
        local ret = self:deactivateFly()
        if ret then
            self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You are no longer flying.")
        else
            self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You can't deactivate fly now.")
        end
        return ret
    end
    return true
end


function Player:onLook(thing, position, distance)
    local description = "You see " .. thing:getDescription(distance)
    description = onItemUpgradeLook(self, thing, position, distance, description) -- https://otland.net/threads/tfs-1-3-upgrade-system.264672/
    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:isPlayer() and 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
        )
    end

    if thing:isCreature() then
        if thing:isPlayer() then
            local kills = math.max(0, thing:getStorageValue(STORAGEVALUE_KILLS)) + math.max(0, thing:getStorageValue(STORAGEVALUE_ASSISTS))
            local deaths = math.max(0, thing:getStorageValue(STORAGEVALUE_DEATHS))
            description = string.format("%s\nKills: %d Deaths: %d", description, kills, deaths)
        end
    end

    self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

function Player:onLookInBattleList(creature, distance)
    local description = "You see " .. creature:getDescription(distance)
    if self:getGroup():getAccess() then
        local str = "%s\nHealth: %d / %d"
        if creature:isPlayer() and 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
        )
    end
    if creature:isPlayer() then
        local kills = math.max(0, creature:getStorageValue(STORAGEVALUE_KILLS)) + math.max(0, creature:getStorageValue(STORAGEVALUE_ASSISTS))
        local deaths = math.max(0, creature:getStorageValue(STORAGEVALUE_DEATHS))
        description = string.format("%s\nKills: %d Deaths: %d", description, kills, deaths)
    end
    self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

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

function Player:onLookInShop(itemType, count)
    return true
end

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

    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:isItem() then
                if parent:getSize() == parent:getCapacity() then
                    self:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_CONTAINERNOTENOUGHROOM))
                    return false
                else
                    return moveItem:moveTo(parent)
                end
            else
                return moveItem:moveTo(parent)
            end   
        end
    end

    return us_onMoveItem(self, item, fromPosition, toPosition)
end

function Player:onItemMoved(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
onUpgradeMoved(self, item, count, fromPosition, toPosition, fromCylinder, toCylinder)
end

function Player:onMoveCreature(creature, fromPosition, toPosition)
    return true
end

local function hasPendingReport(name, targetName, reportType)
    local f = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "r")
    if f then
        io.close(f)
        return true
    else
        return false
    end
end

function Player:onReportRuleViolation(targetName, reportType, reportReason, comment, translation)
    local name = self:getName()
    if hasPendingReport(name, targetName, reportType) then
        self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your report is being processed.")
        return
    end

    local file = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "a")
    if not file then
        self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "There was an error when processing your report, please contact a gamemaster.")
        return
    end

    io.output(file)
    io.write("------------------------------\n")
    io.write("Reported by: " .. name .. "\n")
    io.write("Target: " .. targetName .. "\n")
    io.write("Type: " .. reportType .. "\n")
    io.write("Reason: " .. reportReason .. "\n")
    io.write("Comment: " .. comment .. "\n")
    if reportType ~= REPORT_TYPE_BOT then
        io.write("Translation: " .. translation .. "\n")
    end
    io.write("------------------------------\n")
    io.close(file)
    self:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Thank you for reporting %s. Your report will be processed by %s team as soon as possible.", targetName, configManager.getString(configKeys.SERVER_NAME)))
    return
end

function Player:onReportBug(message, position, category)
    if self:getAccountType() == ACCOUNT_TYPE_NORMAL then
        return false
    end

    local name = self:getName()
    local file = io.open("data/reports/bugs/" .. name .. " report.txt", "a")

    if not file then
        self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "There was an error when processing your report, please contact a gamemaster.")
        return true
    end

    io.output(file)
    io.write("------------------------------\n")
    io.write("Name: " .. name)
    if category == BUG_CATEGORY_MAP then
        io.write(" [Map position: " .. position.x .. ", " .. position.y .. ", " .. position.z .. "]")
    end
    local playerPosition = self:getPosition()
    io.write(" [Player Position: " .. playerPosition.x .. ", " .. playerPosition.y .. ", " .. playerPosition.z .. "]\n")
    io.write("Comment: " .. message .. "\n")
    io.close(file)

    self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "Your report has been sent to " .. configManager.getString(configKeys.SERVER_NAME) .. ".")
    return true
end

local times = {}

function Player:onTurn(direction)
    if not (self:getAccountType() >= 3) then
        return true
    end
    local cid = self:getId()
    if (self:getDirection() == direction) or times[cid] and (os.mtime() - times[cid] < 100) then
        local pos = self:getPosition():getNextPosition(direction)
        if not Tile(pos) then
            Game.createTile(pos)
        end
        self:teleportTo(pos, true)
        times[cid] = os.mtime()
    end
    return true
end


function Player:onTradeRequest(target, item)
    return true
end

function Player:onTradeAccept(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:onGainExperience(source, exp, rawExp)
    if not source or source:isPlayer() then
    exp = us_onGainExperience(self, source, exp, rawExp)
        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:onLoseExperience(exp)
    return exp
end

function Player:onGainSkillTries(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
 
Replace Position:getNextPosition (data/lib/position.lua) with this:
Lua:
function Position:getNextPosition(direction, steps)
    local offset = Position.directionOffset[direction]
    if offset then
        steps = steps or 1
        self.x = self.x + offset.x * steps
        self.y = self.y + offset.y * steps
    end
    return self
end
 
Back
Top