Histórico de Curtidas
-
Jeff Delay recebeu reputação de Under em Novo Narutibia aberto dia 02/08/2024Servidor Online
Aberto dia 02/08
[+]Saga System
[+]Kage System
[+]Task System
[+]Rarity System
[+]Upgrade System
[+]Refinament System
[+]AutoLoot System
[+]Rarity Loot System
[+]Anbu/akatsuki System
[+]Guild Castle War
[+]Diversos Eventos
[+]Old cliente customizado
[+]Old e otc com anti target
[+]Mapa 100% proprio feito do zero
[+]VocationDay System
[+]Aura/buff System
Tudo isso e muito mais, nos acompanhe em:
https://www.ntoarmageddon.com/account/create
https://discord.gg/82HfH5PH
-
Jeff Delay deu reputação a KevinLuzetti em NPC CassinoOi gente, eu estava procurando aqui um npc de aposta de 21 e achei no meio das minhas coisas vou disponibilizar pra vcs.
Testado em 0.3.6 e 0.4
XML
<?xml version="1.0"?> <npc name="Brian O'Conner" script="data/npc/scripts/dicer.lua" walkinterval="0" floorchange="0"> <health now="100" max="100"/> <look type="132" head="114" body="0" legs="0" feet="114" addons="3"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|, quer {apostar} comigo? " /> </parameters> </npc>
LUA
price_21 = 1000 -- 1k ou 1000gold price_jogo6 = 5000 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, 'apostar')) then selfSay('Eu faco 2 jogos: {21}, e jogo do {6}, escolha um deles!', cid) talkState[talkUser] = 5 elseif (msgcontains(msg, '6') and talkState[talkUser] == 5) then selfSay('O Jogo do 6 funciona assim: Eu vou rodar um dado, e se cair no numero 6 voce ganha o sextuplo (6 vezes) do valor apostado.', cid) selfSay('Caso nao caia no 6, voce perde apenas o dinheiro da aposta.', cid) selfSay('Esta pronto para {comecar}?.', cid) talkState[talkUser] = 3 elseif(msgcontains(msg, 'comecar') and talkState[talkUser] == 3) then selfSay('Voce possui o {dinheiro} da aposta ('..price_jogo6..')golds ?', cid) if doPlayerRemoveMoney(cid, price_jogo6) == TRUE then talkState[talkUser] = 2 else selfSay('Desculpe, mais voce nao tem dinheiro para apostar comigo.',cid) end elseif(msgcontains(msg, 'dinheiro') and talkState[talkUser] == 2) then sorteio6 = math.random(1,6) if sorteio6 == 6 then talkState[talkUser] = 3 selfSay('Parabens, o numero sorteado foi 6 e voce acaba de ganhar '..(price_jogo6*6) ..'golds, mais o dinheiro que voce pagou da aposta.',cid) doPlayerAddMoney(cid,price_jogo6*6) else talkState[talkUser] = 2 selfSay('Que azar, o numero sorteado foi '..sorteio6..', mais sorte na proxima.',cid) end elseif(msgcontains(msg, '21') and talkState[talkUser] == 5) then selfSay('O 21 funciona assim: Voce ira ganhar 1 numero e o numero tem quer ser 21, ou chegar o mais proximo possivel sem ultrapassar esse valor.', cid) selfSay('E a mesma coisa sera feita comigo, ganharei 1 numero.', cid) selfSay('Voce pode ir comprando mais numeros dizendo {comprar} e se quiser parar e so dizer {parar}.', cid) selfSay('Se voce ganhar de mim, voce leva o triplo do dinheiro apostado.', cid) selfSay('Esta pronto para {comecar}?.', cid) talkState[talkUser] = 0 elseif(msgcontains(msg, 'comecar') and talkState[talkUser] == 0) then selfSay('Voce possui o {dinheiro} da aposta ('..price_21..')golds ?', cid) talkState[talkUser] = 1 elseif(msgcontains(msg, 'dinheiro') and talkState[talkUser] == 1) then if doPlayerRemoveMoney(cid, price_21) == TRUE then talkState[talkUser] = 0 local mpn = math.random(1,21) setPlayerStorageValue(cid, 55411,mpn) local pn = getPlayerStorageValue(cid, 55411) selfSay('Seu numero e '..pn..', quer comprar mais ou parar?',cid) else selfSay('Desculpe, mais voce nao tem dinheiro para apostar comigo.',cid) end elseif(msgcontains(msg, 'comprar') and talkState[talkUser] == 0) then local cp = math.random(1,10) setPlayerStorageValue(cid, 55411, (getPlayerStorageValue(cid, 55411))+cp) selfSay('Seu numero e '..getPlayerStorageValue(cid, 55411)..', quer comprar mais ou parar?',cid) talkState[talkUser] = 0 elseif(msgcontains(msg, 'parar') and talkState[talkUser] == 0) then local npcn = math.random(1,21) setPlayerStorageValue(cid, 2224, npcn) if getPlayerStorageValue(cid, 55411) < getPlayerStorageValue(cid, 2224) then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid) selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid) selfSay('Ganhei, mais sorte na proxima vez.',cid) talkState[talkUser] = 1 elseif getPlayerStorageValue(cid, 55411) == getPlayerStorageValue(cid, 2224) then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid) selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid) selfSay('Empato, portanto ninguem ganha nada.',cid) talkState[talkUser] = 1 elseif getPlayerStorageValue(cid, 55411) > getPlayerStorageValue(cid, 2224) and getPlayerStorageValue(cid, 55411) <= 21 then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid) selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid) local somag = (price_21*3) selfSay('Voce ganhou '..somag..'golds, mais os seus '..price_21..'golds de volta. Parabens !!!',cid) doPlayerAddMoney(cid, somag) doPlayerAddMoney(cid, price_21) talkState[talkUser] = 1 else selfSay('Você tirou um numero maior que 21, então você perdeu.',cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
-
Jeff Delay deu reputação a Mateus Robeerto em [TFS 1.4.2] Reward Chest System!!Com esse sistema desenvolvido pelo TFS 0.4 8.60 do @Luan Luciano, peguei e adaptei para TFS 1x.
Basicamente, o sistema funciona da seguinte forma :
Você determina as criaturas que funcionarão com este sistema (geralmente chefes).
Durante a batalha com a criatura, o sistema concede pontos aos jogadores por atacar, bloquear e apoiar (curar) aqueles em batalha.
Quando a criatura é morta, o sistema cria o saque com base nos pontos e o envia para o depósito do jogador em uma sacola especificada nas configurações
Aqui está o GIF, mostrando quando o chefe é morto e o saque é enviado pelo correio.
https://imgur.com/AJiM1mh
registre o evento em determinado arquivo de monstro.
XML.
<script> <event name="RewardChestDeath"/> <event name="RewardChestMonster"/> </script> defina o cadáver do chefe como 0.
<look type="201" corpse="0" /> Isto é RevScripts. Coloque o script em qualquer lugar da pasta data/scripts, seja uma subpasta ou seu local preferido .
Reward_Chest_System.lua
local function addRewardLoot(uid, bossName, rewardTable) local money = math.random(10, 40) local msg = "The following items are available in your reward chest:" local player = Player(uid) local chest = Game.createItem(REWARDCHEST.rewardBagId) if not player or not chest then return end chest:setAttribute("description", "Reward System has kill the boss " .. bossName .. ".") for _, reward in ipairs(rewardTable) do if math.random(100) <= reward[3] then local count = math.random(1, reward[2]) chest:addItem(reward[1], count) msg = msg .. " " .. (count > 1 and count or "") .. " " .. ItemType(reward[1]):getName() .. "," end end chest:addItem(2152, money) chest:moveTo(player:getInbox()) player:sendTextMessage(MESSAGE_INFO_DESCR, msg .. " and " .. money .. " platinum coins.") local boss = REWARDCHEST.bosses[bossName] player:setStorageValue(boss.storage, 0) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) end local function addLoot(lootTable, rewardTable, allLoot) if allLoot then for _, loot in ipairs(lootTable) do table.insert(rewardTable, loot) end else table.insert(rewardTable, lootTable[math.random(#lootTable)]) end end local function rewardChestSystem(bossName) local players = {} local boss = REWARDCHEST.bosses[bossName] for _, player in ipairs(Game.getPlayers()) do local points = player:getStorageValue(boss.storage) if points > 0 then table.insert(players, {player = player, points = points}) end end table.sort(players, function(a, b) return a.points > b.points end) local topPoints = players[1] and players[1].points or 0 for i, playerData in ipairs(players) do local player = playerData.player local points = playerData.points local rewardTable = {} if i == 1 then addLoot(boss.common, rewardTable, false) addLoot(boss.semiRare, rewardTable, false) addLoot(boss.rare, rewardTable, false) addLoot(boss.always, rewardTable, true) elseif points >= math.ceil(topPoints * 0.8) then addLoot(boss.common, rewardTable, false) addLoot(boss.semiRare, rewardTable, false) addLoot(boss.rare, rewardTable, false) addLoot(boss.veryRare, rewardTable, false) elseif points >= math.ceil(topPoints * 0.6) then addLoot(boss.common, rewardTable, false) addLoot(boss.semiRare, rewardTable, false) addLoot(boss.rare, rewardTable, false) elseif points >= math.ceil(topPoints * 0.4) then addLoot(boss.common, rewardTable, false) addLoot(boss.semiRare, rewardTable, false) elseif points >= math.ceil(topPoints * 0.1) then addLoot(boss.common, rewardTable, false) end addRewardLoot(player:getId(), bossName, rewardTable) end end local RewardChestDeath = CreatureEvent("RewardChestDeath") function RewardChestDeath.onDeath(creature, corpse, killer) local boss = REWARDCHEST.bosses[creature:getName():lower()] if boss then addEvent(rewardChestSystem, 1000, creature:getName():lower()) end return true end RewardChestDeath:register() local RewardChestMonster = CreatureEvent("RewardChestMonster") function RewardChestMonster.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) if creature:isMonster() and primaryType == COMBAT_PHYSICALDAMAGE and attacker:isPlayer() then local boss = REWARDCHEST.bosses[creature:getName():lower()] if boss then local currentPoints = attacker:getStorageValue(boss.storage) local newPoints = currentPoints + math.ceil(primaryDamage / REWARDCHEST.formula.hit) attacker:setStorageValue(boss.storage, newPoints) end end return primaryDamage, primaryType end RewardChestMonster:register() local LoginPlayer = CreatureEvent("LoginPlayer") function LoginPlayer.onLogin(player) for _, value in pairs(REWARDCHEST.bosses) do if player:getStorageValue(value.storage) > 0 then player:setStorageValue(value.storage, 0) end end player:registerEvent("RewardChestStats") return true end LoginPlayer:register() local RewardChestStats = CreatureEvent("RewardChestStats") function RewardChestStats.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) if attacker and attacker:isMonster() and (primaryType == COMBAT_PHYSICALDAMAGE or secondaryType == COMBAT_PHYSICALDAMAGE) then local boss = REWARDCHEST.bosses[attacker:getName():lower()] if boss then local currentPoints = creature:getStorageValue(boss.storage) local newPoints = currentPoints + math.ceil(math.abs(primaryDamage) / REWARDCHEST.formula.block) creature:setStorageValue(boss.storage, newPoints) creature:setStorageValue(REWARDCHEST.storageExaust, os.time() + 5) end elseif attacker and attacker:isPlayer() and (primaryType == COMBAT_HEALING or secondaryType == COMBAT_HEALING) and (creature:getHealth() < creature:getMaxHealth()) and (creature:getStorageValue(REWARDCHEST.storageExaust) >= os.time()) then for _, valor in pairs(REWARDCHEST.bosses) do if creature:getStorageValue(valor.storage) > 0 then local add = math.min(primaryDamage, creature:getMaxHealth() - creature:getHealth()) local currentPoints = attacker:getStorageValue(valor.storage) local newPoints = currentPoints + math.ceil(add / REWARDCHEST.formula.suport) attacker:setStorageValue(valor.storage, newPoints) end end end return primaryDamage, primaryType end RewardChestStats:register() Agora, esta parte sobre raridades de loot de monstros... deve ser adicionada ao data/lib e criar um arquivo.lua chamado RewardChestSystem.lua e adicionar tudo isso.
-- Reward system created by luanluciano93 for TFS 0.4, function adapted by Mateus Roberto for TFS 1.3+ using RevScripts. REWARDCHEST = { rewardBagId = 2595, formula = {hit = 3, block = 1, support = 9}, storageExhaust = 60000, town_id = 1, bosses = { ["ghazbaran"] = -- the boss's entire name in lower case. { common = { {2143, 10, 100}, -- white pearl {2146, 10, 100}, -- small sapphire {2145, 10, 100}, -- small diamond {2144, 10, 100}, -- black pearl {2149, 10, 100}, -- small emeralds {5954, 3, 100}, -- demon horn {7896, 1, 100}, -- glacier kilt {7590, 1, 100}, -- great mana potion {2179, 1, 100}, -- gold ring {2151, 1, 100}, -- talon }, semiRare = { {2152, 90, 100}, -- platinum coin {7368, 50, 100}, -- assassin star {2130, 1, 100}, -- golden amulet {2436, 1, 100}, -- skull staff {2447, 1, 100}, -- twin axe {2171, 1, 100}, -- platinum amulet {2158, 1, 100}, -- blue gem {2393, 1, 100}, -- giant sword {2164, 1, 100}, -- might ring {7454, 1, 100}, -- glorious axe {6553, 1, 100}, -- ruthless axe {9971, 1, 100}, -- gold ingot }, rare = { {2160, 3, 100}, -- crystal coin {8887, 1, 100}, -- frozen plate {2470, 1, 100}, -- golden legs {2472, 1, 100}, -- magic plate armor {7431, 1, 100}, -- demonbone {2520, 1, 100}, -- demon shield {5943, 1, 100}, -- morgaroth heart {2466, 1, 100}, -- golden armor {2514, 1, 100}, -- mastermind shield {2142, 1, 100}, -- ancient amulet {2123, 1, 100}, -- ring of the sky {1984, 1, 100}, -- blue tome }, veryRare = { {8866, 1, 100}, -- robe of the ice queen {6553, 1, 100}, -- ruthless axe {8884, 1, 100}, -- oceanborn leviathan armor {2421, 1, 100}, -- thunder hammer {2646, 1, 100}, -- golden boots {7455, 1, 100}, -- mythril axe }, always = { {2148, 90, 100}, -- gold coin {6500, 9, 100}, -- demonic essence {2177, 1, 100}, -- life crystal {2214, 1, 100}, -- ring of healing }, storage = 65479, }, ["orshabaal"] = -- the boss's entire name in lower case. { common = { {2143, 10, 100}, -- white pearl {2146, 10, 100}, -- small sapphire {2145, 10, 100}, -- small diamond {2144, 10, 100}, -- black pearl {2149, 10, 100}, -- small emeralds {5954, 3, 100}, -- demon horn {7896, 1, 100}, -- glacier kilt {2432, 1, 100}, -- fire axe {2462, 1, 100}, -- devil helmet {7590, 1, 100}, -- great mana potion {2179, 1, 100}, -- gold ring {2151, 1, 100}, -- talon }, semiRare = { {2195, 1, 100}, -- boots of haste {2436, 1, 100}, -- skull staff {2393, 1, 100}, -- giant sword {5954, 5, 100}, -- demon horn }, rare = { {2470, 1, 100}, -- golden legs {2472, 1, 100}, -- magic plate armor {2514, 1, 100}, -- mastermind shield {2520, 1, 100}, -- demon shield {1982, 1, 100}, -- purple tome {2123, 1, 100}, -- ring of the sky }, veryRare = { {8890, 1, 100}, -- robe of the underworld {2421, 1, 100}, -- thunder hammer }, always = { {5808, 1, 100}, -- orshabaal's brain {2171, 1, 100}, -- platinum amulet {2148, 90, 100}, -- gold coin {2146, 10, 100}, -- small sapphire }, storage = 65480, }, ["ferumbras"] = -- the boss's entire name in lower case. { common = { {2143, 10, 100}, -- white pearl {2146, 10, 100}, -- small sapphire {2145, 10, 100}, -- small diamond {2144, 10, 100}, -- black pearl {2149, 10, 100}, -- small emeralds {7416, 1, 100}, -- bloody edge {7896, 1, 100}, -- glacier kilt {2432, 1, 100}, -- fire axe {2462, 1, 100}, -- devil helmet {7590, 1, 100}, -- great mana potion {2179, 1, 100}, -- gold ring {2151, 1, 100}, -- talon }, semiRare = { {2195, 1, 100}, -- boots of haste {2472, 1, 100}, -- magic plate armor {2393, 1, 100}, -- giant sword {2470, 1, 100}, -- golden legs {2514, 1, 100}, -- mastermind shield }, rare = { {8885, 1, 100}, -- divine plate {2520, 1, 100}, -- demon shield {8930, 1, 100}, -- emerald sword {2522, 1, 100}, -- great shield {2421, 1, 100}, -- thunder hammer }, veryRare = { {5903, 1, 100}, -- ferumbras' hat }, always = { {2171, 1, 100}, -- platinum amulet {2148, 90, 100}, -- gold coin {2146, 10, 100}, -- small sapphire }, storage = 65481, }, ["zulazza the corruptor"] = --- the boss's entire name in lower case. { common = { {2158, 1, 100}, -- blue gem {2156, 1, 100}, -- red gem {2155, 1, 100}, -- green gem {2154, 1, 100}, -- yellow gem {2153, 1, 100}, -- violet gem }, semiRare = { {5944, 5, 100}, -- soul orb }, rare = { {2514, 1, 100}, -- mastermind shield }, veryRare = { {11114, 1, 100}, -- dragon scale boots {8882, 1, 100}, -- earthborn titan armor }, always = { {2152, 90, 100}, -- platinum coin {9971, 5, 100}, -- gold ingot }, storage = 65482, }, ["morgaroth"] = -- the boss's entire name in lower case. { common = { {2143, 10, 100}, -- white pearl {2146, 10, 100}, -- small sapphire {2145, 10, 100}, -- small diamond {2144, 10, 100}, -- black pearl {2149, 10, 100}, -- small emeralds {5954, 3, 100}, -- demon horn {7896, 1, 100}, -- glacier kilt {2432, 1, 100}, -- fire axe {2462, 1, 100}, -- devil helmet {7590, 1, 100}, -- great mana potion {2179, 1, 100}, -- gold ring {2151, 1, 100}, -- talon }, semiRare = { {2195, 1, 100}, -- boots of haste {2393, 1, 100}, -- giant sword {5954, 5, 100}, -- demon horn {2123, 1, 100}, -- ring of the sky }, rare = { {8886, 1, 100}, -- molten plate {2472, 1, 100}, -- magic plate armor {8867, 1, 100}, -- dragon robe {2514, 1, 100}, -- mastermind shield {2520, 1, 100}, -- demon shield {1982, 1, 100}, -- purple tome {8851, 1, 100}, -- royal crossbow }, veryRare = { {2421, 1, 100}, -- thunder hammer {2522, 1, 100}, -- great shield {8850, 1, 100}, -- chain bolter }, always = { {5943, 1, 100}, -- morgaroth's brain {2171, 1, 100}, -- platinum amulet {2148, 90, 100}, -- gold coin {2146, 10, 100}, -- small sapphire }, storage = 65483, }, } } Por último, adicione isto a data/lib/lib.lua e inclua-o.
----Reward Chest System dofile('data/lib/RewardChestSystem.lua') Incrível, você pode configurar os itens de saque de cada chefe individualmente. Está dentro da lib/RewardChestSystem, então aproveite.
Para quem usa Nekiro ou qualquer base TFS 1.x Downgrades,
basta alterar esta linha.
chest:moveTo(player:getInbox()) para. local depotChest = player:getDepotChest(REWARDCHEST.town_id, true) chest:moveTo(depotChest)
-
Jeff Delay recebeu reputação de euromarfia em Base Wo-naruto shinobi Returns [WONSR]Salve pessoal, como ja coletei mt conteudo daqui hoje vim compartilhar algo que na verdade já está free em alguns canais de discord, uma base de nto que eu abri em 2020/2021 até que deu certo e pegou 500/600 players no auge, porem com varios problemas fechei e vendi porem ela ja roda de graça em varios canais então tenho certeza que não tem problema divulgar ela aqui, oque a base tem?
Sistema de elo [Rankeamento];
Sistema edo tensei [Selamento de corpos];
Sistemas de saga [historia];
42 pessonagens completos, todos funcionais e com habilidades unicas;
Sistema de vocação do dia [primeiro nto a ter];
Sistema de raridade [Primeiro nto a ter];
Sistema de fontes termais;
Sistema anbu/akatsuki com bonus;
Sistema de roleta [acredito nunca ter visto uma rotela parecida com a que nos fizemos]
Sistema de cidadão;
Sistema de jinchuriki;
e outros ai que não lembro alem de alguns eventos, o jogo tem bastante coisa e eu dediquei bastante tempo nele, porem atualmente estou trabalhando em outro novamente assim que ficar disponivel iirei postar aqui.
quem tiver curiosidade tem varios videos no yt sobre o jogo]
Creditos a mim que começei o projeto e ao meu irmão jean, lembro como ta o nome dele aqui então vai ficar por isso mesmo.
no arquivo contem Otc, server, site e sourcer.
Base utilizada foi nto shinobi 8.54
não pretendo dar suporte a nada até porque esta abandonado por mim desde 2021
https://mega.nz/file/4cdxiJQT#AYXaTLB_Avkys9VrLKymzNY_I2UJcLxDLFLzIgjL-js VirusTotal - File - f9f1bc435cdfc98845ede6adbbc03763aaf5e2c942732f21efe3e1fe1c1b36fe
-
Jeff Delay recebeu reputação de NeGoGaBe em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor Completoso criar um mapa limpo com a mesma versão e importar o mapa do servidor nesse mapa limpo
-
Jeff Delay deu reputação a Yan Liima em Limite de players em guild in-gameLimite máximo de players em guild in-game ?
Bom galera estou postando esse conteúdo como complemento do limite em WEBSITE
Ao utilizar !joinguild esse code verifica se a guilda já atingiu o limite máximo de membros(configurado)
Eu estarei disponibilizando de duas maneiras:
1º Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)
2º A verificação será feita por DB, onde terá um valor padrão para cada guilda criada, podendo ser alterado o valor de membros maximo.
Ou seja, a guilda número UM pode ter máximo de 50 players, e a guilda número DOIS pode ter o máximo de 100.
Vocês pode ser criativos e vender items que aumenta o limite ou fazer eventos/sorteios para aumentar...
Enfim, vamos lá...
Primeira maneira:
Segunda maneira:
Prontinho galera, espero que ajude algumas pessoas xD
-
Jeff Delay deu reputação a Vodkart em Deletar playerUsando desse jeito, você pode deletar o player com ele offline ou online:
function onSay(cid, words, param) local t, k = string.explode(param:lower(), ","), "No Reason" if (param == "") then doPlayerSendCancel(cid, "use um comando valido") return true end local id = getPlayerGUIDByName(t[1]) if not id then doPlayerSendCancel(cid, "Desculpe, mas o jogador [" .. t[1] .. "] não existe.") return true end local pid = getPlayerByNameWildcard(t[1]) if isPlayer(pid) then doRemoveCreature(pid) end db.executeQuery("DELETE FROM `players` WHERE `id` = " .. id) broadcastMessage("o player "..t[1].." foi deletador por: "..(not t[2] and k or t[2])..".") return true end
obs: modifiquei a query, quem fez esse código é um baita de um noob.
-
Jeff Delay deu reputação a Vodkart em Alavanca que remova paredeslocal hour = 1 local pos = {x=160, y=54, z=7} -- player posiiton local walls = { {1354,{x = 2741, y = 2320, z = 7, stackpos = 1}}, {1354,{x = 2741, y = 2321, z = 7, stackpos = 1}}, {1354,{x = 2741, y = 2322, z = 7, stackpos = 1}}, {1354,{x = 2732, y = 2330, z = 7, stackpos = 1}}, {1354,{x = 2733, y = 2330, z = 7, stackpos = 1}}, {1354,{x = 2734, y = 2330, z = 7, stackpos = 1}}, {1354,{x = 2735, y = 2330, z = 7, stackpos = 1}}, {1354,{x = 2736, y = 2330, z = 7, stackpos = 1}} } function RemoveAndCreateWalls() for i = 1, #walls do if getTileItemById(walls[i][2], walls[i][1]).uid == 0 then doCreateItem(walls[i][1], 1, walls[i][2]) else doRemoveItem(getThingfromPos(walls[i][2]).uid,1) doSendMagicEffect(walls[i][2], CONST_ME_POFF) end end end function onUse(cid, item, fromPosition, itemEx, toPosition) local m = getTopCreature(pos).uid if getTileItemById(walls[1][2], walls[1][1]).uid == 0 then doPlayerSendCancel(cid, 'As paredes ainda estão abertas.') return true elseif m == 0 or m ~= 0 and not isPlayer(m) then doPlayerSendCancel(cid, 'O jogador não está na posição.') return true end doPlayerSendTextMessage(cid, 21, 'a parede foi removida e voltara dentro de '..hour..' hora(s)!') RemoveAndCreateWalls() addEvent(RemoveAndCreateWalls, hour*3600000) return true end
-
Jeff Delay deu reputação a ilLusioN em Pack de sprites freeBom eu sou novo aq no TK, e resolvi postar umas sprites "minhas" por conta de desavenças com 1 certo ADM não vou citar nomes nem nd, bom é isso.
Caso as sprites tenham algum bug de posição, peço q me desculpem pois teve algumas q não testei.
Scan: https://www.virustotal.com/gui/file/a3e38f7b19163c088bb8b4efc33b2bdc780e580f90f3308607f6fdd606288d43/detection
Download: http://www.mediafire.com/file/tcsum7vaqzgwqg6/Packzinho+de+gratís.rar/file
Bom uso !
-
Jeff Delay deu reputação a Vodkart em [TFS] New Auto Loot Unlimited Edition 2.0[ + ] Descrição: Autoloot refeito para VERSÃO TFS e adicionado algumas outras funções que estarei explicando ao decorrer do tópico.
[ + ] Se você quer o Autoloot para VERSÃO OTX clica neste Link: AUTOLOOT OTX
[ + ] Imagem do comando:
[ + ] Features:
[ - ] Você pode ativar ou desativar o autoloot a hora que achar necessário.
[ - ] Também existe um comando para ativar ou desativar mensagens do loot que o autoloot coleta!
[ - ] Você pode escolher a cor do texto em que irá aparecer a coleta do loot!
[ - ] O autoloot informará para você se estiver com pouco slots na sua backpack, e o jogador poderá escolher se quer habilitar ou não está função no autoloot.
[ - ] Versão ilimitada de itens(não ficam armazenadas em storages).
[ - ] O jogador poderá optar por depositar direto no banco os golds que forem dropados.
[ + ] Instalação:
Primeiramente CRIE uma PASTA VAZIA chamanda "autoloot" em DATA/LOGS, ficando assim:
Depois instale o MODS normalmente na pasta MODS do seu servidor.
new_perfect_autoloot_tfs.xml
Link: https://pastebin.com/raw/0xJR4nwr
[ + ] Configuração:
Dentro do mods tem essa tabela
info = { distro = 1, -- 1 = TFS // 2 = talk modificada directory = "data/logs/autoloot", -- não mexer Warn_Bp_Slots = 5, -- quando tiver 5 ou menos slots na BP vai avisar o jogador Talkaction_delay = 5, -- em segundos // delay para remover e adicionar item BlockMonsters = {}, -- Lista de monstros que o autoloot nao vai funcionar BlockItemsList = {2123,2515}, -- Lista de itens que o autoloot nao coleta Money_ids = {2148, 2152, 2160}, -- id das moedas do ot Max_Slots = {free = 3, premium = 5}, -- quantidade de itens que podem ser adicionados no autoloot por free e premium Storages = {988801, 988802, 988803, 988804, 988805, 988806, 988807} -- não mexer }
Sobre o distro = 1
Isso significa que ele usa versão padrão (1), pois existem 2 versões, caso aconteça esse error no seu console ao usar a talkaction do autoloot:
[8/10/2020 19:19:58] [Error - TalkAction Interface]
[8/10/2020 19:19:58] local words = "!autoloot"
(...)
[8/10/2020 19:19:59] return true
[8/10/2020 19:19:59] Description:
[8/10/2020 19:19:59] (LuaInterface::luaGetItemIdByName) Item not found
Você deverá colocar:
distro = 2
Pq? acontece que em alguns servidores não reconhecem o parâmetro "false" da função "getItemIdByName"
OBS: Estarei anexando o autoloot já atualizado na versão 2.0 para quem tiver preguiça de copiar e colar!!
new_perfect_autoloot_tfs.xml
-
Jeff Delay recebeu reputação de Kevin Araujo em (Resolvido)Monstersadicione "0" na passive lá e teste
-
Jeff Delay deu reputação a Cat em Script exori hur imitando o martelo de ThorMuito genial, Cipsoft aprende kkkk.
podia por um gif, embora a img mostre bem como funciona.
Parabens pelo script e obrigado por postar pra nós.
-
Jeff Delay deu reputação a Rogex Joyz em Script exori hur imitando o martelo de ThorFala galeritcha, este script imita o ''martelo de Thor'', ele funciona da seguinte forma: Após o knight falar a magia (no meu caso exori hur), um martelo vai girando em linha reta de acordo com o lado em que o player estiver virado. O martelo vai em efeito de boomerang, ele vai e volta para o dono da magia dando ataque em todos que estão no caminho, o dano é duplicado (são 2 danos), uma vez que 1 dano corresponde à ida e outro corresponde ao do martelo voltando. 0.x -
unknown credits, enjoy. Praticamente as principais coisas são editáveis dentro do script logo no começo, deixarei escrito dentro dele para ficar mais fácil. Let's go ?
Em spells/scripts/attack coloque:
local config = { distance = 6, -- distância em que o martelo irá chegar (no caso ele está configurado para percorrer 6 sqm's e depois voltar) distEffect = 25, -- efeito que irá causar. Fale /x ingame junto com um número e veja os efeitos que mais te agrada, depois só substituir o 25 pelo número do efeito escolhido. No caso o efeito que eu escolhi é justamente de um martelo. minDamage = 200, --Qual o dano mínimo que você deseja que esta magia tire ? maxDamage = 500, -- Qual o dano máximo que você deseja que esta magia tire ? - Lembrando que são dois danos distintos de ida e outro de volta interval = 750 -- Após soltar a magia, quanto tempo levará para o martelo retornar para você ? - Coloque o tempo em milésimos de segundos } function getPosisBetween(fromPos, toPos) local posis = {} for i = 1, getDistanceBetween(fromPos, toPos) do local choices = {fromPos.x, fromPos.x + 1, fromPos.x - 1} if fromPos.x ~= toPos.x then table.sort(choices, function(a, b) if fromPos.x - toPos.x < 0 then return a > b else return a < b end end) fromPos.x = choices[1] end if fromPos.y ~= toPos.y then choices = {fromPos.y, fromPos.y + 1, fromPos.y - 1} table.sort(choices, function(a, b) if fromPos.y - toPos.y < 0 then return a > b else return a < b end end) fromPos.y = choices[1] end table.insert(posis, {x = fromPos.x, y = fromPos.y, z = fromPos.z}) end return posis end function onCastSpell(cid) local playerPos = getThingPos(cid) local toPos = { [0] = {x = playerPos.x, y = playerPos.y - config.distance, z = playerPos.z}, [1] = {x = playerPos.x + config.distance, y = playerPos.y, z = playerPos.z}, [2] = {x = playerPos.x, y = playerPos.y + config.distance, z = playerPos.z}, [3] = {x = playerPos.x - config.distance, y = playerPos.y, z = playerPos.z} } local spellToPos = toPos[getCreatureLookDirection(cid)] local posis = getPosisBetween(getThingPos(cid), spellToPos) doSendDistanceShoot(getThingPos(cid), spellToPos, config.distEffect) for i = 1, #posis do if not getTileInfo(posis[i]).protection then local pid = getTopCreature(posis[i]).uid if isMonster(pid) or isPlayer(pid) then doTargetCombatHealth(cid, pid, COMBAT_PHYSICALDAMAGE, -config.minDamage, -config.maxDamage, -1) end end end addEvent(function() if not isPlayer(cid) then return true end doSendDistanceShoot(spellToPos, getThingPos(cid), config.distEffect) posis = getPosisBetween(spellToPos, getThingPos(cid)) for i = 1, #posis do if not getTileInfo(posis[i]).protection then local pid = getTopCreature(posis[i]).uid if isMonster(pid) or isPlayer(pid) then doTargetCombatHealth(cid, pid, COMBAT_PHYSICALDAMAGE, -config.minDamage, -config.maxDamage, -1) end end end end, config.interval) return true end Em spells.xml coloque:
<instant name="Whirlwind Throw" words="exori hur" lvl="200" mana="500" prem="1" needweapon="1" range="5" needtarget="1" blockwalls="1" exhaustion="1800" maglv="7" needlearn="0" script="attack/Whirlwind Throw.lua">
<vocation id="4"/>
<vocation id="8"/>
-- em words = o nome que deverá ser dito para soltar a spell
mana = quanto de mana gastará ?
needweapon = precisa estar equipado com uma arma para soltá-la ?
range = configurável dentro do script
needtarget = Precisa estar targetando alguém para soltar esta magia ? - Lembrando que caso coloque ''1'', precisará targetar um alvo para soltar a spell, porém isso não influencia na direção da magia. Ela soltará para onde o personagem estiver virado, como um exevo gran vis lux por exemplo.
maglv = Qual o magic level necessário para conjurar esta magia ?
Espero que divirta bastante gente, eu dei uns berro aqui quando vi ela em pratica haha. See you !
-
Jeff Delay deu reputação a Vodkart em Event BOSSlocal config = { name = "Shuryu Boss", pos = {x = 60, y = 63, z = 3}, time = 20 } function onThink(interval, lastExecution) doCreateMonster(config.name, config.pos) broadcastMessage("O "..config.name.." apareceu, voce tem "..config.time.." para mata-lo", MESSAGE_STATUS_CONSOLE_ORANGE) addEvent(function() local creature = getCreatureByName(config.name) if creature ~= nil and not isPlayer(creature) then doRemoveCreature(getTopCreature(getCreaturePosition(creature)).uid) end end, config.time*60*1000) return true end
-
Jeff Delay recebeu reputação de Cat em (Resolvido)Skill Rate/Velocidade para upar skillse pretende fazer isto em todas as skills aconselho remover esse sistema de stage e por o padrão do tibia mesmo, o que voce configura no vocation.xml e no config.xml, nada contra esse sistema mas acredito eu que eu não soube balancear bem isso ai mas tive grandes dor de cabeça, facilitou quando removi isso, acredito que na linha de skill se por a skill 1.0 e deixar o rat skill 1.0 tambem fica bem dificil de treinar ja que o limite fica mais baixo.
-
Jeff Delay recebeu reputação de ashwese1 em AJUDA AQUI +REP problemas encontrados nas spels e monsterserro dos monstro, procure esse monstro na pasta do seu servidor e remova essas 3 linhas que deve existir no monstro já que e este erro que ta dando.
<script>
<event name="questmadara"/>
</script>
caso saiba onde esta esse monstro de quest e deseje apenas reconfigurar faça isso;
vá em creaturescripts\scripts e cole este arquivo lá (questmadara.lua)
volte para pasta creaturescript e abra o arquivo creaturescripts.xml e cole esta linha la.
<event type="death" name="QuestMadara" event="script" value="questmadara.lua"/> sobre as spells possivelmente os arquivos direcionados não existe então o melhor a fazer e apagar estas linhas e refazer os arquivos melhor
vá para data/spell/spell.xml abra o spell.xml veja as spell que esta dando erro e remova elas lembrando que para evitar erro tem que remover a tag completamente, exemplo abaixo do que deve ser removido.
<instant name="Rasengan Shuriken" words="Rasenshuriken" lvl="200" mana="1900" range="2" needtarget="1" blockwalls="1" exhaustion="500" event="script" value="naruto/rasen shuriken.lua"> <vocation id="1"/> </instant>
questmadara.lua
-
Jeff Delay recebeu reputação de ashwese1 em Ajuda, problema no client, nao sei qual e o problema me ajudemmM!!Por nada!
-
Jeff Delay deu reputação a Cat em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto updatefiquei esperando surgir uma voz bonita mas nem audio tem, decepcionado..
Obrigado pelo guia @marcoshps11, otcv8 é muito bacana, eu sempre uso quando precisa logar em algum Ot.
Com certeza vai ser mt útil pra galera!
-
Jeff Delay recebeu reputação de Cat em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto updatebacana, mesmo tutorial de criptografia tem na propria pasta do otc, mas foi legal ter trazido pra cá torna mais visível, reputado
-
Jeff Delay deu reputação a marcoshps11 em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto update* Áudio de saudação *
Neste tutorial, irei ensinar alguns passos inicias para utilizar o OTClientV8
1º Passo: Como fixar ip e colocar a spr no local correto
- Faço o download no link: https://github.com/OTCv8/otclientv8
- Extraia o arquivo
- Dentro da pasta principal, vá até o arquivo init.lua
Neste trecho, precisará remover os comentários --[[ e ]]:
Servers = { --[[ OTClientV8 = "http://otclient.ovh/api/login.php", OTClientV8c = "otclient.ovh:7171", OTClientV8Test = "http://otclient.ovh/api/login2.php", LocalTestServ = "127.0.0.1:7171:1098:110:30:93" ]] }
Ficando assim:
Servers = { Meuserver = "127.0.0.1:7171:1098" } ficando na seguinte configuração NOME = "IP:PORTA:VERSÃO"
Para fixar e não aparecer a lista de servers, basta alterar:
ALLOW_CUSTOM_SERVERS = true -- if true it shows option ANOTHER on server list
Para:
ALLOW_CUSTOM_SERVERS = false -- if true it shows option ANOTHER on server list
Caso queira trocar o nome do aplicativo é só mudar
g_app.setName("OTCv8") trocando o "OTCv8" para o nome desejado, lembrando que isto irá alterar apenas o nome da janela do aplicativo
Incluir a SPR/Dat:
Para incluir, basta ir na pasta data, criar uma nova pasta e renomear com o nome "things" e depois criar uma outra pasta dentro dela com o nome da versão que desejar utilizar, exemplos:
* 800
* 860
* 910
* 1100
dentro desta pasta, incluir as respectivas spr/dat da versão correspondente
Um vídeo objetivo do conteúdo citado acima:
2º Passo: Remover campo "Token" da tela inicial
Apesar de ser algo simples, vejo muitos perguntarem como remover este campo, vamos lá:
- Vá até a pasta modules -> client_entergame
- Abra o arquivo entergame.lua
- Na linha 380 remova ou comente o trecho:
enterGame:getChildById('accountTokenTextEdit'):clearText()
- Na linha 412 remova ou comente o trecho:
G.authenticatorToken = enterGame:getChildById('accountTokenTextEdit'):getText()
- salve o arquivo
- na mesma pasta, abra o arquivo entergame.otui
- da linha 32 a 44 remova ou comente o seguinte trecho:
MenuLabel !text: tr('Token') anchors.left: prev.left anchors.top: prev.bottom text-auto-resize: true margin-top: 8 TextEdit id: accountTokenTextEdit anchors.left: parent.left anchors.right: parent.right anchors.top: prev.bottom margin-top: 2
Um vídeo objetivo do conteúdo citado acima:
3º Passo: como encriptar os arquivos
- Recomendo inicialmente criar uma cópia da pasta que ira encriptar, pois não é reversivo
- Copie o endereço da pasta onde estão os arquivos
- Abra o cmd e navegue até esta pasta utilizando o comando cd (link do endereço da pasta)
- utilize o comando otclient_dx.exe --encrypt
- Aguarde o sistema sinalizar que os arquivos foram encriptados
PS: a pasta do modulo bot ( modules -> game_bot ) não pode ser encriptado, remova ela antes deste processo.
Um vídeo objetivo do conteúdo citado acima:
4º Passo: Utilizando o auto update
IMPORTANTE:
Este processo precisa ser feito exatamente como demonstrado, qualquer link errado o sistema não irá funcionar.
- Dentro da pasta API, abra o arquivo updater_advanced.php
em $files_dir = "/var/www/otclient/files"; é a pasta onde conterá os arquivos do otclient para download, lembrando que o caminho precisa estar especificada desde a pasta inicial
em $files_url = "http://otclient.ovh/files"; é o link que você pode utilizar o navegador para acessar a pasta "files" a mesma pasta do processo anterior.
em $checksum_update_interval = 60; é o tempo em segundos, que o update levará para checkar se há alguma atualização ( não é necesário alterar )
- Na sua vps, dentro da pasta do SITE, cria uma pasta chamada API e outra pasta dentro dela chamada FILES
- Envie o arquivo updater_advanced.php para a pasta API
- De permissão 777 para pasta e subpasta API
* voltando aos arquivos do otclient *
- Abra o arquivo init.lua
aconselho alterar o "APP_NAME = "otclientv8", pois é o nome da pasta que ficará salva nos arquivos temporários, isso evitará conflitos com versões já existe no pc
altere o campo updater, colocando o endereço apontado para o arquivo updater_advanced.php enviado para o seu site nos passos anteriores.
- Após as edições anteriores, salve o arquivo
- Compacte os arquivos data, layout, modules e init.lua, renomeando para data.zip ( obrigatoriamente precisa ser zip )
- Exclua os arquivos zipados e os demais desnecessários para os jogadores.
Atenção: o auto update só funcionará se os arquivos estiverem zipado conforme descrito.
- Envie todos os arquivos para a pasta files em sua vps ( recomendo zipar para enviar, poupara processamento e tempo de envio )
- Após enviar, extraia os arquivos NA VPS, os arquivos no pc devem continuar zipado
- Atenção nesta parte, as pastas e arquivo data / layout / modules / init.lua necessáriamente precisam estar na mesma pasta do executáveis, conforme time 4:20 no vídeo que deixarei disponível no final.
lembrando: o update só aceitará arquivos editados após o tempo estipulado em checksum_update_interval , se fizer edições antes deste tempo, o sistema não irá considerar
Um vídeo objetivo do conteúdo citado acima:
-
Jeff Delay deu reputação a Lyu em Death System 2016 versão frag consecutivo!Fala rapaziada, quanto tempo sem publicar algo aqui! Bom, hoje eu venho trazer um sisteminha que é bem utilizado atualmente.
Estou falando o Death System! Porém, com algumas coisinhas a mais.
Testado em OTX Server 8.60..
Como funciona?
O Death System em alguns servidores possui um channel chamado "Mortes" ou "Death Channel",
mas há alguns servidores que preferem que seja anunciado no default mesmo e a função é informar
quem matou quem, ou quem foi morto por certo monstro.
O que há de novo?
Bom, agora quem matar x jogadores(configurável) e essa quantia for uma consecutiva, será anunciado isso :
E se algum jogador derrotá-lo dentro a consecutiva, será anunciado isso :
Vamos ao sistema :
em data/XML/channels.xml, adicione isso :
<channel id="15" name="Death Channel"/> em data/creaturescripts/creaturescripts.xml :
<event type="death" name="deathchannel" event="script" value="deathchannel.lua"/> em data/creaturescripts/login.lua, adicione isso antes do último return true :
registerCreatureEvent(cid, "deathchannel") em data/creaturescripts/scripts, crie um arquivo deathchannel.lua e cole isso dentro :
-- Coded by Zoom.. local info, win, lose = "%s [Level: %s] foi mort%s pelo %s %s%s", "%s obteve %s frags seguidos após derrotar %s.", "%s acabou de impedir que %s fizesse uma sequência de %s frags seguidos." local frags, storage = {10, 15, 20, 25, 30, 35, 40, 45, 50}, 30045 function onDeath(cid, corpse, deathList) if(not isPlayer(cid)) then return true end local target = deathList[1] doCreatureSetStorage(target, storage, getCreatureStorage(target, storage) + (getCreatureStorage(target, storage) == -1 and 2 or 1)) for _, pid in ipairs(getPlayersOnline()) do doPlayerSendChannelMessage(pid, '', info:format(getCreatureName(cid), getPlayerLevel(cid), getPlayerSex(cid) == 1 and "o" or "a", isPlayer(target) and "player" or "monstro", getCreatureName(target), isPlayer(target) and " [Level: "..getPlayerLevel(target).."]." or "."), TALKTYPE_CHANNEL_ORANGE, 0xF) for _, frag in ipairs(frags) do if(getCreatureStorage(target, storage) == frag) then doPlayerSendChannelMessage(pid, '', win:format(getCreatureName(target), frag, getCreatureName(cid)), TALKTYPE_CHANNEL_MANAGEMENT, 0xF) end if(getCreatureStorage(cid, storage) >= frag) then doPlayerSendChannelMessage(pid, '', lose:format(getCreatureName(target), getCreatureName(cid), getCreatureStorage(cid, storage)+1), TALKTYPE_GAMEMASTER_CHANNEL, 0xF) end end end doCreatureSetStorage(cid, storage, 0) return true end Há uma única configuração, que é as consecutivas :
local frags = {10, 15, 20, 25, 30, 35, 40, 45, 50}
completou 10 frags? anuncia! e assim sucessivamente..
Créditos : EU
-
Jeff Delay deu reputação a LeoTK em [Raid Automatica] MOD Raid Automatica Edit: BrundsSalve galera bom achei esse mod de raid do @Vodkart e Xotservx e resolvi dar uma embelezada, adicionar um mini-tutorial dentro do mod, algumas coisas a mais para facilitar a configuração, alguns efeitos quando os monstros da invasão é sumonado, porém não consegui colocar para aparecer efeito quando os monstros forem removidos, se alguém quiser contribuir e adicionar essa função pra mostrar um efeito nos monstros quando forem removidos sinta-se livre e se for o caso eu atualizo o tópico com essa modificação.
Mod Abaixo
Vídeo de demonstração
Nota: 25/02/2019
(Problemas corrigidos pelo @Vodkart, Efeito quando os monstros forem removidos, e mobs deixando de tentar nascer dentro de casas e área pz e nascendo ao lado)
Espero que gostem do script
Créditos total ao
@Vodkart
xotservx
-
Jeff Delay recebeu reputação de ashwese1 em Ajuda, problema no client, nao sei qual e o problema me ajudemmM!!otfit não e pic, ele é para usar no remeres, baixe um cliente qualquer descompilado e pega o tibia.´pic
-
Jeff Delay deu reputação a JZDJ em Cartoon Maps (mapas de desenho animado)Olá galerinha do Tibia King.
Alguns anos atrás eu comecei um projeto só com mapas de desenho animado que chamei de CARTOON SERVER.
Hoje devido a falta de tempo, família e trabalho não tenho mais como levá-lo adiante.
Então resolvi postar aqui o mapa que eu criei, na verdade são vários mapas em um único arquivo.
O projeto está somente com a base que eu comecei e ainda precisa de 99% de trabalho para terminá-lo.
Caso alguém se interesse por uma ou mais áreas fique a vontade para baixar e criar do seu jeito.
Algumas imagens dos mapas:
mapa cartoon.rar
SCAN
Fiquem a vontade para baixar, editar, compartilhar ou seja lá oq fizerem hehehehe.
Espero que gostem.
-
Jeff Delay deu reputação a Cat em [novo] » Mapas do NolisEm minhas caminhadas dentre as montanhas do vale do Itapocu e as ruínas antigas da Itália , gravei em minha memória a sensação única que é se aventurar na natureza.
Ela é rica em detalhes, momentos arquitetados pelo tempo e pelas criaturas.
Transmitir essa emoção no universo do mapping é minha missão.
Shinobi Universe
Outras amostras: