Ir para conteúdo

Sistema de Atribuição de Pontos - By Draky Lucas


Posts Recomendados

Créditos: 100% Draky Lucas

O que é?
Cada level que você upa, você ganha uma quantidade de pontos configuráveis, que pode ser trocados por skills, vida e mana, porem sendo controlado o que pode ser trocado por vocação (assim. um knight, por exemplo, nao compraria ML)

PS: configurem vcs mesmos tudo na LIB

Funcionamento: Só colocar e ver oO
Video:


comandos:
/atributos

/atributos add, club
/atributos add, axe
/atributos add, sword
/atributos add, fist
/atributos add, shielding
/atributos add, distance
/atributos add, mana
/atributos add, vitality

/atributos reset

/atributos build

instalação:
em data/lib crie um arquivo chamado atributos.lua e nele adicione isso:


vocationPoints = {
[0] = 3,
[1] = 3,
[2] = 3,
[3] = 3,
[4] = 3,
[5] = 5,
[6] = 5,
[7] = 5,
[8] = 5,
}

skills = {
["fist"] = {id = 0,neededPoints = 20,quantoGanha = 1,vocationNeeded={3,4,7,8}},
["club"] = {id = 1,neededPoints = 30,quantoGanha = 1,vocationNeeded={4,8}},
["sword"] = {id = 2,neededPoints = 30,quantoGanha = 1,vocationNeeded={4,8}},
["axe"] = {id = 3,neededPoints = 30,quantoGanha = 1,vocationNeeded={4,8}},
["distance"] = {id = 4,neededPoints = 30,quantoGanha = 1,vocationNeeded={3,7}},
["shielding"] = {id = 5,neededPoints = 30,quantoGanha = 1,vocationNeeded={0,1,2,3,4,5,6,7,8}},
["magic"] = {id = 7, neededPoints = 30,quantoGanha = 1,vocationNeeded={0,1,2,5,6}},
["vitality"] = {id = 30,neededPoints = 3,quantoGanha = 5, vocationNeeded={0,1,2,3,4,5,6,7,8}},
["mana"] = {id = 35,neededPoints = 3,quantoGanha = 5, vocationNeeded={0,1,2,3,4,5,6,7,8}},
}

resetPreco = 100
storagesUtilizadas = {
storageLevelJaPego = 12448,
storagePontos = 12449,
storageFistPoints = 12450,
storageClubPoints = 12451,
storageSwordPoints = 12452,
storageAxePoints = 12453,
storageDistancePoints = 12454,
storageShieldingPoints = 12455,
storageMagicPoints = 12456,
storageVitalityPoints = 12457,
storageManaPoints = 12458,
storageFist = 12459,
storageClub = 12460,
storageSword = 12461,
storageAxe = 12462,
storageDistance = 12463,
storageShielding = 12464,
storageMagic = 12465,
storageVitality = 12466,
storageMana = 12467,
}
function getPontos(cid)
return (getPlayerStorageValue(cid,storagesUtilizadas.storagePontos))
end

function addPontos(cid,qtd)
setPlayerStorageValue(cid,storagesUtilizadas.storagePontos,getPontos(cid) + qtd)
end

function addSkill(cid,id,pontosUsados,quantoGanha,vocationNeeded)
if not isInArray(vocationNeeded,getPlayerVocation(cid)) then
return "Sua vocacao nao pode adicionar esse atributo!"
end
if getPontos(cid) < pontosUsados then
return "Voce nao tem pontos o suficiente para adicionar esse atributo!"
end
local storage = {
[0] = {st1 = storagesUtilizadas.storageFist,st2 = storagesUtilizadas.storageFistPoints},
[1] = {st1 = storagesUtilizadas.storageClub,st2 = storagesUtilizadas.storageClubPoints},
[2] = {st1 = storagesUtilizadas.storageSword,st2 = storagesUtilizadas.storageSwordPoints},
[3] = {st1 = storagesUtilizadas.storageAxe,st2 = storagesUtilizadas.storageAxePoints},
[4] = {st1 = storagesUtilizadas.storageDistance,st2 = storagesUtilizadas.storageDistancePoints},
[5] = {st1 = storagesUtilizadas.storageShielding,st2 = storagesUtilizadas.storageShieldingPoints},
[7] = {st1 = storagesUtilizadas.storageMagic,st2 = storagesUtilizadas.storageMagicPoints},
[30] = {st1 = storagesUtilizadas.storageVitality,st2 = storagesUtilizadas.storageVitalityPoints},
[35] = {st1 = storagesUtilizadas.storageMana,st2 = storagesUtilizadas.storageManaPoints},
}

if id == 30 then
setCreatureMaxHealth(cid, getCreatureMaxHealth(cid) + quantoGanha)
doCreatureAddHealth(cid, quantoGanha)
elseif id == 35 then
setCreatureMaxMana(cid, getCreatureMaxMana(cid) + quantoGanha)
doCreatureAddMana(cid, quantoGanha)
else
if id == 7 then
doPlayerAddMagLevel(cid, quantoGanha)
else
doPlayerAddSkillTry(cid, id, getPlayerRequiredSkillTries(cid, id, getPlayerSkillLevel(cid, id) + quantoGanha),false)
end
end
setPlayerStorageValue(cid,storage[id].st1,getPlayerStorageValue(cid,storage[id].st1) + quantoGanha)
setPlayerStorageValue(cid,storage[id].st2,getPlayerStorageValue(cid,storage[id].st2) + pontosUsados)
addPontos(cid,- pontosUsados)
doSendMagicEffect(getCreaturePosition(cid), 30)
return "Atributo adicionado!"
end

function resetPontos(cid)
for i = storagesUtilizadas.storageFistPoints,storagesUtilizadas.storageManaPoints do
addPontos(cid,getPlayerStorageValue(cid,i))
setPlayerStorageValue(cid,i,0)
end
local guid = getPlayerGUID(cid)
local atuais = {
hp = getCreatureMaxHealth(cid) - (getPlayerStorageValue(cid,storagesUtilizadas.storageVitality)),
mp = getPlayerMaxMana(cid) - (getPlayerStorageValue(cid,storagesUtilizadas.storageMana)),
magic = getPlayerMagLevel(cid) - (getPlayerStorageValue(cid,storagesUtilizadas.storageMagic)),
fist = getPlayerSkillLevel(cid, 0) - (getPlayerStorageValue(cid,storagesUtilizadas.storageFist)),
club = getPlayerSkillLevel(cid, 1) - (getPlayerStorageValue(cid,storagesUtilizadas.storageClub)),
sword = getPlayerSkillLevel(cid, 2) - (getPlayerStorageValue(cid,storagesUtilizadas.storageSword)),
axe = getPlayerSkillLevel(cid, 3) - (getPlayerStorageValue(cid,storagesUtilizadas.storageAxe)),
dist = getPlayerSkillLevel(cid, 4) - (getPlayerStorageValue(cid,storagesUtilizadas.storageDistance)),
shield = getPlayerSkillLevel(cid, 5) - (getPlayerStorageValue(cid,storagesUtilizadas.storageShielding)),
}
doRemoveCreature(cid)

db.executeQuery("UPDATE `players` SET `maglevel` = " .. atuais.magic .. " WHERE `id` = "..guid)

db.executeQuery("UPDATE `players` SET `health` = " .. atuais.hp .. " WHERE `id` = "..guid)
db.executeQuery("UPDATE `players` SET `healthmax` = " .. atuais.hp .. " WHERE `id` = "..guid)

db.executeQuery("UPDATE `players` SET `mana` = " .. atuais.mp .. " WHERE `id` = "..guid)
db.executeQuery("UPDATE `players` SET `manamax` = " .. atuais.mp .. " WHERE `id` = "..guid)

db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.fist .. " WHERE `player_id` = "..guid .. " AND `skillid` = 0")
db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.club .. " WHERE `player_id` = "..guid .. " AND `skillid` = 1")
db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.sword .. " WHERE `player_id` = "..guid .. " AND `skillid` = 2")
db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.axe .. " WHERE `player_id` = "..guid .. " AND `skillid` = 3")
db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.dist .. " WHERE `player_id` = "..guid .. " AND `skillid` = 4")
db.executeQuery("UPDATE `player_skills` SET `value` = " .. atuais.shield .. " WHERE `player_id` = "..guid .. " AND `skillid` = 5")
for i = storagesUtilizadas.storageFist, storagesUtilizadas.storageMana do
db.executeQuery("UPDATE `player_storage` SET `value` = 0 WHERE `key` = "..i .. " and `player_id` = " ..guid)
end
return true
end



