-
Total de itens
156 -
Registro em
-
Última visita
-
Dias Ganhos
19
El Rusher venceu a última vez em Setembro 24
El Rusher had the most liked content!
Sobre El Rusher
Perfil
-
Gênero
Masculino
Informações
-
Forma que conheci o xTibia
Outros Sites
-
Sou
Programador
Últimos Visitantes
2245 visualizações
El Rusher's Achievements
-
Soul System: ok!, action: ok!, auras: ok!, creaturescript: ok!, soul: ok! conclusao: Certifique-se de que o item que você está tentando encantar está listado em L_Soul.enchant.weapons. Cada item deve ter o ID correto correspondente. Atributos do Item: Verifique se os atributos como "Soul" estão sendo corretamente definidos no item durante o processo de encantamento. Pode haver um problema de manipulação de atributos. Tipos de Danos e Efeitos: Confira se os tipos de danos e efeitos estão definidos corretamente em L_Soul.souls para garantir que o encantamento aplique o efeito esperado. Garanta que as funções externas, como L_Soul.souls, L_Soul.creatures, L_Soul.lang, e L_Soul.language, estejam devidamente carregadas e acessíveis.
-
Esse erro indica que o sistema está tentando executar a função onUse, mas não consegue encontrá-la corretamente.. Verifique a função onUse: Certifique-se de que a função onUse está corretamente definida no seu arquivo scripts/water action.lua. Deve estar assim: function onUse(player, item, fromPosition, target, toPosition, isHotkey) -- Seu código aqui return true end Verifique a configuração do arquivo actions.xml: No arquivo actions.xml (localizado na pasta data/actions), certifique-se de que o caminho para o script está correto. Deve parecer algo como: <action itemid="XXXX" script="water action.lua"/> Certifique-se de que o script está na pasta correta: Verifique se o arquivo water action.lua está realmente localizado na pasta scripts dentro de data/actions.
-
Smash Tibia 24 reagiu a uma resposta a uma pergunta: MOVIMENTAÇÃO A CADA ATAQUE
-
Smash Tibia 24 reagiu a uma resposta a uma pergunta: Mudar o modo de batalha do jogo
-
Smash Tibia 24 reagiu a uma resposta a uma pergunta: Sistema SURF ou NAVGAÇÃO
-
Como eu abro a porta no modem DVR CLARO 7171 e 7172
pergunta respondeu ao Muvuka de El Rusher em Infraestrutura
esse login e senha geralmente fica em baixo ou atras do seu roteador, caso nao tiver, solicite a provedora da sua internet -
Procure o arquivo CSS do seu site: Normalmente, o arquivo CSS está na pasta layouts, css, ou styles do seu site. O nome do arquivo pode ser algo como styles.css, main.css, ou similar. Abra o arquivo CSS e localize a seção correspondente ao Highscore Box: Use um editor de texto (como Notepad++ ou VSCode) e procure por classes ou IDs relacionados ao Highscore Box, como .highscore, #highscore, ou algo similar. Ajuste a fonte: Adicione ou modifique a propriedade font-family. Por exemplo: .highscore { font-family: Arial, sans-serif; /* Ou a fonte de sua preferência */ }
-
El Rusher alterou sua foto pessoal
-
-- kills.lua function onSay(cid, words, param) if not isPlayer(cid) then return false end -- Obtém o GUID do jogador local playerGUID = getPlayerGUID(cid) local resultId = db.storeQuery("SELECT unjustified_frags_day, unjustified_frags_week, unjustified_frags_month FROM player_kills WHERE player_id = " .. playerGUID) if resultId ~= false then -- Recupera os frags injustificados local unjustifiedKillsDay = result.getDataInt(resultId, "unjustified_frags_day") or 0 local unjustifiedKillsWeek = result.getDataInt(resultId, "unjustified_frags_week") or 0 local unjustifiedKillsMonth = result.getDataInt(resultId, "unjustified_frags_month") or 0 -- Configuração de quantos frags são necessários para obter red skull ou ban local dailyFragLimit = getConfigValue("dailyFragsToRedSkull") or 3 local weeklyFragLimit = getConfigValue("weeklyFragsToRedSkull") or 5 local monthlyFragLimit = getConfigValue("monthlyFragsToRedSkull") or 10 -- Envia as informações ao jogador doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsDay .. " mortes injustificadas nas últimas 24 horas.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsWeek .. " mortes injustificadas nos últimos 7 dias.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsMonth .. " mortes injustificadas nos últimos 30 dias.") -- Informar se está perto de obter red skull ou ban if unjustifiedKillsDay >= dailyFragLimit or unjustifiedKillsWeek >= weeklyFragLimit or unjustifiedKillsMonth >= monthlyFragLimit then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Cuidado! Você está próximo de obter uma Red Skull ou ser banido!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você ainda está seguro, mas continue atento às suas mortes injustificadas.") end result.free(resultId) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível recuperar suas mortes injustificadas.") end return true end Certifique-se de que o banco de dados contém as colunas unjustified_frags_day, unjustified_frags_week e unjustified_frags_month na tabela player_kills. Além disso, ajuste os valores de configuração dailyFragsToRedSkull, weeklyFragsToRedSkull, e monthlyFragsToRedSkull para se alinhar ao que você deseja no arquivo de configuração do servidor.
-
em data/actions/scripts/water_action.lua: local waterOutfit = {lookType = 134} -- ID da outfit para o navio local originalVoc = 1 -- Vocação original que o player retorna ao sair da água function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end -- Verifica se o jogador já está na outfit de navio if player:getOutfit().lookType ~= waterOutfit.lookType then player:setStorageValue(12345, player:getVocation():getId()) -- Salva a vocação original do jogador player:setOutfit(waterOutfit) -- Altera para a outfit de navio player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você entrou na água e agora está em modo de navegação!") end return true end function onStepOut(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end local originalVocationId = player:getStorageValue(12345) if originalVocationId > 0 then player:setVocation(Vocation(originalVocationId)) -- Retorna à vocação original player:setOutfit({lookType = player:getSex() == PLAYERSEX_FEMALE and 136 or 128}) -- Outfit padrão baseado no sexo do jogador player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você saiu da água e voltou ao modo normal.") end return true end Adicione o seguinte ao seu arquivo actions.xml que fica em data/actions/actions.xml: <action actionid="1001" script="water_action.lua"/> No seu editor de mapas, configure os tiles da área de água que o jogador vai entrar para a ActionID 1001. Observações A waterOutfit pode ser alterada para qualquer ID de outfit que você deseja usar para o "modo navio". Lembre-se de ajustar os IDs de acordo com as vocações e outfits que você quer utilizar. Ao pisar na água, a outfit do jogador mudará, e ao sair, ele retornará à sua vocação e outfit originais. Isso deve lhe dar uma base para começar a implementar a funcionalidade de navegação que você deseja!
-
1. Criar um comando para CTRL + Z (reportar bugs) No TFS, crie um comando que simule a função de CTRL + Z, que vai gerar um arquivo de log específico para bugs. Arquivo: talkactions/scripts/report_bug.lua function onSay(player, words, param) local reportText = param if reportText == "" then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa especificar um relatório de bug.") return false end local file = io.open("data/logs/bug_reports.log", "a") file:write("Player: " .. player:getName() .. " reported: " .. reportText .. "\n") file:close() player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Bug reportado com sucesso.") return true end 2. Criar um comando para CTRL + J (log de players) Em seguida, crie um comando que simule a função de CTRL + J, para criar logs de atividades de jogadores. Arquivo: talkactions/scripts/log_player.lua function onSay(player, words, param) local logMessage = param if logMessage == "" then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa especificar o log.") return false end local file = io.open("data/logs/player_logs.log", "a") file:write("Player: " .. player:getName() .. " log message: " .. logMessage .. "\n") file:close() player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Log gravado com sucesso.") return true end 3. Configurar talkactions.xml Agora, adicione os comandos ctrlz e ctrlj no arquivo talkactions.xml para associar os scripts que você criou: Arquivo: talkactions.xml <talkaction words="/ctrlz" script="report_bug.lua"/> <talkaction words="/ctrlj" script="log_player.lua"/> 4. Como Usar Para reportar um bug (equivalente ao CTRL + Z), o jogador digita no chat: /ctrlz [descrição do bug] Para registrar um log de jogador (equivalente ao CTRL + J), o jogador digita no chat: /ctrlj [mensagem de log]
-
sim.. Crie um script chamado depot_sync.lua com o seguinte conteúdo: local function syncDepots(player) local mainDepot = player:getDepot(1) -- ID do depot do CP local houseDepot = player:getDepot(2) -- ID do depot na casa (ajuste conforme necessário) -- Sincroniza os itens do depot da casa com o depot do CP for i = 0, houseDepot:getCapacity() - 1 do local item = houseDepot:getItem(i) if item then mainDepot:addItemEx(item) end end end function onUse(player, item, fromPosition, target, toPosition, isHotkey) syncDepots(player) player:sendTextMessage(MESSAGE_INFO_DESCR, "Seus depots foram sincronizados com sucesso.") return true end Substitua XXXX pelo ID do item que você quer usar para abrir e sincronizar o depot. Como Funciona: O script sincroniza os itens do depot da house com o depot do CP (central) sempre que o jogador clicar no item configurado. A função syncDepots cuida da sincronização dos itens entre os depots. A função onUse é o evento que ocorre quando o jogador clica no item. Ela chama a função de sincronização e exibe uma mensagem ao jogador. Com isso, o jogador pode clicar no item específico e sincronizar seus depots. Depois, registre a action no arquivo actions.xml, associando o item com o script: <action itemid="XXXX" script="depot_sync.lua"/>
-
Muvuka reagiu a uma resposta a uma pergunta: -=[TFS - 0.3.6 - 8.60]=- ERRO NPC REVIVE
-
wenderotpoke reagiu a uma resposta a uma pergunta: Spawn de Poke Aleatorio em uma determinada Area
-
Spawn de Poke Aleatorio em uma determinada Area
pergunta respondeu ao wenderotpoke de El Rusher em Scripts
local config = { [17003] = { nameDz = "Bronze", chave = 2155, count = 1, areas = { {fromx = 1712, fromy = 1211, fromz = 15, tox = 1966, toy = 1303, toz= 15}, {fromx = 1970, fromy = 1319, fromz = 15, tox = 2248, toy = 1303, toz= 15}, {fromx = 1712, fromy = 1211, fromz = 14, tox = 1966, toy = 1303, toz= 14}, {fromx = 1970, fromy = 1319, fromz = 14, tox = 2248, toy = 1303, toz= 14} }, teleport = { {x = 1789, y = 1288, z = 15}, {x = 2062, y = 1288, z = 15}, {x = 1789, y = 1288, z = 14}, {x = 2062, y = 1288, z = 14} }, pokemons = {"Elder Zubat", "Elder Rattata"}, finish = 15 * 60 * 1000, spawnCount = 64, -- Corrigido para 64 }, -- Outros níveis de Dungeon configurados aqui } -- Função para verificar se o local é walkable function isWalkable(pos, creature, proj, pz, water) if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end -- Função para spawnar Pokémons na área correta function spawnPokemons(area, pokemons, spawnCount) local spawnedCount = 0 for i = 1, spawnCount do local posX = math.random(area.fromx, area.tox) local posY = math.random(area.fromy, area.toy) local posZ = area.fromz local position = {x = posX, y = posY, z = posZ} if isWalkable(position) then local chosenPokemon = pokemons[math.random(1, #pokemons)] doCreateMonster(chosenPokemon, position) spawnedCount = spawnedCount + 1 end end return spawnedCount end function onUse(cid, item, fromPosition, itemEx, toPosition) local cfg = config[item.actionid] if not cfg then return true end if isRiderOrFlyOrSurf(cid) then doPlayerSendCancel(cid, "Saia do ride ou fly para acessar a dungeon.") return true end if getPlayerStorageValue(cid, 468703) - os.time() > 0 then doPlayerSendCancel(cid, "Aguarde "..convertTime(getPlayerStorageValue(cid, 468703) - os.time()).." para entrar na Dungeon.") return true end if getPlayerItemCount(cid, cfg.chave) >= cfg.count then for i, area in ipairs(cfg.areas) do if #getPlayersInArea(area) < 1 then -- Remove monstros existentes e inicia os novos spawns removeNpcInArea({x = area.fromx, y = area.fromy, z = area.fromz}, {x = area.tox, y = area.toy, z = area.toz}, true, false) creatureInSurvival({x = area.fromx, y = area.fromy, z = area.fromz}, {x = area.tox, y = area.toy, z = area.toz}, true, false) -- Teleporta o jogador para a área correspondente doTeleportThing(cid, cfg.teleport[i]) setPlayerStorageValue(cid, 2154610, 1) doPlayerRemoveItem(cid, cfg.chave, cfg.count) -- Spawnar os pokémons na área correta local spawnedPokemons = spawnPokemons(area, cfg.pokemons, cfg.spawnCount) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Foram spawnados "..spawnedPokemons.." pokémons na dungeon.") end end return true else doPlayerSendCancel(cid, "Você precisa de "..cfg.count.." "..getItemNameById(cfg.chave).." para entrar.") end return true end Neste script: A função spawnPokemons foi ajustada para tentar spawnar um total de 64 pokémons por área (ou o número especificado em spawnCount). Foram feitas correções para garantir que apenas posições "walkable" sejam consideradas para o spawn. O número de pokémons spawnados é mostrado ao jogador após o teleporte. -
1. Corrigir o erro do gsub: O erro de gsub ocorre quando o tipo de dado passado para ele não é válido. No caso do erro que você está recebendo, parece que o sistema está esperando uma string, mas recebeu outro tipo de valor. 2. Verificar o erro Creature not found: Esse erro sugere que o NPC está tentando interagir com uma criatura (cid) que não existe ou foi removida do jogo. Pode ser resolvido verificando se o cid é uma criatura válida antes de tentar interagir com ele. Sugestões de ajustes no código: Função teleportPlayerToPositionReborn: function teleportPlayerToPositionReborn(cid) if not isCreature(cid) then selfSay('Player not found.', cid) return false end local playerRebornPositionX = getPlayerStorageValue(cid, PLAYER_REBORN_POSITION_X) local playerRebornPositionY = getPlayerStorageValue(cid, PLAYER_REBORN_POSITION_Y) local playerRebornPositionZ = getPlayerStorageValue(cid, PLAYER_REBORN_POSITION_Z) if playerRebornPositionX == -1 or playerRebornPositionY == -1 or playerRebornPositionZ == -1 then selfSay('You have not died yet.', cid) return false end doTeleportThing(cid, {x = playerRebornPositionX, y = playerRebornPositionY, z = playerRebornPositionZ}) return true end isCreature(cid): Verifica se o cid ainda é uma criatura válida antes de tentar acessá-la. Isso ajuda a evitar o erro Creature not found. Função onThink: Certifique-se de que o onThink está bem implementado no NPC: function onThink() if not npcHandler:isFocused() then return false end npcHandler:onThink() return true end
-
[OTX2] Como fazer os NPCs aceitarem dinheiro do banco no Trade?
pergunta respondeu ao LucasOlzon de El Rusher em Programação
No script Lua do NPC que lida com transações comerciais (geralmente dentro da pasta data/npc/scripts/), você deve incluir verificações do saldo bancário do jogador, além de verificar o dinheiro que ele tem em mãos. Usar a função getBankBalance: Use a função getPlayerBalance(cid) para verificar o saldo bancário do jogador. Se o jogador não tiver dinheiro suficiente em mãos, mas tiver saldo no banco, o NPC pode debitar diretamente do banco. Exemplo de implementação: Aqui está um exemplo básico de como ajustar o código de um NPC para verificar o saldo bancário: local function playerHasMoney(cid, amount) local money = getPlayerMoney(cid) -- Dinheiro que o jogador tem na mochila local bankBalance = getPlayerBalance(cid) -- Saldo do banco -- Verifica se o jogador tem dinheiro suficiente na mochila ou no banco return (money + bankBalance) >= amount end local function removePlayerMoney(cid, amount) local money = getPlayerMoney(cid) if money >= amount then -- Se o jogador tiver dinheiro suficiente na mochila, remover da mochila doPlayerRemoveMoney(cid, amount) else -- Se não, remover o que tem na mochila e o restante do banco doPlayerRemoveMoney(cid, money) doPlayerSetBalance(cid, getPlayerBalance(cid) - (amount - money)) end end -- Exemplo de função de venda de item local function sellItem(cid, itemId, amount, cost) if not playerHasMoney(cid, cost) then npcHandler:say("Você não tem dinheiro suficiente.", cid) return false end -- Se o jogador tiver dinheiro suficiente, remover o dinheiro e dar o item removePlayerMoney(cid, cost) doPlayerAddItem(cid, itemId, amount) npcHandler:say("Aqui está o seu item!", cid) return true end -- Exemplo de uso no script de NPC local tradeItems = { {name = "sword", id = 2376, price = 100}, -- Exemplo de item para vender } function onCreatureSay(cid, type, msg) if msgcontains(msg, 'trade') then npcHandler:say("Gostaria de comprar algo?", cid) openShopWindow(cid, tradeItems) -- Abre a janela de trade end end Explicação: playerHasMoney(cid, amount): Verifica se o jogador tem dinheiro suficiente na mochila e/ou no banco. removePlayerMoney(cid, amount): Deduz a quantia necessária primeiro da mochila e depois, se necessário, do banco. Adicionar ao sistema de NPC existente: Certifique-se de ajustar os nomes das funções e estruturas de diálogo do NPC para o formato usado no seu servidor. Você pode integrar essa lógica com o sistema de eventos de NPCHandler que já está no OTX2. sellItem: Implementa a lógica de venda de um item, removendo o dinheiro do jogador e entregando o item. -
Aqui está uma modificação na lógica para garantir que os itens sejam empilhados corretamente nos containers (backpacks) dentro do inventário do jogador: Cylinder* Player::__queryDestination(int32_t& index, const Thing* thing, Item** destItem, uint32_t& flags) { if (index == 0 /* drop to capacity window */ || index == INDEX_WHEREEVER) { *destItem = NULL; const Item* item = thing->getItem(); if (!item) return this; // Tentar encontrar um slot apropriado no inventário for (int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i) { if (!inventory[i]) { if (__queryAdd(i, item, item->getItemCount(), 0) == RET_NOERROR) { index = i; return this; } } else if (inventory[i] != tradeItem) { if (Item* inventoryItem = inventory[i]) { // Tentar empilhar itens no inventário if (inventoryItem->getID() == item->getID() && inventoryItem->isStackable() && inventoryItem->getItemCount() < 100) { *destItem = inventoryItem; index = i; return this; } } } } // Tentar adicionar ou empilhar nos containers do inventário std::list<std::pair<Container*, int32_t> > deepList; for (int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i) { if (inventory[i] == tradeItem) continue; if (Container* container = dynamic_cast<Container*>(inventory[i])) { // Verificar se o item pode ser empilhado em um container for (Item* containerItem : container->getItemList()) { if (containerItem->getID() == item->getID() && containerItem->isStackable() && containerItem->getItemCount() < 100) { *destItem = containerItem; index = INDEX_WHEREEVER; return container; } } // Caso não possa ser empilhado, tentar adicionar no container if (container->__queryAdd(-1, item, item->getItemCount(), 0) == RET_NOERROR) { index = INDEX_WHEREEVER; *destItem = NULL; return container; } // Adicionar container ao deepList para verificação em níveis mais profundos deepList.push_back(std::make_pair(container, 0)); } } // Verificar mais profundamente nos containers (backpacks dentro de backpacks) int32_t deepness = g_config.getNumber(ConfigManager::PLAYER_DEEPNESS); for (std::list<std::pair<Container*, int32_t> >::iterator dit = deepList.begin(); dit != deepList.end(); ++dit) { Container* c = (*dit).first; if (!c || c->empty()) continue; int32_t level = (*dit).second; for (ItemList::const_iterator it = c->getItems(); it != c->getEnd(); ++it) { if ((*it) == tradeItem) continue; if (Container* subContainer = dynamic_cast<Container*>(*it)) { // Verificar se o item pode ser empilhado em um subContainer for (Item* subContainerItem : subContainer->getItemList()) { if (subContainerItem->getID() == item->getID() && subContainerItem->isStackable() && subContainerItem->getItemCount() < 100) { *destItem = subContainerItem; index = INDEX_WHEREEVER; return subContainer; } } // Adicionar item no subContainer if (subContainer->__queryAdd(-1, item, item->getItemCount(), 0) == RET_NOERROR) { index = INDEX_WHEREEVER; *destItem = NULL; return subContainer; } // Verificar profundidade if (deepness < 0 || level < deepness) deepList.push_back(std::make_pair(subContainer, (level + 1))); } } } // Se não encontrou lugar adequado, retorna this return this; } Thing* destThing = __getThing(index); if (destThing) *destItem = destThing->getItem(); if (Cylinder* subCylinder = dynamic_cast<Cylinder*>(destThing)) { index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } return this; } O que mudou: Adicionei uma verificação dentro dos containers para empilhar os itens (loop através dos itens dentro de containers, procurando por itens empilháveis). Verifico tanto o nível principal dos containers no inventário quanto containers dentro de containers (como backpacks aninhadas). O item será empilhado sempre que possível antes de ser adicionado em um novo espaço.
-
[C++] -=[TFS]=- - 0.3.6 - 8.60 - Auto Clear Log
pergunta respondeu ao Muvuka de El Rusher em Programação
Crie um arquivo chamado clear_console.lua dentro da pasta data/globalevents/scripts e adicione o seguinte código: function onThink(interval, lastExecution) io.write("\27[2J\27[H") -- Comando ANSI para limpar o console print("Console limpo automaticamente.") return true end Adicionar o evento ao globalevents.xml: <globalevent name="clearConsole" interval="43200000" event="script" value="clear_console.lua"/> O valor 43200000 corresponde a 12 horas em milissegundos. Reiniciar o servidor: Após adicionar o script e a entrada no globalevents.xml, reinicie o servidor. O console será automaticamente limpo a cada 12 horas. -
até da... mas vai dar um trampo.. geralmente é um arquivo LUA responsavel pela invocação dos pokemons, de modo mais facil era melhor dar um ctrl + f e procurar pela função doSummonCreature() e remover ou comentar ela.. -- doSummonCreature("nome_do_pokemon", pos) poketibia tambem tem bastante client mod que teria que ser removido.. ai você vai ter que adicionar vocações e sprites personalizaçao de mapa e por fim balanceamento..
-
No Tibia, os efeitos gráficos são chamados de projectiles ou magic effects. Para criar o Kamehameha, você precisará usar um projectile que se move em uma direção. Aqui está um exemplo simples de como fazer isso: function onCastSpell(creature, variant) local position = creature:getPosition() -- Posição inicial do Goku local direction = creature:getDirection() -- Direção do Kamehameha local distance = 7 -- Distância que o ataque vai percorrer local damage = math.random(200, 300) -- Defina o dano do Kamehameha -- Definir o efeito gráfico do Kamehameha local projectileEffect = CONST_ANI_ENERGYBALL -- Escolha um efeito gráfico adequado -- Criação de um loop que movimenta o ataque for i = 1, distance do local newPosition = position:getNextPosition(direction, i) -- Calcula a posição seguinte creature:say("KAMEHAMEHA!", TALKTYPE_MONSTER_SAY) -- Grito de ataque, opcional -- Cria o projectile e o efeito creature:getPosition():sendDistanceEffect(newPosition, projectileEffect) -- Dano no alvo que está na posição do efeito local target = Tile(newPosition):getTopCreature() if target and target:isPlayer() then target:addHealth(-damage) target:getPosition():sendMagicEffect(CONST_ME_EXPLOSIONAREA) -- Efeito de explosão ao atingir end -- Intervalo para a movimentação do projectile addEvent(function() newPosition:sendMagicEffect(CONST_ME_ENERGYHIT) -- Efeito na posição final end, i * 100) -- Ajusta o intervalo da animação end return true end
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.