zbizu
Legendary OT User
Here it is - first way to make your items better on TFS 1.0.
It took me entire night and a lot of work to find different way for functions so I expect your comment here.
Original thread: MoveEvent - Slot system - Multi slot (No crashes) (http://otland.net/threads/slot-system-multi-slot-no-crashes.90387/)
Original author: @Mock
Updated version: CreatureEvent - [TFS 1.3] updated Slot System (https://otland.net/threads/tfs-1-3-updated-slot-system.267624/)
Script updated to 1.1. It may not work on older TFS.
Examples:
07:39 You see a mastermind shield (Def:37).
It weighs 57.00 oz.
[shield.+5%] [mp.+10%] [melee.+2%]
07:40 You see a crossbow (Range:5).
It weighs 40.00 oz.
[shield.+2%] [mp.+14%] [hp.+4%]
Installation:
No support with installation. If you can't install this script, you didn't read with understanding.
add this to global.lua:
add this to actions.xml:
slot.lua action
add this to creaturescripts.xml:
slot.lua creaturescript
It took me entire night and a lot of work to find different way for functions so I expect your comment here.
Original thread: MoveEvent - Slot system - Multi slot (No crashes) (http://otland.net/threads/slot-system-multi-slot-no-crashes.90387/)
Original author: @Mock
Updated version: CreatureEvent - [TFS 1.3] updated Slot System (https://otland.net/threads/tfs-1-3-updated-slot-system.267624/)
Script updated to 1.1. It may not work on older TFS.
Examples:
07:39 You see a mastermind shield (Def:37).
It weighs 57.00 oz.
[shield.+5%] [mp.+10%] [melee.+2%]
07:40 You see a crossbow (Range:5).
It weighs 40.00 oz.
[shield.+2%] [mp.+14%] [hp.+4%]
Installation:
No support with installation. If you can't install this script, you didn't read with understanding.
add this to global.lua:
Code:
function getItemAttack(uid) return ItemType(getThing(uid).itemid):getAttack() end
function getItemDefense(uid) return ItemType(getThing(uid).itemid):getDefense() end
function getItemArmor(uid) return ItemType(getThing(uid).itemid):getArmor() end
function getItemWeaponType(uid) return ItemType(getThing(uid).itemid):getWeaponType() end
function isArmor(uid) if (getItemArmor(uid) ~= 0 and getItemWeaponType(uid) == 0) then return true else return false end end
function isWeapon(uid) return (getItemWeaponType(uid) > 0 and getItemWeaponType(uid) ~= 4) end
function isShield(uid) return getItemWeaponType(uid) == 4 end
function isBow(uid) return (getItemWeaponType(uid) == 5 and (not ItemType(getThing(uid).itemid):isStackable())) end
add this to actions.xml:
Code:
<action itemid="8300" script="slot.lua"/>
slot.lua action
Code:
local conf = {
maxSlotCount=3,
ignoredIds={}
}
function choose(...)
local arg = {...}
return arg[math.random(1,#arg)]
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
if item.uid == 0 or item.itemid == 0 then return false end
toPosition.stackpos = 255
if isInArray(conf.ignoredIds, itemEx.itemid) or
isItemStackable(itemEx.uid) or
itemEx.itemid == 0 or
itemEx.type > 1 or
not(isArmor(itemEx.uid) or isWeapon(itemEx.uid) or isShield(itemEx.uid)) then
return false
end
if isCreature(itemEx.uid) then
return false
end
local nam = Item(itemEx.uid):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)
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','melee','shield','dist')
local p = getper()
doSendMagicEffect(toPosition,30)
nam = nam..' ['..l..'.+'..p..'%]'
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,l..'.+'..p..'%')
doSetItemSpecialDescription(itemEx.uid, nam)
doRemoveItem(item.uid,1)
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,"Slot limit reached.")
end
return true
end
add this to creaturescripts.xml:
Code:
<event type="login" name="SlotLogin" script="slot.lua"/>
slot.lua creaturescript
Code:
local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,300 do
conditionHP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionHP[i], CONDITION_PARAM_SUBID, 50)
setConditionParam(conditionHP[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionHP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionHP[i], CONDITION_PARAM_STAT_MAXHITPOINTSPERCENT, 100+i)
conditionMP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionMP[i], CONDITION_PARAM_SUBID, 51)
setConditionParam(conditionMP[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionMP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionMP[i], CONDITION_PARAM_STAT_MAXMANAPOINTSPERCENT, 100+i)
conditionML[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionML[i], CONDITION_PARAM_SUBID, 52)
setConditionParam(conditionML[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionML[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionML[i], CONDITION_PARAM_STAT_MAGICPOINTSPERCENT, 100+i)
conditionCLUB[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SUBID, 53)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_MELEEPERCENT, 100+i)
conditionSHI[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SUBID, 54)
setConditionParam(conditionSHI[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionSHI[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
conditionDIST[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SUBID, 55)
setConditionParam(conditionDIST[i], CONDITION_PARAM_BUFF_SPELL, 1)
setConditionParam(conditionDIST[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
end
function getSlotType(n)
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 player = Player(cid)
if not player then return false end
local t = {}
for slot=1,9 do
t[slot] = ''
local s = getPlayerSlotItem(player,slot).uid
if s ~= 0 then
t[slot] = Item(s):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)
end
end
return t
end
function chk(cid,f)
if not Player(cid) then return false end
local t = loadSet(cid)
if not t then return false end
for i=1,#f do
if f[i] ~= t[i] then
equip(player,nil,slot)
break
end
end
addEvent(chk,2000,cid,t)
end
function check_slot(aab, i)
if i == 5 or i == 6 then
if isWeapon(aab) or isShield(aab) or isBow(aab) then
return true
end
else
return true
end
return false
end
function equip(player,item,slot)
local t = {}
if item then
local mm,sinal,qto = getSlotType(Item(item.uid):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION))
t[mm] = tonumber(qto)
end
for i=1,9 do
if i ~= slot then
if getPlayerSlotItem(player,i).itemid ~= 0 then
local aab = getPlayerSlotItem(player,i).uid
if aab and check_slot(aab,i) then
for _ in Item(aab):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION):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] > 300 and 300 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
player:addCondition(conditionHP[tonumber(n)])
ca[50] = 1
doSendTutorial(player,19)
elseif sl == 'mp' then
player:addCondition(conditionMP[tonumber(n)])
ca[51] = 1
doSendTutorial(player,19)
elseif sl == 'ml' then
player:addCondition(conditionML[tonumber(n)])
ca[52] = 1
elseif sl == 'melee' then
player:addCondition(conditionCLUB[tonumber(n)])
ca[53] = 1
elseif sl == 'shield' then
player:addCondition(conditionSHI[tonumber(n)])
ca[54] = 1
elseif sl == 'dist' then
player:addCondition(conditionDIST[tonumber(n)])
ca[55] = 1
end
end
if fu > 0 then
for i=50,55 do
if not ca[i] then
doRemoveCondition(player:getId(),CONDITION_ATTRIBUTES,i)
end
end
else
for i=50,55 do
doRemoveCondition(player:getId(),CONDITION_ATTRIBUTES,i)
end
end
return true
end
function onLogin(player)
equip(player,nil,slot)
local cid = player:getId()
addEvent(chk,2000,cid,loadSet(cid))
return true
end
Last edited by a moderator: