Ir para conteúdo

El Rusher

Cavaleiro
  • 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!

3 Seguidores

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

  1. 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.
  2. 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.
  3. esse login e senha geralmente fica em baixo ou atras do seu roteador, caso nao tiver, solicite a provedora da sua internet
  4. 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 */ }
  5. -- 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.
  6. 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!
  7. 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]
  8. El Rusher

    Depot House

    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"/>
  9. 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.
  10. 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
  11. 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.
  12. 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.
  13. 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.
  14. 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..
  15. 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.
×
×
  • Criar Novo...