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

Lua Error NPC Cledwyn TFS 1.5 downgrade

Azerty

Active Member
Joined
Apr 15, 2022
Messages
321
Solutions
4
Reaction score
34
Could anyone help me with this error?

1713702534507.png

Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function onCreatureAppear(cid)
    npcHandler:onCreatureAppear(cid)
end
function onCreatureDisappear(cid)
    npcHandler:onCreatureDisappear(cid)
end
function onCreatureSay(cid, type, msg)
    npcHandler:onCreatureSay(cid, type, msg)
end
function onThink()
    npcHandler:onThink()
end

local shop = {
    {id=25177, buy=100, sell=0, name='earthheart cuirass'},
    {id=25178, buy=100, sell=0, name='earthheart hauberk'},
    {id=25179, buy=100, sell=0, name='earthheart platemail'},
    {id=25191, buy=100, sell=0, name='earthmind raiment'},
    {id=25187, buy=100, sell=0, name='earthsoul tabard'},
    {id=25174, buy=100, sell=0, name='fireheart cuirass'},
    {id=25175, buy=100, sell=0, name='fireheart hauberk'},
    {id=25176, buy=100, sell=0, name='fireheart platemail'},
    {id=25190, buy=100, sell=0, name='firemind raiment'},
    {id=25186, buy=100, sell=0, name='firesoul tabard'},
    {id=25183, buy=100, sell=0, name='frostheart cuirass'},
    {id=25184, buy=100, sell=0, name='frostheart hauberk'},
    {id=25185, buy=100, sell=0, name='frostheart platemail'},
    {id=25193, buy=100, sell=0, name='frostmind raiment'},
    {id=25189, buy=100, sell=0, name='frostsoul tabard'},
    {id=40398, buy=1, sell=0, name='magic shield potion'},
    {id=25180, buy=100, sell=0, name='thunderheart cuirass'},
    {id=25181, buy=100, sell=0, name='thunderheart hauberk'},
    {id=25182, buy=100, sell=0, name='thunderheart platemail'},
    {id=25192, buy=100, sell=0, name='thundermind raiment'},
    {id=25188, buy=100, sell=0, name='thundersoul tabard'},
}

local function setNewTradeTable(table)
    local items, item = {}
    for i = 1, #table do
        item = table[i]
        items[item.id] = {id = item.id, buy = item.buy, sell = item.sell, subType = 0, name = item.name}
    end
    return items
end

local function onBuy(cid, item, subType, amount, ignoreCap, inBackpacks)
    local player = Player(cid)
    local itemsTable = setNewTradeTable(shop)
    if not ignoreCap and player:getFreeCapacity() < ItemType(itemsTable[item].id):getWeight(amount) then
        return player:sendTextMessage(MESSAGE_INFO_DESCR, "You don't have enough cap.")
    end
    if itemsTable[item].buy then
        if player:removeItem(Npc():getCurrency(), amount * itemsTable[item].buy) then
            if amount > 1 then
                currencyName = ItemType(Npc():getCurrency()):getPluralName():lower()
            else
                currencyName = ItemType(Npc():getCurrency()):getName():lower()
            end
            player:addItem(itemsTable[item].id, amount)
            return player:sendTextMessage(MESSAGE_INFO_DESCR,
                        "Bought "..amount.."x "..itemsTable[item].name.." for "..itemsTable[item].buy * amount.." "..currencyName..".")
        else
            return player:sendTextMessage(MESSAGE_INFO_DESCR, "You don't have enough "..currencyName..".")
        end
    end

    return true
end

local function onSell(cid, item, subType, amount, ignoreCap, inBackpacks)
    return true
end

local chargeItem = {
    ['pendulet'] = {noChargeID = 34067, ChargeID = 34983},
    ['sleep shawl'] = {noChargeID = 34066, ChargeID = 34981},
    ['blister ring'] = {noChargeID = 36392, ChargeID = 36456},
    ['theurgic amulet'] = {noChargeID = 35236, ChargeID = 35238},
    ['ring of souls'] = {noChargeID = 37456, ChargeID = 37471}
}

local function greetCallback(cid)
    return true
end

local voices = {
    { text = 'Trading tokens! First-class bargains!' },
    { text = 'Bespoke armor for all vocations! For the cost of some tokens only!' },
    { text = 'Tokens! Bring your tokens!' }
}

npcHandler:addModule(VoiceModule:new(voices))

