Ir para conteúdo

Slot System (tfs 1.1)


Peedbew

Posts Recomendados

Oi. Vim trazer esse sistema postado por nosso amigo zbizu da comunidade otland. Se não sabe como funciona, veja o exemplo abaixo. Espero que seja útil! 

 

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%]

 

 

SLOT SYSTEM

 

global.lua

  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

 

actions.xml

<action itemid="8300" script="slot.lua"/>

 

slot.lua action

local conf = {maxSlotCount=3,ignoredIds={}}function choose(...)  local arg = {...}  return arg[math.random(1,#arg)]endfunction 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 trueend

 

creaturescripts.xml

<event type="login" name="SlotLogin" script="slot.lua"/>

 

slot.lua creaturescripts

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)endfunction 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  endendlocal 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 tendfunction 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)endfunction 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  endreturn falseendfunction 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 trueendfunction onLogin(player)  equip(player,nil,slot)local cid = player:getId()  addEvent(chk,2000,cid,loadSet(cid))  return trueend

 

SLOT REMOVER

 

actions.xml

<action itemid="8299" script="slotremove.lua"/>

 

slotremove.lua

function getSlotType_full(n)   if not n then     return false   end   if n:match('%[(.+)%]') then     n = n:match('%[(.+)%]')     if n == '?' then       return 0,n     else       return n     end   else     return false   endendfunction onUse(cid, item, fromPosition, itemEx, toPosition)item_slots_a = 0item_slots_n = ""item_slots_t = {}   for _ in Item(itemEx.uid):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION):gmatch('(%[.-%])') do     item_slots_a = item_slots_a + 1     item_slots_t[item_slots_a] = getSlotType_full(_)   end      if item_slots_t[1] == nil then     return false   end   for i = 1, #item_slots_t - 1 do   item_slots_n = item_slots_n .. "[" .. item_slots_t[i] .. "]"   end      doRemoveItem(item.uid,1)   doSendMagicEffect(toPosition,CONST_ME_MAGIC_RED)   doSetItemSpecialDescription(itemEx.uid, item_slots_n)   doPlayerSendTextMessage(cid,20,"Attribute removed.")return trueend

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...