Ir para conteúdo

Slot System


Lolksky

Posts Recomendados

Batarde amoures o/

 

Bom, eu achei aqui no forúm um sistema de refinamento interesante do MOCK (era o que diziam), ele funciona direitinho e pans,

Funciona da seguinte forma: Você usa o item em alguma arma/equipamento e ele aumenta o atributo randomicamente em porcentagem, aumentando também HP e MP.

Problema: é que ele aumenta MUITO a porcentagem, por ex. tem hora que eu uso que aumenta 25% + de HP, eu queria diminui essa porcentagem máxima que aumenta, já tentei de tudo mas não conssegui, quem puder ajuda agradeço.

 

Script

action.XML

<action itemid="8300" event="script" value="slot.lua"/>
--[[

Slot system 100% by mock \o

]]

---Config

local conf = {

maxSlotCount=2,

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

function onUse(cid, item, fromPosition, itemEx, toPosition) -- Script by mock the bear (MTB)

if item.uid == 0 or item.itemid == 0 then return false end

toPosition.stackpos = 255

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)

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

function getSlotCount(nam)

local c = 0

for _ in nam:gmatch('%[(.-)%]') do

c = c+1

end

return c

end

if getSlotCount(nam) < conf.maxSlotCount then

local l = choose('hp','mp','ml','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

return true

end

 

creaturescript.XML

<event type="login" name="SlotLogin" script="slot.lua"/>
---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

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

Eai, tudo bem?

 

Nesse script esta é a função que define a porcentagem:

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

 

Você deve alterá-la ao seu gosto :P:

Link para o comentário
Compartilhar em outros sites

Eai, tudo bem?

 

Nesse script esta é a função que define a porcentagem:

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

 

Você deve alterá-la ao seu gosto :P:

 

 

certo, mas como eu altero, pra ser no maximo 15%?

de 0 - 15%?

Seria: (0,15)?

Link para o comentário
Compartilhar em outros sites

eai, voce pode fazer assim:

function getper()
return math.random(0,10)
end

 

Troque o 0 pelo valor mínimo que você quer e o 10 pelo valor máximo.

 

:P:

ACHEi man,era ai mesmo, mas nao era somente ai q mexia, mas achei, de qualquer forma dei seu REP, valeu

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

×
×
  • Criar Novo...