function creatureSayCallback(cid, type, msg)
    if not npcHandler:isFocused(cid) then
        return false
    end
    local player = Player(cid)
    if not player then
        return false
    end
    if msgcontains(msg, 'token') or msgcontains(msg, 'tokens') then
        npcHandler:say("If you have any {silver} tokens with you, let's have a look! Maybe I can offer you something in exchange.", cid)
    elseif msgcontains(msg, 'information') then
        npcHandler:say("With pleasure. <bows> I trade {token}s. There are several ways to obtain the {token}s I am interested in - killing certain bosses, for example. In exchange for a certain amount of tokens, I can offer you some first-class items.", cid)
    elseif msgcontains(msg, 'talk') then
        npcHandler:say({"Why, certainly! I'm always up for some small talk. ...",
                         "The weather continues just fine here, don't you think? Just the day for a little walk around the town! ...",
                         "Actually, I haven't been around much yet, but I'm looking forward to exploring the city once I've finished trading {token}s."}, cid)
    elseif msgcontains(msg, 'silver') then
        openShopWindow(cid, shop, onBuy, onSell)
        npcHandler:say({"Here's the deal, " .. player:getName() .. ". For 100 of your silver tokens, I can offer you some first-class torso armor. These armors provide a solid boost to your main attack skill, as well as ...",
        "some elemental protection of your choice! I also sell a magic shield potion for one silver token. So these are my offers."}, cid)
    elseif msgcontains(msg, 'enchant') then
        npcHandler:say("The following items can be enchanted: {pendulet}, {sleep shawl}, {blister ring}, {theurgic amulet}. Make you choice!", cid)
        npcHandler.topic[cid] = 1
    elseif isInArray({'pendulet', 'sleep shawl', 'blister ring', 'theurgic amulet'}, msg:lower()) and npcHandler.topic[cid] == 1 then
        npcHandler:say("Should I enchant the item pendulet for 2 ".. ItemType(Npc():getCurrency()):getPluralName():lower() .."?", cid)
        local charge = msg:lower()
        npcHandler.topic[cid] = 2
    elseif npcHandler.topic[cid] == 2 then
        if msgcontains(msg, 'yes') then
            if not chargeItem[charge] then
                npcHandler:say("Sorry, you don't have an unenchanted ".. charge ..".",cid)
            else
                if (player:getItemCount(Npc():getCurrency()) >= 2) and (player:getItemCount(chargeItem[charge].noChargeID) >= 1) then
                    player:removeItem(Npc():getCurrency(), 2)
                    player:removeItem(chargeItem[charge].noChargeID, 1)
                    local itemAdd = player:addItem(chargeItem[charge].ChargeID, 1)
                    npcHandler:say("Ah, excellent. Here is your " .. itemAdd:getName():lower() .. ".", cid)
                else
                    npcHandler:say("Sorry, friend, but one good turn deserves another. Bring enough ".. ItemType(Npc():getCurrency()):getPluralName():lower() .." and it's a deal.", cid)
                end
                npcHandler.topic[cid] = 0
            end
        elseif msgcontains(msg, 'no') then
            npcHandler:say("Alright, come back if you have changed your mind.", cid)
            npcHandler.topic[cid] = 0
        end
    elseif msgcontains(msg, 'addon') then
        if player:hasOutfit(846, 0) or player:hasOutfit(845, 0) then
            npcHandler:say("Ah, very good. Now choose your addon: {first} or {second}.", cid)
            npcHandler.topic[cid] = 3
        else
            npcHandler:say("Sorry, friend, but one good turn deserves another. You need to obtain the rift warrior outfit first.", cid)
        end
    elseif isInArray({'first', 'second'}, msg:lower()) and npcHandler.topic[cid] == 3 then
        if msg:lower() == 'first' then
            if not(player:hasOutfit(846, 1)) and not(player:hasOutfit(845, 1)) then
                if player:removeItem(25172, 100) then
                    npcHandler:say("Ah, excellent. Obtain the first addon for your rift warrior outfit.", cid)
                    player:addOutfitAddon(846, 1)
                    player:addOutfitAddon(845, 1)
                    if (player:hasOutfit(846, 1) or player:hasOutfit(845, 1)) and (player:hasOutfit(846, 2) or player:hasOutfit(845, 2)) then
                        player:addAchievement("Rift Warrior")
                    end
                else
                    npcHandler:say("Sorry, friend, but one good turn deserves another. Bring enough ".. ItemType(Npc():getCurrency()):getPluralName():lower() .." and it's a deal.", cid)
                end
            else
                npcHandler:say("Sorry, friend, you already have the first Rift Warrior addon.", cid)
            end
        elseif msg:lower() == 'second' then
            if not(player:hasOutfit(846, 2)) and not(player:hasOutfit(845, 2)) then
                if player:removeItem(25172, 100) then
                    npcHandler:say("Ah, excellent. Obtain the second addon for your rift warrior outfit.", cid)
                    player:addOutfitAddon(846, 2)
                    player:addOutfitAddon(845, 2)
                    if (player:hasOutfit(846, 1) or player:hasOutfit(845, 1)) and (player:hasOutfit(846, 2) or player:hasOutfit(845, 2)) then
                        player:addAchievement("Rift Warrior")
                    end
                else
                    npcHandler:say("Sorry, friend, but one good turn deserves another. Bring enough ".. ItemType(Npc():getCurrency()):getPluralName():lower() .." and it's a deal.", cid)
                end
            else
                npcHandler:say("Sorry, friend, you already have the second Rift Warrior addon.", cid)
            end
        end
        npcHandler.topic[cid] = 0
    end
    return true
end

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Back
Top