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

[10.95 + Cast] [TFS 1.2] Custom modifications V2

Ive got a problem with the store. When i buy an item it keeps saying Your purchase is being processed. Anyone any clue?
 
Same with transfer coins to another player . Keeps sending ..
 
added and im using your datapack for testing

store_history added from your schema.sql

Now i got a message i success but i dont get the items ^^

Solved. I had to edit your modules
 
Last edited by a moderator:
My items are fading when I equipo demon armor , golden armor , helmet of the deep , or some items they simply disappear .
 
@Lundrial, @Dyabl0hi, days ago i post it, and not yet get solved this, any solution? Thanks.

@Lundrial ,@Dyabl0 Hello, this is my player.lua:

Code:
-- Players cannot throw items on teleports if set to true
local blockTeleportTrashing = false

function Player:onBrowseField(position)
    return true
end

function Player:onLook(thing, position, distance)
    local description = 'You see '
    if thing:isItem() then
        if thing.actionid == 5640 then
            description = description .. 'a honeyflower patch.'
        elseif thing.actionid == 5641 then
            description = description .. 'a banana palm.'
        else
            description = description .. thing:getDescription(distance)
        end
    else
        description = description .. thing:getDescription(distance)
    end

    if self:getGroup():getAccess() then
        if thing:isItem() then
            description = string.format('%s\nItem ID: %d', description, thing.itemid)

            local actionId = thing.actionid
            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

            description = description .. '.'
            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() and thing:isPlayer() then
            description = string.format('%s\nIP: %s.', description, Game.convertIpToString(thing:getIp()))
        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: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: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 item:getActionId() == NOT_MOVEABLE_ACTION then
        self:sendCancelMessage('Sorry, not possible.')
        return false
    end
  
    if toPosition.x == CONTAINER_POSITION and toCylinder and toCylinder:getId() == 26052 then
        self:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        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 blockTeleportTrashing and toPosition.x ~= CONTAINER_POSITION then
        local thing = Tile(toPosition):getItemByType(ITEM_TYPE_TELEPORT)
        if thing then
            self:sendCancelMessage('Sorry, not possible.')
            self:getPosition():sendMagicEffect(CONST_ME_POFF)
            return false
        end
    end

    if isInArray({1714, 1715, 1716, 1717, 1738, 1740, 1741, 1747, 1748, 1749}, item.itemid) and item.actionid > 0 or item.actionid == 5640 then
        self:sendCancelMessage('You cannot move this object.')
        return false
    elseif item.itemid == 7466 then
        self:sendCancelMessage('You cannot move this object.')
        return false
    end

    if fromPosition.x == CONTAINER_POSITION and toPosition.x == CONTAINER_POSITION
            and item.itemid == 8710 and self:getItemCount(8710) == 2 and self:getStorageValue(Storage.RookgaardTutorialIsland.cockroachLegsMsgStorage) ~= 1 then
        self:sendTextMessage(MESSAGE_INFO_DESCR, 'Well done, you have enough cockroach legs! You should head back to Santiago with them. Climb the ladder to the north to exit.')
        self:setStorageValue(Storage.RookgaardTutorialIsland.cockroachLegsMsgStorage, 1)
        self:setStorageValue(Storage.RookgaardTutorialIsland.SantiagoNpcGreetStorage, 6)
    end
  
    -- REWARD CHEST BOSS 11 Marzo 2016
    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:onMoveCreature(creature, fromPosition, toPosition)
    return true
end

function Player:onTurn(direction)
    return true
end

function Player:onTradeRequest(target, item)
    if isInArray({1738, 1740, 1747, 1748, 1749, 8766}, item.itemid) and item.actionid > 0 or item.actionid == 5640 then
        self:sendCancelMessage('Sorry, not possible.')
        return false
    end
    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.uid
    local currentTime = os.time()
    local staminaTable = Game.getStorageValue("stamina")
    local timePassed = currentTime - staminaTable[playerId]
    if timePassed <= 0 then
        return
    end

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

function Player:onGainExperience(source, exp, rawExp)
    if not source or source:isPlayer() then
        return exp
    end
  
    local thing = self:getStorageValue(80000)
    if thing > os.time() then
        exp = exp * 1.5
    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 skill == SKILL_MAGLEVEL then
        return tries * configManager.getNumber(configKeys.RATE_MAGIC)
    end
    return tries * configManager.getNumber(configKeys.RATE_SKILL)
end

And my events.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<events>

    <!-- Creature methods -->
    <event class="Creature" method="onChangeOutfit" enabled="0" />
    <event class="Creature" method="onAreaCombat" enabled="0" />
    <event class="Creature" method="onTargetCombat" enabled="1" />

    <!-- Party methods -->
    <event class="Party" method="onJoin" enabled="0" />
    <event class="Party" method="onLeave" enabled="0" />
    <event class="Party" method="onDisband" enabled="0" />

    <!-- Player methods -->
    <event class="Player" method="onBrowseField" enabled="0" />
    <event class="Player" method="onLook" enabled="1" />
    <event class="Player" method="onLookInBattleList" enabled="1" />
    <event class="Player" method="onLookInTrade" enabled="1" />
    <event class="Player" method="onLookInShop" enabled="0" />
    <event class="Player" method="onMoveItem" enabled="1" />
    <event class="Player" method="onMoveCreature" enabled="0" />
    <event class="Player" method="onTurn" enabled="0" />
    <event class="Player" method="onTradeRequest" enabled="1" />
    <event class="Player" method="onTradeAccept" enabled="0" />
    <event class="Player" method="onGainExperience" enabled="1" />
    <event class="Player" method="onLoseExperience" enabled="0" />
    <event class="Player" method="onGainSkillTries" enabled="1" />
</events>

Maybe i forget something in global.lua or compat.lua?
Thanks for help me!
 
@Lundrial, @Dyabl0hi, days ago i post it, and not yet get solved this, any solution? Thanks.
Maybe... Try debugging the code?

Example:
Code:
    print(toCylinder, toCylinder and toCylinder:getId() or toCylinder)
    if toPosition.x == CONTAINER_POSITION and toCylinder and toCylinder:getId() == 26052 then
        self:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return false
    end
 
@Lundrial I found an error that is occurring on my server .
for example , I have 200 cap ! and I'm using a focus cape , I caught one armor plate and put in the backpack , then I try to equip and unequip sometimes after a few times it vanishes
 
@Lundrial I found an error that is occurring on my server .
for example , I have 200 cap ! and I'm using a focus cape , I caught one armor plate and put in the backpack , then I try to equip and unequip sometimes after a few times it vanishes
I'll try to reproduce it
 
@MatheusMkalo Hi bro, i put the code
Code:
 print(toCylinder, toCylinder and toCylinder:getId() or toCylinder)

and i get this in console:

Code:
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil

This lines appear alot time on console. Any idea? Thanks!
 
@MatheusMkalo Hi bro, i put the code
Code:
 print(toCylinder, toCylinder and toCylinder:getId() or toCylinder)

and i get this in console:

Code:
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil
nil     nil

This lines appear alot time on console. Any idea? Thanks!
You are using an old version of tfs 1.2 and it does not have the toCylinder change to onMoveItem:
https://github.com/otland/forgottenserver/commit/2cdbbcc58e551d4e06d46050fb94de7dfe6943e7
 
/home/mario/custom/custom/src/depotchest.cpp: In constructor ‘DepotChest::DepotChest(uint16_t, bool)’:
/home/mario/custom/custom/src/depotchest.cpp:33:12: error: statement has no effect [-Werror=unused-value]
pagination;
 
/home/mario/custom/custom/src/depotchest.cpp: In constructor ‘DepotChest: DepotChest(uint16_t, bool)’:
/home/mario/custom/custom/src/depotchest.cpp:33:12: error: statement has no effect [-Werror=unused-value]
pagination;

DepotChest: DepotChest(uint16_t type, bool pagination) :
Container(type)
{
maxDepotItems = 2000;
maxSize = 32;
pagination;
}

change
pagination;
to
pagination = true;
 
about the critical hit system, not have any command in the db ?
 
Back
Top