Ir para conteúdo
Propaganda

Filipe Carvalho

Membro
  • Total de Posts

    5
  • Registro em

  • Última visita

  • Dias Ganhos

    2

Filipe Carvalho ganhou no último dia 3 de Janeiro

Filipe Carvalho teve o conteúdo mais curtida!

Sobre Filipe Carvalho

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

Filipe Carvalho's Achievements

Apprentice

Apprentice (3/14)

  • Conversation Starter Rara
  • One Year In
  • One Month Later
  • First Post
  • Reacting Well

Emblemas Recentes

77

Reputação

  1. Tenho exatamente o que você procura! OTG-Server-1.4-Clean
  2. 🪽 24 sprites de asas ✔️ HellGrave ✔️ Todas centralizadas ✔️ Sprites + BMP inclusos ✔️ Scan de segurança no VirusTotal Prontas para uso em OTServer
  3. Em src/game.cpp acima de: void Game::addMagicEffect(const Position& pos, uint8_t effect) Adicione isso: void Game::updateCreature(const Creature* creature) { SpectatorHashSet spectators; map.getSpectators(spectators, creature->getPosition(), true, true); for (Creature* spectator : spectators) { if (Player* tmpPlayer = spectator->getPlayer()) { tmpPlayer->sendUpdateCreature(creature); } } } Em src/game.h acima de: void addMagicEffect(const Position& pos, uint8_t effect); Adicione isso: void updateCreature(const Creature* creature); Em src/player.cpp abaixo de: g_game.addCreatureHealth(this); Adicione isso: g_game.updateCreature(this); Em src/player.h acima de: void sendPlayerMana(const Player* player) const { Adicione isso: void sendUpdateCreature(const Creature* creature) const { if (client) { client->sendUpdateCreature(creature); } } Em src/protocolgame.cpp acima de: void ProtocolGame::sendFYIBox(const std::string& message) Adicione isso: void ProtocolGame::sendUpdateCreature(const Creature* creature) { if (!canSee(creature)) { return; } const Position& pos = creature->getPosition(); int32_t stackpos = creature->getTile()->getClientIndexOfCreature(player, creature); if (stackpos == -1) { return; } NetworkMessage msg; msg.addByte(0x6B); msg.addPosition(pos); msg.addByte(stackpos); AddCreature(msg, creature, false, 0); writeToOutputBuffer(msg); } Em src/protocolgame.h acima de: void sendPlayerMana(const Player* target); Adicione isso: void sendUpdateCreature(const Creature* creature); Em src/protocolgamebase.cpp no lugar de: msg.addString(creature->getName()); Adicione isso: if (const Player* p = creature->getPlayer()) { msg.addString(p->getName() + " Lv." + std::to_string(p->getLevel())); } else { msg.addString(creature->getName()); }
      • 5
      • Like
      • Thanks
  4. Criei esse autoloot com a ajuda do chatgpt e vim compartilhar com alguns que não conseguem adicionar um autoloot ao seu otserv de forma simples. Como funciona? Adiciona drops personalizados por monstro, sem usar loot.xml Executa automaticamente quando um monstro é morto (onKill) Só aplica o drop se o monstro estiver configurado na lista customDrops Sorteia cada item individualmente com base na chance definida Sorteia a quantidade mínima e máxima de cada item Envia o loot diretamente para a mochila do jogador Se o jogador estiver em party, o loot vai para o leader O leader só recebe o loot se estiver: No mesmo andar (z) A até 8 SQMs de distância Empilha gold coins corretamente (máximo de 100 por stack) Envia mensagem de loot no formato padrão: Loot of a rat: 3 gold coin e 1 cheese Envia a mensagem para todos os membros da party Mostra efeito mágico azul na posição do jogador que recebeu o loot Detecta mochila cheia Remove o item se não couber na mochila Avisa o jogador quando algum item é perdido por falta de espaço Não cria itens no chão Não interfere no drop padrão do monstro (se existir) Não depende de banco de dados Compatível com TFS 1.x Como adicionar ao serv? Procure pela pasta, data\creaturescripts Dentro da pasta, data\creaturescripts, abra o arquivo, creaturescripts.xml e cole isso: <event type="kill" name="autoloot" script="autoloot.lua"/> Procure pela pasta, data\creaturescripts\scripts\others Dentro da pasta, data\creaturescripts\scripts\others, abra o arquivo, login.lua e cole isso nos registros abaixo: player:registerEvent("autoloot") Ficando mais ou menos assim: player:registerEvent("Idle") player:registerEvent("Recompensa") player:registerEvent("SoulWarBosses") player:registerEvent("AdventurerBlessings") player:registerEvent("vortexSpawnCarlin") player:registerEvent("PlayerDeath") player:registerEvent("autoloot") Procure pela pasta, data\creaturescripts\scripts Dentro da pasta, data\creaturescripts\scripts, crie um arquivo chamado autoloot.lua e cole o script dentro do arquivo e depois salve-o: -- LISTA DE DROPS PERSONALIZADOS local customDrops = { ["rat"] = { { itemId = 2148, chance = 100, minCount = 1, maxCount = 4 }, -- gold coin { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese }, } -- Formata texto do loot local function formatDropList(parts) if #parts == 1 then return parts[1] elseif #parts == 2 then return parts[1] .. " e " .. parts[2] end return table.concat(parts, ", ", 1, #parts - 1) .. " e " .. parts[#parts] end -- Verifica se o leader está próximo e no mesmo andar local function isLeaderVisible(members, leader) if not leader then return false end local leaderPos = leader:getPosition() for _, member in ipairs(members) do local memberPos = member:getPosition() if memberPos.z == leaderPos.z and memberPos:getDistance(leaderPos) <= 8 then return true end end return false end function onKill(player, creature) if not player or not creature then return true end local dropList = customDrops[creature:getName():lower()] if not dropList then return true end -- Define quem recebe o loot local dropPlayer = player local members = { player } local leader local party = player:getParty() if party then members = party:getMembers() leader = party:getLeader() if leader and isLeaderVisible(members, leader) then dropPlayer = leader end end local backpack = dropPlayer:getSlotItem(CONST_SLOT_BACKPACK) local lootLost = false local messageParts = {} for _, drop in ipairs(dropList) do if math.random(100) <= drop.chance then local amount = math.random(drop.minCount, drop.maxCount) -- GOLD COINS (empilhamento até 100) if drop.itemId == 2148 then local remaining = amount local added = 0 while remaining > 0 do local stack = math.min(remaining, 100) local item = Game.createItem(2148, stack) if item and backpack and backpack:addItemEx(item) == RETURNVALUE_NOERROR then added = added + stack else if item then item:remove() end lootLost = true end remaining = remaining - stack end if added > 0 then table.insert(messageParts, added .. " gold coin") end else local item = Game.createItem(drop.itemId, amount) if item and backpack and backpack:addItemEx(item) == RETURNVALUE_NOERROR then table.insert(messageParts, amount .. " " .. ItemType(drop.itemId😞getName()) else if item then item:remove() end lootLost = true end end end end -- Mensagem de loot if #messageParts > 0 then local text = formatDropList(messageParts) for _, member in ipairs(members) do member:sendTextMessage( MESSAGE_INFO_DESCR, "Loot of a " .. creature:getName():lower() .. ": " .. text ) end dropPlayer:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) end -- Aviso de mochila cheia if lootLost then dropPlayer:sendTextMessage( MESSAGE_INFO_DESCR, "Sua mochila está cheia, alguns itens foram perdidos." ) end return true end Uma mensagem será exibido para todos da party sendo exibida no na tela e também no server log: Loot of a slime lord: 1 gold coin Caso queira adicionar algum novo monstro para drop automático: Primeiro retire o corpse dos monstro que serão adicionados ao script na pasta data\monster, abra o xml do monstro em <look type="21" corpse=""/>, deixe assim, vazio entre "". Pronto, agora vamos adicionar mais montros. Procure pela pasta, data\creaturescripts\scripts Dentro da pasta, data\creaturescripts\scripts, agora abra o arquivo chamado autoloot.lua Busque por: ["rat"] = { { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese }, Copie o código acima até a e cole, ficando como no exemplo abaixo! local customDrops = { ["rat"] = { { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese }, ["rabbit"] = { { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin { itemId = 2666, chance = 50, minCount = 1, maxCount = 1 }, -- meat }, } E para adicionar um novo item a ser dropado faça assim! local customDrops = { ["nomedomonstro"] = { { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese { itemId = iddoitem, chance = chancededropde1a100, minCount = quantidademinimadedrop, maxCount = quantidademaximadedrop }, -- nome do item para nao se perder }, } Se quiser também aumentar a dificuldade de 1 para 100 pra 1 para 1000 só alterar essa parte: 1 entre 100 if math.random(1, 100) <= drop.chance then 1 entre 1000 ou mais if math.random(1, 1000) <= drop.chance then Pronto, agora só usar e ser feliz. Qualquer dúvida deixe abaixo, estarei ajudando no que precisar.
      • 3
      • Like
  5. Como faço para usar os training offline?
×
  • Criar Novo...