Histórico de Curtidas
-
maiconmnt deu reputação a Mathwsz em Ajudem, erro na distro do sv do mitsuig@sharen 1- O nome do global-spawn.xml esta igual no config.lua ??
2- Vá em XML, abre o groups.xml e veja o ID se ta certinho..
3- Nao entendi nn..
Obs: Se lhe ajudei, de um REP+ :D
-
maiconmnt 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
-
maiconmnt deu reputação a Wise em (Resolvido)Outfit e addon questoutfits.xml (data/XML):
Altere os parâmetros do outfit assassin (geralmente sendo o outfit ID 13) para como sendo:
<outfit id="13" quest="31013"> <list gender="0" lookType="156" name="Assassin"/> <list gender="1" lookType="152" name="Assassin"/> </outfit>
ou
<outfit id="13" storageId="31013" storageValue="1"> <list gender="0" lookType="156" name="Assassin"/> <list gender="1" lookType="152" name="Assassin"/> </outfit>
assassinquest.lua (data/actions/scripts):
function onUse(cid, item, fromPos, item2, toPos) local stor = 31013 -- storage if getPlayerStorageValue(cid, stor) < 1 then setPlayerStorageValue(cid, stor, 1) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! Now you can wear your new outfit.") else doPlayerSendCancel(cid, "You already have picked up your outfit, it's empty.") end return true end
Tag - actions.xml (data/actions):
<action actionid="ACTIONID" script="assassinquest.lua"/>
Basta fazer o mesmo processo com os outros outfits.
-
maiconmnt deu reputação a Rusherzin em Erro Creature script GonkaTu tens duas opções, ou cria um NPC com o nome [Server Information], ou tu remove a seguinte linha:
doCreatureSay(getCreatureByName("[Server Information]"), "[DOUBLE POINTS]: Receba pontos em dobro para qualquer valores! Promoção por tempo LIMITADO!.", TALKTYPE_PRIVATE, false, cid)
-
maiconmnt deu reputação a Caronte em (Resolvido){Dúvida}Como fazer TFS aceitar acentuaçãoSó as frases acentuadas...
Você usa bloco de notas ? , quando você for salvar como, veja essa parte:
Ponha ANSI , se não estiver...
-
maiconmnt recebeu reputação de iluargrott em [Pedido] SPRITES MAIORESAc
-
maiconmnt deu reputação a iluargrott em [Pedido] SPRITES MAIORESVeio se discutindo ao longo do tempo várias possibilidades de aumento de sprites no OTClient, com IA, alterar os programas Remeres, OTitem, Object builder. Porém todas essas modificações necessitaria uma equipe para dar suporte aos erros futuros e presentes que vieram se apresentando a todos aqueles que realizavam todas estas modificações.
Em contato com o editor do ObjectBuilder e Remeres para 64x64, 96x96, ele mesmo disse que pela presença de erros, não valeria à pena investir num servidor com estes aumentos de sprites.
Então como brasileiro, imaginei uma possível gambiarra. Segue abaixo, o meu pedido ?
Este seria um sistema para a analise de movimento do personagem/criaturas.
Como todos sabem o tibia tem um "hitbox"/square de movimento de 32x32. Este square impede que o player suba em outro square de 32x32 que seja "sólido" ou que esteja marcado para não ser passado por cima, ex: Pedras, agua, bordas, parede, porta fechada, caule da arvore, outro square de player.
Porém qualquer imagem que ultrapasse os 32x32 na linha de baixo, corre o grande risco de sair "atropelando" em cima de objetos, player e etc.
Sendo assim, imaginei a possibilidade de algum script que averiguasse o movimento das criaturas/players, checando se nos 32x32 aos arredores do player há algum objeto que não seja passável, assim forçando-o a não "pisar" em cima deste. ex:
Como pode ser visto, a região mais escura de cada "demon" seria o limitador de movimento, como um sqm à esquerda há outro demon ,ele não poderia se mover para a esquerda, pois teria um "obstaculo".
Esse limitador seria apenas para movimentos.
Com esse sistema, o uso de sprites maiores sem o grande erro de atropelar alguém / objetos, o uso de sprites maiores para projetos alternativos sairia muito mais " limpo.
Estou utilizando TFS 1.2, mas qualquer servidor está valendo para conseguir esta benção de sistema para aumentar a qualidade dos gráficos de um projeto alternativo.
Deixo aqui este pedido para alguma alma generosa que queira auxiliar o desenvolvimento de novos jogos com sprites maiores
Obrigado pela sua atenção,
-
maiconmnt recebeu reputação de Jeff Delay em Sistema de loteria diferente baseado na vida realBoa noite pessoal. Tenho uma ideia de sistema de loteria diferente para ot, se alguém se dispor a fazer eu agradeço. E creio que será de grande valia para outros ots também.
O script seria para a versão 8.60. tfs 0.4, ou otx 2
Seguinte, gostaria de um sistema de loteria bem semelhante ao da realidade que ocorresse umas três vezes na semana somente. Para participar o player vai ate um npc e paga um valor para poder participar. Quando chegar no dia e na hora de ocorrer o sorteio, o npc/script faz o sorteio apenas para os players que compraram com ele baseado na quantidade do valor juntado das apostas de todos os players. Por exemplo, digamos que o valor seja 10k para apostar. E ate o fechamento da aposta, 10 players foram ate o npc e compraram seu "bilete de aposta", entao o valor a ser sorteado para o ganhador seja 100k. e depois recomeça tudo ate o proximo sorteio.
Vou fazer um rascunho com dialogo do npc abaixo para tentar exemplificar melhor.
Player: Hi
Npc Loteria: Ola player name, sou o reponsavel pela loteria desse ot. Para fazer sua aposta diga {aposta}, para saber em quanto o premio esta cumulado diga {premio}, ou então diga {receber) caso voce seja o ganhador do ultimo sorteio da nossa loteria.
Player: aposta
Npc Loteria: O valor atual para apostas em nossa loteria é de 10000 gold, tem certeza de que deseja apostar?
Player: yes
Npc Loteria: Muito bem! Voce esta participando do proximo sorteio da nossa loteria.
Dai quando ocorresse o sorteio fosse anunciando na tela via broadcast mesmo com o ganhador, ou algo relacionado ao site, tanto faz. Se possível ter que ir ao npc para poder pegar o premio. Mas caso nao, pode ser entregue direto ao player mesmo assim como ocorre com o sistema de loteria normal que tem nos ots atualmente.
Tudo isso pode ser adaptado de acordo com as possibilidades e ideias, mas o objetivo principal com essa ideia é fazer com que para participar do sorteio do sistema de loteria o player tenha que pagar um valor para isso, e que o premio seja a soma do valor de todos os players que apostaram.
Bom é isso ai, se alguma alma boa e com conhecimento para tal puder desenvolver esse script ai para nós, seremos muito gratos!
-
maiconmnt deu reputação a Vodkart em (Resolvido)[PEDIDO] Script Para Não Usar Magic Wall em Tal Áreaé só fazer no script de magic e wild tbm faz assim para ficar mais fácil de editar: na sua lib vc coloca essa função: function BlockRunesInArea(cid) local block_area = { -- defina as areas {{x=135,y=53,z=7}, {x=140,y=56,z=7}}, -- com a pos começo e final da area {{x=135,y=46,z=7}, {x=141,y=49,z=7}}, {{x=200,y=1019,z=7}, {x=300,y=1019,z=7}} } for _, var in ipairs(block_area) do if isInRange(getCreaturePosition(cid), var[1], var[2]) then return true end end return false end Data > Spells > script > support magic wall rune.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497) function onCastSpell(cid, var) if BlockRunesInArea(cid) then doPlayerSendCancel(cid, "você não pode jogar runas nesta area.") return false end return doCombat(cid, combat, var) end wild growth rune.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1499) function onCastSpell(cid, var) if BlockRunesInArea(cid) then doPlayerSendCancel(cid, "você não pode jogar runas nesta area.") return false end return doCombat(cid, combat, var) end pronto, e quando quiser bloquear uma spells ou runa na area só usar if BlockRunesInArea(cid) then doPlayerSendCancel(cid, "você não pode jogar runas nesta area.") return false end
-
maiconmnt deu reputação a Wise em [PEDIDO] Jogadores da mesma cidade não podem se atacar e npc guard diferente.Ah, ok.
guard.lua (data/npc/lib):
Guard = { config = { attackspeed = 1000, townid = 5, -- ID da town que o NPC protege }, combat = {type = COMBAT_PHYSICALDAMAGE, min = 100, max = 200} } function Guard:new() local ret = {} setmetatable({}, {__index = self.combat}) setmetatable(ret, {__index = self}) return ret end function Guard:reset() self.config = Guard.config self.target = 0 selfFollow(0) doTeleportThing(self.id, self.position) end function Guard:updateTarget() if self.target ~= 0 then return end local creatures = getSpectators(getThingPosition(self.id), self.range, self.range, false) for i = 1, #creatures do local target = creatures[i] if isCreature(target) and not isNpc(target) and getPlayerTown(target) ~= self.config.townid then if not getTilePzInfo(getThingPosition(target)) then if selfFollow(target) then selfSay("You're not welcome in this city! ".. getCreatureName(target) ..", get out of here!") self.target = target self:attack() break end end else self:reset() end end end function Guard:attack() if self.target == 0 then self:reset() return end self.time = self.time or os.clock() if self.time < os.clock() then if getDistanceBetween(getThingPosition(self.id), getThingPosition(self.target)) == 1 then doTargetCombatHealth(self.id, self.target, self.combat.type, -self.combat.min, -self.combat.max, CONST_ME_DRAWBLOOD) end self.time = self.time + (self.config.attackspeed/1000) end end
guard.lua (data/npc/scripts):
local guard = Guard:new() function onCreatureAppear(cid) if cid == getNpcId() then guard.id = getNpcId() guard.target = 0 guard.position = getNpcPos() end end function onCreatureDisappear(cid) if cid == guard.target then guard:reset() end end function onCreatureSay(cid, type, msg) return false end function onThink() guard:updateTarget() if guard.target ~= 0 then if isCreature(guard.target) then guard:attack() else guard:reset() end else guard:reset() end end
Guard.xml (data/npc):
<?xml version="1.0" encoding="UTF-8"?> <npc name="Guard" script="guard.lua" walkinterval="0" speed="200" floorchange="0"> <health now="100" max="100"/> <look type="134" head="57" body="59" legs="40" feet="76" addons="0"/> <parameters/> </npc>
Em relação a não poderem se atingir com as spells, nunca vi um código desenvolvido pra isso.
Disponha ;]
-
maiconmnt deu reputação a Wise em [PEDIDO] Jogadores da mesma cidade não podem se atacar e npc guard diferente.Eu não testei, mas enfim:
guard.lua (data/npc/lib):
Guard = { config = { attackspeed = 1000, townid = 5, -- ID da town que o NPC protege }, combat = {type = COMBAT_PHYSICALDAMAGE, min = 100, max = 200} } function Guard:new() local ret = {} setmetatable({}, {__index = self.combat}) setmetatable(ret, {__index = self}) return ret end function Guard:reset() self.config = Guard.config self.target = 0 selfFollow(0) doTeleportThing(self.id, self.position) end function Guard:updateTarget() if self.target ~= 0 then return end local creatures = getSpectators(getThingPosition(self.id), self.range, self.range, false) for i = 1, #creatures do local target = creatures[i] if isCreature(target) and not isNpc(target) and getPlayerTown(target) ~= self.config.townid then if not getTilePzInfo(getThingPosition(target)) then if selfFollow(target) then selfSay("You're not welcome in this city! ".. getCreatureName(target) ..", get out of here!") self.target = target self:attack() break end end else self:reset() end end end function Guard:attack() if self.target == 0 then self:reset() return end self.time = self.time or os.clock() if self.time < os.clock() then if getDistanceBetween(getThingPosition(self.id), getThingPosition(self.target)) == 1 then doTargetCombatHealth(self.id, self.target, self.combat.type, -self.combat.min, -self.combat.max, CONST_ME_DRAWBLOOD) end self.time = self.time + (self.config.attackspeed/1000) end end
Os demais arquivos do NPC permanecem os mesmos, apenas substitua os códigos desse arquivo da lib dos npcs.
Enquanto a não atacar players da mesma town:
sametown.lua (data/creaturescripts/scripts):
function onAttack(cid, target) if isPlayer(target) and getPlayerTown(target) == getPlayerTown(cid) then doPlayerSendCancel(cid, "You can't attack players of the same town.") return false end return true end
Registre o creature event em login.lua (data/creaturescripts/scripts):
registerCreatureEvent(cid, "SameTown")
Tag - creaturescripts.xml (data/creaturescripts):
<event type="attack" name="SameTown" script="sametown.lua"/>
Créditos ao Oneshot pelo desenvolvimento dos códigos do NPC Guard original, eu apenas o alterei.
-
maiconmnt deu reputação a Wise em [Pedido] Npc que faz virar morador da cidade.Fiz pra que o player seja teleportado para o templo da nova town ao falar com o NPC.
mayor.lua (data/npc/scripts): local newtown = 5 -- new townID local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if (not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid if (msgcontains(msg, 'dweller')) then talkState[talkUser] = 1 selfSay('You want to become a dweller of this city?', cid) elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 1) then if (getPlayerTown(cid) ~= newtown) then doPlayerSetTown(cid, newtown) doTeleportThing(cid, getTownTemplePosition(newtown)) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) selfSay('Now you are a dweller of '..getTownName(newtown)..' City.', cid) else talkState[talkUser] = 0 selfSay('You are already a dweller of this city.', cid) end elseif (msgcontains(msg, 'no') and talkState[talkUser] == 1) then talkState[talkUser] = 0 selfSay('Okay, you are just visiting.', cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
Mayor.xml (data/npc):
<npc name="Mayor" script="data/npc/scripts/mayor.lua" access="5" lookdir="1"> <health now="1000" max="1000"/> <look type="123" head="45" body="67" legs="89" feet="10" addons="1"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I can make you a {dweller} of this city." /> </parameters> </npc> -
maiconmnt deu reputação a klipstyle em [Pedido] Npc que faz virar morador da cidade.local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if (msgcontains(msg, "yes")) then if getPlayerTown(cid) == 0 then npcHandler:say("Welcome! You are now a citizen of Baiak Town", cid) doPlayerSetTown(cid, 1) else npcHandler:say("sorry you already are a resident of this city!!", cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
-
maiconmnt deu reputação a xWhiteWolf em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser Inauguradofalha minha, aqui estão as funções que faltavam:
só colocar elas no começo do script logo abaixo da tabela que deve funcionar perfeito
function isOnSameFloor(fromPos, toPos) return fromPos.z == toPos.z and true or false end function isEven(arg) return arg % 2 == 0 and true or false end Edit: essas funções fazem parte de uma lib nova que to fazendo pra postar em breve, não era pra elas terem vazado tão cedo e por isso não tão da maneira correta como deveriam mas em todo caso eu confio no e dei permissão pra ele utilizar no script;
-
maiconmnt deu reputação a Wise em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser Inaugurado@maiconmnt
Substitua o action script por esse:
-- Coded by Suicide local tab = { boss = "Infernatil", -- "Monster Name" storages = {27771, 27772}, -- {globalstorage, storage} apos = {x=1882, y=2080, z=14}, -- pos x, y, z que o player será teleportado ao puxar a alavanca rangex = {x=123, y=456, z=7}, -- pos x, y, z do sqm do canto superior da área (total) rangey = {x=321, y=654, z=7}, -- pos x, y, z do sqm do canto inferior da área (total) atime = 10 -- tempo máximo de permanência na arena, em minutos } -- xWhiteWolfs functions \/ function isOnSameFloor(fromPos, toPos) return fromPos.z == toPos.z and true or false end function isEven(arg) return arg % 2 == 0 and true or false end function getMiddlePos(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local middle = {x = 0, y = 0, z = 0} middle.x = isEven(fromPos.x + toPos.x) and (fromPos.x + toPos.x)/2 or math.floor((fromPos.x + toPos.x)/2) + 1 middle.y = isEven(fromPos.y + toPos.y) and (fromPos.y + toPos.y)/2 or math.floor((fromPos.y + toPos.y)/2) + 1 middle.z = fromPos.z or toPos.z return middle end function clearArea(middlePos, rangex, rangey, mob, player) for i = -rangex, rangex do for j = -rangey, rangey do pos = {x = middlePos.x + i, y = middlePos.y + j, z = middlePos.z} creature = getTopCreature(pos).uid if isMonster(creature) and mob then doSendMagicEffect(getThingPos(creature), 14) addEvent(doCreateMonster, 1000, tab.boss, pos) doRemoveCreature(creature) end if isPlayer(creature) and player then doSendMagicEffect(getThingPos(creature), 14) doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature))) end end end return true end function getDistanceRadius(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local distance = getDistanceBetween(fromPos, toPos) return isEven(distance) and (distance/2) or math.floor(distance/2) + 1 end -- xWhiteWolfs functions /\ function onUse(cid, item, frompos, item2, topos) if getGlobalStorageValue(tab.storage[1]) - os.time() < 1 then setGlobalStorageValue(tab.storages[1], os.time() + (tab.atime * 60)) setPlayerStorageValue(cid, tab.storages[2], 1) local rx = getDistanceRadius(tab.rangex, tab.rangey) addEvent(clearArea, 1000, getMiddlePos(tab.rangex, tab.rangey), rx, rx, true, false) doTeleportThing(cid, tab.apos) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "E que comece o desafio!!") else doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Há alguém fazendo a Quest.") end return true end E obrigado, xWhiteWolf.
-
maiconmnt deu reputação a Wise em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser InauguradoSeguinte, remova todos os scripts relacionados a essa sua arena, pra evitar possíveis erros. Remova também o monstro da arena pelo RME, não vai ser necessário.
Adicione esse script ao arquivo da sua alavanca (action script):
-- Coded by Suicide local tab = { boss = "Infernatil", -- "Monster Name" storages = {27771, 27772}, -- {globalstorage, storage} apos = {x=1882, y=2080, z=14}, -- pos x, y, z que o player será teleportado ao puxar a alavanca rangex = {x=123, y=456, z=7}, -- pos x, y, z do sqm do canto superior da área (total) rangey = {x=321, y=654, z=7}, -- pos x, y, z do sqm do canto inferior da área (total) atime = 10 -- tempo máximo de permanência na arena, em minutos } -- xWhiteWolfs functions \/ function isOnSameFloor(fromPos, toPos) return fromPos.z == toPos.z and true or false end function isEven(arg) return arg % 2 == 0 and true or false end function getMiddlePos(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local middle = {x = 0, y = 0, z = 0} middle.x = isEven(fromPos.x + toPos.x) and (fromPos.x + toPos.x)/2 or math.floor((fromPos.x + toPos.x)/2) + 1 middle.y = isEven(fromPos.y + toPos.y) and (fromPos.y + toPos.y)/2 or math.floor((fromPos.y + toPos.y)/2) + 1 middle.z = fromPos.z or toPos.z return middle end function clearArea(middlePos, rangex, rangey, mob, player) for i = -rangex, rangex do for j = -rangey, rangey do pos = {x = middlePos.x + i, y = middlePos.y + j, z = middlePos.z} creature = getTopCreature(pos).uid if isMonster(creature) and mob then doSendMagicEffect(getThingPos(creature), 14) addEvent(doCreateMonster, 1000, tab.boss, pos) doRemoveCreature(creature) end if isPlayer(creature) and player then doSendMagicEffect(getThingPos(creature), 14) doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature))) end end end return true end function getDistanceRadius(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local distance = getDistanceBetween(fromPos, toPos) return isEven(distance) and (distance/2) or math.floor(distance/2) + 1 end -- xWhiteWolfs functions /\ function onUse(cid, item, frompos, item2, topos) if getGlobalStorageValue(tab.storage[1]) - os.time() < 1 then setGlobalStorageValue(tab.storages[1], os.time() + (tab.atime * 60)) setPlayerStorageValue(cid, tab.storages[2], 1) local rx = getDistanceRadius(tab.rangex, tab.rangey) addEvent(clearArea, 1000, getMiddlePos(tab.rangex, tab.rangey), rx, rx, true, false) doTeleportThing(cid, tab.apos) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "E que comece o desafio!!") else doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Há alguém fazendo a Quest.") end return true end
Apenas substitua o que continha no meu outro script dos creature events, por esse script:
-- Coded by Suicide local tab = { storages = {27771, 27772, 27773}, -- {globalstorage, storage} boss = "Infernatil", -- "Monster Name" roompos = {x=123, y=456, z=7}, -- pos x, y, z da sala da recompensa que o player será teleportado msgs = {"Você sobreviveu ao BOSS, agora pegue a recompensa.", "Você sobreviveu mais uma vez, porém não vai receber outra recompensa.", "O tempo para matar o BOSS se esgotou, tente novamente."} -- menssagens {"nunca matou o boss antes", "já matou o boss antes", "esgotou o tempo de permanência"} } function onKill(cid, target, lastHit) if getCreatureName(target) == tab.boss and getPlayerStorageValue(cid, tab.storages[2]) > 0 then if getPlayerStorageValue(cid, tab.storages[3]) < 1 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) setPlayerStorageValue(cid, tab.storages[3], 1) doTeleportThing(cid, tab.roompos) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[1]) else setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[2]) end end return true end function onThink(cid) if getGlobalStorageValue(tab.storages[1]) - os.time() < 1 and getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[3]) end return true end function onDeath(cid) if getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) end return true end function onLogout(cid) if getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end return true end
Adicione as tags - creaturescripts.xml (data/creaturescripts):
<event type="think" name="ArenaTime" script="survivalarena.lua"/> <event type="kill" name="ArenaKill" script="survivalarena.lua"/> <event type="death" name="ArenaDeath" script="survivalarena.lua"/> <event type="logout" name="ArenaLogout" script="survivalarena.lua"/>
E não se esqueça dos registros dos creature events em login.lua (data/creaturescripts/scripts):
registerCreatureEvent(cid, "ArenaTime") registerCreatureEvent(cid, "ArenaKill") registerCreatureEvent(cid, "ArenaDeath")
Enquanto a configuração da tabela da action script (rangex/rangey), faça como o exemplo (totalmente desproporcional que eu "desenhei"):
rangex -- pos do sqm do canto superior da arena;
rangey -- pos do sqm do canto inferior da arena.
Agradecimentos ao meu professor e grande amigo, xWhiteWolf, pelas 5 funções dele que usei num dos scripts.
Não testei, mas tudo coincide. Espero que ajude.
-
maiconmnt deu reputação a buddha em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser InauguradoEditei o post anterior, tenta agora. Acho que agora vai...
-
maiconmnt deu reputação a Shiro em Lucro com OTServ, debate !Sei muita coisa que poucos sabem, conheço alguns projetos secretos e tenho contato com pessoas antigas no mundo do "OTServ" que estão criando algumas coisas novas, mas não é por isso que pretendo ficar me exibindo ou discutir com você. xD
Enfim, OTServ realmente está dando lucro ? Não encontrei muitos servidores bons online. Além disso, encontrei apenas um "ATS" que vale a pena jogar.
E não criem mais discussões para fugir do assunto do tópico, caso contrário, irei reportar os mesmos.
-
maiconmnt recebeu reputação de Shadow.Styller em [PEDIDO]Efeito no chão que tira life do playerhumm entendi.
nesse caso nesse momento não irei poder te ajudar amigo, pois esta além das minhas habilidades, estou aprendendo lua agora também.
mas logo alguém vai vim aqui te ajudar pode ficar tranquilo.
obrigado pelo rep +
UP
-
-
maiconmnt deu reputação a buddha em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser InauguradoMeu caro, isso que você fez fará com que quando QUALQUER player deslogue outro possa entrar na arena. Faça o seguinte:
E no script que você criou:
Isso deve ser o suficiente.
-
maiconmnt deu reputação a Wise em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser InauguradoVocê só vai precisar alterar o seu action script e adicionar 3 creature events. Remova o seu script de movement e o portal da arena.
Substitua o seu script da alavanca por este (data/actions/scripts):
local tab = { storages = {55554, 55553}, -- {globalstorage, storage}, pos = {x=1882, y=2080, z=14}, -- pos x, y, z que o player será teleportado msgs = {"E que comecem os jogos!!", "Há alguém fazendo a Quest."} -- menssagens {"ao puxar", "aguardando"} } function onUse(cid, item, frompos, item2, topos) if getGlobalStorageValue(tab.storages[1]) < 1 then setGlobalStorageValue(tab.storages[1], 1) setPlayerStorageValue(cid, tab.storages[2], 1) doTeleportThing(cid, tab.pos) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, tab.msgs[1]) else doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[2]) end return true end
survivalarena.lua (data/creaturescripts/scripts):
local tab = { storages = {55554, 55553}, -- {globalstorage, storage}, boss = "Infernatil", -- "Monster Name", reward = {2160, 50}, -- a recompensa {itemid, count}, msg = "Parabéns, você conseguiu sobreviver e recebeu sua recompensa." } function onKill(cid, target, lastHit) if getCreatureName(target) == tab.boss and getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) doPlayerAddItem(cid, tab.reward[1], tab.reward[2]) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msg) end return true end function onDeath(cid) if getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) end return true end function onLogout(cid) if getPlayerStorageValue(cid, tab.storages[2]) > 0 then setGlobalStorageValue(tab.storages[1], -1) setPlayerStorageValue(cid, tab.storages[2], -1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end return true end
Adicione os registros dos creature events (kill/death) no arquivo login.lua (data/creaturescripts/scripts):
registerCreatureEvent(cid, "ArenaKill") registerCreatureEvent(cid, "ArenaDeath")
Tags - creaturescripts.xml (data/creaturescripts):
<event type="kill" name="ArenaKill" script="survivalarena.lua"/> <event type="death" name="ArenaDeath" script="survivalarena.lua"/> <event type="logout" name="ArenaLogout" script="survivalarena.lua"/> -
maiconmnt recebeu reputação de Shadow.Styller em [PEDIDO]Efeito no chão que tira life do playernão sei se é bem isso que você quer, mas vou tentar ajudar.
em movements.xml cri um arquivo chamado drown.lua e cole isso:
em movements.xml adicione essas duas linhas:
Explicação:
-5000 aqui é o tanto que será arrancado de life quando pisar no chão
2000 aqui é o tempo de hit para hit, nesse caso o player sofrerá dando a cada 2 segundos, sendo 1000 igual a 1 segundo.
itemid == 114 aqui basta voce trocar o 114 pelo id do item que voce quer que quando o player tiver usando ele não tome hit. no meu ot esta assim, e acho que fica mais interessante também, mas se não quiser que tenha item creio que é so excluir essa linha inteira.
e em movements xml onde tem itemid=113 corresponde ao id do chão que você vai usar no rme. procure colocar um tile que não tenha em outras partes do mapa. eu utilizei o otitemeditor para criar um chão único em meu server, se quiser criar um chão de id próprio para isso procure um tutorial aqui no tibiaking ou me mande pm que tento te ajudar, pois não tem erro.
Abraços, espero que tenha te ajudado.
mas se não for bem isso que voce quer, espero que possa encontrar logo o que procura.
fique em paz.
-
maiconmnt deu reputação a klipstyle em (Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser Inauguradodata/creaturescripts/scripts/Login.lua
tente adicionar isso antes do ultimo return true
if getGlobalStorageValue(cid, 55554) == 1 then setGlobalStorageValue(cid, 55554, -1) end -
maiconmnt deu reputação a palubo em [Pedido] Npc que faz virar morador da cidade.Tenta colocar isso aqui no .lua do NPC:
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} local townid = [COLOQUE O ID DA CIDADE AQUI] function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function greetCallback(cid) if msgcontains(cid,"citizen") then selfSay("Do you want to become a citizen?", cid) talkState[talkUser]=1 end if talkState[talkUser]==1 then if msgcontains(cid,"yes") then selfSay("So be it!", cid) doPlayerSetTown(cid, townid) elseif msgcontains(cid,"no") then selfSay("As you wish.", cid) end talkState[talkUser]=0 end end npcHandler:setCallback(CALLBACK_GREET, greetCallback) npcHandler:addModule(FocusModule:new()) Não esquece de mudar o ID da cidade ali. Se não funcionar, me avisa.
Abraço.