Ir para conteúdo
  • Cadastre-se

(Resolvido)exp potion de acordo com posição do rank


Ir para solução Resolvido por FeeTads,

Posts Recomendados

tenho um script de exp potion, que da +50% de exp pra todos os players do rank 2 abaixo, e 25% pro top level


script completo da exp potion:

Spoiler

function onUse(cid, item, frompos, item2, topos)
    local pausa = 10*60*1000 -- (1000 = 1 segundos) Tempo que o script durará
    local texto = "Você adicionou +50% da sua Experiencia \n \n Joadores TopLevel tem -50% do efeito total da expfood" -- Texto que irá receber ao usar a potion.
    local textofinal = "Acabou o potion de Experiencia." -- Texto que irá receber quando o efeito da potion acabar.
    local exp = getPlayerRates(cid)[SKILL__LEVEL] + 0.5 -- O quanto que você quer que dobre sua experiencia, por exemplo 2 é 2x as rates do seu server.
    local exp2 = getPlayerRates(cid)[SKILL__LEVEL] + 0.25 -- O quanto que você quer que dobre sua experiencia, por exemplo 2 é 2x as rates do seu server.
    local expfinal = 1 --Não mude, isso é para a experiencia voltar ao normal.
    local limitedeuso = 49015
    local tempo = 10*60*1000 -- 1000 = 1s então 1000 vezes 60 vezes 30 = 30 minutos
    local textofinal1 = "Você já esta sob efeito da potion, se nao estiver, teste relogar!"
    local seuitem = 6541 -- seu item que dará double exp
    local efeito1 = 19 -- efeito que ficara com o char por meia hora
    local efeito2 = 14 -- efeito que acontecera no momento que usar a pot
    --fim da parte configuravel não mecha se nao tiver conhecimento de scripting
    local timeEffect = 61 -- tempo em segundos que o efeito vai apareceer no player, 31 = 30 segundos. sempre coloque 1 segundo a mais. 
    local function effect(cid, seconds)
        if not isCreature(cid) then return LUA_ERROR end
        local t, pos = convertTime(0, seconds), getCreaturePosition(cid)
        doSendMagicEffect(pos, 19)
        doSendAnimatedText(pos, t.minutes > 0 and t.minutes..":"..t.seconds or t.seconds, math.random(150,150))
        if seconds ~= 1 then addEvent(effect, 1000, cid,seconds-1) end
    end
    function getNameTopServer()
    local query, name = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1"), ""
    if (query:getID() ~= -1) then
        name = query:getDataString("name")
    end
    return name
end
    local function potion(cid)
    doPlayerSetExperienceRate(cid,expfinal)
    end
    if getPlayerLevel(cid) <= 129999 then
doCreatureSay(cid, "[ERROR] Apenas players com lv. 120k mais, podem usar este item.", TALKTYPE_ORANGE_1)
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
return true
end
    if getTileInfo(getThingPos(cid)).optional or getTileInfo(getThingPos(cid)).protection then
    doSendMagicEffect(getPlayerPosition(cid), 2)
    return doCreatureSay(cid, "[Error] Voce nao pode usar exp foods em area Protection Zone", TALKTYPE_ORANGE_1)
    end
    if item.itemid == seuitem and (getPlayerStorageValue(cid, limitedeuso) - os.time() > 0) then
    doSendMagicEffect(getPlayerPosition(cid), 2)
    return doCreatureSay(cid, "[Error] Voce ja esta sob efeito da potion, se nao estiver tente relogar!", TALKTYPE_ORANGE_1)
    end
    if getNameTopServer() == getPlayerName(cid) and item.itemid == seuitem then
    doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp2)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
        doPlayerSendTextMessage(cid,22,texto)
        return true
    end
    if item.itemid == seuitem and getPlayerStorageValue(cid, 2311) <= 0 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
        doPlayerSendTextMessage(cid,22,texto)
    elseif item.itemid == seuitem and getPlayerStorageValue(cid, 2311) == 1 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 480)
        doPlayerSendTextMessage(cid,22,texto)
    elseif item.itemid == seuitem and getPlayerStorageValue(cid, 2311) == 2 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 540)
        doPlayerSendTextMessage(cid,22,texto)
    elseif item.itemid == seuitem and getPlayerStorageValue(cid, 2311) == 3 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 600)
        doPlayerSendTextMessage(cid,22,texto)
    elseif item.itemid == seuitem and getPlayerStorageValue(cid, 2311) == 4 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 660)
        doPlayerSendTextMessage(cid,22,texto)
    elseif item.itemid == seuitem and getPlayerStorageValue(cid, 2311) >= 5 then
        doRemoveItem(item.uid,1)
        doPlayerSetExperienceRate(cid,exp)
        doSendMagicEffect(frompos,efeito2)
        setPlayerStorageValue(cid, limitedeuso, os.time() + 720)
        doPlayerSendTextMessage(cid,22,texto)
    end
    return true
end


("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1")
a partir dessa linha, alguem sabe me dizer, como eu seleciono um player especifico, tipo TOP 2? ... TOP 3... do rank?


essa function, puxa o player top level 

Spoiler

function getNameTopServer()
    local query, name = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1"), ""
    if (query:getID() ~= -1) then
        name = query:getDataString("name")
    end
    return name
end

 

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
Em 22/08/2022 em 15:52, poko360 disse:

a partir dessa linha, alguem sabe me dizer, como eu seleciono um player especifico, tipo TOP 2? ... TOP 3... do rank?

 

transforma em table

function getNameTopServer()  -- eu alteraria pra getNameTopCinco
    local query, name = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 5"), {}
    if (query:getID() ~= -1) then
    	for i=1, 5 do
        	name[i] = query:getDataString("name")
      	end
    end
    return name
end


ai faz um script pra ler os names de 1 a 5
tipo
 

local name = getNameTopServer()
local exp = {0.5, 0.25, 0.20, 0.15, 0.10}
for j=1, 5 do
  if name[j] == getPlayerName(cid) and item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, exp[j])
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
      return true
  end
end

 

Link para o post
Compartilhar em outros sites

eu botei assim:
 

Spoiler

function onUse(cid, item, frompos, item2, topos)
    local pausa = 10*60*1000 -- (1000 = 1 segundos) Tempo que o script durará
    local texto = "Você adicionou +100% da sua Experiencia \n \n Joadores TopLevel tem -50% do efeito total da expfood " -- Texto que irá receber ao usar a potion.
    local textofinal = "Acabou o potion de Experiencia." -- Texto que irá receber quando o efeito da potion acabar.
    local expfinal = 1 --Não mude, isso é para a experiencia voltar ao normal.
    local limitedeuso = 49015
    local tempo = 10*60*1000 -- 1000 = 1s então 1000 vezes 60 vezes 30 = 30 minutos
    local textofinal1 = "Você já esta sob efeito da potion, se nao estiver, teste relogar!"
    local seuitem = 2695 -- seu item que dará double exp
    local efeito1 = 19 -- efeito que ficara com o char por meia hora
    local efeito2 = 14 -- efeito que acontecera no momento que usar a pot
    --fim da parte configuravel não mecha se nao tiver conhecimento de scripting
    local timeEffect = 61 -- tempo em segundos que o efeito vai apareceer no player, 31 = 30 segundos. sempre coloque 1 segundo a mais. 
    local function effect(cid, seconds)
        if not isCreature(cid) then return LUA_ERROR end
        local t, pos = convertTime(0, seconds), getCreaturePosition(cid)
        doSendMagicEffect(pos, 19)
        doSendAnimatedText(pos, t.minutes > 0 and t.minutes..":"..t.seconds or t.seconds, math.random(150,150))
        if seconds ~= 1 then addEvent(effect, 1000, cid,seconds-1) end
    end
    function getNameTopServer()  -- eu alteraria pra getNameTopCinco
    local query, name = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 5"), {}
    if (query:getID() ~= -1) then
        for i=1, 5 do
            name[i] = query:getDataString("name")
          end
    end
    return name
end

    local function potion(cid)
    doPlayerSetExperienceRate(cid,expfinal)
    end
      if getPlayerLevel(cid) <= 219999 then
doCreatureSay(cid, "[ERROR] Apenas players com lv. 220k mais, podem usar este item.", TALKTYPE_ORANGE_1)
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
return true
end
    if getTileInfo(getThingPos(cid)).optional or getTileInfo(getThingPos(cid)).protection then
    doSendMagicEffect(getPlayerPosition(cid), 2)
    return doCreatureSay(cid, "[Error] Voce nao pode usar exp foods em area Protection Zone", TALKTYPE_ORANGE_1)
    end
    if item.itemid == seuitem and (getPlayerStorageValue(cid, limitedeuso) - os.time() > 0) then
    doSendMagicEffect(getPlayerPosition(cid), 2)
    return doCreatureSay(cid, "[Error] Voce ja esta sob efeito da potion, se nao estiver tente relogar!", TALKTYPE_ORANGE_1)
    end
    local name = getNameTopServer()
    local exp = {5, 4, 3, 2, 1}
    for j=1, 5 do
  if name[j] == getPlayerName(cid) and item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, exp[j])
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 600)
      doPlayerSendTextMessage(cid,22,texto)
      return true
  end
end
    return true
end



funcionou apenas pro TOP Level, quando fui botar o char no top 2,3... nao funfou

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

tenta trocar a função do top pra essa:

 

function getNameTopServer()  -- eu alteraria pra getNameTopCinco
  	local i = 1
    local query, name = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 5"), {}
    if (query:getID() ~= -1) then
    	while(true) do
      		name[i] = query:getDataString("name")
      		i = i + 1
      		if not(query:next()) then
        		break
        	end
      	end
    end
    return name
