Ir para conteúdo

Ajudar na solução de bug..


surfnament

Posts Recomendados

Olá galera

Estou com um probleminha em meu servidor....

Eu possuo o Slot System

 

---Script by mock the bear!
local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
--- HP
conditionHP = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionHP, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionHP, CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
setConditionParam(conditionHP, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionHP, CONDITION_PARAM_SUBID, 50)
--MANA
conditionMP = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionMP, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionMP, CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
setConditionParam(conditionMP, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionMP, CONDITION_PARAM_SUBID, 51)
--Magic level
conditionML = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionML, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionML, CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 100+i)
setConditionParam(conditionML, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionML, CONDITION_PARAM_SUBID, 52)
--club axe sword
conditionCLUB = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionCLUB, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
setConditionParam(conditionCLUB, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionCLUB, CONDITION_PARAM_SUBID, 53)
--- shield
conditionSHI = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionSHI, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionSHI, CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
setConditionParam(conditionSHI, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionSHI, CONDITION_PARAM_SUBID, 54)
--- dist
conditionDIST = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionDIST, CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionDIST, CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
setConditionParam(conditionDIST, CONDITION_PARAM_BUFF, true)
setConditionParam(conditionDIST, CONDITION_PARAM_SUBID, 55)
end
function getSlotType(n) --By mock the bear
if not n then
return false
end
if n:match('%[(.+)%]') then
n = n:match('%[(.+)%]')
if n == '?' then
return 0,n
else
return n:match('(.-)%.([+-])(%d+)%%')
end
else
return false
end

end
local function loadSet(cid)
local t = {}
for slot=1,9 do
t[slot] = ''

local s = getPlayerSlotItem(cid,slot).uid
if s ~= 0 then
t[slot] = getItemName(s)
end
end
return t
end
function isInArray2(arr,var) -- Because in some servers it return 1 and 0 and others true and false
for i,b in pairs(arr) do
if var == b then
return true
end
end
return false
end
function check2(cid,i)
if i == 5 or i == 6 then
if isInArray({'head','necklace','backpack','body','legs','feet','ring'},getItemValue(getPlayerSlotItem(cid,i).itemid,'slotType') or '') then
return false
end
end
return true
end
function chk(cid,f)
if not isPlayer(cid) then return end
local t = loadSet(cid)
for i=1,#f do
if f ~= t then
equip(cid,nil,slot)
break
end
end
addEvent(chk,2000,cid,t)
end
items = { ---- Only to get attr: slotType because getItemName dont return it -.-'
_VERSION='1.0 By mock',
XML_DIR='data/items/items.xml',
}
do
local ia = os.clock()
io.write('Loading items')
local i = io.open(items.XML_DIR,'r')
local u = i:read(-1)
i:close()
local u = u:match('<items>(.+)</items>')
for mi,id,mid,name,data,me in u:gmatch('<(%a-)%s*id%s*=%s*"(%d+)"%s*(.-)%s*name%s*=%s*"(.-)"%s*>(.-)</(%a*)>') do
if mi == 'item' and me == 'item' then
local td = {name=name,id=id,type=1}
for key,value in data:gmatch('<attribute key="(.-)" value="(.-)"/>') do
td[key] = value
end
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td

items[name] = td
end
end
for mi,id,mid,name,data in u:gmatch('<(%a-)%s*id%s*=%s*"(%d*)"%s*(.-)%s*name%s*=%s*"(%a+)"%s*/>') do
if mi == 'item' then
local td = {name=name,id=id,type=2}
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td
items[name] = td
end
end
io.write('[done '..os.clock()-ia..']\n')
end
function getItemValue(item,value)
return items[item] and items[item][value]
end
function equip(cid,item,slot) --By mock the bear
local HP = getCreatureHealth(cid)
local MP = getCreatureMana(cid)
local t = {}
if item then
local mm,sinal,qto = getSlotType(getItemName(item.uid))
t[mm] = tonumber(qto)
end
for i=1,9 do -- Not on slot 10 > arrow
if i ~= slot then
if getPlayerSlotItem(cid,i).itemid ~= 0 then
local aab = getPlayerSlotItem(cid,i).uid
if aab and check2(cid,i) then
for _ in getItemName(aab):gmatch('(%[.-%])') do
local mm,sinal,qto2 = getSlotType(_)
if mm then
if not t[mm] then
t[mm] = 0
end
t[mm] = t[mm]+tonumber(qto2)

t[mm] = t[mm] > 100 and 100 or t[mm]
end
end
end
end
end
end
local fu = 0
local ca = {}
local s = ''
for sl,n in pairs(t) do
fu = fu+1
s = s..''..n..'% more of '..sl..'\n'
if sl == 'hp' then
doAddCondition(cid,conditionHP[tonumber(n)])
doCreatureAddHealth(cid,HP-getCreatureHealth(cid))
ca[50] = 1
doPlayerSendTutorial(cid,19)
elseif sl == 'mp' then
doAddCondition(cid,conditionMP[tonumber(n)])
doCreatureAddMana(cid,HP-getCreatureMana(cid))
ca[51] = 1
doPlayerSendTutorial(cid,19)
elseif sl == 'ml' then
doAddCondition(cid,conditionML[tonumber(n)])
ca[52] = 1
elseif sl == 'cas' then
doAddCondition(cid,conditionCLUB[tonumber(n)])
ca[53] = 1
elseif sl == 'shield' then
doAddCondition(cid,conditionSHI[tonumber(n)])
ca[54] = 1
elseif sl == 'dist' then
doAddCondition(cid,conditionDIST[tonumber(n)])
ca[55] = 1
end
end
if fu > 0 then
addEvent(doPlayerSendTextMessage,100,cid,24,'You have:\n'..s)
for i=50,55 do
if not ca then
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
else
for i=50,55 do
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
return true
end
function onLogin(cid) ---Script by mock the bear!
equip(cid,nil,slot)
addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
return TRUE
end

 

 

 

E o o Reset System

 

<?xml version="1.0" encoding="UTF-8"?>
<mod name="Reset System" version="1.0" author="Kimoszin" contact="tibiaking.com" enabled="yes">

<!-- Configuracao -->
<config name="reset_config"><![CDATA[
config = {
level = 600, -- Level minimo para resetar
premium = false, -- Precisa de premium, sim = true, nao = false
storage = 54676,
}

function reset(cid)
if (config.premium and not(isPremium(cid)) ) then
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You need have a premium account.")
end

if (getPlayerLevel(cid) < config.level) then
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You must be at least level "..config.level..".")
end
if(getPlayerItemCount(cid, 2157) < 30) then
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa de 30kk para resetar.")
end

if not(getTilePzInfo(getCreaturePosition(cid))) then
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You must be in protect zone.")
end

doPlayerAddLevel(cid, - (getPlayerLevel(cid) - 8))
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_GREEN)
doCreatureSetStorage(cid, config.storage, getResets(cid))
doPlayerRemoveItem(cid, 2157, 30)
doPlayerAddItem(cid, 8300, 1)
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Congratulations, you have been reset. Now you have "..getResets(cid).." resets.")
end

function getResets(cid)
return (isPlayer(cid) and getCreatureStorage(cid, config.storage) + 1)
end
]]></config>

<!-- Talkaction para resetar -->
<talkaction words="!reset" event="buffer"><![CDATA[
domodlib('reset_config')
reset(cid)
]]></talkaction>

<!-- Talkaction para ver quantos resets tem -->
<talkaction words="!myresets" event="buffer"><![CDATA[
domodlib('reset_config')
return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have "..getResets(cid).." resets.")
]]></talkaction>

<!-- Tile -->
<movevent type="StepIn" actionid="9991" event="script"><![CDATA[
domodlib('reset_config')
function onStepIn(cid, item, position, fromPosition)
local minResets = 1

if (not(getResets(cid) >= minResets)) then
doPlayerSendCancel(cid, "Desculpe, voce precisa de "..minResets.." resets")
return doTeleportThing(cid, fromPosition)
end

doPlayerSendCancel(cid, "Welcome")
end
]]></movevent>

<!-- Porta -->
<action actionid="9990" event="script"><![CDATA[
domodlib('reset_config')
function onUse(cid, item, position, fromPosition)
local minResets = 1

if not(getResets(cid) >= minResets) then
return doPlayerSendCancel(cid, "Desculpa,voce presisa de "..minResets.." resets")
end

doPlayerSendCancel(cid, "Bem Vindo")
end
]]></action>
</mod>

 

 

 

Meu erro é o seguinte: Quando o player reseta usando items com Slot Crystal ele volta com 1 de vida..

Acredito que seja conflito entre os scripts....
Para arrumar pensei em o Reset System pedir para remover TODOS os equipamentos do corpo antes do reset... Alguem saberia fazer isso?

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

@,

Se você deseja que o player retire todos seus items antes de resetar, tente assim:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<mod name="Reset System" version="1.0" author="Kimoszin" contact="um fórum que não merece ser citado" enabled="yes">
 
    <!-- Configuracao -->
        <config name="reset_config"><![CDATA[
                config = {
                        level = 600,                      -- Level minimo para resetar
                        premium = false,         -- Precisa de premium, sim = true, nao = false
                        storage = 54676,
                }
 
                function reset(cid)
						for i = 1, 10 do
							if getPlayerSlotItem(cid, i).itemid > 100 then
								return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Retire todos seus items antes de resetar.")
								break
							end
						end

                        if (config.premium and not(isPremium(cid)) ) then
                                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You need have a premium account.")
                        end
 
                        if (getPlayerLevel(cid) < config.level) then
                                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You must be at least level "..config.level..".")
                        end
						if(getPlayerItemCount(cid, 2157) < 30) then
                                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa de 30kk para resetar.")
                        end
 
                        if not(getTilePzInfo(getCreaturePosition(cid))) then
                                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You must be in protect zone.")
                        end
                       
                        doPlayerAddLevel(cid, - (getPlayerLevel(cid) - 8))
                        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_GREEN)
                        doCreatureSetStorage(cid, config.storage, getResets(cid))
						doPlayerRemoveItem(cid, 2157, 30)
						doPlayerAddItem(cid, 8300, 1)
                        return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Congratulations, you have been reset. Now you have "..getResets(cid).." resets.")
                end
 
                function getResets(cid)
                        return (isPlayer(cid) and getCreatureStorage(cid, config.storage) + 1)
                end
        ]]></config>
 
        <!-- Talkaction para resetar -->
        <talkaction words="!reset" event="buffer"><![CDATA[
                domodlib('reset_config')
                reset(cid)
        ]]></talkaction>
 
        <!-- Talkaction para ver quantos resets tem -->
        <talkaction words="!myresets" event="buffer"><![CDATA[
                domodlib('reset_config')
                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have "..getResets(cid).." resets.")
        ]]></talkaction>
 
        <!-- Tile -->
        <movevent type="StepIn" actionid="9991" event="script"><![CDATA[
                domodlib('reset_config')
                function onStepIn(cid, item, position, fromPosition)
                        local minResets = 1
 
                        if (not(getResets(cid) >= minResets)) then
                                doPlayerSendCancel(cid, "Desculpe, voce precisa de "..minResets.." resets")
                                return doTeleportThing(cid, fromPosition)
                        end
 
                        doPlayerSendCancel(cid, "Welcome")
                end
        ]]></movevent>
 
        <!-- Porta -->
        <action actionid="9990" event="script"><![CDATA[
                domodlib('reset_config')
                function onUse(cid, item, position, fromPosition)
                        local minResets = 1
 
                        if not(getResets(cid) >= minResets) then
                                return doPlayerSendCancel(cid, "Desculpa,voce presisa de "..minResets.." resets")
                        end
 
                        doPlayerSendCancel(cid, "Bem Vindo")
                end
        ]]></action>
</mod>

 

 

Link para o comentário
Compartilhar em outros sites

Opa...

 

Obrigado por tentar!
Testei aqui e não funcionou... Ele continua podendo resetar com item...


O erro que to tendo entre os scripts é que quando o player reseta com slot crystal ele volta pra 1 de vida e mana ao inves da vida normal de level 8... Acredito que seja porque o script do slot crystal continua registrando a % de hp que tinha antes de resetar , já que meu script nao desloga o char ao resetar....

Acredito que tenha varias maneiras de resolver isso...

Adicionando a função pedindo pra Remover os Items do corpo antes de resetar...
Deslogando o player antes de resetar...
Mudando a função do script Slot Cristal...

Se algum puder me ajudar a testar alguma dessas ou outras alternativas agradeço muito!

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

O tópico foi fechado e movido para lixeira por estar inativo a mais de 10 dias. Caso seja preciso reabrir o mesmo, favor entrar em contato com a equipe.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...