Ir para conteúdo

Premium Points In Game


Beeki

Posts Recomendados

Fala galerinha do XTibia, vim aqui postar um sistema de Premium Points inGame, que eu achei muito útil, pois eu estava tendo sérios problemas com o Shop System do Modern AAC, ai vai os sistemas.

antes de tudo execute esse comando em seu banco de dados.


ALTER TABLE `accounts` ADD `premium_points` INT NOT NULL DEFAULT 0;
[/code]

[font=tahoma,geneva,sans-serif][color=#ff0000]#[/color][color=#000000]S[/color]istemas[/font]

[font=tahoma,geneva,sans-serif]vá em data/libs e crie um novo arquivo com o nome [i]048-ppoints.lua[/i][/font]

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

function doAccountAddPoints(cid, count)
return db.executeQuery("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) + count .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
end

function doAccountRemovePoints(cid, count)
return db.executeQuery("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) - count .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
end

[/i]

vá em data/talkactions/talkactions.xml e adicione as seguintes tags.

<!-- Premium Points System -->
<talkaction log="yes" words="!getpoints;/getpoints" access="6" event="script" value="GetPoints.lua" />
<talkaction log="yes" words="!addpoints;/addpoints" access="6" event="script" value="AddPoints.lua" />
<talkaction log="yes" words="!removepoints;/removepoints" access="6" event="script" value="RemovePoints.lua" />
<talkaction words="!points" event="script" value="SelfGetPoints.lua" />



vá em data/talkactions/scripts e crie um novo arquivo com o seguinte nome AddPoints.lua

function onSay(cid, words, param, channel)
local split = param:explode(",")
local name, count = split[1], tonumber(split[2])
pid = getPlayerByNameWildcard(name)
if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
return TRUE
end
if not(split[2]) then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The commands requires 2 parameters: character name, amount")
end
if not(count) then
print(count)
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Numeric parameter required.")
end
doAccountAddPoints(cid, count)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. count .. " premium points were added to " .. getCreatureName(pid) .. "\'s Account.")
return true
end



vá em data/talkactions/script e crie um arquivo com o seguinte nome GetPoints.lua

function onSay(cid, words, param, channel)
local pid = 0
if(param == '') then
pid = getCreatureTarget(cid)
if(pid == 0) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
return TRUE
end
else
pid = getPlayerByNameWildcard(param)
end
if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
return TRUE
end
if isPlayer(pid) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. getCreatureName(pid) .. "\'s Account has " .. getAccountPoints(cid) .. " premium points.")
return TRUE
end
return TRUE
end



vá em data/talkactions/script e crie um arquivo com o seguinte nome RemovePoints.lua

function onSay(cid, words, param, channel)
local split = param:explode(",")
local name, count = split[1], tonumber(split[2])
local points = getAccountPoints(cid)
pid = getPlayerByNameWildcard(name)
if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
return TRUE
end
if not(split[2]) then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The commands requires 2 parameters: character name, amount")
end
if not(count) then
print(count)
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Numeric parameter required.")
end
if (points <= 0) then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. getCreatureName(pid) .. "\'s Account has 0 premium points.")
end
doAccountRemovePoints(cid, count)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. count .. " premium points were deleted from " .. getCreatureName(pid) .. "\'s Account.")
return true
end



vá em data/creaturescripts/scripts e crie um novo arquivo com o nome SelfGetPoints.lua

function onLogin(cid)
if isPlayer(cid) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your Account has " .. getAccountPoints(cid) .. " premium points.")
end
return TRUE
end



declare ele no creaturescripts.xml

<event type="login" name="GetPoints" event="script" value="getpoints.lua" />



#Scripts

aqui está um exemplo de talkaction para mudar o sexo do personagem usando o sistema de points.

local config = {
costPremiumDays = 2
}

function onSay(cid, words, param, channel)
if(getPlayerSex(cid) >= 2) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot change your gender.")
return
end

if(getAccountPoints(cid) < config.costPremiumDays) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sorry, not enough Premium Points - changing gender costs " .. config.costPremiumDays .. " Premium Points.")
doSendMagicEffect(getThingPosition(cid), CONST_ME_POFF)
return
end

if(getAccountPoints(cid) >= config.costPremiumDays) then
doRemovePoints(cid, -config.costPremiumDays)
end

local c = {
{3, 1, false, 6, 1},
{3, 2, false, 6, 2},
{6, 1, false, 3, 1},
{6, 2, false, 3, 2}
}
for i = 1, #c do
if canPlayerWearOutfitId(cid, c[i][1], c[i][2]) then
doPlayerRemoveOutfitId(cid, c[i][1], c[i][2])
c[i][3] = true
end
end

doPlayerSetSex(cid, getPlayerSex(cid) == PLAYERSEX_FEMALE and PLAYERSEX_MALE or PLAYERSEX_FEMALE)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have changed your gender and lost " .. config.costPremiumDays .. " days of premium time.")
doSendMagicEffect(getThingPosition(cid), CONST_ME_MAGIC_RED)

for i = 1, #c do
if c[i][3] == true then
doPlayerAddOutfitId(cid, c[i][4], c[i][5])
end
end

return true
end



Aqui está um npc ( aconselho usar ele para vender seus itens vips )

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 bootsid = 1455
local bootscost = 15

local ringid = 2145
local ringcost = 5

local bladeid = 12610
local bladecost = 20


local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

if(msgcontains(msg, 'vip boots') or msgcontains(msg, 'boots')) then
selfSay('Do you want to buy Vip Boots fo '.. bootscost ..' premium points?', cid)
talkState[talkUser] = 1
elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
if(getAccountPoints(cid) >= bootscost) then
if(doAccountRemovePoints(cid, bootscost) == TRUE) then
doPlayerAddItem(cid, bootsid)
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)

elseif(msgcontains(msg, 'blade of corruption') or msgcontains(msg, 'blade')) then
selfSay('Do you want to buy blade of corruption for '.. bladecost ..' premium points?', cid)
talkState[talkUser] = 2
elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
if(getAccountPoints(cid) >= bladecost) then
if(doAccountRemovePoints(cid, bladecost) == TRUE) then
doPlayerAddItem(cid, bladeid)
selfSay('Here you are.', cid)
else
selfSay('Sorry, you don\'t have enough points!.', cid)
end
end
talkState[talkUser] = 0
elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
talkState[talkUser] = 0
selfSay('Ok then.', cid)

elseif(msgcontains(msg, 'expring') or msgcontains(msg, 'ring')) then
selfSay('Do you want to buy exp ring for '.. ringcost ..' premium points?', cid)
talkState[talkUser] = 2
elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
if(getAccountPoints(cid) >= ringcost) then
if(doAccountRemovePoints(cid, ringcost) == TRUE) then
doPlayerAddItem(cid, ringid)
selfSay('Here you are.', cid)
else
selfSay('Sorry, you don\'t have enough gold.', cid)
end
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())



npc.xml

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Donator" script="donator.lua" walkinterval="0" floorchange="0" speed="900">
<health now="150" max="150"/>
<look type="131" head="19" body="19" legs="19" feet="19"/>
<interaction range="3" idletime="60">
<interact keywords="hi" focus="1">
<keywords>hello</keywords>
<response text="Hey there, I sell items only to Donators! To Donate check website or ask Server Staff.">
<action name="idle" value="1"/>
</response>
</interact>
<interact keywords="bye" focus="0">
<keywords>farewell</keywords>
<response text="Good bye."/>
</interact>
</interaction>
</npc>



script made by Vodkart

npc por trade say

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
-- ["nome do item"] = {Qntos pontos vao custar, id do item}
local t = {
["boots of haste"] = {15, 2195}, --
["demon helmet"] = {25, 2493},
["frozen starlight"] = {30, 2361},
["royal crossbow"] = {20, 8851},
["solar axe"] = {30, 8925},
["soft boots"] = {50, 2640},
["demon armor"] = {100, 2494},
["firewalker boots"] = {50, 9932},
["magic plate armor"] = {70, 2472},
["flame blade"] = {100, 8931}
}
if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
local str = ""
str = str .. "Eu vendo estes items: "
for name, pos in pairs(t) do
str = str.." {"..name.."} = "..pos[1].." Points/"
end
str = str .. "."
npcHandler:say(str, cid)
elseif t[msg] then
if (doAccountRemovePoints(cid, t[msg][1]) == TRUE) then
doPlayerAddItem(cid,t[msg][2],1)
npcHandler:say("Aqui está seu ".. getItemNameById(t[msg][2]) .."!", cid)
else
npcHandler:say("você não tem "..t[msg][1].." Points", cid)
end
end
return TRUE
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())



npc por trade

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
local shopWindow = {}
local t = {
[2195] = {price = 15},
[2493] = {price = 25},
[2361] = {price = 30},
[8851] = {price = 20},
[8925] = {price = 30},
[2640] = {price = 50},
[2494] = {price = 100},
[9932] = {price = 50},
[2472] = {price = 70},
[8931] = {price = 48}
}
local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
if t[item] and getAccountPoints(cid) < t[item].price then
selfSay("You dont have "..t[item].price.." points", cid)
else
doPlayerAddItem(cid, item)
doAccountRemovePoints(cid, t[item].price)
selfSay("Here is you item!", cid)
end
return true
end
if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
for var, ret in pairs(t) do
table.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)})
end
openShopWindow(cid, shopWindow, onBuy, onSell)
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())



é só isso!

créditos:
LucasOlzon
Beeki XTibia
Vodkart

@Edit

adicionado scripts by Vodkart.

Editado por Bennyyw
Link para o comentário
Compartilhar em outros sites

Quais foram os créditos do: LucasOlzon nesse script? Ele que fez e você apenas postou? Só para ficar claro...

Rep+ pelo script que eu não testei ainda, mas parece estar tudo nos seus conformes, ainda mais eu gostei da parte que dá para mudar de sexo usando points, pois ás vezes eles vendem isso no site, ou seja, vai ajudar os servidores que não tem site ou para ter um melhor RPG.

Link para o comentário
Compartilhar em outros sites

podia ter feito isso tudo num Mod.

O npc ta bem feio.

Nem tabelas ele tem, o script é bom porém algumas partes ele deveria ter melhorado e poderia reduzir bem mais o código ;D

2 espertos, por que não fazem isso ao em vez de só vim falar mal do script? :)

Link para o comentário
Compartilhar em outros sites

2 npc de presente:

 

por trade

 

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
local shopWindow = {}
local t = {
     [2195] = {price = 15},
     [2493] = {price = 25},
     [2361] = {price = 30},
     [8851] = {price = 20},
     [8925] = {price = 30},
     [2640] = {price = 50},
     [2494] = {price = 100},
     [9932] = {price = 50},
     [2472] = {price = 70},
     [8931] = {price = 48}
     }
local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
   if t[item] and getAccountPoints(cid) < t[item].price then
        selfSay("You dont have "..t[item].price.." points", cid)
        else
       doPlayerAddItem(cid, item)
       doAccountRemovePoints(cid, t[item].price)
       selfSay("Here is you item!", cid)
      end
   return true
end
if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
           for var, ret in pairs(t) do
                   table.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)})
               end
           openShopWindow(cid, shopWindow, onBuy, onSell)
       end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) 
npcHandler:addModule(FocusModule:new())

 

 

por trade say

 

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

-- ["nome do item"] = {Qntos pontos vao custar, id do item}

local t = {
     ["boots of haste"] = {15, 2195}, --
     ["demon helmet"] = {25, 2493},
     ["frozen starlight"] = {30, 2361},
     ["royal crossbow"] = {20, 8851},
     ["solar axe"] = {30, 8925},
     ["soft boots"] = {50, 2640},
     ["demon armor"] = {100, 2494},
     ["firewalker boots"] = {50, 9932},
     ["magic plate armor"] = {70, 2472},
     ["flame blade"] = {100, 8931}
     }

if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
local str = ""
str = str .. "Eu vendo estes items: "
for name, pos in pairs(t) do
str = str.." {"..name.."} = "..pos[1].." Points/"
end
str = str .. "." 
npcHandler:say(str, cid)
elseif t[msg] then
       if (doAccountRemovePoints(cid, t[msg][1]) == TRUE) then
           doPlayerAddItem(cid,t[msg][2],1)
           npcHandler:say("Aqui está seu ".. getItemNameById(t[msg][2]) .."!", cid)
       else
           npcHandler:say("você não tem "..t[msg][1].." Points", cid)
       end
end 
return TRUE 
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) 
npcHandler:addModule(FocusModule:new())

 

 

 

abraços

Link para o comentário
Compartilhar em outros sites

Eu faço sim se quiser sim.

Só apenas estou dizendo como muitos scripter irão dizer que o script dá para ser melhorado.

 

Já o que o subwat disse fazer em mod, ficaria bom.. mas o código ficaria grande.

 

criticar o Trabalho do LucasOlzon é faciinho, quero ver você fazer melhor do que ele e postar pra a galera, até

Link para o comentário
Compartilhar em outros sites

Eu faço sim se quiser sim.

Só apenas estou dizendo como muitos scripter irão dizer que o script dá para ser melhorado.

 

Já o que o subwat disse fazer em mod, ficaria bom.. mas o código ficaria grande.

 

criticar o Trabalho do LucasOlzon é faciinho, quero ver você fazer melhor do que ele e postar pra a galera, até

 

 

MU1T4 TR3T4

 

MU1T4 TR3T4

 

MU1T4 TR3T4

 

Ótimo script ;D

Não vou testar (assim como não testo nenhum), mas ficou bem estiloso u.u

Bom que ainda dá pra controlar os pontos por site rs

Abraços.

Link para o comentário
Compartilhar em outros sites

Contribuição bem legal para os donos de servidores sem site que além de tudo pensam em lucrar com Open Tibia.

 

Mas, como relatado aqui, o código do NPC do tal LucasOlzon está muito simplista e adicionar mais de cinco itens diferentes já tornaria o código em um amontoado maçante e macarrônico.

 

Ele poderia ter usado muito bem tabelas para simplificar o código e apenas uma sintaxe relacionando a tabela. Não tiro os créditos pela funcionalidade, mas o código não está bom e eu como scripter não posso simplesmente sorrir e falar "Ai que lindo amiguh, tá muito daora rep+"

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...