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

Premium accounts NPC!

jpkulik

New Member
Joined
Mar 15, 2008
Messages
208
Reaction score
2
[Released] Premium accounts NPC!

Hello World :D
That is a released NPC that's sell Premmium account and promotions.
Crédits goto who create the Johnny NPC for Evolutions, i just modified some stuff to make it works for TFS.

That is the scripts:

NPC The King.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="The King" script="data/npc/scripts/premium.lua" autowalk="1" floorchange="0">
    <health now="100" max="100"/>
    <look type="73" head="20" body="39" legs="45" feet="7" addons="0"/>
</npc>
And Script premium.lua
Code:
local focus = 0
local talk_start = 0
local target = 0
local days = 0

function onThingMove(creature, thing, oldpos, oldstackpos)

end


function onCreatureAppear(creature)

end


function onCreatureDisappear(cid, pos)
      if focus == cid then
          selfSay('Good bye then.')
          focus = 0
          talk_start = 0
      end
end


function onCreatureTurn(creature)

end


function msgcontains(txt, str)
      return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end


function onCreatureSay(cid, type, msg)
      msg = string.lower(msg)

      if (msgcontains(msg, 'hi') and (focus == 0)) and getDistanceToCreature(cid) < 4 then
         selfSay('Hello ' .. getPlayerName(cid) .. '! I sell premiums and promotions.')
         focus = cid
         talk_start = os.clock()

    elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then
          selfSay('Sorry, ' .. getPlayerName(cid) .. '! I talk to you in a minute.')

      elseif focus == cid then
        talk_start = os.clock()

        if msgcontains(msg, 'promotion') or msgcontains(msg, 'promote') then
             if getPlayerVocation(cid) > 4 then
                 selfSay('Sorry, you are already promoted.')
                 talk_state = 0
             elseif getPlayerLevel(cid) < 20 then
                selfSay('Sorry, you need level 20 to buy promotion.')
                talk_state = 0
            elseif not isPremium(cid) then
                selfSay('Sorry, you must be premium to buy promotion.')
                talk_state = 0
            else
                selfSay('Do you want to buy promotion for 20000 gold coins?')
                talk_state = 1
            end

        elseif msgcontains(msg, 'premium') or msgcontains(msg, 'premmy') then
            selfSay('Do you want to buy 7 days of premium for 50000 gold coins?')
            talk_state = 2

        elseif talk_state == 1 then
            if msgcontains(msg, 'yes') then
                if doPlayerRemoveMoney(cid,20000) then
                    doPlayerSetVocation(cid, getPlayerVocation(cid)+4)
                    selfSay('You are now promoted!')
                else
                    selfSay('Sorry, you do not have enough money.')
                end
             end
            talk_state = 0

        elseif talk_state == 2 then
            if msgcontains(msg, 'yes') then
                if doPlayerRemoveMoney(cid,50000) then
                    doPlayerAddPremiumDays(cid, 7)
                    selfSay('You have 7 days of premium time!')
                else
                    selfSay('Sorry, you do not have enough money.')
                end
            end
            talk_state = 0

          elseif msgcontains(msg, 'bye')  and getDistanceToCreature(cid) < 4 then
              selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
              focus = 0
              talk_start = 0
          end
      end
end


function onCreatureChangeOutfit(creature)

end


function onThink()
    doNpcSetCreatureFocus(focus)
      if (os.clock() - talk_start) > 30 then
          if focus > 0 then
              selfSay('Next Please...')
          end
              focus = 0
      end
     if focus ~= 0 then
         if getDistanceToCreature(focus) > 5 then
             selfSay('Good bye then.')
             focus = 0
         end
     end
end
If you want to change the premium price, edit:
Code:
selfSay('Do you want to buy 7 days of premium for [COLOR=Red]50000[/COLOR] gold coins?')
and
Code:
if doPlayerRemoveMoney(cid,[COLOR=Red]50000[/COLOR])
If you want to change the premium time, edit:
Code:
selfSay('Do you want to buy [COLOR=Red]7[/COLOR] days of premium for 50000 gold coins?')
and
Code:
doPlayerAddPremiumDays(cid, [COLOR=Red]7[/COLOR])
I hope that's help some one who is looking for such a NPC.
Don't forgot to comment!CYA
 
Last edited by a moderator:
[21/01/2011 15:12:43] [Error - Npc interface]
[21/01/2011 15:12:43] data/npc/scripts/promotion.lua:onThink
[21/01/2011 15:12:43] Description:
[21/01/2011 15:12:43] data/npc/scripts/promotion.lua:113: attempt to compare number with nil
[21/01/2011 15:12:43] stack traceback:
[21/01/2011 15:12:43] data/npc/scripts/promotion.lua:113: in function <data/npc/scripts/promotion.lua:104>


TFS 0.4
 
the command !buypremium (Mod)
this or misconfigured or malfunctioning
sometimes when I say that the! buypremuim not work
and I have must be, changing the name each time I want to know
if you can help me with that here is the script:


<? Xml version = "1.0" encoding = "UTF-8"?>
<Mod name = "Buy premium command" version = "1.0" author = "The Forgotten Server"
contact = "otland.net" enabled = "yes">
<config name="buypremium_config"> <! [CDATA [
config = {
days = 90,
cost = 10000,
maxDays = 360
}
]]></ Config>
words="!buypremium" <talkaction event="buffer"> <! [CDATA [
domodlib ('buypremium_config')
if (getPlayerPremiumDays (cid)> config.maxDays) then
doPlayerSendTextMessage (cid, MESSAGE_INFO_DESCR, "You
CAN NOT buy more than ".. .. config.maxDays config.days +" days of Premium
Account. ")
doSendMagicEffect (getPlayerPosition (cid)
CONST_ME_POFF)
return
end

if (not doPlayerRemoveMoney (cid, config.cost)) Then
doPlayerSendCancel (cid, "You Do not Have enough money,
".. .. Config.days" days premium account costs ".. .. config.cost gold
coins. ")
doSendMagicEffect (getPlayerPosition (cid)
CONST_ME_POFF)
return
end

doPlayerAddPremiumDays (cid, config.days)
doPlayerSendTextMessage (cid, MESSAGE_INFO_DESCR, "You have
Bought "config.days .. .." days of premium account. ")
]]></ Talkaction>
</ Mod>
 
LUA:
function onSay(cid, words, param)
if getPlayerPremiumDays(cid) <= 360 then
if doPlayerRemoveMoney(cid, 100) == TRUE then
doPlayerAddPremiumDays(cid, 100)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have bought 100 days of premium account.")
else
doPlayerSendCancel(cid, "You don't have enough money, 100 days premium account costs 100 gold coins.")
doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
end
else
doPlayerSendCancel(cid, "You can not buy more than one year of Premium Account.")
doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
end
return TRUE
end
 
im only bumping this cause i want the npc to work, i added all of this and it wont spawn on the map...using same scripts as in main post

nf29Z4J.png
 
Add this in npc.lua or look for something similar and use that.
Code:
function getDistanceToCreature(id)
     if not id or id == 0 then
         selfIdle()
         return nil
     end

     local c = getCreaturePosition(id)
     if not c.x or c.x == 0 then
         return nil
     end

     local s = getCreaturePosition(getNpcId())
     if not s.x or s.x == 0 or s.z ~= c.z then
         return nil
     end

     return math.max(math.abs(s.x - c.x), math.abs(s.y - c.y))
end
 
Add this in npc.lua or look for something similar and use that.
Code:
function getDistanceToCreature(id)
     if not id or id == 0 then
         selfIdle()
         return nil
     end

     local c = getCreaturePosition(id)
     if not c.x or c.x == 0 then
         return nil
     end

     local s = getCreaturePosition(getNpcId())
     if not s.x or s.x == 0 or s.z ~= c.z then
         return nil
     end

     return math.max(math.abs(s.x - c.x), math.abs(s.y - c.y))
end
npc handler?
 
The npc.lua is in data/npc/lib.
i can add it anywheres in that file?

still doesnt work :S

this is the npc.lua i added the part you gave me at the bottom
Code:
-- Including the Advanced NPC System
dofile('data/npc/lib/npcsystem/npcsystem.lua')
dofile('data/npc/lib/npcsystem/customModules.lua')

isPlayerPremiumCallback = Player.isPremium

function msgcontains(message, keyword)
    local message, keyword = message:lower(), keyword:lower()
    if message == keyword then
        return true
    end

    return message:find(keyword) and not message:find('(%w+)' .. keyword)
end

function doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
    local amount, subType, ignoreCap, item = amount or 1, subType or 0, ignoreCap and true or false, 0
    local player = Player(cid)
    ignoreCap = false
    if ItemType(itemid):isStackable() then
        if inBackpacks then
            stuff = Game.createItem(backpack, 1)
            item = stuff:addItem(itemid, math.min(100, amount))
        else
            stuff = Game.createItem(itemid, math.min(100, amount))
        end
        return player:addItemEx(stuff, ignoreCap) ~= RETURNVALUE_NOERROR and 0 or amount, 0
    end

    local a = 0
    if inBackpacks then
        local container, b = Game.createItem(backpack, 1), 1
        for i = 1, amount do
            local item = container:addItem(itemid, subType)
            if isInArray({(ItemType(backpack):getCapacity() * b), amount}, i) then
                if player:addItemEx(container, ignoreCap) ~= RETURNVALUE_NOERROR then
                    b = b - 1 --
                    break
                end
                a = i -- a = a + i
                if amount > i then
                    container = Game.createItem(backpack, 1)
                    b = b + 1
                end
            end
        end
        return a, b
    end

    for i = 1, amount do -- normal method for non-stackable items
        local item = Game.createItem(itemid, subType)
        if player:addItemEx(item, ignoreCap) ~= RETURNVALUE_NOERROR then
            break
        end
        a = i
    end
    return a, 0
end

local func = function(pars)
    local player = Player(pars.pcid)
    if player then
        player:say(pars.text, pars.type, false, player, player:getPosition())
        pars.e.done = true
    end
end

function doCreatureSayWithDelay(cid, text, type, delay, e, pcid)
    if Player(pcid) then
        e.done = false
        e.event = addEvent(func, delay < 1 and 1000 or delay, {cid=cid, text=text, type=type, e=e, pcid=pcid})
    end
end

function doPlayerTakeItem(cid, itemid, count)
    local player = Player(cid)
    if player:getItemCount(itemid) < count then
        return LUA_ERROR
    end

    while count > 0 do
        local tempcount = 0
        if ItemType(itemid):isStackable() then
            tempcount = math.min (100, count)
        else
            tempcount = 1
        end

        local ret = player:removeItem(itemid, tempcount)
        if ret ~= LUA_ERROR then
            count = count - tempcount
        else
            return LUA_ERROR
        end
    end

    if count ~= 0 then
        return LUA_ERROR
    end
    return LUA_NO_ERROR
end

function doPlayerSellItem(cid, itemid, count, cost)
    local player = Player(cid)
    if doPlayerTakeItem(cid, itemid, count) == LUA_NO_ERROR then
        if not player:addMoney(cost) then
            error('Could not add money to ' .. player:getName() .. '(' .. cost .. 'gp)')
        end
        return LUA_NO_ERROR
    end
    return LUA_ERROR
end

function doPlayerBuyItemContainer(cid, containerid, itemid, count, cost, charges)
    local player = Player(cid)
    if not player:removeMoney(cost) then
        return LUA_ERROR
    end

    for i = 1, count do
        local container = Game.createItem(containerid, 1)
        for x = 1, ItemType(containerid):getCapacity() do
            container:addItem(itemid, charges)
        end

        if player:addItemEx(container, true) ~= RETURNVALUE_NOERROR then
            return LUA_ERROR
        end
    end
    return LUA_NO_ERROR
end

function getCount(string)
    local b, e = string:find("%d+")
    return b and e and tonumber(string:sub(b, e)) or -1
end

function getDistanceToCreature(id)
     if not id or id == 0 then
         selfIdle()
         return nil
     end

     local c = getCreaturePosition(id)
     if not c.x or c.x == 0 then
         return nil
     end

     local s = getCreaturePosition(getNpcId())
     if not s.x or s.x == 0 or s.z ~= c.z then
         return nil
     end

     return math.max(math.abs(s.x - c.x), math.abs(s.y - c.y))
end
 
Didn't see your edit, it's correct like this.
For next time, you can also just try it and if something goes wrong post the result (problems/errors/scripts etc).

I noticed you use a TFS 1.x version so use getNpcCid instead or use TFS 1.x functions.
 
Back
Top