Ir para conteúdo
  • Cadastre-se

Derivado HELP Criaturescript incompleto ajudem completar


Posts Recomendados

gente eu sou novo em script não manjo muito e estou tentando fazer um creaturescript da seguinte maneira
quando o monstro morrer quem bater entre 15 e 29% da vida dele ganha 1 item, quem bater entre 30 e 49% ganha outro item e quem bater entre 50 e 100% ganha outro item
eu estou testando ele com um monstro fraco, no caso é um abra, esta sem erro mas n esta executando
aqui esta o script
Script bositem.lua

Spoiler

 local config = {
    name = "Abra",
}
 
function onKill(cid, target)
    if getPlayerDamagePercent(cid) <= 14  then
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'voce não bateu o sufuciente')
    end
    if getPlayerDamagePercent(cid) >= 15 and getPlayerDamagePercent(cid) <= 29 then
        doPlayerAddItem(cid, 2160, 1)
        end
    if getPlayerDamagePercent(cid) >= 30 and getPlayerDamagePercent(cid) <= 49 then
        doPlayerAddItem(cid, 2160, 2)
        end
        
    if getPlayerDamagePercent(cid) >= 50 and getPlayerDamagePercent(cid) <= 100 then
        doPlayerAddItem(cid, 2160, 3)
    end
    
 
    return true
end

 

adicionei esta tag no creaturescripts
 

Spoiler

<event type="kill" name="bositem" event="script" value="bositem.lua"/>


e no abra.xml adicionei esse event

<script>
        <event name="bositem"/>
        <event name="Spawn"/>
    </script>

como eu disse não gera erro, mas n executa tambem

@Alexy Brocanello

 

@Xagah

 

@MySticaL

 

@vankk


@dominus

 

 

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 ()"

Bem, vamos analisar como vc fez esse creaturescript:

function onKill(cid, target)
Função ao matar (quem matou, quem morreu)

Aí vc foi lá e registrou no xml do monstro, ou seja, isso só vai ativar se o monstro te matar. Se queria fazer pra quando ele morrer deveria ter usado onDeath ou onPrepareDeath ou até onStatsChange com algumas checagens pra garantir que aquele era o monstro certo e que o ultimo hit tiraria a vida dele e que quem matou foi um player humano.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites
7 horas atrás, xWhiteWolf disse:

Bem, vamos analisar como vc fez esse creaturescript:

function onKill(cid, target)
Função ao matar (quem matou, quem morreu)

Aí vc foi lá e registrou no xml do monstro, ou seja, isso só vai ativar se o monstro te matar. Se queria fazer pra quando ele morrer deveria ter usado onDeath ou onPrepareDeath ou até onStatsChange com algumas checagens pra garantir que aquele era o monstro certo e que o ultimo hit tiraria a vida dele e que quem matou foi um player humano.

será que poderia corrigir o erro pra mim?
eu tenho q mudar para onDeath, isso entendi
também tenho que retirar a tag do monstro.xml??
como eu especifico quem matou e quem morreu do jeito que voce disse?, como eu disse sou novo nisso e ainda tou aprendendo e pensei q isso ja estava especificado, me ajude?

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

se vc colocar onDeath aí vc só precisa checar se é player

if isPlayer(target) then

código

end

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites
23 horas atrás, xWhiteWolf disse:

se vc colocar onDeath aí vc só precisa checar se é player

if isPlayer(target) then

código

end

boa noite deixei o script assim

function onDeath(cid, target)
local targetName = "Abra"
if isPlayer(target) then
    if getPlayerDamagePercent(cid) <= 14  then
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'voce não bateu o sufuciente')
    end
    if getPlayerDamagePercent(cid) >= 15 and getPlayerDamagePercent(cid) <= 29 then
        doPlayerAddItem(cid, 2160, 1)
        end
    if getPlayerDamagePercent(cid) >= 30 and getPlayerDamagePercent(cid) <= 49 then
        doPlayerAddItem(cid, 2160, 2)
        end
        
    if getPlayerDamagePercent(cid) >= 50 and getPlayerDamagePercent(cid) <= 100 then
        doPlayerAddItem(cid, 2160, 3)
    end
    
 
    return true
end
end

aconteceu que quando eu mato o abra ele apenas some sem deixar corpo e nem dar o item para quem o matou? poderia me ajudar a resolver?
sem erro na distro

Link para o post
Compartilhar em outros sites

cara, se vc registra no xml do monstro é ele que vai executar o onDeath e isso implica que ele vai ser o cid. O cara que matou vai ser o target.. então ficaria assim:

 

function onDeath(cid, target)
    if isPlayer(target) then
        if getPlayerDamagePercent(target) <= 14  then
        doPlayerSendTextMessage(target, MESSAGE_INFO_DESCR, 'voce não bateu o sufuciente')
        end
        if getPlayerDamagePercent(target) >= 15 and getPlayerDamagePercent(target) <= 29 then
            doPlayerAddItem(target, 2160, 1)
            end
        if getPlayerDamagePercent(target) >= 30 and getPlayerDamagePercent(target) <= 49 then
            doPlayerAddItem(target, 2160, 2)
            end
            
        if getPlayerDamagePercent(target) >= 50 and getPlayerDamagePercent(target) <= 100 then
            doPlayerAddItem(target, 2160, 3)
        end         
    end
return true
end

Isso supondo que "getPlayerDamagePercent" exista, porque nunca vi essa função na vida.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites
49 minutos atrás, xWhiteWolf disse:

cara, se vc registra no xml do monstro é ele que vai executar o onDeath e isso implica que ele vai ser o cid. O cara que matou vai ser o target.. então ficaria assim:

 


function onDeath(cid, target)
    if isPlayer(target) then
        if getPlayerDamagePercent(target) <= 14  then
        doPlayerSendTextMessage(target, MESSAGE_INFO_DESCR, 'voce não bateu o sufuciente')
        end
        if getPlayerDamagePercent(target) >= 15 and getPlayerDamagePercent(target) <= 29 then
            doPlayerAddItem(target, 2160, 1)
            end
        if getPlayerDamagePercent(target) >= 30 and getPlayerDamagePercent(target) <= 49 then
            doPlayerAddItem(target, 2160, 2)
            end
            
        if getPlayerDamagePercent(target) >= 50 and getPlayerDamagePercent(target) <= 100 then
            doPlayerAddItem(target, 2160, 3)
        end         
    end
return true
end

Isso supondo que "getPlayerDamagePercent" exista, porque nunca vi essa função na vida.

eu tambem nunca tinha visto essa função acontece que um outro leki que estava me ajudando com isso me passou ela e também me passou essa (doCreatureDamagePercent)
eu testei com as duas e nenhuma esta dando certo

tudo que quero é que os players ganhem uma recompensa ao tirar determinadas porcentagem de vida de um monstro quando o monstro for morto

será um boss que quanto mais vida você tirar dele melhor será sua recompensa quando ele for morto
não estou conseguindo fazer isso, sera que voce consegue me fazer esse script? se for preciso eu te pago por isso
 

Link para o post
Compartilhar em outros sites

vc vai ter que fazer um creaturescript onStatsChange pro monstro, verificar se oque ele tá tendo de mudança de stats é perder vida, se o attacker é um player. Aí vc salva o value no storage do player sendo valor atual + value (dano causado). Quando o monstro morrer vc pega a vida total dele e compara com os killers quem tem o storage entre os values de porcentagem que vc quer definir.

E não esquece de zerar o storage ao dar o prêmio e colocar pra zerar ao relogar (caso ele morra)

Editado por xWhiteWolf (veja o histórico de edições)

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Vai em creaturescript/script/login.lua 

Lá existe os eventos dado aos players é so adicionar esse novo evento.

Link para o post
Compartilhar em outros sites
13 horas atrás, xWhiteWolf disse:

vc vai ter que fazer um creaturescript onStatsChange pro monstro, verificar se oque ele tá tendo de mudança de stats é perder vida, se o attacker é um player. Aí vc salva o value no storage do player sendo valor atual + value (dano causado). Quando o monstro morrer vc pega a vida total dele e compara com os killers quem tem o storage entre os values de porcentagem que vc quer definir.

E não esquece de zerar o storage ao dar o prêmio e colocar pra zerar ao relogar (caso ele morra)

 

 

 

 

3 horas atrás, dominus disse:

Vai em creaturescript/script/login.lua 

Lá existe os eventos dado aos players é so adicionar esse novo evento.

sera que voces podem me explicar o passo a passo? estou ate com dor de cabeça nesse script, queria ser foda igual vocês mas n sou :(

Link para o post
Compartilhar em outros sites

Primeiramente: essa funcao getplayerdamagepercent (), eu desconheço. Se não gerou erro no distro, logo ela existe, mas pode ser que ela execute de uma forma distinta da que tu queres.

Isso tem que ser analisado. 

 

Creaturescript/script/login.lua:

registerCreatureEvent(cid, "GuildMotd") 
registerCreatureEvent(cid, "deathPlayer") 
 

Isso faz com que seja registrado no player um evento do creaturescript como: premmy account, rook system, etc... 

Nesse caso nos exemplos acima são os dois eventos que estão adicionado em creaturescript.xml com os seus respectivos nomes (um nome para cada evento).

 

Ao adicionar um novo script em creaturescript voce tem que adicionar esse evento não só no arquivo creaturescript.xml como também no login.lua.

 

O script que você postou, eu creio que esteja certo, mesmo desconhecendo essa função getplayerdamagepercent.

 

Link para o post
Compartilhar em outros sites
12 horas atrás, dominus disse:

Primeiramente: essa funcao getplayerdamagepercent (), eu desconheço. Se não gerou erro no distro, logo ela existe, mas pode ser que ela execute de uma forma distinta da que tu queres.

Isso tem que ser analisado. 

 

Creaturescript/script/login.lua:

registerCreatureEvent(cid, "GuildMotd") 
registerCreatureEvent(cid, "deathPlayer") 
 

Isso faz com que seja registrado no player um evento do creaturescript como: premmy account, rook system, etc... 

Nesse caso nos exemplos acima são os dois eventos que estão adicionado em creaturescript.xml com os seus respectivos nomes (um nome para cada evento).

 

Ao adicionar um novo script em creaturescript voce tem que adicionar esse evento não só no arquivo creaturescript.xml como também no login.lua.

 

O script que você postou, eu creio que esteja certo, mesmo desconhecendo essa função getplayerdamagepercent.

 

será que poderia me ajudar com isso fazendo um teste?
o máximo que aconteceu foi o mostro desaparecer quando morre sem deixar corpo, é como se eu tivesse dado um  /r  nele
estou precisando muito desse script e por mais que eu mecha nele não vai, registrei no login.lua e continua do mesmo jeito, sem erro

outra coisa o xp de quando se mata um monstro é dividido de acordo com a quantidade de dano que cada jogador deu nele e quem dar mais rit fica com o loot certo? sera que é possivel usar a mesma função pra isso que eu quero?, no caso n daria a xp mas dependendo da quantidade de dano viria os itens, não sei vou começar a estudar o xp, mas se der por favor da uma mãozinha nesse scrip??
é o script que mais da dor de cabeça

Link para o post
Compartilhar em outros sites

Para termos sucesso na elaboração desse script, é necessário saber se essa função: getplayerdamagepercent existe e funciona da forma requerida.

 

A maior dificuldade é a elaboração dessa função que haveriguará o dano percentual de cada atacante do mesmo.

 

Por demais é revelante.

 

Poccnn.

Link para o post
Compartilhar em outros sites
Em 30/01/2016 17:47:42, dominus disse:

Para termos sucesso na elaboração desse script, é necessário saber se essa função: getplayerdamagepercent existe e funciona da forma requerida.

 

A maior dificuldade é a elaboração dessa função que haveriguará o dano percentual de cada atacante do mesmo.

 

Por demais é revelante.

 

Poccnn.

sera que podemos usar a mesma função do xp? aqui esta o script do xp

POKEEXP.LUA

Spoiler

local function playerAddExp(cid, exp)
    doPlayerAddExp(cid, exp)
    doSendAnimatedText(getThingPos(cid), exp, 215)
end


function onDeath(cid, corpse, deathList)
        
    --if not isCreature(cid) then return true end
    if isSummon(cid) or not deathList or getCreatureName(cid) == "Evolution" then return true end --alterado v1.8

    -------------Edited Golden Arena-------------------------   --alterado v1.7 \/\/
    if getPlayerStorageValue(cid, 22546) == 1 then
       setGlobalStorageValue(22548, getGlobalStorageValue(22548)-1)
       if corpse.itemid ~= 0 then doItemSetAttribute(corpse.uid, "golden", 1) end  --alterado v1.8    
    end   
    if getPlayerStorageValue(cid, 22546) == 1 and getGlobalStorageValue(22548) == 0 then
       local wave = getGlobalStorageValue(22547)
       for _, sid in ipairs(getPlayersOnline()) do
           if isPlayer(sid) and getPlayerStorageValue(sid, 22545) == 1 then
              if getGlobalStorageValue(22547) < #wavesGolden+1 then
                 doPlayerSendTextMessage(sid, 20, "Wave "..wave.." will begin in "..timeToWaves.."seconds!")   
                 doPlayerSendTextMessage(sid, 28, "Wave "..wave.." will begin in "..timeToWaves.."seconds!")
                 addEvent(creaturesInGolden, 100, GoldenUpper, GoldenLower, false, true, true)
                 addEvent(doWave, timeToWaves*1000)
              elseif getGlobalStorageValue(22547) == #wavesGolden+1 then
                 doPlayerSendTextMessage(sid, 20, "Você foi o último sobrevivente da Golden arena tome sua recompensa!")
                 doPlayerAddItem(sid, 2152, getPlayerStorageValue(sid, 22551)*2)    --premio
                 setPlayerStorageValue(sid, 22545, -1)
                 doTeleportThing(sid, getClosestFreeTile(sid, posBackGolden), false)
                 setPlayerRecordWaves(sid)
              end
           end
       end
       if getGlobalStorageValue(22547) == #wavesGolden+1 then
          endGoldenArena()
       end
    end
    ---------------------------------------------------   /\/\
    local givenexp = getWildPokemonExp(cid)
    ---local killer = getItemAttribute(corpse.uid, "corpseowner")  

if givenexp > 0 then
for a = 1, #deathList do
local pk = deathList[a]
---
local list = getSpectators(getThingPosWithDebug(pk), 30, 30, false)
if isCreature(pk) then
   local expTotal = math.floor(givenexp * getDamageMapPercent(pk, cid))
   local party = getPartyMembers(pk)
   if isInParty(pk) and getPlayerStorageValue(pk, 4875498) <= -1 then
      expTotal = math.floor(expTotal/#party)         --alterado v1.6.1
      for i = 1, #party do
          if isInArray(list, party) then             
if getPlayerLevel(pk) <= 50 then
             playerAddExp(party, expTotal * 200)  
elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then
             playerAddExp(party, expTotal * 130)
elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then
             playerAddExp(party, expTotal * 80)
elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then
             playerAddExp(party, expTotal * 40)
elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then
             playerAddExp(party, expTotal * 20)
elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then
             playerAddExp(party, expTotal * 10)
elseif getPlayerLevel(pk) >= 351 then
             playerAddExp(party, expTotal * 5)
             end
          end
      end
   elseif not isInParty(pk) then
if getPlayerLevel(pk) <= 50 then
playerAddExp(pk, math.floor(200 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then
playerAddExp(pk, math.floor(130 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then
playerAddExp(pk, math.floor(80 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then
playerAddExp(pk, math.floor(40 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then
playerAddExp(pk, math.floor(20 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then
playerAddExp(pk, math.floor(10 * givenexp * getDamageMapPercent(pk, cid)))
elseif getPlayerLevel(pk) >= 351 then
playerAddExp(pk, math.floor(5 * givenexp * getDamageMapPercent(pk, cid)))
return true end      
   end       
end
end
end

    if isNpcSummon(cid) then
        local master = getCreatureMaster(cid)
        doSendMagicEffect(getThingPos(cid), getPlayerStorageValue(cid, 10000))
        doCreatureSay(master, getPlayerStorageValue(cid, 10001), 1)
        doRemoveCreature(cid)
    return false
    end
if corpse.itemid ~= 0 then   --alterado v1.8
   doItemSetAttribute(corpse.uid, "level", getPokemonLevel(cid))
   doItemSetAttribute(corpse.uid, "gender", getPokemonGender(cid))  
end
return true
end

 

Link para o post
Compartilhar em outros sites

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