Ir para conteúdo
Entre para seguir isso  
LsM

"P" Points system v1.0

Recommended Posts

LsM    2
LsM

P Points System

divisor.png

 

Nome do script :P Points system v1

Versão testada : TFS 0.4 (8.70 Funciona em versões anteriores)

Creditos : LsM (OTServ Brasil)

DedoDireita.png Como funciona :

 

O sistema funciona como uma recompensa ao player por ficar online por um certo tempo. O player, ao ficar online por um certo intervalo de tempo programado no código, receberá uma quantidade de pontos "P" a qual também se pode alterar.

 

O objetivo foi fazer com que os players se sintam incentivados a ficar online por um maior período de tempo para que recebam tais moedas. Essa é, definitivamente, uma forma fácil de se alcançar um número maior de players online, já que a ideia foi retirada de um MMORPG online de grande sucesso.

 

DedoDireita.png Como utilizar :

 

Como o sistema tem como foco dar uma recompensa ao player, no caso pontos P, estes, podem ser utilizados no comercio, em npcs, ou até mesmo na entrada de locais. Sua sintaxe é muito maleável e se encaixa em quaquer requisito desejado.

 

 

DedoDireita.png Instalação :

 

Primeiramente, execute a seguinte QUERY em seu banco de dados :

 

ALTER TABLE  `accounts` ADD  `p_points` INTEGER NOT NULL DEFAULT 0

 

Em seguida, crie um arquivo com a extensão .lua chamado "points.lua" em "data/creaturescripts/scripts" e adicione o código abaixo :

 

--[[
P Points System by LsM.
OTServ Brasil © 2011
Version : v1.0
]]--

function onLogin(cid)
   doCreatureSetStorage(cid, 1219, os.time())
   return true
end

function onLogout(cid)
   doCreatureSetStorage(cid, 1219, 0)
   return true
end

Ainda em creaturescripts, abra o arquivo "creaturescripts.xml" e adicione a seguinte TAG:

 

<event type="login" name="PlayerAddPointsTimer" event="script" value="points.lua"/>
<event type="logout" name="PlayerResetPointsTimer" event="script" value="points.lua"/>

Agora, em "data/globalevents/script" crie um arquivo com a extensão .lua também chamado "points.lua" e cole o seguinte código :

 

--[[
P Points System by LsM.
OTServ Brasil © 2011
Version : v1.0
]]--

local config = {
               p_time = 3600, -- Tempo em segundos para receber os pontos( 3600 = 1hora )
               p_points = 1 -- Quantidade de pontos recebida a cada "p_time"
               }

local function givePoints(cid, quant)
     if os.time() - getCreatureStorage(cid, 1219) >= config.p_time then
          doPlayerSendTextMessage(cid, 19, "Congratulations, you recieved ".. config.p_points .." p points. Now you have ".. config.p_points + getPoints(cid) .." p points in your account. Your timer was reseted.")    
          doPlayerAddPoints(cid, quant)                 
          doCreatureSetStorage(cid, 1219, 0)
          doCreatureSetStorage(cid, 1219, os.time())
     end
     return true
end                  

function onThink(interval)
   for i, v in pairs(getPlayersOnline()) do   
        givePoints(v, config.p_points)
   end
   return true
end

E em "globalevents.xml" cole a seguinte TAG:

 

<globalevent name="points" interval="60" event="script" value="points.lua"/>

Em seguida vá em "data/talkactions/scripts", crie um arquivo com extensão .lua chamado "points.lua" e adicione o seguinte código :

 

function onSay(cid, words, param, channel)
   local getP = getPoints(cid)
   doPlayerPopupFYI(cid, "You have ".. getP .." P points.")
   return true
end

E em "talkactions.xml" adicione a TAG :

 

    <talkaction words="!ppoints;/ppoints" event="script" value="points.lua"/>

Para finalizar, vá em "data/lib/050-function.lua" e na última linha, adicione as funções abaixo :

 

function getPoints(cid)
   local res = db.getResult('select `p_points` from accounts where name = \''..getPlayerAccount(cid)..'\'')
   if(res:getID() == -1) then
      return false
   end
   local ret = res:getDataInt("p_points")
   res:free()
   return tonumber(ret)
end

function doPlayerAddPoints(cid, quant)
   return db.executeQuery("UPDATE `accounts` SET `p_points` = '".. getPoints(cid) + quant .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
end

function doPlayerRemovePoints(cid, quant)
   return db.executeQuery("UPDATE `accounts` SET `p_points` = '".. getPoints(cid) - quant .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
end

Fim, o sistema está instalado.

 

DedoDireita.png Como configurar :

 

A parte da configuração é a mais fácil, apenas edite :

 

local config = {
               p_time = 3600, -- Tempo em segundos para receber os pontos( 3600 = 1hora )
               p_points = 1 -- Quantidade de pontos recebida a cada "p_time"
               }

 

Quer utilizar o sistema em um npc, ou action, ou algum outro sistema e não sabe como? Simples, apenas use as seguintes funções :

 

getPoints(cid) A função retorna a quantidade de pontos do player.

 

doPlayerAddPoints(cid, quant) A função adiciona a quantidade(quant) de pontos ao player.

 

doPlayerRemovePoints(cid, quant) A função remove a quantidade(quant) de pontos do player.

 

DedoDireita.png Ilustração :

 

Funcionamento do script

219b993.png

 

Ilustração de !ppoints

10z9y7p.png

 

Aí está galera, espero que gostem, e, para os preguiçosos, disponibilizei o download do sistema completo:

 

download2.bmp

 

Caso encontre um erro, não hesite em reportá-lo.

 

Abraços.

Editado por Garou

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Meus parabéns, LsM. Um sistema com grande utilidade para servidores em geral, imagine integrar esse sistema com um NPC que venda itens raros apenas por "P" ou ainda aquela pedra do sistema de refinamento...? Além também de valorizar aqueles jogadores que não param de jogar o servidor.

 

Avaliando o sistema em si, vi que abre muitas possibilidades para sua configuração e utilização, sem contar que o código foi muito bem feito, creio que sem bug nenhum.

 

Parabéns

Aprovado!

Você receberá V$ 120 pela contribuição!

Script avaliado como A+.

Compartilhar este post


Link para o post
SubythKiller    2
SubythKiller

Ual, simplismente fantastico ;x

Eu adorei, cara fiz um npc que tipo assim, ele remove uma quantidade de pontos e dar um item para o player...

nossa cara D+

Gostei muito.

 

PS: Erro em

ALTER TABLE `accounts` ADD `p_points` INT NOT NULL
não dar para executar a seguinte Query, diz que

INT NOT NULL

 

Não é valido ;s

Editado por SubythKiller

Compartilhar este post


Link para o post
Bvkse    0
Bvkse

parece aquele negocio do habbo mano de pixels sei la como é o nome :P

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Para quem deu erro na hora de executar a Query, tentem assim:

 

ALTER TABLE  `accounts` ADD  `p_points` INTEGER NOT NULL DEFAULT 0

 

Para LsM: Fiz pequenas modificações na função getPoints.

Editado por Garou

Compartilhar este post


Link para o post
Sphex    0
Sphex

É só por um char de bot no ot e deixar ganhando points...

Mas o sistema em sí é bem interessante, da pra fazer muitas coisas com ele, parabéns!

Seria legal também, se no lugar de horas online, o player recebesse esses points por uma quantidade de xp por dia, se o player adquirir X experience por 1 dia, ele pode ganhar points, sei la flw

Compartilhar este post


Link para o post
LsM    2
LsM

Obrigado pelos comentários.

 

@Garou

 

Sem problemas, realmente, dessa forma a função tem uma maior "funcionalidade".

Não sei por que a QUERY deu problema, aqui funcionou normalmente. Talvez pode ter ocorrido pelo fato de eu não colocar um valor inicial "Default". Mesmo assim, Obrigado por ter alterado e consertado Garouzitos.

Compartilhar este post


Link para o post
Ramza    11
Ramza

Ae nega, boa =D

Agora gogogo terminar o 'gran sistema' xD

 

Obs.: Esse sistema é bom, mas como o amigo ali em cima disse, vai é incentivar bots e account sharing. Mas mesmo assim, não deixa de ser interessante, e muito bem feito. Parabéns xD

Compartilhar este post


Link para o post
iuniX    4
iuniX

Muito bem pensado, se somar isso com algum tipo de anti-bot system, da pra fazer algo legal. Trocar por itens ou até cash :]

rep +

Compartilhar este post


Link para o post
SubythKiller    2
SubythKiller

aee agora funcionou ;x

 

Ps: bot? kkkk é só criar algo que tipo assim: precise muito mais de apenas 10 pontos para trocar por items, por exemplo:

 

150 pontos ;x

 

Cara, testei aki, agora é so desenvolver o npc, não sou tão bom mais neguin temque tentar neh!

Otimo script, \o/

Compartilhar este post


Link para o post
LsM    2
LsM

Obrigado a todos os que comentaram.

 

O desenvolvimento de npcs é uma tarefa fácil, apenas use a função doPlayerRemovePoints(cid, quant)

Editado por LsM

Compartilhar este post


Link para o post
vyctor17    35
vyctor17

gostei cara parabems

Compartilhar este post


Link para o post
SubythKiller    2
SubythKiller
Obrigado a todos os que comentaram.

 

O desenvolvimento de npcs é uma tarefa fácil, apenas use a função doPlayerRemovePoints(cid, quant)

 

mais para quem não entende muito, isso ai é como uma bomba kkk

porque tipo, eu só consigo criar com apenas 1 item, se eu colocar + de 1 ou para pode negociar no hi/trade ai buga, da erro, ja tentei de tudo + num consegui ;s

 

--------------EDIT-----------------------------------------

Aee eu consegui, mais só tem como trocar por um item ;x

 

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

function creatureSayCallback(cid, type, msg)
   if(not npcHandler:isFocused(cid)) then
       return false
   end

   local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

   if(msgcontains(msg, 'war') or msgcontains(msg, 'points')) then
       selfSay('que trocar seus 10 war points por 1 documento vale-war?', cid)
       talkState[talkUser] = 1
   elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
       if[color=red](getPoints(cid) >= 10)[/color] then
           if[color=red](doPlayerRemovePoints(cid, 10)[/color] == TRUE) then
               doPlayerAddItem[color=red](cid, 12427, 1)[/color]
               selfSay('Here you are.', cid)
           else
               selfSay('Sorry, you don\'t have enough gold.', cid)
           end
       else
           selfSay('Sorry, you don\'t have the item.', cid)
       end
       talkState[talkUser] = 0
   elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
       talkState[talkUser] = 0
       selfSay('Ok then.', cid)
   end

   return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

AI é so configurar o que ta em vermelho:

(getPoints(cid) >= 10) = checa se o player possui os points necessarios

(doPlayerRemovePoints(cid, 10) = Remove os points, 10 é a quantidade

(cid, 12427, 1) = Adiciona um item, no caso seria de ID 12427, quantidade 1

Editado por SubythKiller

Compartilhar este post


Link para o post
Ramza    11
Ramza

Presente pra vocês:

 

 

 


local focuses, controlId = {}, 3586
local items = {
{name = "Item 1", id = 12427, price = 100, requirePremium = false},
{name = "Item 2", id = 124278, price = 120, requirePremium = false}
}

function onCreatureDisappear(cid)
   if isFocused(cid, focuses) then
    removeFocus(cid, focuses)
       if isPlayer(cid) then
        closeShopWindow(cid)
       end
   end
end

local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
local info = items[item-controlId]
   if getPoints(cid) >= info.price then
    doPlayerAddItem(cid, info.id)
    doPlayerRemovePoints(cid, info.price)
    selfSay("Here we are!", cid)
    lookAtFocus(focuses)
   end
end

function onCreatureSay(cid, type, msg)
local itensWindow = {}
   if msgcontains(msg, "hi", "hello") and not isFocused(cid, focuses) and getDistanceToCreature(cid) < 4 then
    selfSay("Hiho " .. getCreatureName(cid) .. ", I can sell you some itens for {PPoints}.", cid)
    addFocus(cid, focuses)
    selfFocus(cid)
   elseif (msgcontains(msg, "itens") or msgcontains(msg, "items")) and isFocused(cid, focuses) then
    selfSay("Take a look at my items!", cid)
       for index, info in pairs(items) do
           if not info.requirePremium or isPremium(cid) and info.requirePremium then
            table.insert(itensWindow, {id=controlId+index, subType=0, buy=info.price, sell=0, name=info.name})
           end
       end
       openShopWindow(cid, itensWindow, onBuy, onSell)
   elseif msgcontains(msg, "bye", "goodbye") and isFocused(cid, focuses) then
    selfSay("Goodbye!", cid)
    closeShopWindow(cid)
    removeFocus(cid, focuses)
    lookAtFocus(focuses)
   end
end

function onThink()
   for _, focus in pairs(focuses) do
       if not isCreature(focus) then
        removeFocus(focus, focuses)
       else
        local distance = getDistanceTo(focus) or 5
           if distance > 4 then
               selfSay("Hmpf!", focus)
               closeShopWindow(focus)
               removeFocus(focus, focuses)
           end
       end
   end
   lookAtFocus(focuses)
end

Editado por Ramza

Compartilhar este post


Link para o post
LsM    2
LsM

Ê Nega ! :)

 

Eu já estava planejando fazer um desse, com as mesmas funções, já que o pessoal estava apresentando algumas dificuldades quanto a isso.

Mas, já que você já fez, obrigado, ficou muito bom ^^.

 

Estou desenvolvendo o meu, dai eu edito.

Editado por LsM

Compartilhar este post


Link para o post
MaXwEllDeN    13
MaXwEllDeN

Fiz a talkaction do shop, mas não cheguei à testar...

os comandos são:

 

!pshop help
!pshop list

 

TAG:

 

<talkaction words="!pshop" sensitive="false" event="script" value="pshop.lua"/>

 

pshop.lua:

 

local config = {
     minlvl = false,
     premmyonly = false,
}

local list = {
["magic plate armor"] = {points = 10, id = 2472},
["golden legs"] = {points = 7, id = 2470},
["magic longsword"] = {points = 20, id = 2390},
}

function onSay(cid, words, param)

local param = param:lower()

if (param ~= "list") and (param ~= "help")then
  return doPlayerSendTextMessage(cid, 27, "You must use the correct parameters.\n If you need help use: ".. words .. " help\n and to se the items list use: ".. words .. " list")
end   

if (premmyonly and getPlayerPremiumDays(cid) < 1) then
  return doPlayerSendTextMessage(cid, 27, "Only players that have premium account can use shop system.")
end

if (type(minlvl) == "number" and getPlayerLevel(cid) < minlvl) then
  return doPlayerSendTextMessage(cid, 27, "Only players with level ".. config.minlvl .." or higher can use the Point Shop System.")
end


if (param == "help") then        
  return doPlayerPopupFYI(cid, "Points Shop System Help: \n\n\n*How to see the list of items that have in the shop.\n\nIt's simple, you only need use this command: " .. words .. " list\nand will show in your screen the list of items that are display in shop.\n\n\n*How to buy a item.\n\nIt's simple, you only need use: " .. words .. " item name\n Example: " .. words .. " magic plate armor.")
elseif (param == "list") then
  indexloks = "This is the shop list:\n"
  for a, b in pairs(list) do
      poin = "points"
  if b.points < 2 then
      poin = "point"
  end    
      indexloks = "\n" .. indexloks .. a:sub(1, 1):upper().. a:sub(2):lower() .. " - " .. b.points .. " " .. poin ..";"            
  end
  indexloks = indexloks:sub(1, #indexloks-1) .. "."
  return doShowTextDialog(cid, 2160, indexloks)
end

if getPoints(cid) < list[param].points then
  lawl = "a" .. getPoints(cid) - list[param].points 
  return doPlayerSendTextMessage(cid, 27, "To buy " .. param:sub(1, 1):upper().. param:sub(2):lower() .. " you must have more ".. lawl:sub(3, #lawl) .. " point(s).")
end 

  doPlayerAddItem(cid, list[param].id, 1)
  doPlayerRemovePoints(cid, list[param].points)
  return doPlayerSendTextMessage(cid, 27, "You bought " .. param:sub(1, 1):upper().. param:sub(2):lower() .. " for " .. list[param].points ..", now you have " .. getPoints(cid) .. " points.")
end       

 

Toda configuração do scripts está nessas duas partes:

 

local config = {
     minlvl = false,
     premmyonly = false,
}

 

minlvl = false

level minimo para poder utilizar o sistema, caso precise de level, ponha o numero do level, caso o contrario só ponha false.

 

premmyonly = false

Somente players premium account podem utilizar o script? false para não e true para sim

local list = {
["magic plate armor"] = {points = 10, id = 2472},
["golden legs"] = {points = 7, id = 2470},
["magic longsword"] = {points = 20, id = 2390},
}

AI é a lista dos items que estão na loja. Para adicionar mais use esse exemplo: (em negrito o que é para modificar)

 

["nome do item todo em minusculo"] = {points = custo em pontos, id = id do item},

Editado por MaXwEllDeN

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Eu consertei vários erros do código do Ramza.

 

local focuses = {}

local items = {
   [12427] = {price = 10, requirePremium = false},
   [2400] = {price = 1500, requirePremium = true}
}

local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
   local info = items[item]
   if(info and doPlayerRemoveItem(cid, 6527, info.price)) then
       doPlayerAddItem(cid, item)
       selfSay("Here we are!", cid)
       lookAtFocus(focuses)
   else
       selfSay("You can't buy this item!", cid)
   end
   return true
end

function onCreatureSay(cid, type, msg)
   local shopWindow = {}
   local msg = msg:lower() or ""

   if(msg:find("hi") or msg:find("hello") and not(isFocused(cid, focuses)) and getNpcDistanceTo(cid) <= 4) then
       focuses[cid] = {talkstate = 1}
       selfSay("Hiho, ".. getCreatureName(cid) .. ". I can sell to you some {items} for {P Points}.", cid)
       addFocus(cid, focuses)
       selfFocus(cid)
   elseif(msg:find("bye") or msg:find("goodbye") and isFocused(cid, focuses)) then
       selfSay("Goodbye!", cid)
       closeShopWindow(cid)
       removeFocus(cid, focuses)
       lookAtFocus(focuses)
   end

   if(focuses[cid].talkstate == 1) then
       if(msg:find("items") or msg:find("trade")) then
           selfSay("Take a look at my items!", cid)
           for index, info in pairs(items) do
               if(not(info.requirePremium) or (isPremium(cid) and info.requirePremium)) then
                   table.insert(shopWindow, {id = index, subType = 0, buy = info.price, sell = 0, name = getItemNameById(index)})
               end
           end
           openShopWindow(cid, shopWindow, onBuy, onSell)
       end
   end
   return true
end

function onThink()
   for i, focus in pairs(focuses) do
       if(isPlayer(focus) and isFocused(focus, focuses)) then
           local distance = getNpcDistanceTo(focus) or -1
           if(distance >= 4 or distance == -1) then
               selfSay("Hmph!")
               closeShopWindow(focus)
               removeFocus(focus, focuses)
           end
       end
   end
   lookAtFocus(focuses)
end

Lembrando que esse tipo de NPC precisa de algumas funções extras que o sistema Jiddo não tem, então, se o código estiver apresentando algum erro, basta adicionar isso no seu npc.lua em data/npc/lib.

 

function isFocused(cid, t)
   for i, v in pairs(t) do
       if(v == cid) then
           return true
       end
   end
   return false
end

function addFocus(cid, t)
   if(not isFocused(cid, t)) then
       table.insert(t, cid)
   end
end

function setFocus(t)
   for i, v in pairs(t) do
       if(isPlayer(v)) then
           doNpcSetCreatureFocus(v)
           return
       end
   end
   doNpcSetCreatureFocus(0)
end

function removeFocus(cid, t)
   for i, v in pairs(t) do
       if(v == cid) then
           table.remove(t, i)
           setFocus(focuses)
           break
       end
   end
end

function onCreatureDisappear(cid)
   if isFocused(cid, focuses) then
    removeFocus(cid, focuses)
       if isPlayer(cid) then
        closeShopWindow(cid)
       end
   end
end

lookAtFocus = setFocus

Um abraço!

Editado por Garou

Compartilhar este post


Link para o post
SkyFail    0
SkyFail

Fiz um Sistema Legal, Ao criar conta Adiciona um "Container" em seu BackPack, com a spr escrito SHOP, ao abrir estara a foto dos items Imoveis, e ao dar lock mostra o nome, a armor, e o preço, assim Facilitando na compra. tudo com peso 0, assim dando um sistema legal. fora que isso também e bem util para outras coisas.

Compartilhar este post


Link para o post
arrozbr    0
arrozbr

aee por favor , alguem faz um script tipo um bau e quando clica remove os point e adiciona os items obgrigado (:

Compartilhar este post


Link para o post
Lwkass    1
Lwkass

#arrozbr:

Essa seção e/ou tópico não é para pedidos de script

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×