Ir para conteúdo
Banner com Efeitos

Movie

Membro
  • Registro em

  • Última visita

Tudo que Movie postou

  1. Não mexo com versões que tem o market incluso, no passar dos dias irei dar uma olhada nas sources, se eu achar te passo a informação.
  2. Houve uma pequena alteração no código. Aos que estavam usando, favor atualizar na sua datapack.
  3. Movie postou uma resposta no tópico em Mapas de Tibia
    O script desse mapa está disponível no Thunder
  4. Agora eu sei resolver grande parte desses erros aí, seu corno... Porém é um ótimo servidor para se trabalhar e faltam poucas coisas para se terminar ele.
  5. Movie postou uma resposta no tópico em Websites
    Utilize Linux para rodar seu OT e seu site. Até então, não sei a versão que pode ser utilizada em Windows. Em breve irei disponibilizar um novo site melhor, mas sem data prevista.
  6. Peço perdão, tinha totalmente esquecido de compilar e deixar disponível aqui.
  7. Não chegou a ser aberto não. Estava desenvolvendo porém perdi o interesse em continuar e resolvi abrir o projeto para a comunidade.
  8. Apenas se você editar a parte de sprites do cliente ou se não adaptar a parte de montarias das versões mais novas (10.x) para essa mais antiga (8.60)
  9. Os arquivos serão disponibilizados através da plataforma GitHub, onde você poderá acompanhar as atualizações que poderão ocorrer. https://github.com/moviebr/baiakthunder Updates: 24/01/2021 - https://github.com/moviebr/baiakthunder/pull/7 Imagens Link para o projeto https://github.com/moviebr/baiakthunder Créditos - Desenvolvedores do TFS; - @moviebr (@Breno Alves ); - @DdJs (Felipe); - @crypter (Gustavo); - Nolis (Daniel - @Cat).
  10. Itens aleatórios como prêmio, você diz?
  11. Evento Monster Hunt Durante uma hora, o player que mais matar um monstro específico ganha o evento. Na pasta lib, crie um arquivo chamado monsterHunt.lua com isso dentro MONSTER_HUNT = { list = {"Demon", "Rotworm", "Cyclops"}, days = { ["Sunday"] = {"13:55"}, ["Monday"] = {"13:55"}, ["Tuesday"] = {"13:55"}, ["Wednesday"] = {"13:55"}, ["Thursday"] = {"13:55"}, ["Friday"] = {"13:55"}, ["Saturday"] = {"13:55"}, }, messages = { prefix = "[Monster Hunt] ", warnInit = "O evento irá começar em %d minuto%s. Seu objetivo será matar a maior quantidade de monstros escolhidos pelo sistema.", init = "O monstro escolhido pelo sistema foi %s. Você tem 1 hora para matar a maior quantidade desse monstro.", warnEnd = "Faltam %d minuto%s para acabar o evento. Se apressem!", final = "O jogador %s foi o ganhador do evento! Parabéns.", noWinner = "Não houve ganhadores no evento.", reward = "Você recebeu o seu prêmio no mailbox!", kill = "Você já matou {%d} %s do evento.", }, rewards = { {id = 2160, count = 100}, }, storages = { monster = 891641, player = 891642, }, players = {}, } function MONSTER_HUNT:initEvent() Game.setStorageValue(MONSTER_HUNT.storages.monster, 0) Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnInit:format(5, "s")) addEvent(function() Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnInit:format(3, "s")) end, 2 * 60 * 1000) addEvent(function() Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnInit:format(1, "")) end, 4 * 60 * 1000) addEvent(function() local rand = math.random(#MONSTER_HUNT.list) Game.setStorageValue(MONSTER_HUNT.storages.monster, rand) Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.init:format(MONSTER_HUNT.list[rand])) end, 5 * 60 * 1000) return true end function MONSTER_HUNT:endEvent() Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnEnd:format(5, "s")) addEvent(function() Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnEnd:format(3, "s")) end, 2 * 60 * 1000) addEvent(function() Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.warnEnd:format(1, "")) end, 4 * 60 * 1000) addEvent(function() if #MONSTER_HUNT.players == nil then Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.noWinner) return end table.sort(MONSTER_HUNT.players, function(a,b) return a[2] > b[2] end) local player = Player(MONSTER_HUNT.players[1][1]) if player then Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.final:format(player:getName())) player:setStorageValue(MONSTER_HUNT.storages.player, -1) for c, d in ipairs(MONSTER_HUNT.rewards) do local item = Game.createItem(d.id, d.count) player:addItemEx(item) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.reward) player:getPosition():sendMagicEffect(30) end --[[ Função exclusiva (ignore) else local player = Player(MONSTER_HUNT.players[1][1], true) if not player then return false end Game.broadcastMessage(MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.final:format(player:getName())) player:setStorageValue(MONSTER_HUNT.storages.player, -1) for c, d in ipairs(MONSTER_HUNT.rewards) do local item = Game.createItem(d.id, d.count) player:getInbox():addItemEx(item, INDEX_WHEREEVER, FLAG_NOLIMIT) end player:delete() --]] end for a, b in pairs(MONSTER_HUNT.players) do local player = Player(b[1]) if player then player:setStorageValue(MONSTER_HUNT.storages.player, 0) MONSTER_HUNT.players[a] = nil --[[ Função exclusiva (ignore) else player = Player(b[1], true) player:setStorageValue(MONSTER_HUNT.storages.player, 0) MONSTER_HUNT.players[a] = nil player:delete() --]] end end Game.setStorageValue(MONSTER_HUNT.storages.monster, -1) end, 5 * 60 * 1000) return true end Não esqueça de registrar essa lib no lib.lua Agora em globalevents, crie um arquivo na pasta scripts com isso dentro function onThink(interval) if MONSTER_HUNT.days[os.date("%A")] then local hrs = tostring(os.date("%X")):sub(1, 5) if isInArray(MONSTER_HUNT.days[os.date("%A")], hrs) then MONSTER_HUNT:initEvent() end end return true end function onTime(interval) MONSTER_HUNT:endEvent() return true end Não esqueça de adicionar a tag no globalevents <globalevent name="MonsterHunt" interval="60000" script="custom/events/monsterHunt.lua" /> <globalevent name="MonsterHuntEnd" time="14:55" script="custom/events/monsterHunt.lua" /> Agora em creaturescripts, crie um arquivo na pasta scripts com isso dentro function onKill(player, target) if Game.getStorageValue(MONSTER_HUNT.storages.monster) == nil then return true end if not player or not target then return true end if player:getStorageValue(MONSTER_HUNT.storages.player) == -1 then player:setStorageValue(MONSTER_HUNT.storages.player, 0) end if target:isMonster() and target:getName():lower() == (MONSTER_HUNT.list[Game.getStorageValue(MONSTER_HUNT.storages.monster)]):lower() then player:setStorageValue(MONSTER_HUNT.storages.player, player:getStorageValue(MONSTER_HUNT.storages.player) + 1) player:sendTextMessage(MESSAGE_STATUS_BLUE_LIGHT, MONSTER_HUNT.messages.prefix .. MONSTER_HUNT.messages.kill:format(player:getStorageValue(MONSTER_HUNT.storages.player), target:getName())) table.insert(MONSTER_HUNT.players, {player:getId(), player:getStorageValue(MONSTER_HUNT.storages.player)}) end return true end Com a tag no creaturescripts <event type="kill" name="MonsterHunt" script="custom/monsterHunt.lua" /> Não esqueça de registrar o evento no login.lua player:registerEvent("MonsterHunt") Bom aproveito. Créditos: 100% meu
  12. Movie postou uma resposta no tópico em Códigos C++
    Square System Esse sistema irá possibilitar você colocar uma square em determinado player. Em luascript.cpp, acima de registerMethod("Player", "isPlayer", LuaScriptInterface::luaPlayerIsPlayer); coloque isso registerMethod("Player", "sendCreatureSquare", LuaScriptInterface::luaSendCreatureSquare); Agora, acima de int LuaScriptInterface::luaPlayerCreate(lua_State* L) Coloque isso int LuaScriptInterface::luaSendCreatureSquare(lua_State* L) { // player:sendCreatureSquare(creature, color) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } Creature* creature = getUserdata<Creature>(L, 2); if (!creature) { lua_pushnil(L); return 1; } uint32_t color = getNumber<uint32_t>(L, 3, 0); player->sendCreatureSquare(creature, static_cast <SquareColor_t>(color)); lua_pushboolean(L, true); return 1; } Agora em luascript.h, antes de static int luaPlayerIsPlayer(lua_State* L); adicione isso static int luaSendCreatureSquare(lua_State* L); Agora para utilizar use player:sendCreatureSquare(creature, color) Boa criatividade. Créditos: 100% meu
  13. Loot Channel para TFS 1.X Liberando mais alguns conteúdos para vocês. Dessa vez o loot channel para tfs 1.x. Crie um arquivo chamado loot.lua na pasta chatchannels/scripts contendo isso local STORAGEVALUE_LOOT = 8914 function onSpeak(player, type, message) return false end function onJoin(player) player:setStorageValue(STORAGEVALUE_LOOT, 1) return true end function onLeave(player) player:setStorageValue(STORAGEVALUE_LOOT, 0) return true end Agora em chatchannels.xml adicione a tag <channel id="11" name="Loot" script="loot.lua" /> Em events/scripts, abra o arquivo monster.lua e você provavelmente irá encontra-lo assim function Monster:onDropLoot(corpse) if configManager.getNumber(configKeys.RATE_LOOT) == 0 then return end local player = Player(corpse:getCorpseOwner()) local mType = self:getType() if not player or player:getStamina() > 840 then local monsterLoot = mType:getLoot() for i = 1, #monsterLoot do local item = corpse:createLootItem(monsterLoot[i]) if not item then print('[Warning] DropLoot:', 'Could not add loot item to corpse.') end end if player then local text = ("Loot of %s: %s"):format(mType:getNameDescription(), corpse:getContentDescription()) local party = player:getParty() if party then party:broadcastPartyLoot(text) else player:sendTextMessage(MESSAGE_INFO_DESCR, text) end end else local text = ("Loot of %s: nothing (due to low stamina)"):format(mType:getNameDescription()) local party = player:getParty() if party then party:broadcastPartyLoot(text) else player:sendTextMessage(MESSAGE_INFO_DESCR, text) end end end Altere para esse local STORAGEVALUE_LOOT = 8914 function Monster:onDropLoot(corpse) if configManager.getNumber(configKeys.RATE_LOOT) == 0 then return end local player = Player(corpse:getCorpseOwner()) local mType = self:getType() if not player or player:getStamina() > 840 then local monsterLoot = mType:getLoot() for i = 1, #monsterLoot do local item = corpse:createLootItem(monsterLoot[i]) if not item then print('[Warning] DropLoot:', 'Could not add loot item to corpse.') end end if player then local text = ("Loot de %s: %s"):format(mType:getNameDescription(), corpse:getContentDescription()) local party = player:getParty() if party then party:broadcastPartyLoot(text) else if player:getStorageValue(STORAGEVALUE_LOOT) == 1 then sendChannelMessage(11, TALKTYPE_CHANNEL_O, text) else player:sendTextMessage(MESSAGE_INFO_DESCR, text) end end end else local text = ("Loot de %s: nada (devivo a baixa stamina)"):format(mType:getNameDescription()) local party = player:getParty() if party then party:broadcastPartyLoot(text) else if player:getStorageValue(STORAGEVALUE_LOOT) == 1 then sendChannelMessage(11, TALKTYPE_CHANNEL_O, text) else player:sendTextMessage(MESSAGE_INFO_DESCR, text) end end end end Pronto, adicionado o Loot Channel! Créditos: 100% meu
  14. Movie postou uma resposta no tópico em Suporte Tibia OTServer
    A melhor forma seria via getSpectators.
  15. Ando muito ocupado, as vezes que entro no fórum ou no discord da academia de codding estou pelo celular. De qualquer forma, irei disponibilizar isso gratuitamente, portanto faço no meu tempo. Espero que consiga trazer logo pro 1.x, daí não vou ter que terminar de passar
  16. No 1.x funciona sem as libs. Para usar com 0.x precisa das libs.
  17. Fala pessoal, como vocês estão? Na academia de codding um usuário pediu ajuda para montar um "gerenciador" de quests, para que todas ficassem no mesmo arquivo sem ficar com aquele "spam" de quests nas actions. Esse script foi feito para a TFS 1.X mas, usando a lib do @Mathias Kenfi, você consegue utilizar para TFS 0.X também. O link para as libs: https://github.com/kenfi2/KenfiLib Na pasta actions/scripts crie um arquivo chamado quests.lua config = { quests = { [7172] = { -- ActionID que será colocado no baú name = "dos Crystal Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91143, -- Apenas uma key por quest }, effectWin = 30, -- Efeito que vai aparecer quando fizer a quest }, [7171] = { -- ActionID que será colocado no baú name = "dos Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count {id = 2152, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91140, -- Apenas uma key por quest }, effectWin = 29, -- Efeito que vai aparecer quando fizer a quest }, }, messages = { notExist = "Essa quest não existe.", win = "Você fez a quest %s.", notWin = "Você já fez a quest %s.", level = "Você precisa de level %d ou maior para fazer a quest %s.", }, } function onUse(cid, item, fromPosition, target, toPosition, isHotkey) local player = Player(cid) local choose = config.quests[item.actionid] if not choose then player:sendCancelMessage(config.messages.notExist) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.level.active and player:getLevel() < choose.level.min then player:sendCancelMessage(config.messages.level:format(choose.level.min, choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.storage.active and player:getStorageValue(choose.storage.key) >= 0 then player:sendCancelMessage(config.messages.notWin:format(choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end for i = 1, #choose.rewards do player:addItem(choose.rewards[i].id, choose.rewards[i].count) end player:setStorageValue(choose.storage.key, 1) player:sendCancelMessage(config.messages.win:format(choose.name)) player:getPosition():sendMagicEffect(choose.effectWin) return true end Para configurar é só utilizar ler os comentários deixados e para adicionar mais quests apenas use o mesmo padrão que deixei aí Utilize a tag no actions.xml desse forma <action fromaid="7171" toaid="7172" script="quests.lua" /> Sendo que o "fromaid" é a actionid inicial, e o "toaid" é a última actionid registrada no arquivo. Qualquer problema, relate nesse tópico.
  18. Você conferiu se sua versão é 1.x?
  19. Se alguém aí tiver o servidor e puder reupar e me mandar o link para eu atualizar o tópico, ficarei agradecido. Não faço pois já não tenho mais o servidor.
  20. Movie postou uma resposta no tópico em Portal
    Desculpe, mas mesmo vocês sendo donos do TibiaKing e UnderWar, EU acho meio nada haver postar nessa seção em que tecnicamente serviria para avisos do TibiaKing. Eu acharia super normal se postasse em algo relacionado a divulgação e tudo mais... Mas essa é apenas a minha opinião, quem manda são vocês.
  21. É assim mesmo, diria que seria a melhor solução, confesso que nem lembrei do isInArray, boa jogada.
  22. Tem essa opção também, mas pegaria tecnicamente todas... Caso fosse somente a 1 e a 3, teria que ser pelo or mesmo. Mas boa observação!
  23. Nesse caso, não seria and.. seria or if creature:isPlayer() and (creature:getVocation():getClientId()) == 1 or (creature:getVocation():getClientId()) == 2 or (creature:getVocation():getClientId()) == 4 then
  24. Quando você usa com storage, você precisa comparar, porque a storage pode assumir diversos valores. Por exemplo, se você tentar fazer isso, você vai comparar o valor com o que? Isso o lua não entende if player:getStorageValue(1771) then O certo seria if player:getStorageValue(1771) == (valor) then Não sei se conseguiu entender.. caso não tenha entendido me avisa.

Informação Importante

Confirmação de Termo