Ir para conteúdo
  • Cadastre-se

(Resolvido)Ajuda nesse script de slot, por favor !!


Ir para solução Resolvido por Vodkart,

Posts Recomendados

Galera seguinte.. tenho esse sistema de slot upgrade onde e dado um atributo em % aleatório ao item ( funcional ate então ) .. porém ele da valores entre 1 a 100%.. porem eu gostaria de limitar apenas para ganhar ate 5% ( ou configurável pra mim ).

 

Script Action:

--[[
Slot system 100% by mock \o
]]
---Config
local conf = {
	maxSlotCount=1,
	ignoredIds={}
}
--End
function choose(...) --- Function by mock.
    local arg = {...}
    return arg[math.random(1,#arg)]
end
if not getItemAttack then
    function getItemAttack(uid)
        return getItemAttribute(uid,'attack')
    end
    function getItemDefense(uid)
        return getItemAttribute(uid,'defense')
    end
end
local function isArmor(uid) -- Function by Mock the bear.
    if (getItemInfo(uid.itemid).armor ~= 0) and (getItemWeaponType(uid.uid) == 0) then
        return true
    end
    return false
end
local function isWeapon(uid) -- Function by Mock the bear.
    uid = uid or 0
    local f = getItemWeaponType(uid)
    if f == 1 or f == 2 or f == 3 then
        return true
    end
    return false
end
local function isShield(uid) -- Function by Mock the bear.
    uid = uid or 0
    if getItemWeaponType(uid) == 4 then
        return true
    end
    return false
end
local function isBow(uid) -- Function by Mock the bear.
    uid = uid or 0
    if getItemWeaponType(uid) == 5 and not isItemStackable(uid) then
        return true
    end
    return false
end

local function getper()
	local n = 1
	for i=1,10 do
		n = n+math.random(0,10)
		if n < 8*i then
			break
		end
	end
	return n
end
local function getSlotCount(nam)
	local c = 0
	for _ in nam:gmatch('%[(.-)%]') do
		c = c+1
	end
	return c
end
local function getSlots(nam)
	local c = {}
	for slot in nam:gmatch('%[(.-)%]') do
		table.insert(c, slot)
	end
	return c
end


local removeUpgrade = {
	[11971] = "all" -- "all", "last" or "first"
}

function onUse(cid, item, fromPosition, itemEx, toPosition) -- Script by mock the bear (MTB)
	if removeUpgrade[item.itemid] then
		if item.uid == 0 or item.itemid == 0 then return false end
		toPosition.stackpos = 255
		if isInArray(conf.ignoredIds, itemEx.itemid)
			or (not getItemWeaponType(itemEx.uid) or getItemWeaponType(itemEx.uid) > 5)
			or (getItemWeaponType(itemEx.uid) == 0 and not isArmor(itemEx))
			or itemEx.itemid == 0 or itemEx.type > 1 or isItemStackable(itemEx.uid) then
			doPlayerSendTextMessage(cid, 24,"You cannot remove a slot from this item. #")
			return true
		end
		if isCreature(itemEx.uid) then
			return false
		end
		local nam = getItemName(itemEx.uid)
		if getSlotCount(nam) >= 1 then
			local slots = getSlots(nam)
			local newName = getItemInfo(itemEx.itemid).name
			for i = 1, #slots do
				if removeUpgrade[item.itemid] ~= "all" and (not((removeUpgrade[item.itemid] == "first" and i == 1) or (removeUpgrade[item.itemid] == "last" and i == #slots))) then
					newName = newName .. ' [' .. slots[i] .. ']'
				end
			end

			doSendMagicEffect(toPosition,30)
			doSendAnimatedText(toPosition,'REMOVED',120)
			doItemSetAttribute(itemEx.uid,'name', newName)
			doRemoveItem(item.uid, 1)
		else
			doPlayerSendTextMessage(cid, 24,"You cannot remove a slot here.")
		end
	else
		if item.uid == 0 or item.itemid == 0 then return false end
		toPosition.stackpos = 255
		if isInArray(conf.ignoredIds, itemEx.itemid)
			or (not getItemWeaponType(itemEx.uid) or getItemWeaponType(itemEx.uid) > 5)
			or (getItemWeaponType(itemEx.uid) == 0 and not isArmor(itemEx))
			or itemEx.itemid == 0 or itemEx.type > 1 or isItemStackable(itemEx.uid) then
			doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
			return true
		end
		if isCreature(itemEx.uid) then
			return false
		end
		local nam = getItemName(itemEx.uid)
		if getSlotCount(nam) < conf.maxSlotCount then
			local l = choose('hp','mp','cas','shield','dist')
			local p = getper()
	 
			doSendMagicEffect(toPosition,30)
			nam = nam..' ['..l..'.+'..p..'%]'
			doSendAnimatedText(toPosition,l..' '..p..'%',120)
			doItemSetAttribute(itemEx.uid,'name',nam)
			doRemoveItem(item.uid,1)
		else
			doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
		end
	end
    return true
end

 

Creaturescripts:

---Script by mock the bear!
local conditionMP,conditionHP,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
--- HP
conditionHP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionHP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionHP[i], CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
setConditionParam(conditionHP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionHP[i], CONDITION_PARAM_SUBID, 50)
--MANA
conditionMP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionMP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionMP[i], CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
setConditionParam(conditionMP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionMP[i], CONDITION_PARAM_SUBID, 51)
--club axe sword
conditionCLUB[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SUBID, 53)
--- shield
conditionSHI[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionSHI[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
setConditionParam(conditionSHI[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SUBID, 54)
--- dist
conditionDIST[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionDIST[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
setConditionParam(conditionDIST[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionDIST[i], 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[i] ~= t[i] 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)
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[i] 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

 

Link para o post
Compartilhar em outros sites
  • Solução

Tente trocar essa função:

 

local function getper()
	local n = 1
	for i=1,10 do
		n = n+math.random(0,10)
		if n < 8*i then
			break
		end
	end
	return n
end

 

por

 

local function getper()
local min, max = 1, 10
	return math.random(min, max)
end

 

máximo está 10%

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
2 horas atrás, Vodkart disse:

Tente trocar essa função:

 


local function getper()
	local n = 1
	for i=1,10 do
		n = n+math.random(0,10)
		if n < 8*i then
			break
		end
	end
	return n
end

 

por

 


local function getper()
local min, max = 1, 10
	return math.random(min, max)
end

 

máximo está 10%

obrigado vod, tu é incrível !! 

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