end


e troca a outra por essa, vou colocar pra printar, me manda o que aparece no console quando tenta usar

local name = getNameTopServer()
local exp = {5, 4, 3, 2, 1}
local NaoEstaCinco = 0
local expOutros = 1
for j=1, 5 do
  if name[j] == getPlayerName(cid) and item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, exp[j])
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
      NaoEstaCinco = 1
      break
      return true
  end
end
if NaoEstaCinco == 0 then
  if item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, expOutros)
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
  end
end

 

Link para o post
Compartilhar em outros sites

man funcionou perfeitamente, se eu colocar, so que vi um "problema", ele nao é em tempo real, tem que esperar o server salvar (ou o rank atualizar) pra ele jogar a xp correta:
ai te pergunto:
se eu colocar um doPlayerSave(cid) no script ao executar a potion, da bom? (n da lag etc...?) ou tens uma ideia melhor?

Link para o post
Compartilhar em outros sites
9 minutos atrás, poko360 disse:

se eu colocar um doPlayerSave(cid) no script ao executar a potion, da bom? (n da lag etc...?) ou tens uma ideia melhor?

cara o doPlayerSave(cid, true) é perfeito sim, eu uso no meu server, e não laga nada, porém eu tenho uma estrutura muito boa, se vc tiver muita gente e uma VPS fraca, pode ser que lague, pq ele sempre vai ta executando um save na DB.

vc pode sim usar o doPlayerSave(cid, true)
porém eu indico vc usar SEMPRE que o player upar, CASO vc tenha uma VPS boa, se não, coloca o doPlayerSave(cid, true) no script mesmo, vai funcionar perfeitamente.

caso queira usar o sempre que o player upar (necessário estrutura boa)
eu uso esse script:


creaturescripts > scripts > advancedSave.lua

function onAdvance(cid, skill, oldLevel, newLevel)
	if(skill == SKILL__EXPERIENCE) then
		return true
	end

	if(skill == SKILL__LEVEL) then		--sempre que upar level
		doPlayerSave(cid, true)			-- salva o player (isso da update na DB pode lagar maquina fraca)
	end
	return true
end

 

creaturescripts > creaturescripts.xml

<event type="advance" name="AdvanceSave" event="script" value="advancesave.lua"/>


e no creaturescripts > scripts > login.lua
procure por 
"registerCreatureEvents(........)"
e adiciona abaixo de qualquer um:
 

registerCreatureEvent(cid, "AdvanceSave")


ai da reload no creature, e sempre vai salvar quando upar

 

 

e lógicamente, vc precisa dar o save no player, logo após o onUse
pra ficar tipo
salva o player > atualiza na DB > roda o scripts pra saber a pos dele no rank

Link para o post
Compartilhar em outros sites

eu botei por globalevent (creature n deu mt certo nao)

ficou assim:
 

Spoiler

function onThink(interval, lastExecution)
for _, name in ipairs(getOnlinePlayers()) do
local cid = getPlayerByName(name)
    if (getPlayerStorageValue(cid, 49015) - os.time() > 0) then
        doPlayerSave(cid, true)
    end
    end
    return true
end



eu so tenho mais uma pergunta, tipo nesse script ele mostra os jogadores de 1 a 5 do top rank,

como que eu boto pra o RESTO dos jogadores receber um valor x de exp? tipo o rank 6 adiante (7...8...9...)
eu tentei botar um "else" e n deu mt certo nao do jeito que botei kkkkkk


Edit:
  if name[j] == getPlayerName(cid) and item.itemid == seuitem then

como eu botaria um "elseif" nessa linha?
name[j] ~=?

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
2 minutos atrás, poko360 disse:

eu tentei botar um "else" e n deu mt certo nao do jetio que bote

e pq o else vai contrariar tudo do if kkkkk, tenta tipo assim

local name = getNameTopServer()
local exp = {5, 4, 3, 2, 1}
local NaoEstaCinco = 0
local expOutros = 1
for j=1, 5 do
  print(name[j])
  if name[j] == getPlayerName(cid) and item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, exp[j])
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
      NaoEstaCinco = 1
      break
      return true
  end
end
if NaoEstaCinco == 0 then
  if item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, expOutros)
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
      NaoEstaCinco = 1
      break
      return true
  end
end

 

alias, pode tirar o "print(name[j])"

Link para o post
Compartilhar em outros sites

tira o break desse segundo kkkkkk coloca assim:

if NaoEstaCinco == 0 then
  if item.itemid == seuitem then
      doRemoveItem(item.uid,1)
      doPlayerSetExperienceRate(cid, expOutros)
      doSendMagicEffect(frompos,efeito2)
      setPlayerStorageValue(cid, limitedeuso, os.time() + 420)
      doPlayerSendTextMessage(cid,22,texto)
     return true
  end
end

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo