Engraçado como funciona a hipocrisia...
Fulano é mercenário pois cobra por serviço, entendam só... Fulano passou horas e horas estudando, falhando, desanimando pra aprender aquilo e se aperfeiçoar... Fulano tem total direito de cobrar pelo seu serviço sim, há uma diferença entre serviço pronto e ajuda, geralmente só vejo pedidos de scripts prontos, nem o favor de testar antes, ou tentar corrigir por si só, já que isso aumenta seu aprendizado...
Outra, por que vocês colocam donate, items vip pra vender no OTSERV? Querem retorno, querem ganhar dinheiro, entendeu onde está a hipocrisia? Se não quer ser cobrado por tempo e aprendizado, aprendam, tentem que eu digo a vocês, será bem mais satisfatório!
Boa sorte a todos com seus otservers, e digo mais uma vez, isso é um dos motivos mais fortes de o Open Tibia estar se extinguindo...
Então, posta a solução, mano ! Outras pessoas podem ter essa mesma dúvida ou necessidade...
O erro de vocês é esse: Vem atrás de resultados, quando encontra, não compartilha !
local config = {
targetList = {
[1] = 'purching bag'
},
access = 3 -- Gamemaster
}
function onPush(cid, target)
if getPlayerAccess(cid) >= config.access then
return true
end
if target == cid or not isPlayer(target) then
return true
end
if (getCreatureTarget(target) > 0 and isInArray(config.targetList, getCreatureName(getCreatureTarget(target)):lower())) then
doPlayerSendCancel(cid, "You cannot move this player.")
return false
end
return true
end
Tentei kk, não manjo de 0.4 kk
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED)
local condition = createConditionObject(CONDITION_PARALYZE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 20000)
setConditionFormula(condition, -0.9, 0, -0.9, 0)
setCombatCondition(combat, condition)
function onCastSpell(cid, var)
setPlayerStorageValue(cid, 12019, 1)
addEvent(function(id)
if not isPlayer(id) then
return
end
setPlayerStorageValue(id, 12019, -1)
end, 500, cid)
return doCombat(cid, combat, var)
end
Engraçado como funciona a hipocrisia...
Fulano é mercenário pois cobra por serviço, entendam só... Fulano passou horas e horas estudando, falhando, desanimando pra aprender aquilo e se aperfeiçoar... Fulano tem total direito de cobrar pelo seu serviço sim, há uma diferença entre serviço pronto e ajuda, geralmente só vejo pedidos de scripts prontos, nem o favor de testar antes, ou tentar corrigir por si só, já que isso aumenta seu aprendizado...
Outra, por que vocês colocam donate, items vip pra vender no OTSERV? Querem retorno, querem ganhar dinheiro, entendeu onde está a hipocrisia? Se não quer ser cobrado por tempo e aprendizado, aprendam, tentem que eu digo a vocês, será bem mais satisfatório!
Boa sorte a todos com seus otservers, e digo mais uma vez, isso é um dos motivos mais fortes de o Open Tibia estar se extinguindo...
Quando seu suporte for resolvido, por favor marque a melhor resposta para que a tag "Resolvido" seja adicionada. Esta é uma mensagem automática! Pedimos que leia as regras do fórum!
@r0bert0lol
local config = {
[100] = {nameSpell = "spell", msg = "Você já pode usar..."},
[150] = {nameSpell = "spell", msg = "Você já pode usar..."},
[200] = {nameSpell = "spell", msg = "Você já pode usar..."},
[250] = {nameSpell = "spell", msg = "Você já pode usar..."},
[300] = {nameSpell = "spell", msg = "Você já pode usar..."},
}
function onAdvance(cid, skill, oldLevel, newLevel)
local level = config[newLevel]
if not level then
return true
end
if getPlayerLearnedInstantSpell(cid, level.nameSpell) then
return true
end
doPlayerLearnInstantSpell(cid, level.nameSpell)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, level.msg)
return true
end
function onLogin(cid)
if getPlayerLastLoginSaved(cid) <= 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "Seja Bem-Vindo ao X server e tenha um bom jogo")
return true
end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "Bem-Vindo novamente, espero que esteja gostando do nosso servidor")
return true
end
Para quem já assistiu Sword Art Oline vai ficar fácil de entender. Jogadores poderão fazer uma quest simples, porém, diferenciada. Funciona da seguinte forma:
1 - Jogador terá que possuir uma chave para abrir o caminho de uma sala misteriosa e aparentemente cheia de tesouros e recompensas dentro de um baú
2 - Abrindo a passagem, ele vai se deparar com um baú em sua espera, o interesse do ser humano é devastador, ele irá abrir sim!
3 - Ao tentar abrir o baú, monstros serão invocados e a passagem será imediatamente fechada
4 - De todos os monstros que serão invocados, terá um chefe que será responsável por permitir a saída dos jogadores para sala de recompensa e sair daquele lugar, APENAS matando ele, isso será possível
5 - Após a morte do chefe, TODOS players na sala da quest serão teleportados para a área de recompensa configurada no script.
Obs.: A quest tá configurada para ser feita em X minutos para TODO servidor, ou seja, se uma guild fez a quest e você configurou para ela ser feita novamente em 10 minutos, então, nenhum outro player poderá fazer a quest nesse intervalo, pois a storage armazenada é a do servidor.
* Instalação *
VERSÃO TESTADA: 8.6 - TFS 0.4
Para agilizar o processo, deixei como anexo todos os arquivos necessários, devidamente separados e organizados, caso queira baixar, o ViruScan dele está logo abaixo.
Em data/actions/scripts/
1° - Crie um arquivo chamado keySAO.lua e cole o seguinte código dentro:
--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]--
local config = {
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
tempoFechar = 1, -- MINUTOS para a passagem fechar, caso não entrem APÓS abrirem a passagem
}
function remover_parede(conf)
local parede = getTileItemById(conf.parede.pos, conf.parede.id)
if (parede) then
doRemoveItem(parede.uid, 1)
doSendMagicEffect(conf.parede.pos, 10)
end
return true
end
function adicionar_parede(conf)
local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
return true
end
function onUse(cid, item, fromPos, item2, toPos)
if (item2.itemid == config.parede.id) then
if (getGlobalStorageValue(config.strPassagem.storage) >= os.time()) then return doCreatureSay(cid, 'Precisa esperar ' .. config.strPassagem.tempo .. ' minuto para fazer a quest!', TALKTYPE_ORANGE_1)
end
doRemoveItem(item2.uid, 1)
doSendMagicEffect(config.parede.pos, 10)
doCreatureSay(cid, "A passagem foi aberta por "..getPlayerName(cid).."! Peguem a recompensa no bau, depressa!", TALKTYPE_ORANGE_1)
doPlayerSendCancel(cid, "A passagem ira fechar em " ..config.tempoFechar.. " minuto!")
addEvent(function()
adicionar_parede(config)
end, config.tempoFechar * 60 * 1000)
doRemoveItem(item.uid, 1)
end
return true
end
Em seguida, crie outro arquivo no mesmo local com o nome de bauSAO.lua e cole o código dentro:
--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]
local mti = {
[1] = {nome = 'Demon', pos = {x=955, y=935, z=6}}, -- [numero] = {nome = 'Nome Monstro', pos = 'POSICAO QUE IRÁ RESPAWNAR O MONSTRO'}
[2] = {nome = 'Demon', pos = {x=955, y=936, z=6}},
[3] = {nome = 'Demon', pos = {x=955, y=937, z=6}},
[4] = {nome = 'Demon', pos = {x=955, y=938, z=6}},
[5] = {nome = 'Demon', pos = {x=955, y=939, z=6}},
[6] = {nome = 'Demon', pos = {x=955, y=940, z=6}},
[7] = {nome = 'Demon', pos = {x=964, y=935, z=6}},
[8] = {nome = 'Demon', pos = {x=964, y=936, z=6}},
[9] = {nome = 'Demon', pos = {x=964, y=937, z=6}},
[10] = {nome = 'Demon', pos = {x=964, y=938, z=6}},
[11] = {nome = 'Demon', pos = {x=964, y=939, z=6}},
[12] = {nome = 'Demon', pos = {x=964, y=940, z=6}},
[13] = {nome = 'Loki', pos = {x=959, y=940, z=6}},
}
local config = {
unique = 17458, -- uniqueID que vai colocar no BAÚ no seu EDITOR DE MAPA!
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
}
function adicionar_parede(conf)
local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
return true
end
function onUse(cid, item, fromPos, item2, toPos)
if (item.uid == config.unique) then
if (getGlobalStorageValue(config.strPassagem.storage) >= os.time()) then return doCreatureSay(cid, 'Precisa esperar ' .. config.strPassagem.tempo .. ' minuto para fazer a quest!', TALKTYPE_ORANGE_1) end
doCreatureSay(cid, "Argh!! Sala com armadilha.", TALKTYPE_ORANGE_1)
adicionar_parede(config)
for _, cf in pairs(mti) do
doSummonCreature(cf.nome, cf.pos)
end
setGlobalStorageValue(config.strPassagem.storage, os.time() + config.strPassagem.tempo * 60)
end
return true
end
Adicione as seguintes linhas de código em data/actions/actions.xml
<action uniqueid="17458" event="script" value="bauSAO.lua"/>
<action itemid="IDdaKEY" event="script" value="keySAO.lua" />
2° - Agora em data/creaturescripts/scripts
Crie um arquivo chamado tpSAO.lua e cole o código dentro:
--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]
local config = {
SupEsquerdo = {x=953, y=930, z=6}, -- posicao do canto SUPERIOR ESQUERDO da área que ficará a quest
InfDireito = {x=966, y=941, z=6}, -- posicao do canto INFERIOR DIREITO da área que ficará a quest
chefe = "Loki", -- Nome do BOSS, responsável por abrir passagem e liberar a recompensa no baú
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- id da parede ||||| posicao dela
posPremio = {x = 1263, y = 1128, z = 7}, -- posicao para area de recompensa quando os players matarem o boss
msgSucesso = "Parabéns por passarem do desafio! Agora permitirei pegar algumas recompensas como reconhecimento de um otimo guerreiros que es!" -- Mensagem quando os players conseguirem matar o boss da sala
}
function getAllPlayersInArea(fromPosition, toPosition)
local players = {}
for _, pid in ipairs(getPlayersOnline()) do
local f = {x = fromPosition.x, y = fromPosition.y, z = fromPosition.z}
local t = {x = toPosition.x, y = toPosition.y, z = toPosition.z}
local min = (fromPosition.z > toPosition.z and toPosition.z or fromPosition.z)
for index = 0, math.abs(toPosition.z - fromPosition.z) do
f.z = min + index
t.z = min + index
if (isInRange(getPlayerPosition(pid), f, t)) then
table.insert(players, pid)
end
end
end
return players
end
function remover_parede(conf)
local parede = getTileItemById(conf.parede.pos, conf.parede.id)
if (parede) then
doRemoveItem(parede.uid, 1)
doSendMagicEffect(conf.parede.pos, 10)
end
return true
end
function adicionar_parede(conf)
local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
return true
end
function onDeath(cid)
local boss = getCreatureName(cid) == config.chefe
if boss then
doCreatureSay(cid, config.msgSucesso, TALKTYPE_ORANGE_1)
doSendMagicEffect(getCreaturePosition(cid), 49)
addEvent(function()
local players = getAllPlayersInArea(config.SupEsquerdo, config.InfDireito)
for _, jogador in ipairs(players) do
doTeleportThing(jogador, config.posPremio)
doSendMagicEffect(getPlayerPosition(jogador), 11)
end
end, 7000)
end
return true
end
Adicione a seguinte linha de código em data/creaturescripts/creaturescripts.xml
<event type="death" name="tpSao" script="tpSAO.lua"/>
Em data/creaturescripts/scripts/login.lua adicione esta linha de código abaixo do último registerCreatureEvent
3° - Por fim, agora escolhe um monstro que será o chefe responsável por permitir que os jogadores saiam do local e que leve-os até a sala de recompensa após o derrotarem.
Escolheu? Show, agora vá até o diretório dele em data/monster/pastaDoSeumonstro/arquivoDoSeuMonstro.xml e adicione essas linhas de códigos abaixo de alguma tag, no meu caso, utilizei abaixo da tag flags
<script>
<event name="tpSao"/>
</script>
Segue foto para melhor entendimento:
* Explicação da configuração *
Bom, apesar de está TUDO COMENTADO e AJUSTÁVEL, acho importante dá algumas explicações:
1 - Configurou tudo nas pastas corretamente, colocou todas linhas de códigos necessárias e explicadas? Beleza, você tá quase lá.
2 - Coloque em um baú no seu editor de mapa um UNIQUEID que será responsável por identificar que aquele BAÚ é da quest, segue imagem:
Aconselho não modificar o valor, pois é muito improvável que já esteja sendo utilizado em seu servidor.
3 - Agora entrando na parte dos scripts:
No arquivo keySAO.lua localizado em data/actions/scripts/
local config = {
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
tempoFechar = 1, -- MINUTOS para a passagem fechar, caso não entrem APÓS abrirem a passagem
}
Configure o id da parede que impedirá a passagem dos players e o jogador utilizará a chave nela para passar! Não esqueça de configurar a posição dela também, deixe a mesma que você colocou no mapa. Configure o storage que será responsável por permitir ou não jogadores fazerem a quest em X minutos. Configure o tempo que o player terá para passar para dentro da sala antes que a passagem se feche, no script tá 1 minuto.
No arquivo bauSAO.lua localizado em data/actions/scripts/
local mti = {
[1] = {nome = 'Demon', pos = {x=955, y=935, z=6}}, -- [numero] = {nome = 'Nome Monstro', pos = 'POSICAO QUE IRÁ RESPAWNAR O MONSTRO'}
[2] = {nome = 'Demon', pos = {x=955, y=936, z=6}},
[3] = {nome = 'Demon', pos = {x=955, y=937, z=6}},
[4] = {nome = 'Demon', pos = {x=955, y=938, z=6}},
[5] = {nome = 'Demon', pos = {x=955, y=939, z=6}},
[6] = {nome = 'Demon', pos = {x=955, y=940, z=6}},
[7] = {nome = 'Demon', pos = {x=964, y=935, z=6}},
[8] = {nome = 'Demon', pos = {x=964, y=936, z=6}},
[9] = {nome = 'Demon', pos = {x=964, y=937, z=6}},
[10] = {nome = 'Demon', pos = {x=964, y=938, z=6}},
[11] = {nome = 'Demon', pos = {x=964, y=939, z=6}},
[12] = {nome = 'Demon', pos = {x=964, y=940, z=6}},
[13] = {nome = 'Loki', pos = {x=959, y=940, z=6}},
}
local config = {
unique = 17458, -- uniqueID que vai colocar no BAÚ no seu EDITOR DE MAPA!
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
}
Configure os nomes e posições que os monstros irão respawnar, e repare que deixei apenas 1 diferenciado chamado 'Loki', pois foi o monstro que escolhi como CHEFE
Configure o uniqueID que será utilizado no baú, recomendo não mexer nessa parte
Configure novamente o ID da parede que irá bloquear a passagem e a mesma posição (use a mesma coisa da configuração anterior)
Configure novamente o storage e tempo que permitirá os jogadores fazerem a quest em X minutos (use a mesma coisa da configuração anterior)
No arquivo tpSAO.lua em data/creaturescripts/scripts/
local config = {
SupEsquerdo = {x=953, y=930, z=6}, -- posicao do canto SUPERIOR ESQUERDO da área que ficará a quest
InfDireito = {x=966, y=941, z=6}, -- posicao do canto INFERIOR DIREITO da área que ficará a quest
chefe = "Loki", -- Nome do BOSS, responsável por abrir passagem e liberar a recompensa no baú
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- id da parede ||||| posicao dela
posPremio = {x = 1263, y = 1128, z = 7}, -- posicao para area de recompensa quando os players matarem o boss
msgSucesso = "Parabéns por passarem do desafio! Agora permitirei pegar algumas recompensas como reconhecimento de um otimo guerreiros que es!" -- Mensagem quando os players conseguirem matar o boss da sala
}
Configure o canto superior esquerdo e inferior direito, é de EXTREMA importância isso, pois será responsável por verificar os jogadores na sala da quest e teleportá-los, segue imagem:
Coloque as posições corretamente de cada canto.
Configure o nome do chefe que você escolheu para completar a quest, o monstro diferenciado que falamos lá em cima, certo?
Configure novamente o ID da parede que irá bloquear a passagem e a mesma posição (use a mesma coisa da configuração anterior)
Configure a posição do prêmio, isto é, a posição que o player será teleportado quando matar o CHEFE, a posição da SALA DE RECOMPENSAS ou seja lá o que queira fazer após os jogadores matarem o chefe.
Configure a mensagem, caso queira, de quando os jogadores matarem o CHEFE da sala.
* Observações finais e anexos para download *
Digo logo que é um script simples, porém bastante trabalhoso de ser configurado, visto que faz-se necessário a instalação de alguns arquivos, mas não deixa de ser simples!
A ideia que tive foi quando estava lembrando do anime, e como estou voltando aos poucos com Tibia (aprendendo bastante), tive a ideia de fazer isso, pois como gostava bastante de jogar em Baiak e modos semelhantes, isso daqui pode ser bastante útil. Ah! E deixe-me alertá-lo, é um sistema simples que não está 100% como eu desejava, portanto, quando tiver tempo estarei atualizando e deixando com mínimo de incoerência possível no funcionamento dele.
POR FAVOR, faça o trabalho de ler as configurações do script, está tudo organizadinho para que você configure lá e deixe da maneira mais prática possível. Acredito que isso é tudo, abraços, \o.
Download dos arquivos zipados: Arquivos - Quest Baú SAO - Lordzetros.zip
Scan do arquivo: https://www.virustotal.com/pt/file/10e6bf2be0ccb33838a75198e5f822c1c8888f4c8652dcfc5235f87260a7582a/analysis/1540133843/
Eu procurei em diversos fóruns, falei com algumas pessoas, tentei desencryptar alguns e até mesmo montar o meu próprio client, porém sem sucesso. Faz um tempo que eu achei um client em outro fórum mas ele simplesmente se recusava a conectar-se em qualquer servidor devido a RSA que vinha compilada no próprio client, e sério, vocês não tem ideia do trabalho que uma pessoa leiga tem para fazer coisas que não funcionam funcionarem, isso é, sem suporte de ninguém. Entre telas pretas, problemas de conexão, debugs e outras coisas que aqui não citei finalmente obtive sucesso, isso só prova que independente do seu conhecimento se você persevera vocẽ chega em um resultado, você supera um obstaculo por menor que ele seja e se sente bem com isso. (Isso é estranho, devo ser a única pessoa que encontra filosofia enquanto monta um server, gay.)
Eu não achei um client que funcionasse em NENHUM lugar da internet que fosse próprio para versão 7.x, eu também vi uma regressão em servidores de qualidade com essa versão, posto isso sem o intuito de ser bonzinho com alguém, mas com o intuito que as pessoas USEM, sonhem e realizem esse sonho, por menor que ele seja, eu posso, eu quero, eu consigo. Espero realmente que isso facilite mesmo que minimamente o trabalho de todo aquele que deseja criar um servidor em uma versão inferior mas considerada por muitos superior em questão de nostalgia e qualidade.
ATENÇÃO:
O cliente necessita de alterações para que seja de uso próprio de qualquer servidor, o meu trabalho nele foi apenas fazer funcionar, o que não foi fácil para alguém que como dito antes é leigo, como eu apendi minha lição superando esse obstaculo hoje seria fácil para mim repetir o feito. Utilizei alguns ícones e o background do Medivia, fica a seu gosto substituir ou não, se tiver algum problema fico a seu dispor para tentar auxiliá-lo por intermédio desse tópico. Deus abençoe o TibiaKing.
local chest = {
[8049] = {
name = '[Event] BOX',
container = 1738,
items = {
[1] = {
chance = 100,
itemId = 2160,
amountMax = 10
}
}
}
}
function onUse(cid, item, frompos, item2, topos)
local tmpConfig = chest[item.actionid]
if not tmpConfig then
return true
end
local container, str = doPlayerAddItem(cid, tmpConfig.container, 1), 'BackPack from '.. tmpConfig.name ..', Your Rewards:\n'
for i = 1, #tmpConfig.items do
local items = tmpConfig.items[i]
if items.chance >= math.random(1, 100) then
local amountRandom = math.random(1, items.amountMax)
str = str .. amountRandom .. ' ' .. getItemNameById(items.itemId) .. ' '..(i ~= #tmpConfig.items and ', ' or '.')
doAddContainerItem(container, items.itemId, amountRandom)
else
return true
end
end
doSendMagicEffect(getPlayerPosition(cid), math.random(28, 30))
doRemoveItem(item.uid, 1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,'You have found a '.. str)
return true
end
Puts, erro meu! Não havia reparado, mas tudo bem, vida que segue... @KotZletY @Vodkart marcação aleatória, só saudades
@KillerWatts Meu conhecimento de script é muito baixo, infelizmente não tenho a ajuda que você precisa. Eu só fiz esse post porque você pediu algo parecido para 8.60 lá no tópico do @tataboy67. Acredito que ele e o @FlavioHulk são mais indicados para te auxiliar nesse quesito.
Quem já me conhece aqui do fórum sabe que minha área não é script ou nada do gênero. Estou fazendo esse post para ajudar um membro, o @KillerWatts, e outros mais, talvez.
Introdução:
Wand/rod que dispara vários elementos aleatórios. O uso dos elementos não é configurável como o modal do @tataboy67, lembrando que esse script é velho e foi testado em OTs versões 8.40 até 8.60
Guia:
ef - efeito que irá fazer no alvo (além do efeito comum já do elemento).
sh - shoot type que traçará o "ar" até o alvo.
dmg - tipo de dano que causará no alvo.
Eu usei a Jester Staff (ID: 7958). Você pode usar o item que desejar.
Lista de itens para utilizar como rod/wand:
Em weapons/scripts crie um arquivo "wandelement.lua":
Para TFS 1.x (créditos e agradecimento ao @FlavioHulk pelo desenvolvimento):
Em weapons.xml adicione a tag:
Em items.xml (aqui tanto faz como vai estar, tirando o "range" que é válido, o que vai contar para o resto é o script em weapons):