agora em data/talkactions/scripts crie uma pasta chamada drakylucas e nela crie um arquivo chamado atributos.lua , colocando isso nele:

 

function onSay(cid, words, param)
                        local param = param:lower()
                local op = string.explode(param, ",")
                        local text = ""
                        if param == nil or (op[1] ~= "reset" and op[1] ~= "add" and op[1] ~= "build") then
                         
                                text = text ..
                                "Pontos: " .. getPontos(cid) ..
                                "\nSua vocação ganha: " .. vocationPoints[getPlayerVocation(cid)] .. " pontos por level" ..
                                "\n\nNome - Precisa - Ganha -- Para sua voc"
                                for i, x in pairs(skills) do
                                        if isInArray(x.vocationNeeded,getPlayerVocation(cid)) then
                                                text = text .. "\n"..i.. " - " ..x.neededPoints.. " - " .. x.quantoGanha .. ""
                                        end
                                end
                                text = text .. "\n\nExemplos:\n/atributos add,mana\n/atributos add,vitality"
                                text = text .. "\nVoce pode resetar seus atributos: Digite /atributos reset   (custa " .. resetPreco.."k)\nVeja sua build: /atributos build"
                                return doShowTextDialog(cid, 1976, text)
                        end
                       
                        if op[1] == "reset" then
                                if getCreatureCondition(cid, CONDITION_INFIGHT) == true then
                                        return doPlayerSendCancel(cid,"Voce tem que estar sem battle para resetar seus atributos")
                                end
                               
                                if getPlayerMoney(cid) < (resetPreco*1000) then
                                        return doPlayerSendCancel(cid,"Voce nao tem dinheiro suficiente para resetar seus atributos!")
                                end
                               
                                doPlayerRemoveMoney(cid, resetPreco*1000)
                                return resetPontos(cid)
                        end
                       
                        if op[1] == "add" then
                                if skills[op[2]] == nil then
                                        return doPlayerSendTextMessage(cid,19,"atributo nao existente. Verifique sua ortografia!")
                                end
                                doPlayerSendTextMessage(cid,19,addSkill(cid,skills[op[2]].id,skills[op[2]].neededPoints,skills[op[2]].quantoGanha,skills[op[2]].vocationNeeded))
                                return true
                        end
                       
                        if op[1] == "build" then
                        local atuais = {
                                hp = (getPlayerStorageValue(cid,storagesUtilizadas.storageVitality)),
                                mp = (getPlayerStorageValue(cid,storagesUtilizadas.storageMana)),
                                magic = (getPlayerStorageValue(cid,storagesUtilizadas.storageMagic)),
                                fist = (getPlayerStorageValue(cid,storagesUtilizadas.storageFist)),
                                club = (getPlayerStorageValue(cid,storagesUtilizadas.storageClub)),
                                sword = (getPlayerStorageValue(cid,storagesUtilizadas.storageSword)),
                                axe = (getPlayerStorageValue(cid,storagesUtilizadas.storageAxe)),
                                dist = (getPlayerStorageValue(cid,storagesUtilizadas.storageDistance)),
                                shield = (getPlayerStorageValue(cid,storagesUtilizadas.storageShielding)),
                        }
                                text = "Quantidades de atributos ja recebidos: \n" ..
                                "Vitality: "..atuais.hp.." \n" ..
                                "Mana: "..atuais.mp.." \n" ..
                                "Magic: "..atuais.magic.." \n" ..
                                "Fist: "..atuais.fist.." \n" ..
                                "Club: "..atuais.club.." \n" ..
                                "Sword: "..atuais.sword.." \n" ..
                                "Axe: "..atuais.axe.." \n" ..
                                "Distance: "..atuais.dist.." \n" ..
                                "Shielding: "..atuais.shield.." \n" ..
                                "Pontos restantes: " .. getPontos(cid)
                               
                                doShowTextDialog(cid, 1976, text)
                                return true
                        end
return true
end



agora em data/creaturescripts/scripts crie uma pasta chamada drakylucas e nela crie um arquivo chamado atributos.lua (sim, todos arquivos tem o mesmo nome.. cuidado nas pastas) e coloque isso:


function onAdvance(cid, skill, oldLevel, newLevel)
                if not (vocationPoints[getPlayerVocation(cid)]) then
                        return true
                end
                        if skill == 8 then
                                 if getPlayerStorageValue(cid, storagesUtilizadas.storageLevelJaPego) < newLevel then
                                    local pts = (newLevel - (1 + getPlayerStorageValue(cid, storagesUtilizadas.storageLevelJaPego))) * vocationPoints[getPlayerVocation(cid)]
                        addPontos(cid,pts)
                                        setPlayerStorageValue(cid,storagesUtilizadas.storageLevelJaPego,newLevel -1)
                                        doSendAnimatedText(getCreaturePosition(cid), "+"..pts, math.random(1,200))
                                end
                        end
                return true
                end



agora em data/creaturescripts/scripts, abre o login.lua e coloque isso ANTES do último return true:


-- attribute system by draky lucas
                if getPlayerStorageValue(cid,storagesUtilizadas.storageLevelJaPego) == -1 then
                   for i = storagesUtilizadas.storageLevelJaPego,storagesUtilizadas.storageMana do
                        setPlayerStorageValue(cid,i,0)
                   end
                end
                registerCreatureEvent(cid,"avancarGanharPontos")                       
        --



agora em data/talkactions/talkactions.xml coloque isso:

<talkaction words="/atributos" event="script" value="drakylucas/atributos.lua"/>

agora em data/creaturescripts/creaturescripts.xml coloque isso:
<event type="advance" name="avancarGanharPontos" event="script" value="drakylucas/atributos.lua"/>


reinicie o servidor e divirta-se.
PS: não sei se funciona com sqlite.. eu uso MYSQL como banco de dados.
Testado com TFS 0.4 Rev 3887 8.60



Por favor, nao deixem de comentar, desanima criar coisas e a cada 100 visitas, apenas um comentario.

EDIT: Arrumado bug do magiclevel! Editado por CyberBot
Link para o comentário
Compartilhar em outros sites

Bom sistema mano, parabéns!

(adoro seus sistemas e scripts! são bons, e criados por você, parabéns!)

 

Uma dúvida: Tipo, eu sou level 150, ai eu já ganhei meus pontos por alcançar esse level, ai se eu morrer e voltar level 146, e upar 150, eu ganho novamente os pontos ou não?

Link para o comentário
Compartilhar em outros sites

Bom sistema mano, parabéns!

(adoro seus sistemas e scripts! são bons, e criados por você, parabéns!)

 

Uma dúvida: Tipo, eu sou level 150, ai eu já ganhei meus pontos por alcançar esse level, ai se eu morrer e voltar level 146, e upar 150, eu ganho novamente os pontos ou não?

 

 

Não.. você só ganha uma vez os pontos..

e nao tem bug de tipo voltar 1 level e upar 3 pra ganhar 4 leveis.. vai ganhar somente os 2 (3 - 1 que voltou) leveis em pontos...

 

Só tem uma coisa ai, tipo a maioria dos servidores começam level 8, entao o primeiro level vai contar 9leveis.. depois conta um em um.. mas ja os que tem rookgard ta certinho, level 1.

 

 

PS: acredito que, se o servidor seus ja existirem (tiver online), você pode instalar o sistema sem problemas, pois ao upar um level o jogador ja irá ganhar os pontos equivalentes a todos os leveis que ele nao tinha (tipo, tou level 150, instalou o sistema, ao upar 151, eu irei ganhar os 151 leveis em pontos, assim nao deixando somente os leveis baixos em vantagens por ganharem pontos ao upar mais facil ^^)

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

tó tendo erros man, error - Talkactions Interface - (luaGetPlayerRequireSkillTries) Player Not found

 

Talkactions Interface - (luaDoPlayerAddSkillTry) Player Not found

 

sempre que vou colocar em algum skill, o resto tá normal,

Link para o comentário
Compartilhar em outros sites

tó tendo erros man, error - Talkactions Interface - (luaGetPlayerRequireSkillTries) Player Not found

 

Talkactions Interface - (luaDoPlayerAddSkillTry) Player Not found

 

sempre que vou colocar em algum skill, o resto tá normal,

 

aqui nao ocorreu erro algum.. e se tiver dando erro, nao tem o minimo sentido, nao usei nenhum addEvent no script pra fazer com que o cid nao seja encontrado.. e pra ele chegar a puxar a funçao, ele tem que ter o cid oO...

 

você instalou a lib corretamente? qual distro usa? (posta link)

 

 

EDIT: axei o erro, vou arruma-lo e ja edito no topico.. esperem um pouquinho só

 

 

edit2: erro arrumado.. era uma virgula na lib na funçao... acho que apertei sem qrer qnd eu tava arrumando as vocations, e devo ter bugado oO... agora está certinho dnv.. atualizem a lib e pronto

 

Estou baixando o camtasia (20 min eu baixo), vou fazer um video mostrando o sistema, mas sem muita explicação, pois videos longos sao chatos ^^

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

bem interessante... fico bemmm complexo kkk eu fiz um sistema assim pra um amigo a um tempo soh q bem mais simples e pro otclient... n acha melhor usar..

doPlayerAddSkill(cid, skill, amout)

em vez de ter q remover o player e editar a DB? ;x

 

ps: se for usar esse comando va em lib/050-function.lua e troque a funçao la por isso..

 

function doPlayerAddMagLevel(cid, amount)
   for i = 1, amount do
       doPlayerAddSpentMana(cid, (getPlayerRequiredMana(cid, getPlayerMagLevel(cid, true) + 1) - getPlayerSpentMana(cid)) / getConfigInfo('rateMagic'))
   end
   return true
end  

function doPlayerAddSkill(cid, skill, amount, round)
   amount = tonumber(amount) or 1
   if amount <= 0 then amount = 1 end

   if(skill == SKILL__LEVEL) then    
       return doPlayerAddLevel(cid, amount, round)
   elseif(skill == SKILL__MAGLEVEL) then
       return doPlayerAddMagLevel(cid, amount)
   end

   for i = 1, amount do
  	 doPlayerAddSkillTry(cid, skill, (getPlayerRequiredSkillTries(cid, skill, getPlayerSkillLevel(cid, skill) + 1) - getPlayerSkillTries(cid, skill)) / getConfigInfo('rateSkill'))
   end
   return true
end

 

 

ps²: caso n 'enxa' a skill toda retire isso..

/ getConfigInfo('rateSkill')

/ getConfigInfo('rateMagic')

Link para o comentário
Compartilhar em outros sites

bem interessante... fico bemmm complexo kkk eu fiz um sistema assim pra um amigo a um tempo soh q bem mais simples e pro otclient... n acha melhor usar..

doPlayerAddSkill(cid, skill, amout)

em vez de ter q remover o player e editar a DB? ;x

 

ps: se for usar esse comando va em lib/050-function.lua e troque a funçao la por isso..

 

function doPlayerAddMagLevel(cid, amount)
for i = 1, amount do
	doPlayerAddSpentMana(cid, (getPlayerRequiredMana(cid, getPlayerMagLevel(cid, true) + 1) - getPlayerSpentMana(cid)) / getConfigInfo('rateMagic'))
end
return true
end  

function doPlayerAddSkill(cid, skill, amount, round)
amount = tonumber(amount) or 1
if amount <= 0 then amount = 1 end

if(skill == SKILL__LEVEL) then	
	return doPlayerAddLevel(cid, amount, round)
elseif(skill == SKILL__MAGLEVEL) then
	return doPlayerAddMagLevel(cid, amount)
end

for i = 1, amount do
  	 doPlayerAddSkillTry(cid, skill, (getPlayerRequiredSkillTries(cid, skill, getPlayerSkillLevel(cid, skill) + 1) - getPlayerSkillTries(cid, skill)) / getConfigInfo('rateSkill'))
end
return true
end

 

 

ps²: caso n 'enxa' a skill toda retire isso..

/ getConfigInfo('rateSkill')

/ getConfigInfo('rateMagic')

 

pela função o ml vai até 150 e poco e a skill até 200 e poco, dai pela database acho que vai até quanto quiser u.u

Link para o comentário
Compartilhar em outros sites

nao, a database só é utilizada na hora de remover a skill.. leia um pouco o script..

addSkill negativo nao funciona =/

 

arrumei um errinho na hora do reset, reinstalem a LIB dinovo kk... agora acho q está sem nenhum bug.

Link para o comentário
Compartilhar em outros sites

lembrando que vocês tbm podem configurar o vocations.xml como quiser, pra ganhar menos mana, nao ganhar skills (para deixar só o sistema), etc... (mas logico q se forem deixar só o sistema, coloquem pra ganhar mais pontos Oo)

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...