Ir para conteúdo
  • Cadastre-se

Derivado HELP Criaturescript incompleto ajudem completar


Posts Recomendados

1 hora atrás, dominus disse:

 

Ot pokemon � bem estranho. 
Fiz algumas modifica��es para funcionar no ot pokemon, como � no-pvp, ent�o algumas linhas do script n�o s�o necessarias. 
Atualiza todos os scripts. 

 

 

Insere em; creaturescripts>kill.lua: 

--[[Marcryzius D'evil]]-- 
function onDeath(cid, corpse, deathList) 
   for _,player in pairs(deathList) do 
   local player = isMonster(player) and getCreatureMaster(player) or player 
      if(isPlayer(player))then 
         if(getDamageInMonster(cid,player) > 50)then 
            --doPlayerAddItem(player,itemid,quant) 
         end 
         if(M[player])then table.remove(M,player) end 
      end 
   end 
   return true 
end 

 

 

A maior diferen�a entre esse script do kill.lua para o que eu te mandei, � a falta da senten�a "if not( isCreature()) then" que estava gerando o erro. 
Bem como n�o d� - pelo menos eu n�o consegui atacar players (se bem que eu levei duas horas para entender como summonar um pokemon) - para atacar players, ent�o n�o faz necessario saber se � criatura. 

 

 

Insere em; creaturescripts>stats.lua: 
--[[ 
   autor = Marcryzius 
   data = sexta-feira, 05 de fevereiro de 2016 
   query para ser adicionada no monstro: 
   <script> 
      <event name = "stats"/> 
      <event name = "deathMonster"/> 
   </script> 
]] 

function onStatsChange(cid, attacker, tipo, combat, value) 
local atac = attacker 
if not(M[cid])then M[cid] = {} end 
if not(tipo == 1)then return true end 

   if(isPlayer(attacker))then 
      if not(M[cid][attacker])then M[cid][attacker] = 0   end 
      M[cid][attacker] = M[cid][attacker] + value 
   elseif(isMonster(attacker))then -- caso seja um monstro o atacante 
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando 
      atac = get 
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player 
         if not(M[cid][get])then M[cid][get] = 0   end 
         M[cid][get] = M[cid][get] + value 
      end 
   end 
   return true 
end 

 

 

Insere na lib>functions.lua: 

 

M = {} 
function getDamageInMonster(monster,cid) --[[Marcryzius D'evil]]-- 
local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0 
if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') end 
   for k,v in pairs(M[monster]) do 
      if(k == cid)then p_dano = v end 
      m_life = m_life + v 
   end 
   return math.floor(p_dano/(m_life/100)) 
end 

 

 

o restante continua da mesma forma. 
Espero que funcione agora. N�o testei a fundo, pois, ainda n�o sei bem como jogar em ot pokemon - a backpack do boneco n�o abre mais, j� n�o sei o que fazer sem bp, n�o d� pra pegar outra bp, n�o d� pra mudar de outfit, n�o usa magias, cara isso n�o � tibia! 
 

Testei da seguinte forma:

Summonei um dragon e matei solo, gerou 100% do dano.

De novo o dragon, só que com dois players, gerou à porcentagem de cada um devido ao dano causado na criatura.

Depois testei com pokemon, solo e com dois players,  funcionou perfeitamente.

 

 

 

voce tem que criar outro personagem para poder abrir a bp se ela não esta abrindo é porque tem algum item bugado dentro dela
vou testar aqui

AS MAGIAS SÃO
M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12
para usalas é preciso estar com um pokémon solto
para soltar um pokemon tem q colocar o icone dele no slot certo e dar use, o icone dele ja pode estar no local certo ou dentro da pb
se a bp n abre n da pra colocar o icone no local certo pois ele deve tar dentro dela
a outfit se troca igual tibia
segura ctrl e clica para abrir o personagem e vai ter opções



outra coisa como a lib n tem function.lua
coloquei no 050-function.lua pois deve ser este local


FUNCIONOU PERFEITAMENTE CARA EU TE AMO D+
VOU TESTAR + A FUNDO AS PORSENTAGENS PARA DIVIDIR PARA VARIOS PLAYERS MAS DE RESTO VOCE É PERFEITO, JA DISSE QUE TE AMO?
+ REP+


obrigado por não desistir de me ajudar voce é o melhor deste forum sempre vejo voce ajudando todas as pessoas voce ta de parabéns

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Respostas 60
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

@xWhiteWolf me ajuda aqui mano http://www.tibiaking.com/forum/topic/67062-subir-escada-bug/#comment-385003

Esse error se deu por causa da função isCreature(monster) que está retornando um valor falso, ou seja, não é um monstro que está na variável "monster" da função.    No caso dele estar sumind

Fiz uma modificação no script:     Ps: muda "isplayeron ()" por: "getCreatureName ()"

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       
    • Por Ghaz
      Fala pessoal tudo bem?
       
      Estou com dificuldades em um script e preciso da ajuda dos magos do LUA rs.
       
      Tenho um script que quando o player morre (onDeath), ele faz algumas coisas e depois ele chama uma função que deveria retornar uma table (array) para eu fazer o for com o ipairs certinho. Segue abaixo o código:
       
       
      Segue abaixo a função getPlayersInArea:
       
       
      Acontece que no código de cima (do primeiro spoiler) eu dou um print no retorno da função getPlayersInArea, porém ela não tá me retornando a table, tá me retornando só: 2
       
       
       
      Alguém consegue me ajudar em, como raios eu faço a função retornar a lista de players ao invés da quantidade? Acredito que ta retornando o count da table, e não os itens do array.
       
       
      Agradeço desde já, valeu tchurma!
    • Por LeoTK
      Salve galera neste tópico irei postar algumas prints do mapa do servidor para quem queira acompanhar e quem sabe até utilizar de inspiração para mapear o seu NTO.
       
      #Att 11/08/2022

       
       
       
       
      Konoha (Em Desenvolvimento)
       
       
       
       
    • Por FeeTads
      salve rapaziada, estou fazendo uma quest no meu OT que é necessário faze-la durante 10 dias consecutivos, porém caso o player perca um dia, a storage da quest reseta.
      Já tenho esses scripts prontos de 2 formas: global event que checa a storage de todos os player online no momento e caso ja tenha passado 24h ele tira a storage do player que está entre os 10 dias de quest.
      E também tenho um creatureScript de onLogin() que quando o player loga, ele entra num loop de verificação a cada 60s

      minha duvida: globalEvents vai checar todos os players online de uma só vez e fazer as alterações necessarias, isso pode lagar a distro, ou até mesmo crashar?
      o creatureScript vai entrar num loop até o player deslogar, isso numa média de 250 pessoa são diversas verificações em momentos diferentes, pode acabar lagando ou crashando?

      meu OT possui uma media de 300 pessoas online.

      Script globalEvents é esse:

      function onThink(interval, lastExecution)
          local players = {}
          local timer = os.time()
          for _, pid in pairs (getPlayersOnline()) do
              local storage = getPlayerStorageValue(pid, 1231234)
              if getPlayerStorageValue(pid,888251) > 0 and getPlayerStorageValue(pid,888251) <= 9 then
                  if storage - timer <= 1  then
                      table.insert(players, pid)
                  end
              end
          end
          
          if #players > 0 then
              for i = 1, #players do
                  doPlayerSendTextMessage(players[i],22,"seu dano voltou ao normal por vc nao ter feito a quest!")
                  setPlayerStorageValue(players[i],888251,0)
              end
          end
      return true
      end

      Script do Creature é esse:
      local storage = getPlayerStorageValue(cid,1231234)
              function checkStorage(cid) local timer = os.time()
                     if not isPlayer(cid) then return true end
                     if getPlayerStorageValue(cid,888251) > 0 and getPlayerStorageValue(cid, 888251) <= 9 then
                             if storage - timer <= 1 then
                                     setPlayerStorageValue(cid,888251,0)
                             end
                   end
                   addEvent(function()
                              checkStorage(cid)
                    end, 60000)
      end
      function onLogin(cid)
              checkStorage(cid)
      return true
      end
      function onLogout(cid)
             stopEvent(checkStorage[cid])
      return true
      end


      caso os códigos nao estejam legiveis me avisem como arrumar em .lua pf

      se quiserem usar os códigos podem usar a vontade kkkkkkk
    • Por thelifeofpbion
      Existem alguns scripts que depois de matar boss abri tp para os players entrarem em uma sala de recompensa, porém (não sei se já existe) vou postar 2 scripts:

      1º Script: Todos players que der algum dano no boss é teleportado
      2º Script: Depois que o Boss for derrotado todos players de uma sala são teleportados.
       
       

       
      É Basicamente isso, tava ajudando no suporte quando pediram isso e resolvi postar para ficar mais facil de achar (e depois pra eu achar também).

      Agradeço o vodkart por ter disponibilizado a parte do script onde seleciona todos players de uma area (retirei de algum post do forum),
      e Xagah que copiei descaradamente as imagens de tópico porque achei bonito  

      Ajudei de alguma Forma? REP+.


       



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo