Ir para conteúdo
  • 0

Magic Items


leandrozera

Pergunta

Posts Recomendados

  • 0

arrumei, é só um MODS...

 

caso não de certo tenta:

 

creaturescripts.xml:
<event type="login" name="randomstats_register" script="randomstats.lua"/>
   <event type="kill" name="randomstats_loot" script="randomstats.lua"/>
randomstats.lua
local rare_popup = true
local rare_text = "*rare*"
local rare_effect = true
local rare_effect_id = CONST_ME_MAGIC_GREEN
 
local tiers = {
[1] = {
prefix = 'rare',
showattr = true, -- attr prefix will be shown instead
extra = {0, 0},
chance = {
[1] = 10000, -- chance for basic stat
[2] = 5000 -- chance for second stat
}
},
 
[2] = {
prefix = 'epic',
extra = {7, 20}, -- additional percent bonus
chance = {
[1] = 3333,
[2] = 25000
}
},
 
[3] = {
prefix = 'legendary',
extra = {20, 35},
chance = {
[1] = 1000,
[2] = 100000 -- 2 bonuses always
}
},
}
 
--! attributes
local attr = {
atk = {
name = 'atk',
prefix = 'sharpened',
percent = {7, 25},
},
def = {
name = 'def',
prefix = 'fortified',
percent = {7, 25},
},
extradef = {
name = 'extra def',
prefix = 'balanced',
percent = {7, 25},
},
arm = {
name = 'arm',
prefix = 'flawless',
percent = {7, 20},
},
hitchance = {
name = 'accuracy',
prefix = 'accurate',
percent = {10, 25},
},
shootrange = {
name = 'range',
prefix = 'powerful',
percent = {17, 34},
},
charges = {
name = 'charges',
prefix = 'charged',
percent = {30, 45},
},
duration = {
name = 'time',
prefix = 'unique',
percent = {35, 50},
},
 
--[[ not available in 1.1
attackSpeed = {},
extraAttack = {},
]]
}
 
local stats = {
[1] = {ITEM_ATTRIBUTE_ATTACK, attr.atk},
[2] = {ITEM_ATTRIBUTE_DEFENSE, attr.def},
[3] = {ITEM_ATTRIBUTE_EXTRADEFENSE, attr.extradef},
[4] = {ITEM_ATTRIBUTE_ARMOR, attr.arm},
[5] = {ITEM_ATTRIBUTE_HITCHANCE, attr.hitchance},
[6] = {ITEM_ATTRIBUTE_SHOOTRANGE, attr.shootrange},
[7] = {ITEM_ATTRIBUTE_CHARGES, attr.charges},
[8] = {ITEM_ATTRIBUTE_DURATION, attr.duration},
-- not available in 1.1
-- [9] = {ITEM_ATTRIBUTE_ATTACKSPEED, attr.attackSpeed},
-- [10] = {ITEM_ATTRIBUTE_EXTRAATTACK, attr.extraAttack},
}
 
function stat_getItemDuration(item)
local it_id = item:getId()
local tid = ItemType(it_id):getTransformEquipId()
if tid > 0 then
item:transform(tid)
local vx = item:getAttribute(ITEM_ATTRIBUTE_DURATION)
item:transform(it_id)
item:removeAttribute(ITEM_ATTRIBUTE_DURATION)
return vx
end
return 0
end
 
function loot_attrToVal(item, attr)
local id = ItemType(item:getId())
local v = {
[ITEM_ATTRIBUTE_ATTACK] = id:getAttack(),
[ITEM_ATTRIBUTE_DEFENSE] = id:getDefense(),
[ITEM_ATTRIBUTE_EXTRADEFENSE] = id:getExtraDefense(),
[ITEM_ATTRIBUTE_ARMOR] = id:getArmor(),
[ITEM_ATTRIBUTE_HITCHANCE] = id:getHitChance(),
[ITEM_ATTRIBUTE_SHOOTRANGE] = id:getShootRange(),
[ITEM_ATTRIBUTE_CHARGES] = id:getCharges(),
[ITEM_ATTRIBUTE_DURATION] = stat_getItemDuration(item),
 
-- not available in 1.1
-- [ITEM_ATTRIBUTE_ATTACKSPEED] = item:getAttackSpeed(),
-- [ITEM_ATTRIBUTE_EXTRAATTACK] = item:getExtraAttack(),
}
return v[attr]
end
 
function assign_loot_Stat(c)
local rares = 0
local h = c:getItemHoldingCount()
if h > 0 then
for i = 1, h do
local available_stats = {}
local it_u = c:getItem(i - 1)
local it_id = ItemType(it_u:getId())
if it_u:isContainer() then
local crares = assign_loot_Stat(it_u)
rares = rares + crares
else
if not it_id:isStackable() then
local wp = it_id:getWeaponType()
if wp > 0 then
if wp == WEAPON_SHIELD then -- type shield
table.insert(available_stats, stats[2])
elseif wp == WEAPON_DISTANCE then -- type bow
table.insert(available_stats, stats[1])
table.insert(available_stats, stats[5])
table.insert(available_stats, stats[6])
-- not available in 1.1
-- table.insert(available_stats, stats[9])
elseif wp == WEAPON_WAND then -- type wand
table.insert(available_stats, stats[6])
-- not available in 1.1
-- table.insert(available_stats, stats[9])
elseif isInArray({WEAPON_SWORD, WEAPON_CLUB, WEAPON_AXE}, wp) then -- melee weapon
 
if it_id:getAttack() > 0 then
table.insert(available_stats, stats[1])
end
 
if it_id:getDefense() > 0 then
table.insert(available_stats, stats[2])
end
 
if it_id:getExtraDefense() ~= 0 then
table.insert(available_stats, stats[3])
end
-- not available in 1.1
-- table.insert(available_stats, stats[10])
end
else -- armors, amulets, runes and rings
if it_id:getArmor() > 0 then
table.insert(available_stats, stats[4])
end
 
if it_id:getCharges() > 0 then
table.insert(available_stats, stats[7])
end
 
local eq_id = it_id:getTransformEquipId()
if eq_id > 0 then
table.insert(available_stats, stats[8])
end
end
end
end
 
if #available_stats > 0 then
-- skips it all if it's empty
local tier = math.random(1, #tiers)
if #tiers[tier].chance > 0 then
local statsStored = 0
local stats_used = {}
for stat = 1, #tiers[tier].chance do
if #available_stats > 0 then
-- stops if no more stats available
if stat - 1 == statsStored then
-- checks when it's time to stop adding stats
if math.random(1, 100000) <= tiers[tier].chance[stat] then
statsStored = statsStored + 1
 
local selected_stat = math.random(1, #available_stats)
table.insert(stats_used, available_stats[selected_stat])
table.remove(available_stats, selected_stat)
end
end
end
end
 
if #stats_used > 0 then
rares = rares + 1
local stat_desc = {}
for stat = 1, #stats_used do
local v = math.random(
stats_used[stat][2].percent[1],
stats_used[stat][2].percent[2]
) + math.random(
tiers[tier].extra[1],
tiers[tier].extra[2]
)
local basestat = loot_attrToVal(it_u, stats_used[stat][1])
it_u:setAttribute(stats_used[stat][1], basestat + math.abs(basestat * v / 100))
table.insert(stat_desc, '[' .. stats_used[stat][2].name .. ': +' .. v .. '%]')
end
 
if tiers[tier].showattr then
for stat = 1, #stats_used do
it_u:setAttribute(ITEM_ATTRIBUTE_NAME, "[" .. stats_used[stat][2].prefix .. "]" .. it_u:getAttribute(ITEM_ATTRIBUTE_NAME))
end
it_u:setAttribute(ITEM_ATTRIBUTE_NAME, it_u:getAttribute(ITEM_ATTRIBUTE_NAME) .. " " .. it_id:getName())
else
it_u:setAttribute(ITEM_ATTRIBUTE_NAME, tiers[tier].prefix .. " " .. it_id:getName())
end
 
it_u:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, table.concat(stat_desc, "\n"))
end
end
end
end
end
return rares
end
 
function find_loot_Container(pos)
local rares = 0
local c = Tile(pos):getTopDownItem()
if c ~= nil then
if c:isContainer() then
rares = rares + assign_loot_Stat(c)
if rares > 0 then
if rare_popup then
local spectators = Game.getSpectators(pos, false, true, 7, 7, 5, 5)
for i = 1, #spectators do
spectators[i]:say(rare_text, TALKTYPE_MONSTER_SAY, false, spectators[i], pos)
end
end
 
if rare_effect then
pos:sendMagicEffect(rare_effect_id)
end
end
return true
end
end
end
 
function onKill(player, target, lastHit)
if (not isSummon(target)) then
addEvent(find_loot_Container, 2, target:getPosition())
end
return true
end
 
function onLogin(player)
player:registerEvent("randomstats_loot")
return true
end
Link para o comentário
Compartilhar em outros sites

  • 0

Eu ja vi esse sistema em algum ot , se não me engano era no NOXIOUSOT,

creio que tenha pelo fórum procure dar uma pesquisada antes.

Vou tentar achar para você ,se eu achar edito aqui.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu ja vi esse sistema em algum ot , se não me engano era no NOXIOUSOT,

creio que tenha pelo fórum procure dar uma pesquisada antes.

Vou tentar achar para você ,se eu achar edito aqui.

ok obg UP

up

up

up

Link para o comentário
Compartilhar em outros sites

  • 0

e basicamente dropa items com atributos

 

se for isso é apenas itens criados com atributos que ao dropar aparece o rare no loot do monstro ... porém pode ser um item comun com a função de ao dropar pode vir com o atributo ... tem essas duas possibilidades

Link para o comentário
Compartilhar em outros sites

  • 0

 

se for isso é apenas itens criados com atributos que ao dropar aparece o rare no loot do monstro ... porém pode ser um item comun com a função de ao dropar pode vir com o atributo ... tem essas duas possibilidades

ou uma função que automaticamente adiciona atributo nos itens configuravel, a quantidade de atributo

Link para o comentário
Compartilhar em outros sites

  • 0

MODS:



ItemStats.xml


<?xml version="1.0" encoding="UTF-8"?>
<mod name="Random Item Stats" enabled="1">
<config name="itemstats_conf"><![CDATA[
-- //
extra_loot_key = 123 --: optional storage for higher loot rate
vocation_base_attackspeed = getVocationInfo(1).attackSpeed --: used for attackSpeed stat
-- //

tiers, attr = {}, {}

tiers['rare'] = {
color = 66, -- color of 'RARE' text
extra = {0, 0},
attrNames = true, -- show attribute names instead of rare
chance = {
[1] = 10000,
[2] = 5000 -- chance for 2nd stat
}
}
tiers['epic'] = {
color = 35,
extra = {7, 20}, -- additional percent bonus
chance = {
[1] = 3333,
[2] = 25000
}
}
tiers['legendary'] = {
color = 149,
extra = {20, 35},
chance = {
[1] = 1000,
[2] = 100000 -- 2 bonuses always
}
}

MELEE = 0
DISTANCE = 1
ARMOR = 2
SHIELD = 3
WAND = 4
DURATION_RING = 5
CHARGES = 6

--! attributes
attr['quick'] = {
attr = 'attackSpeed',
name = 'Attack Speed',
percent = {6, 20},
types = {MELEE, DISTANCE, WAND}
}
attr['fortified'] = {
attr = 'extraDefense',
base = 'defense',
name = 'Defense',
percent = {7, 25},
types = {MELEE, SHIELD}
}
attr['deadly'] = {
attr = 'extraAttack',
base = 'attack',
name = 'Attack',
types = {MELEE},
percent = {7, 25}
}
attr['strong'] = {
attr = 'armor',
name = 'Armor',
percent = {7, 20},
types = {ARMOR}
}
attr['hawkeye\'s'] = {
attr = 'hitChance',
name = 'Hit Chance',
percent = {10, 25},
types = {DISTANCE}
}
--[[ // not available without source edit
attr['farsight'] = {
attr = 'shootRange',
name = 'Shoot Range',
percent = {17, 34},
types = {DISTANCE, WAND}
}
]]
attr['charged'] = {
attr = 'charges',
name = 'Charges',
percent = {30, 45},
types = {CHARGES}
}
attr['divine'] = {
attr = 'duration',
name = 'Duration',
percent = {35, 50},
types = {DURATION_RING}
}
--/ attributes

rate = getConfigInfo('rateLoot')

if( getConfigInfo('monsterLootMessage') ~= 0 )then
print('[Notice] Set monsterLootMessage = 0 to prevent duplicate loot messages')
end
]]></config>

<event type="kill" name="itemstats" event="script"><![CDATA[
domodlib('itemstats_conf')

function round(n, s)
return tonumber(('%.' .. (s or 0) .. 'f'):format(n))
end

function getContentDescription(uid, sep)
local ret, i, containers = '', 0, {}
while( i < getContainerSize(uid) )do
local v, s = getContainerItem(uid, i), ''
local k = getItemInfo(v.itemid)
k.name = getItemAttribute(v.uid, 'name') or k.name
if( k.name ~= '' )then
if( v.type > 1 and k.stackable and k.showCount )then
s = v.type .. ' ' .. k.plural
else
local article = getItemAttribute(v.uid, 'article') or k.article
s = (article == '' and '' or article .. ' ') .. k.name
end
ret = ret .. (i == 0 and not sep and '' or ', ') .. s
if( isContainer(v.uid) and getContainerSize(v.uid) ~= 0 )then
table.insert(containers, v.uid)
end
else
ret = ret .. (i == 0 and not sep and '' or ', ') .. 'an item of type ' .. v.itemid .. ', please report it to gamemaster'
end
i = i + 1
end
for i = 1, #containers do
ret = ret .. getContentDescription(containers, true)
end
return ret
end

local function send(cid, corpse, monster)
if( isPlayer(cid) )then
local ret = corpse and isContainer(corpse) and getContentDescription(corpse)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'))
local party = getPlayerParty(cid)
if( party )then
for _, pid in ipairs(getPartyMembers(party)) do
doPlayerSendChannelMessage(pid, '', 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'), TALKTYPE_CHANNEL_W, CHANNEL_PARTY)
end
end
end
end

local function createLoot(i, ext)
local item = type(i.id) == 'table' and i.id[math.random(#i.id)] or i.id
local random = math.ceil(math.random(100000) / ext)
local tmpItem, f

if( random < i.chance )then
if i.subType == -1 then
f = getItemInfo(item)
end
tmpItem = doCreateItemEx(item,
i.subType ~= -1 and i.subType or
f.stackable and random % i.count + 1 or
f.charges ~= 0 and f.charges or
1
)
end

if( not tmpItem )then
return
end

if( i.actionId ~= -1 )then
doItemSetAttribute(tmpItem, 'aid', i.actionId)
end

if( i.uniqueId ~= -1 )then
doItemSetAttribute(tmpItem, 'uid', i.uniqueId)
end

if( i.text ~= '' )then
doItemSetAttribute(tmpItem, 'text', i.text)
end

local ret, done

for k, v in pairs(tiers) do
local cur, used = {}, {}
for i = 1, #v.chance do
if( math.random(100000) <= v.chance )then
if( f )then
f = getItemInfo(item)
end
if( not f.stackable )then
for m, n in pairs(attr) do
if( not table.find(used, m) and
(
( table.find(n.types, MELEE) and table.find({WEAPON_SWORD, WEAPON_CLUB, WEAPON_AXE}, f.weaponType) ) or
( table.find(n.types, DISTANCE) and f.weaponType == WEAPON_DIST and f.ammoType ~= 0 ) or
( table.find(n.types, ARMOR) and f.armor ~= 0 and f.wieldPosition ~= CONST_SLOT_NECKLACE ) or
( table.find(n.types, SHIELD) and f.defense ~= 0 and f.weaponType == WEAPON_SHIELD ) or
( table.find(n.types, WAND) and f.weaponType == WEAPON_WAND ) or
( table.find(n.types, DURATION_RING) and f.wieldPosition == CONST_SLOT_RING and f.transformEquipTo ~= 0 ) or
( table.find(n.types, CHARGES) and table.find({CONST_SLOT_RING, CONST_SLOT_NECKLACE}, f.wieldPosition) and f.charges ~= 0 )
) )then
table.insert(cur, m)
end
end

if( #cur ~= 0 )then
local n = cur[math.random(#cur)]
table.insert(used, n)

n = attr[n]
local percent, new, tmp = math.random(n.percent[1] + (v.extra[1] or 0), n.percent[2] + (v.extra[2] or 0))
-- hacks
if( n.attr == 'duration' )then
tmp = getItemInfo(f.transformEquipTo)
if tmp.transformDeEquipTo ~= item then
break
end
new = round( tmp.decayTime * (1 + percent / 100) * 1000 )
elseif( n.attr == 'attackSpeed' )then
new = round( vocation_base_attackspeed / (1 + percent / 100) )
elseif( n.attr == 'hitChance' ) then
new = round(
f.hitChance == -1 and
percent
or
f.hitChance * (1 + percent / 100)
)
else
new = round(
n.base and
f[n['attr']] + f[n['base']] * (percent / 100)
or
f[n['attr']] * (1 + percent / 100)
)

if( new == f[n[n.base and 'base' or 'attr']] )then -- no improvement
break
end
end

doItemSetAttribute(tmpItem, n.attr:lower(), new)

local name = getItemAttribute(tmpItem, 'name')
if( v.attrNames or not name )then
local name = (v.attrNames and used[#used] or k) .. ' ' .. (name or f.name)
doItemSetAttribute(tmpItem, 'name', name)

if( f.article ~= '' )then
local article = getArticle(name)
if( article ~= f.article )then
doItemSetAttribute(tmpItem, 'article', article)
end
end
end

local desc = getItemAttribute(tmpItem, 'description') or f.description
doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. '%]' .. (desc == '' and '' or '\n' .. desc))

ret = k
end
cur = {}
if( #v.chance == i )then
done = true
end
end
else
done = i ~= 1
break
end
end
if( done )then
break
end
end

return tmpItem, ret
end

local function createChildLoot(parent, i, ext, pos)
if( not i or #i == 0 )then
return true
end

local size, cap = 0, getContainerCap(parent)
for k = 1, #i do
if( size == cap )then
break
end
local tmp, ret = createLoot(i[k], ext)
if( tmp )then
if( isContainer(tmp) )then
if( createChildLoot(tmp, i[k].child, ext, pos) )then
doAddContainerItemEx(parent, tmp)
size = size + 1
else
doRemoveItem(tmp)
end
else
if( ret )then
doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
end
doAddContainerItemEx(parent, tmp)
size = size + 1
end
end
end

return size > 0
end

local function dropLoot(pos, v, ext, master, cid, target)
local corpse
if( not master or master == target )then -- 0.3/4
corpse = getTileItemById(pos, v.lookCorpse).uid
if( isContainer(corpse) )then
for i = 1, getContainerSize(corpse) do
doRemoveItem(getContainerItem(corpse, 0).uid)
end
local size, cap = 0, getContainerCap(corpse)
for i = 1, #v.loot do
if( size == cap )then
break
end
local tmp, ret = createLoot(v.loot, ext)
if( tmp )then
if( isContainer(tmp) )then
if( createChildLoot(tmp, v.loot.child, ext, pos) )then
doAddContainerItemEx(corpse, tmp)
size = size + 1
else
doRemoveItem(tmp)
end
else
if( ret )then
doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
end
doAddContainerItemEx(corpse, tmp)
size = size + 1
end
end
end
end
end
send(cid, corpse, v.description)
end

function onKill(cid, target, damage, flags)
if( (damage == true or bit.band(flags, 1) == 1) and isMonster(target) )then -- 0.3/4
local v = getMonsterInfo(getCreatureName(target))
if( v and v.lookCorpse ~= 0 )then
local s = getCreatureStorage(cid, extra_loot_key)
addEvent(dropLoot, 0, getThingPos(target), v, s == -1 and rate or s, getCreatureMaster(target), cid, target)
end
end
return true
end
]]></event>

<event type="login" name="itemstats_login" event="buffer"><![CDATA[
registerCreatureEvent(cid, 'itemstats')
]]></event>

</mod>


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

  • 0

erro creature scripts


[24/4/2015 23:44:12] [Error - CreatureScript Interface] 
[24/4/2015 23:44:12] data/creaturescripts/scripts/randomstats.lua:onLogin
[24/4/2015 23:44:12] Description: 
[24/4/2015 23:44:12] data/creaturescripts/scripts/randomstats.lua:278: attempt to index local 'player' (a number value)
[24/4/2015 23:44:12] stack traceback:
[24/4/2015 23:44:12] 	data/creaturescripts/scripts/randomstats.lua:278: in function <data/creaturescripts/scripts/randomstats.lua:277>

mod deu esse erro

 

1SWg2wn.png

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

  • 0

erro creature scripts


[24/4/2015 23:44:12] [Error - CreatureScript Interface] 
[24/4/2015 23:44:12] data/creaturescripts/scripts/randomstats.lua:onLogin
[24/4/2015 23:44:12] Description: 
[24/4/2015 23:44:12] data/creaturescripts/scripts/randomstats.lua:278: attempt to index local 'player' (a number value)
[24/4/2015 23:44:12] stack traceback:
[24/4/2015 23:44:12] 	data/creaturescripts/scripts/randomstats.lua:278: in function <data/creaturescripts/scripts/randomstats.lua:277>

mod deu esse erro

 

1SWg2wn.png

tenta registrar no login.lua

registerEvent("randomstats_loot")

se não der tente assim:

player:registerEvent("randomstats_register")

Não tenho total certeza testa ae.

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

×
×
  • Criar Novo...