Histórico de Curtidas
-
Bloodwalker deu reputação a Vodkart em [NPC] Fixando BUG de o NPC comprar itens equipados nos slots(corpo)!Em alguns servidores a função 'doPlayerRemoveItem' não tem o parâmetro 'ignoreEquipped', fazendo com que o jogador acabe vendendo os itens que estão nos slots(equipados).
Esta função(gambiarra) serve para que o jogador ao vender itens no npc, o mesmo só compre itens que estiverem dentro da bp.
Primeiramente coloque essas duas funções na lib do seu ot caso você não tenha:
https://pastebin.com/raw/BfRLcrLA
agora vá em \data\npc\lib\npcsystem e abra o seu modules.lua
substitua essa função:
-- Callback onSell() function. If you wish, you can change certain Npc to use your onSell(). function ShopModule:callbackOnSell(cid, itemid, subType, amount, ignoreCap, inBackpacks) if(self.npcHandler.shopItems[itemid] == nil) then error("[ShopModule.onSell]", "items[itemid] == nil") return false end if(self.npcHandler.shopItems[itemid].sellPrice == -1) then error("[ShopModule.onSell]", "Attempt to sell a non-sellable item") return false end local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = amount * self.npcHandler.shopItems[itemid].sellPrice, [TAG_ITEMNAME] = self.npcHandler.shopItems[itemid].realName } if(subType < 1) then subType = -1 end if(doPlayerRemoveItem(cid, itemid, amount, subType)) then local msg = self.npcHandler:getMessage(MESSAGE_SOLD) msg = self.npcHandler:parseMessage(msg, parseInfo) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg) doPlayerAddMoney(cid, amount * self.npcHandler.shopItems[itemid].sellPrice) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return true else local msg = self.npcHandler:getMessage(MESSAGE_NEEDITEM) msg = self.npcHandler:parseMessage(msg, parseInfo) doPlayerSendCancel(cid, msg) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return false end end
por esta:
-- Callback onSell() function. If you wish, you can change certain Npc to use your onSell(). function ShopModule:callbackOnSell(cid, itemid, subType, amount, ignoreCap, inBackpacks) if(self.npcHandler.shopItems[itemid] == nil) then error("[ShopModule.onSell]", "items[itemid] == nil") return false end if(self.npcHandler.shopItems[itemid].sellPrice == -1) then error("[ShopModule.onSell]", "Attempt to sell a non-sellable item") return false end local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = amount * self.npcHandler.shopItems[itemid].sellPrice, [TAG_ITEMNAME] = self.npcHandler.shopItems[itemid].realName } if(subType < 1) then subType = -1 end if getPlayerSlotItem(cid, CONST_SLOT_BACKPACK).itemid ~= 0 then local bp = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK) local z = getContainerItemsById(bp, itemid) if #z >= amount then for i = 1, amount do doRemoveItem(z[i].uid) end local msg = self.npcHandler:getMessage(MESSAGE_SOLD) msg = self.npcHandler:parseMessage(msg, parseInfo) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg) doPlayerAddMoney(cid, amount * self.npcHandler.shopItems[itemid].sellPrice) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return true else local msg = self.npcHandler:getMessage(MESSAGE_NEEDITEM) msg = self.npcHandler:parseMessage(msg, parseInfo) doPlayerSendCancel(cid, msg) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return false end else doPlayerSendCancel(cid, "I only buy items that are inside a BackPack") if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return false end end
-
Bloodwalker deu reputação a Bragaia12 em [SHOWOFF] Bragaia12 Mapper ShowoffEstou postando minhas primeiras imagens.
-
Bloodwalker recebeu reputação de Beyond Sky em [ShowOff] SharkOTOlá pessoal do TibiaKing beleza!
Venho aqui mostrar umas fotos do humilde mapa do servidor que estou trabalhando
e pretendo abri-lo em breve, então vim aqui para receber um Feedback de vocês
Obrigado dez de já
-BaiakCity
Temple
Temple/tps
-Newcity
New-desertcity
New-desertcity
-Hunts and farm system
~
O meu intuito com o este server é criar um mapa simples e limpo
um servidor divertido sem hunts quadradas como os atuais Mapas Baiak.
O que acharam ?
Obrigado.
-
Bloodwalker recebeu reputação de Wakon em [ShowOff] SharkOTOlá pessoal do TibiaKing beleza!
Venho aqui mostrar umas fotos do humilde mapa do servidor que estou trabalhando
e pretendo abri-lo em breve, então vim aqui para receber um Feedback de vocês
Obrigado dez de já
-BaiakCity
Temple
Temple/tps
-Newcity
New-desertcity
New-desertcity
-Hunts and farm system
~
O meu intuito com o este server é criar um mapa simples e limpo
um servidor divertido sem hunts quadradas como os atuais Mapas Baiak.
O que acharam ?
Obrigado.
-
Bloodwalker recebeu reputação de gmdouglas em PROBLEMA NAS VOCAÇÕESTenta algo mais simples, se a magia é a mesma e os dois estão iguais em vocations.xml só você
editar o magHealingDamage do que esta healando menos para ele healar mais e assim ficar igual
-
Bloodwalker recebeu reputação de dashjoe em [Action] Changesex por itemOlá pessoal vim postar este script que fiz para o meu server...
Funciona da mesma forma que o talkaction porem você tem que clicar em um item.
Em actions.xml adicione a tag:
Em actions/scripts crie um arquivo como nome de changesex.lua e cole:
Obs: em verde coloque o id do item que será usado. Pronto é simples, Obrigado ! -
Bloodwalker deu reputação a luanluciano93 em TFS 0.4 CASTOlá pessoal, tive a iniciativa de criar esse tópico para atualizar e otimizar as sources do TFS 0.4 DEV que é uma das mais usadas no mundo do otserv. Conteúdo totalmente gratuito e pretendemos melhora-lo cada vez mais.
Qualquer um pode colaborar, postando bugs, erros, otimizando códigos, comentar aqui no tópico, toda ajuda é bem vinda, vamos tornar essa a melhor source disponível. Conto com vocês.
Versão do Tibia: 8.60
Alguns sistema já implementados na source:
• TFS 0.4 DEV rev 3777 (by TFS Team)
• Anti-Divulgação (.servegame, .no-ip, .net, .com, .org, .pl, .biz, .br, .sytes, .info)
• War System
• Cast System (by Summ)
• Retirado bugs de anti-push ..
• Retirado bugs de elfbot ...
• Retirado erro de não aceitar outros items ...
• Retirado erro de Malformed File ...
• Add creatureevent onMoveItem() ...
• Add função getCreaturePathTo () ...
• E vários outros!
Complementos:
• Add cast System (passo a passo): [AQUI]
• Pode add o comando na config.lua:
healthHealingColor = COLOR_GREEN -- [podendo alterar a cor]. manaHealingColor = COLOR_DARKPURPLE -- [podendo alterar a cor]. Downloads:
• Distro Compilada 32x
• Distro Compilada 64x
• Sources 7
TESTADO EM WINDOWS, DEBIAN 7.8, UBUNTU 12.04 E 14.05!
• Compilar em Linux:
• Erros para arrumar:
Obrigado ao runeraserver pelo incentivo em fixa-la para linux
E é isso pessoal, espero ter ajudado, abraços
-
Bloodwalker deu reputação a xWhiteWolf em New Library v. 1.2Fala galera, hoje vim trazer pra vocês uma nova biblioteca de funções que eu venho desenvolvendo, pretendo ir atualizando esse tópico constantemente sempre adicionando funções novas e explicando a utilização delas. Algumas funções que eu coloquei aqui estão presentes na OTAL também, porém algumas eu fiz pequenas correções de forma que essa lib poderia facilmente substituir a OTAL sem grandes problemas (pelo menos se você utilizava apenas as funções básicas da otal)
Todas as funções que não tem -- nome do autor do lado dela foram feitas por mim, xWhiteWolf ou Night Wolf (NW). O restante delas são créditos dos devidos autores, apenas coloquei pois considero funções vitais no server de cada um. Crie um arquivo em data/lib chamado 075 - White Wolf Functions.lua e coloque o seguinte código dentro:
Agora eu vou explicar oque cada função faz porque de nada adianta lançar uma lib e não explicar oque ela faz não é mesmo? hahaha
Obs inicial: quando uma função tiver em seus parametros um [] significa que oque está dentro do colchetes não é um parâmetro obrigatório.
Como usar: doShowTimeByPos(cid, getCreaturePosition(cid), 20, 20)
Irá fazer uma contagem regressiva na posição que o player se encontra começando de 20 e mandando a mensagem na mesma cor da fala dos monstros.
Essa função é bem útil em actions/spells para fazer contagem de tempo em runas como a magic wall e ver quanto tempo falta pra magic wall sumir)
Obs: Espero que ajude bastante pessoas a entender sobre funções, eu utilizei cid como o principal uid das funções nos exemplos mas você pode muito bem utilizar outros uids, fica a critério seu.
Qualquer dúvida comentem abaixo que eu vou tentar ajudar da melhor maneira.
Ahhh, isso daí foi testado em 8.54 mas deve funcionar em quase todas as versões que tenham as funções básicas do TFS.
EDIT: Pessoal, agora é sério, essa lib tem fácil umas 600 linhas, das quais umas 500 eu devo ter codado sozinho (na mão, linha por linha). Eu tive todo o trabalho de testar cada uma delas e oque eu peço é o mínimo de gratidão e respeito. Se eu te ajudei clique em Gostei, se você tiver alguma dúvida eu to me colocando a disposição de responder qualquer coisa relacionada ao tópico, mesmo que você não saiba nem oque é uma lib apenas venha aqui e escreva sua dúvida.
EDIT 2: Duas novas funções adicionas, espero que gostem!
EDIT 3: Três novas funções adicionadas juntamente com suas respectivas explicações.
-
Bloodwalker deu reputação a xWhiteWolf em PK ao Atacar Summon de Outro Playerlocal stime = 10 -- tempo de pk (minutos) local condition_infight = createConditionObject(CONDITION_INFIGHT) setConditionParam(condition_infight, CONDITION_PARAM_TICKS, stime * 60 * 1000) function onAttack(cid, target) if getPlayerLevel(cid) < 50 and isPlayer(getCreatureMaster(target)) then doPlayerSendCancel(cid, "You can't attack this summon since you're in the protected level.") return false end if isPlayer(cid) and getCreatureSkullType(cid) < 3 and isPlayer(getCreatureMaster(target)) then doCreatureSetSkullType(cid, SKULL_WHITE) doAddCondition(cid, condition_infight) doPlayerSetPzLocked(cid, true) end return true end mas isso não impede de abrir pk utilizando spells, só de ataque basico.
-
Bloodwalker deu reputação a Wise em PK ao Atacar Summon de Outro PlayerSerei breve, já que o próprio título já diz sobre o sistema.
É um creaturescript bem simples, porém pode ser útil.
onattacksummon.lua (data/creaturescripts/scripts):
local stime = 10 -- tempo de pk (minutos) local condition_infight = createConditionObject(CONDITION_INFIGHT) setConditionParam(condition_infight, CONDITION_PARAM_TICKS, stime * 60 * 1000) function onAttack(cid, target) if getCreatureSkullType(cid) < 3 and isPlayer(getCreatureMaster(target)) then doCreatureSetSkullType(cid, SKULL_WHITE) doAddCondition(cid, condition_infight) doPlayerSetPzLocked(cid, true) end return true end
No mesmo diretório, adicione o registro ao arquivo login.lua (data/creaturescripts/scripts):
registerCreatureEvent(cid, "onAttackSummon")
Adicione a tag - creaturescripts.xml (data/creaturescripts):
<event type="attack" name="onAttackSummon" event="script" value="onattacksummon.lua"/>
Créditos: Suicide (aprendiz de xWhiteWolf).
-
Bloodwalker deu reputação a Killua em Evento Blood Castle [Automático]Últimas atualizações:
16/12/2013:
Introdução:
Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
Informações:
#Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
Atualização [12/04/2014]
Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
O que mudou?
Instalando o evento:
Lib:
Movements:
Creaturescripts:
Monsters:
O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades: Automática:
Manual:
Como Configurar:
* Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
* Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
<globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
* Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:
As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:
Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:
Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:
Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:
As outras configurações eu acredito que já estejam bem explicadas. Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão. Qualquer dúvida ou bug, postem que irei responder. -
Bloodwalker deu reputação a Wise em efeito aura por vocação [pedido]Embora a área esteja incorreta..faça o seguinte:
aura.lua (data/creaturescripts/scripts):
local tab = { [9] = {effect = 27}, -- [vocationID] = {effect = Number} [10] = {effect = 28}, [11] = {effect = 29}, [12] = {effect = 30} } local delay = 3 -- tempo do efeito da aura em segundos function ariseAura(cid) doSendMagicEffect(getThingPos(cid), tab[getPlayerVocation(cid)].effect) addEvent(ariseAura, delay * 1000, cid) return true end function onLogin(cid) if tab[getPlayerVocation(cid)] then ariseAura(cid) end return true end
Tag - creaturescripts.xml (data/creaturescripts):
<event type="login" name="Aura" event="script" value="aura.lua"/> -
Bloodwalker deu reputação a zipter98 em efeito aura por vocação [pedido]local tab = { ["10-30"] = CONST_ME_MAGIC_GREEN, --["minLevel-maxLevel"] = effect, ["31-40"] = CONST_ME_MAGIC_BLUE, ["41-50"] = CONST_ME_MAGIC_RED, } function ariseText(cid) local eff = nil for level, effect in pairs(tab) do local l = level:explode("-") if getPlayerLevel(cid) >= tonumber(l[1]) and getPlayerLevel(cid) <= tonumber(l[2]) then eff = effect break end end if eff then doSendMagicEffect(getThingPos(cid), eff) addEvent(function() if isCreature(cid) then ariseText(cid) end end, 600) end return true end function onLogin(cid) ariseText(cid) return true end
-
Bloodwalker recebeu reputação de AQuiLIX em (Resolvido)Quero Potions que acabem!Cara testa esse script, ve se funciona por que é versão 8.6
-
Bloodwalker recebeu reputação de luanluciano93 em [Talkaction] comando !rest descansarNome: Sistema de dormir com recuperação automática.
Criadores: Flaah e Vodkart
Versão Testada: 8.54 / 8.60
Modificado por Bloodwalker
Olá pessoal hoje eu vim postar um talkaction que foi personalizado conforme a minha necessidade e que resolvi compartilhar
aqui com vocês. O script funciona da seguinte forma você da um comando e seu char dorme, healando life e mana.
Este script foi modificado para Tibia. (parece que era para naruto)
E agora, só pode ser usado em protection zone.
Print:
Crie um arquivo em talkactions/scripts com o nome de rest.lua e cole isso:
Em talkactions.xml adicione a tag:
Pronto é isso, eu não sou muito bom com scripts então pode ser
que esteja um pouco grande ;p
Obrigado.
-
Bloodwalker recebeu reputação de isex em [Talkaction] comando !rest descansarNome: Sistema de dormir com recuperação automática.
Criadores: Flaah e Vodkart
Versão Testada: 8.54 / 8.60
Modificado por Bloodwalker
Olá pessoal hoje eu vim postar um talkaction que foi personalizado conforme a minha necessidade e que resolvi compartilhar
aqui com vocês. O script funciona da seguinte forma você da um comando e seu char dorme, healando life e mana.
Este script foi modificado para Tibia. (parece que era para naruto)
E agora, só pode ser usado em protection zone.
Print:
Crie um arquivo em talkactions/scripts com o nome de rest.lua e cole isso:
Em talkactions.xml adicione a tag:
Pronto é isso, eu não sou muito bom com scripts então pode ser
que esteja um pouco grande ;p
Obrigado.
-
Bloodwalker deu reputação a xWhiteWolf em Passagem secreta diferenteEai pessoal, vim trazer hoje um sistema de passagem secreta que um amigo viu no Baiak-wars. Não sei qual server é esse e eu não jogo tibia então pra mim tanto faz mas ele gravou um vídeo, pediu um igual e obviamente eu não fiz um igual porque o sistema dos caras era muito ruim uhauheuhauheuhauheuhuhauhe
Enfim, comecei um script do 0 pra fazer exatamente oque ele queria e foi isso daqui que eu consegui:
Explicação: Você clica em algum item escondido pelo mapa e abre uma passagem secreta que vai durar X segundos (configurável), após esse tempo a passagem se fecha; Note que nessas imagens ele não tá escondido já que tem uma FUCKING ARVORE NO MEIO DE UM DESERTO mas você pode colocar uma tocha em cima de uma parede e colocar o actionid na tocha pra ativar e vai ficar super foda e com muito rpg
Ué, mas oque tem de diferente dos outros scripts?
Bem, ele é super fácil de configurar e ele dá a sensação de que o item foi arrastado :]
Bom, se isso não foi o bastante pra você entender então observe essas fotinhas
Tendo entendido tudo vamos à parte mais legal da coisa (SCRIPTAR!!!!)
Você vai precisar criar um arquivo em actions\scripts chamado hidden.lua com o seguinte conteúdo:
local positions = { [1] = {pos = {x=139, y=77, z=7}, id = 1718}, [2] = {pos = {x=140, y=77, z=7}, id = 1718}, [3] = {pos = {x=139, y=76, z=7}, id = 6855, toid = 6884}, [4] = {pos = {x=140, y=76, z=7}, id = 6855, toid = 6884}, } local createpos = { [1] = {pos = {x=138, y=77, z=7}, id = 1718}, [2] = {pos = {x=141, y=77, z=7}, id = 1718} } local tempo = 5 function onUse(cid, item, frompos, item2, topos) if getTileItemById(positions[1].pos, positions[1].id).uid < 100 then doPlayerSendCancel(cid, "Is already open.") return true end doCreatureSay(cid, "You have ".. tempo .." seconds.", 19) function criar_paredes() for i = 1, #positions do if i <= (#positions/2) then doCreateItem(positions[i].id, 1, positions[i].pos) local obst = getTileItemById(createpos[i].pos, createpos[i].id).uid doSendMagicEffect(createpos[i].pos, 2) doRemoveItem(obst, 1) elseif i > (#positions/2) then local obst = getTileItemById(positions[i].pos, positions[i].toid).uid doTransformItem(obst, positions[i].id) end end return true end for i = 1, #positions do local obst = getTileItemById(positions[i].pos, positions[i].id).uid if i <= (#positions/2) and obst ~= 0 then doRemoveItem(obst, 1) doSendMagicEffect(positions[i].pos, 2) doCreateItem(createpos[i].id, 1, createpos[i].pos) elseif i > (#positions/2) and obst ~=0 then doTransformItem(obst, positions[i].toid) end end addEvent(criar_paredes, tempo*1000) return true end Feito isso vc vai precisar declarar no actions.xml a forma que você quer utilizar o script
<action actionid="27004" script="hidden.lua"/> note que vc pode colocar algum itemid, actionid ou uniqueid de sua escolhe, só lembre de mudar no map editor dependendo da forma que vc escolher.
Agora eu vou ensinar vocês a configurarem o meu monstrinho *-*
aqui você tem o tempo que a passagem vai ficar aberta
aqui você vai editar o seguinte: na primeira são as posições dos itens e seus respectivos id's
posição das duas prateleiras e seus id's
posição das paredes, id dela e pra qual id ela vai ser transformada.
aqui você tem as posições que sua prateleira vai se mover e os id's dela.
Lembrando que você pode se sentir livre pra adicionar oque vc quiser e deixar do seu gosto, só lembrando que se vc quiser adicionar mais items ou diminuir itens é só alterar nas duas tabelas seguindo a mesma lógica. Metade pra prateleira, metade pra parede e uma tabela pra fazer as prateleiras se moverem.
Os créditos são 60% meus e 40% do @MaXwEllDeN por ter me dado um norte no começo do script.
Qualquer coisa comenta aí e dá aquele rep+ pra ajudar ;]
-
Bloodwalker deu reputação a Garou em Perfect Upgrade SystemNome: Perfect Upgrade System
Tipo: Biblioteca, Action, Sistema
Autor: Oneshot
Essa é a versão final do Perfect Refine System ou Perfect Upgrade System criado por mim.
É um sistema construído em cima de funções em POO (orientação a objetos), o que o torna muito versátil, possibilitando a outros programadores/scripters criarem seus próprios sistemas com base na biblioteca.
A função do sistema é simples. Não passa de um sistema de refino, presente em todos os servidores, onde você usa um item em um equipamento e este fica mais forte e ganha um nome caracterizando o nível de força - bem clichê - mas muito interessante.
Meu sistema é um pouco diferente dos outros, pois possui algumas características exclusivas, listadas abaixo:
O nível máximo configurável é praticamente ilimitado O sistema funciona com armas de combate corpo-a-corpo, bows e crossbows. O refino pode falhar, não acontecendo nada, regredindo o nível ou resetando ele. Há um sistema nativo de broadcasts, que são enviados quando um jogador consegue refinar um equipamento até um certo nível ou maior. As chances são configuradas manualmente e sua randomização é muito precisa. Há dois modos de instalar o sistema em seu servidor, o primeiro é baixar a pasta com os scripts necessários e apenas copiar as chaves nos arquivos XMLs ou então seguir o curto tutorial de instalação.
Crie um arquivo chamado upgradesystem.lua na pasta data/lib e copie o conteúdo abaixo:
--[[ PERFECT UPGRADE SYSTEM 2.0 Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- UpgradeHandler = { levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, broadcast = 7, attributes = { ["attack"] = 2, ["defense"] = 1, ["armor"] = 1 }, message = { console = "Trying to refine %s to level +%s with %s%% success rate.", success = "You have upgraded %s to level +%s", fail = "You have failed in upgrade of %s to level +%s", downgrade = "The upgrade level of %s has downgraded to +%s", erase = "The upgrade level of %s has been erased.", maxlevel = "The targeted %s is already on max upgrade level.", notupgradeable = "This item is not upgradeable.", broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!", invalidtool = "This is not a valid upgrade tool.", toolrange = "This upgrade tool can only be used in items with level between +%s and +%s" }, tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, isEquipment = function(self) local weaponType = self:getItemWeaponType() return ((weaponType > 0 and weaponType < 7) or self.item.armor ~= 0) end, setItemName = function(self, name) return doItemSetAttribute(self.item.uid, "name", name) end, chance = function(self) local chances = {} chances.upgrade = (self.levels[self.item.level + 1][1] or 100) chances.downgrade = (self.item.level * 5) chances.erase = (self.item.level * 3) return chances end } function UpgradeHandler:new(item) local obj, ret = {} obj.item = {} obj.item.level = 0 obj.item.uid = item.uid for key, value in pairs(getItemInfo(item.itemid)) do obj.item[key] = value end ret = setmetatable(obj, {__index = function(self, index) if _G[index] then return (setmetatable({callback = _G[index]}, {__call = function(self, ...) return self.callback(item.uid, ...) end})) else return UpgradeHandler[index] end end}) if ret:isEquipment() then ret:update() return ret end return false end function UpgradeHandler:update() self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0) end function UpgradeHandler:refine(uid, item) if not self.item then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.notupgradeable) return "miss" end local tool = self.tools[item.itemid] if(tool == nil) then doPlayerSendTextMessage(uid, MESSAGE_EVENT_DEFAULT, self.message.invalidtool) return "miss" end if(self.item.level > #self.levels) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.maxlevel:format(self.item.name)) return "miss" end if(self.item.level < tool.range[1] or self.item.level >= tool.range[2]) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.toolrange:format(unpack(tool.range))) return "miss" end local chance = (self:chance().upgrade + tool.info.chance) doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.console:format(self.item.name, (self.item.level + 1), math.min(100, chance))) if(tool.info.removeable == true) then doRemoveItem(item.uid, 1) end if chance * 100 > math.random(1, 10000) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_ORANGE, self.message.success:format(self.item.name, (self.item.level + 1))) if (self.item.level + 1) >= self.broadcast then doBroadcastMessage(self.message.broadcast:format(getCreatureName(uid), self.item.name, (self.item.level + 1))) end self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1"))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item.level > 0 and getItemAttribute(self.item.uid, key) or self.item[key]) + value) end end return "success" else if(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name)) self:setItemName(self.item.name) for key, value in pairs(self.attributes) do if self.item[key] > 0 then doItemSetAttribute(self.item.uid, key, self.item[key]) end end elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1))) self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1)))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item[key] + value * (self.item.level - 1))) end end else doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1))) end return "fail" end end Crie um arquivo chamado upgrade.lua em data/actions/scripts e cole o conteúdo abaixo:
function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) end local obj = UpgradeHandler:new(itemEx) if(obj == false) then return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable) end local status = obj:refine(cid, item) if status == "success" then --doSendAnimatedText(toPosition, "Success!", COLOR_GREEN) doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) elseif status == "fail" then --doSendAnimatedText(toPosition, "Fail!", COLOR_RED) doSendMagicEffect(toPosition, CONST_ME_POFF) else doSendMagicEffect(toPosition, CONST_ME_POFF) end return true end No arquivo actions.xml, cole a seguinte linha:
<action itemid="8306" event="script" value="upgrade.lua"/> Para adicionar mais níveis de refino no sistema, edite a seguinte tabela:
levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true} }, Por padrão, ela já está configurado como na maioria dos MMORPGs, 10 níveis de refino, com chances de sucesso, regressão e "quebra". Mas se você quiser, por exemplo, adicionar mais dois níveis, siga o modelo, sempre colocando uma vírgula no final com exceção da última linha da tabela:
levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, O primeiro valor é chance de sucesso, o segundo se o item pode regredir na tentativa e o terceiro é se o item para "quebrar" (perder todo o nível de refino). Para criar novas ferramentas (itens) de refinar, configure a tabela abaixo:
tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, Seguindo o mesmo esquema da tabela anterior, vírgulas em todas as linhas com exceção da última, seguindo o modelo abaixo. Por exemplo, uma ferramenta de ID 8303 que refine do level +6 ao +10, que dê 10% de chance bônus e que seja finita, eu faço assim:
tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, [8310] = {range = {6, 10}, info = {chance = 10, removeable = true}} }, Em breve vídeo de demonstração com sistema em funcionamento.
Perfect Upgrade System.rar
-
Bloodwalker recebeu reputação de Vills em NPC (Trocar item por item.)Ola, eu tbm já estive precisando de um npc como esse, porem optei por outro opção,
é um script em que você clica no bau e ele te vende o item por um gold alternativo.
Dá uma olhada nele, vê se pode te ajudar
http://www.tibiaking.com/forum/topic/13768-action-comprando-item-por-chest-bau/
-
Bloodwalker deu reputação a Guilherme. em Anti-Bot SystemBom, esse é um sistema anti-bot que vai funcionar da seguinte forma:
O Jogador fica online por 15 minutos
[Antibot]: Por favor escreva !antibot 5%8&9^2*3 sem simbolos. Ex: code: 1*5^8¿6%9 -> !antibot 15869.
Lembre-se você tem 2 minutos para fazer isso ou será kickado.
Jogador: !antibot 58923
[Antibot]: Aproveite seu tempo!
Caso o código esteja incorreto:
[Antibot]: Voce tem mais 2 chances para tentar novamente.
Caso o jogador escreva o código 3 vezes errado, será kickado, ou então, caso o jogador não escrever o código nos próximos 2 minutos (configurável) será kickado também.
Primeiro vá em data/creaturescripts/scripts/ e crie um arquivo chamado antibot.luae então cole:
local symbols = {"*", "^", "¿", "%", "&", "$"} local timeBetweenQuestion = 15 * 60 --15 minutes local timeToKick = 2 * 60 --2 minutes local timeStorage = 65117 local codeStorage = 65118 local kickStorage = 65119 local timesStorage = 65121 function onThink(cid, interval) if not isPlayer(cid) or getPlayerGroupId(cid) >= 3 then return end if getCreatureStorage(cid, timeStorage) < 1 then doCreatureSetStorage(cid, timeStorage, os.time() + timeBetweenQuestion) end if getCreatureStorage(cid, kickStorage) > 0 and os.time() >= getCreatureStorage(cid, kickStorage) then local tmp = {timeStorage, kickStorage, timesStorage, codeStorage} for i = 1, #tmp do doCreatureSetStorage(cid, tmp[i], 0) end return doRemoveCreature(cid) end if os.time() >= getCreatureStorage(cid, timeStorage) then local code, set = "", 0 set = math.random(1, 100000) local s, e = 1, 1 for i = 1, string.len(set) do code = (code == "" and string.sub(set, s, e) or code .. symbols[math.random(#symbols)] .. string.sub(set, s, e)) s, e = s + 1, e + 1 end doCreatureSetStorage(cid, codeStorage, set) doCreatureSetStorage(cid, kickStorage, os.time() + timeToKick) doCreatureSetStorage(cid, timeStorage, os.time() + timeBetweenQuestion) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[Antibot]: Por favor escreva !antibot " .. code .. " sem simbolos. Ex: code: 1*5^8¿6%9 -> !antibot 15869. Lembre-se voce tem " .. timeToKick / 60 .. " minutos para fazer isso ou sera kickado.") end return end Agora cole isso em data/creaturescripts/creaturescripts.xml: <event type="think" name="Antibot" event="script" value="antibot.lua"/> Cole isso em data/creaturescripts/scripts/login.lua: local timeStorage = 65117 local codeStorage = 65118 local kickStorage = 65119 local timesStorage = 65121 registerCreatureEvent(cid, "Antibot") doCreatureSetStorage(cid, codeStorage, 0) doCreatureSetStorage(cid, kickStorage, 0) doCreatureSetStorage(cid, timesStorage, 0) doCreatureSetStorage(cid, timeStorage, 0) Agora vá em data/talkactions/scripts,crie um arquivo criado antibot.lua e cole: local codeStorage = 65118 local kickStorage = 65119 local timesStorage = 65121 local times = 3 function onSay(cid, words, param, channel) if getCreatureStorage(cid, codeStorage) == 0 then return doPlayerSendCancel(cid, "Not yet.") elseif tonumber(param) == tonumber(getCreatureStorage(cid, codeStorage)) then doCreatureSetStorage(cid, codeStorage, 0) doCreatureSetStorage(cid, kickStorage, 0) doCreatureSetStorage(cid, timesStorage, 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[Antibot]: Aproveite seu tempo!") return true else if getCreatureStorage(cid, timesStorage) < 0 then doCreatureSetStorage(cid, timesStorage, 0) end doCreatureSetStorage(cid, timesStorage, getCreatureStorage(cid, timesStorage) + 1) if getCreatureStorage(cid, timesStorage) == times then doCreatureSetStorage(cid, codeStorage, 0) doCreatureSetStorage(cid, kickStorage, 0) doCreatureSetStorage(cid, timesStorage, 0) doRemoveCreature(cid) return true else return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[Antibot]: Voce tem " .. times - getCreatureStorage(cid, storageTimes) .. " oportunidades para tentar novamente.") end end return true end Agora cole isso em data/talkactions/talkactions.xml: <talkaction words="!antibot" event="script" value="antibot.lua"/> Caso você queria deixar o jogador banido por 1 (uma) hora, coloque isto: return doAddAccountBanishment(getPlayerAccountId(cid),getPlayerGUID(cid), os.time() + 1*60*60, 12, 7, "Away from keyboard botter") and doRemoveCreature(cid) No lugar de: return doRemoveCreature(cid)
E isso é tudo pessoal, aproveitem o código, que por sinal, foi completamente feito por darkhaos com alguma colaboração de Gomgom e uma pequena parte minha, que deixei as frases em Português (BR) !
-
Bloodwalker deu reputação a Vodkart em Simple Task 3.008/01/2017
SISTEMA ATUALIZADO PARA 4.0:
Mods:
-
Bloodwalker deu reputação a Fausto32 em Advanced Ban/Unban System !Então não encontrei nem um sistema de ban 100% funcional e sem erros no forum então resolvi postar o meu pqê vejo varias pessoas pedindo ban system u.u vamo lá .
Explicação:
Utilização:
/ban playername,razão,tempo,comentario
exemplo: /ban Skion,1,86.400,Uso Abusivo de bot.
Padrão:
comprimento: tempo em segundos
Comentário: Comentário padrão ou de sua preferencia.
razão: número, ler o texto abaixo.
Razão (popular):
1-uso de software ilegal.
4-ofensiva declaração,
5-spam,
6-publicidade,
10-bug-abuso,
12-oficial-soft
13-hacking,
14 multi-cliente,
15-conta-trading-ou-sharing,
16-ameaçador-gamemaster,
18-falso-relatório-a-g,
19 comportamento destrutivo,
20-excessiva-injustificada-morte
Então o script já manda pra database o nome e tempo do player banido que e passado diretamente para o site onde todos os players poderam vêr na pagina de players banidos contem tambem animação ao player ser banido e etc
Data\talkactions\scripts\ban
local default = { length = getConfigValue("banLength"), comment = "Rule Violations.", reason = 12 } function getPlayerTesti(cid) local Tiedot = db.getResult("SELECT `id` FROM `accounts` WHERE `id` = " .. getPlayerAccountId(cid) .. " LIMIT 1") if Tiedot:getID() ~= LUA_ERROR then local account = Tiedot:getDataInt("id") return account end return LUA_ERROR end function onSay(cid, words, param) local t = string.explode(param, ",") if(not t[1]) then doPlayerSendCancel(cid, "You must enter name.") return true end local player = getPlayerByName(t[1]) if(not isPlayer(player)) then doPlayerSendCancel(cid, "Player with name `" .. t[1] .. "` not found.") return true end local action = t[2] if(not t[2] or (t[2] and type(t[2]) ~= 'string')) then doPlayerSendCancel(cid, "Wrong param.") return true end local length = (t[3] and tonumber(t[3]) > 0) and t[3] or default.length local comment = (t[4] and type(t[4]) == "string") and t[4] or default.comment if(isInArray({"account", "acc", "a"}, action)) then doAddAccountBanishment(getAccountIdByName(t[1]), getPlayerGUID(t[1]), os.time() + length, default.reason, comment, ACTION_BANISHMENT, comment, getPlayerGUID(cid)) result = true --[[ elseif(isInArray({"player", "p"}, action)) then --type missing doAddPlayerBanishment(getPlayerGUID(t[1]), type, os.time() + length, default.reason, ACTION_BANISHMENT, comment, getPlayerGUID(cid)) result = true elseif(isInArray({}, action)) then --ip and mask missing doAddIpBanishment(ip, mask, os.time() + length, default.reason, comment, getPlayerGUID(cid)) result = true elseif(isInArray({}, action)) then doAddNotation(getAccountIdByName(t[1]), getPlayerGUID(t[1]), default.reason, comment, getPlayerGUID(cid)) result = true elseif(isInArray({}, action)) then --channelId missing doAddStatement(getPlayerGUID(t[1]), channelId, default.reason, comment, getPlayerGUID(cid)) result = true ]] end if(result) then db.executeQuery("INSERT INTO `bans` (`id` ,`type` ,`value` ,`param`, `active`, `expires`, `added`, `admin_id`, `comment`, `reason`, `action`) VALUES ('id', '3', '".. getPlayerTesti(player) .."', '45', '1', '".. os.time() + length .."', '".. os.time() .."', '".. getPlayerGUID(cid) .."', '".. comment .."', '12', '2' );") doSendAnimatedText(getCreaturePosition(player), "BANISHED", TEXTCOLOR_RED) doPlayerBroadcastMessage(cid, "The player "..t[1].." has been banished by reason "..t[4].. ". Mais informacoes no site.") doRemoveCreature(player) end return true end Data\talkactions\talkactions.xml <talkaction log="yes" words="/ban" access="4" event="script" value="ban.lua"/> Ban By: Hermes Unban: Data\talkactions\scripts\unban Comandos: /unban playername exemplo: /unban Skion function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end local account, tmp = getAccountIdByName(param), true if(account == 0) then account = getAccountIdByAccount(param) if(account == 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player or account '" .. param .. "' does not exists.") return true end tmp = false end local ban = getBanData(account, BAN_ACCOUNT) if(ban and doRemoveAccountBanishment(account)) then local name = param if(tmp) then name = account end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, name .. " has been " .. (ban.expires == -1 and "undeleted" or "unbanned") .. ".") end if(not tmp) then return true end tmp = getIpByName(param) if(isIpBanished(tmp) and doRemoveIpBanishment(tmp)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "IP Banishment on " .. doConvertIntegerToIp(ip) .. " has been lifted.") end local guid = getPlayerGUIDByName(param, true) if(guid == nil) then return true end ban = getBanData(guid, BAN_PLAYER, PLAYERBAN_LOCK) if(ban and doRemovePlayerBanishment(guid, PLAYERBAN_LOCK)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Namelock from " .. param .. " has been removed.") end ban = getBanData(guid, BAN_PLAYER, PLAYERBAN_BANISHMENT) if(ban and doRemovePlayerBanishment(guid, PLAYERBAN_BANISHMENT)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param .. " has been " .. (ban.expires == -1 and "undeleted" or "unbanned") .. ".") end return true end Data\talkactions\talkactions.xml [/font][/b]<talkaction log="yes" words="/unban" access="4" event="script" value="unban.lua"/>
Unban By: unknown
Então eh isso ai mermo .-. espero ter ajudado alguém
-
Bloodwalker deu reputação a xWhiteWolf em Critical Skill SystemFala galera do TK, vejo que tem bastante gente procurando esse sisteminha que é praticamente igual ao dodge system, então eu decidi fazer visto que na realidade era só mudar 3 linhas kkkk em todo caso ta aí pra quem quiser:
creaturescripts.xml:
<!-- CRITICAL SYSTEM --> <event type="statschange" name="critical" event="script" value="critical.lua"/> creaturescripts\scripts\login.lua:
--- CRITICAL SYSTEM ---- registerCreatureEvent(cid, "critical") if getPlayerStorageValue(cid, 48913) == -1 then setPlayerStorageValue(cid, 48913, 0) end creaturescritps\scripts\critical.lua:
--[[Critical System ------------------------- By Night Wolf]] local lvlcrit = 48913 local multiplier = 1.5 function onStatsChange(cid, attacker, type, combat, value) if isPlayer(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then if (getPlayerStorageValue(attacker, lvlcrit)*3) >= math.random (0,1000) then dano = math.ceil(value*(multiplier)) doTargetCombatHealth(attacker, cid, combat, -dano, -dano, 255) doSendAnimatedText(getCreaturePos(attacker), "CRITICAL!!", 144) return false end end return true end lvlcrit é o storage que fica salvo o seu level de critical e multiplier é o multiplicador do dano para ataques críticos.. nesse caso um ataque critico vai ser 1,5 vezes maior doque um ataque normal (50% maior)
Agora em actions.xml adicione:
<action itemid="1294" script="criticalrock.lua"/> e em actions\scripts\criticalrock.lua adicione:
--- CRITICAL System by Night Wolf local config = { effectonuse = 14, -- efeito que sai levelscrit = 100, --- leveis que terão storagecrit = 48913 -- storage que será verificado } function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid, config.storagecrit) < config.levelscrit then doRemoveItem(item.uid, 1) doSendMagicEffect(topos,config.effectonuse) doPlayerSendTextMessage(cid,22,"You've Leveled your Critical Skill to ["..(getPlayerStorageValue(cid, config.storagecrit)+1).."/"..config.levelscrit.."].") setPlayerStorageValue(cid, config.storagecrit, getPlayerStorageValue(cid, config.storagecrit)+1) elseif getPlayerStorageValue(cid, config.storagecrit) >= config.levelscrit then doPlayerSendTextMessage(cid,22,"You've already reached the MAX level of Critical Skill.\nCongratulations!!!!") return 0 end return 1 end Feito isso tá pronto, pra editar o item que dá a skill de critical vc edita no actions.xml mesmo:
<action itemid="1294" << ID do item que será usado pra dar a skill.
A config tá bem simples:
effectonuse = 14, -- efeito que sai
levelscrit = 100, --- leveis que terão
storagecrit = 48913 -- storage que será verificado.
Lembrando que cada pedra utilizada dará 0,3% a mais de chance.. 10 pedras dão 3% de chance de dar critico a cada ataque e 100 pedras (NIVEL MÁXIMO PADRÃO) dará 30% de chance de dar crítico em cada ataque.
Espero que vcs gostem, qualquer coisa deixem os comentários aqui.
Obs: aqui tá uma foto
Note que esse script só funciona em players, se vc quiser que funcione em monstros você vai ter que abrir um por um todos os monstros do server e colocar essa tag aqui:
<script> <event name="critical"/> </script> coloque antes de </monster>
Minha dica: coloquem apenas no Trainer pra que o player consiga ver que ele tem o critical e quanto ele tira e deixem avisado que o sistema só vai funcionar em players.
-
Bloodwalker recebeu reputação de Thiago Rulexz em (Resolvido)[Ajuda] Buypremium por itemAqui está amigo utilizo este, espero que funcione.
Aonde está em verde você coloca o id do item e em Cost a quantidade necessária.