Leaderboard
Popular Content
Showing content with the highest reputation on 10/27/16 in all areas
-
This is not really script request. Because with scripts you should to do a lot of work for controlling mobs, do a lot of arrays, do a lot of checks, and you will not know exact time when MVP spawned. Why do you need to do all of this job, if you can try to use src edits? Here what you need to do: 1. Open mob.c and find next function int mob_delayspawn(int tid, unsigned int tick, int id, intptr_t data) 2. In this function find mob_spawn(md); and above or below add next code // if monster boss -> do announce if( md->spawn->state.boss ) { char message[128]; sprintf(message, "[MVP Spawn]: %s has been spawned on his map.", md->name); clif_broadcast(&md->bl, message, strlen(message) + 1, BC_DEFAULT, ALL_CLIENT); } P.S. if you do not understand where need to add code above, just look function uploaded here: https://gist.github.com/anacondaqq/b0c7729aa4ed9ee73c9a45705f8daec4 Or here is diff patch: link Here is screen when i kill Tao, (tomb system enabled, mvp re-spawn time decreased in monster.conf to avoid log waiting for mvp re-spawn (just for testing this custom source mode above). Then i go to another map just to confirm that mod showing announces for all connected players to the game on any map. As you see i sitting at prt_fild, and just waiting for announce. So, as you see this mod show you if some mvp spawned. It will NOT affect @reloadscript, and reloadmobdb, it will affect only spawn data if mob killed by someone. Have fun P.S. if you wish to see where exactly spawned mob (like on screen below) replace line in modification above: sprintf(message, "[MVP Spawn]: %s has been spawned on his map.", md->name); to: sprintf(message, "[MVP Spawn]: %s has been spawned on %s map.", md->name, map_mapid2mapname(md->spawn->m));2 points
-
Scripting Intermediário! - 1 Olá, meu nome é João Victor vulgo nick é Wolf, e estou criando este tutorial para aprendizado da linguagem script do emulador. São aulas que estavam desatualizadas antigamente no eAthena, que eu me propus a atualizar e adicionar comandos como while, e outros exemplos afim de ajudar a todos da comunidade. Primeiro assunto: - While No inglês o comando While significa enquanto, funciona da mesma forma que um if (verificação). Utilizando condição como base, ele criará um loop (laço) enquanto o valor que estiver nele for verdadeiro, vejamos um exemplo: set @i, 1; while (@i < 100) { mes "Estou aprendendo loopings em Script!"; set @i, @i +1; } Nesse caso, iniciamos o nosso contador que é o While, lembrando que primeiro atribuimos um valor a nossa variável que é igual a 1 (@i). Nosso While avalia se @i é menor que 100, caso for verdadeiro, a condição, ele executará o script, se não for, no caso a condição for falsa, ele sairá do loop (do laço). A primeira volta de nosso loop, a instrução é verdadeira, então dentro do loop escrevemos a mensagem e somamos +1 a variável @i, com o operador de incrementação (+). Após terminar, o loop volta e avalia @i com o vlaor 2, se for verdadeiro, rodará mais uma vez, e assim por diante, até que chegue a seu limite e delimite como falsa, para quebrar o loop. No caso se quisessemos fazer com if, fariamos dessa forma: Retornar: if (@i < 100) { mes "estou aprendendo loops em script!"; set @i, @i +1; callsub Retornar; } Como vimos, o comando while verifica primeiro a variável. Já o comando Do While, que iremos explicar agora, faz ao contrário. Mas porquê? Simples, ele executa o código primeiro, e só depois que verifica a variável, se ela for verdadeira, ele executará o código novamente, e não como o while que verifica primeiro para que depois possa executar ou não o script. Veja o exemplo: set @i, 1; do { mes "Estou aprendendo loops em script!"; set @i, @i +1; } while (@i < 100); Fim da aula de While! Segundo assunto desta aula: - For A sintaxe (comando) for funciona da mesma maneira que o While, em conjunto com um if. Utilizando uma ou mais variáveis como base, junto com uma condição. Ele cria um loop também, enquanto o valor for verdadeiro ele executa, porém em uma linha só, vejamos: for (set @i,1; //Como no While, setamos a variável e seu valor. Agora nesse mesmo For, iremos incrementar a condição, como no While, veja: for (set @i,1; @i <= 100; E como no final, iremos adicionar +1 a variável inicial, para que o for possa contar, até chegar o seu valor condicionalmente definido (100), como abaixo: for (set @i,1; @i <= 100; set @i, @i + 1) Isso não fará do script incorreto, mas se você fizer isso e não souber utilizar corretamente o script, fará um loop inifinito, ou seja, executará o script para sempre, sem que ele pare. Utilizamos desta forma quando o script acaba sendo baseado em uma variável inicial, ou mais variáveis. Veja: for (set @i,1; @i < 100; set @i, @i + 1) { mes "Estou aprendendo loops em script!"; } Neste caso ele executará o mes 100x até o valor 100 ser sanado, batido. Vejamos melhor como funciona, se eu utilizasse um if: set @i, 1; Retornar: if (@i < 100) { mes "Estou aprendendo Loopings em Script!"; set @i, @i + 1; callsub Retornar; } Mas pra que isso, se podemos transformar esse if em apenas uma linha? Veja: for (for set @i,1; @i < 100; set @i, @i +1) { mes "Estou aprendendo Loopings em Script!"; } set @i,0; É o valor inicial da variável base. @i < 100; É a condição para o loop se manter. set @i,@i+1; É o complemento da variável, a incrementação na variável @i, para que a condição seja atingida. Acabamos por aqui nossa primeira aula de script intermediário! Agradeço ao Keoy por ter me ajudado sempre, ser meu professor antigamente e me ensinar muito tudo que sei, e me ter dado aulas com base para criação destes tutoriais.1 point
-
1 point
-
1 point
-
i believe he wants to announce when the MVP spawns. i have a quick and dirty solution here, this one needs to edit who you want to Announce each spawn ONE BY ONE. if youre going to support all MVPs, this is not a good solution. for example, you want to announce Beelzebub to be announced each spawn. first, you have to remove this line from npc/pre-re/mobs/dungeons/abbey.txt abbey03,0,0,0,0 boss_monster Beelzebub 1873,1,43200000,600000,1 second, you have to create your own script to spawn Beelzebub OnHour3: monster "abbey03",0,0,"Beelzebub",1873,1; announce "Beelzebub has spawned @ abbey03!",bc_yellow|bc_all; end; this code summons Beelzebub every 3 hours, see more options here https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L857 you can also add an event when Beelzebub died. please take note that: this will make Beelzebub spawn every 3hours even if Beelzebub is still alive. Yes, this scripts can make Beelzebub more than 1 in the said map. but this problem can be solve with some tweaks in the code. if your server is using Tomb NPC, it will NOT work with Beelzebub anymore. if you add a lot of these codes in your server, it might cause LAG to your server. lastly, this will make Beelzebub spawn exactly every 3 hours.1 point
-
I think yes, but you have to copy all sources, and also it does not make sense? since you have import/ for ur custom stuffs.1 point
-
Scripting Intermediário! - 2 Assunto da aula: - Arrays As arrays não passam de um conjunto de variáveis, que são usados dentro de loops que são For e Whiles como ensinados na aula anterior, podem servir de Banco de Dados, já que podemos guardar/alterar/modificar/remover valores dento delas e certamente economizam certas linhas se bem usadas no script. São uma das melhores ferramentas para scripters hoje em dia. Array, não possui tradução para português, mas podemos entender como Conjunto de Variáveis, o nome já diz tudo, não? Vamos ver as maneiras certas para a utilização de uma array: +==========+======+=======+ |Variável | Norm | Array | +==========+======+=======+ |$Str$ | OK! | OK! | +----------+------+-------+ |$@Str$ | OK! | OK! | +----------+------+-------+ |@Str$ | OK! | OK! | +----------+------+-------+ |#Str$ | OK! | ERRO! | +----------+------+-------+ |Str$ | OK! | ERRO! | +----------+------+-------+ |$Int | OK! | OK! | +----------+------+-------+ |$@Int | OK! | OK! | +----------+------+-------+ |@Int | OK! | OK! | +----------+------+-------+ E agora temos algumas variáveis que dão erros, caso o uso for desta maneira: #str$ - ERRO Str$ - ERRO Porque ocorreram esses erros? o_o Simplesmente porque as arrays não podem ser "setadas" à um jogador, por isso existem as variáveis normais. Sintaxe da Array: setarray <Nome da Array>[<Index>],<Valor>{,<Valor>,...,<Valor>}; Exemplos: setarray @i[0],1000,2000,3000,4000; @array [0] = 1000 @array [1] = 2000 @array [2] = 3000 e @array [3] = 4000 Agora se eu usar após o exemplo anterior (lembre-se, APÓS): setarray @array[1],1,2; @array[0] = 1000 (Pois o 0 não foi alterado, e somente o 2, 3 se a index anterior for 0). @array[1] = 1 @array [2] = 2 @array [3] = 4000 Temos o comando cleararray, que limpa a array: cleararray <nome do array>[<primeiro valor para alterar>],<valor>,<número de valores para definir>; Esse comando vai mudar o valor de uma array e ao mesmo tempo adicionar outro. Exemplo: setarray @i[0],1000,2000,3000,4000; cleararray @i[0],0,6; Isso transformará todos os valores em 0. cleararray @i[0],245,1; Isso transformará o valor do @i[0] == 1000, para 245. cleararray @i[1],345,2; Isso transformará o valor do @i[1], @i[2] para 345. Simples, não? Ensinaremos então, o comando getarraysize que é muito útil também no Loop (For): Essa função retorna o número de valores que estão contidos dentro de uma array, no caso, um valor específico. Exemplo: setarray @i[0],1000,2000,3000,4000; set @i_size,getarraysize(@i); Isso vai fazer com que @i seja igual a 4, pois temos 4 "indexes". Agora se eu fizer: setarray @i[0],1000,2000,3000,4000,0; set @i_size,getarraysize(@i); Será de qualquer maneira 4, pois 0 é igual a nada, então não contará. Existe também o copyarray, como podemos ver a utilização desse: copyarray <array de destino>[<primeiro valor>],<array fonte>[<primeiro valor>],<número de elemento a serem copiados>; Esse comando faz com que você copie o valor de uma array, vejamos: setarray @i[0],1000,2000,3000,4000; copyarray @i2,@i[0],@i[1]; Essa array @i2 terá o primeiro valor 1000, e o segundo 2000. Mas porque Wolf? Vejamos, o @i2[0] == 1000, e o @i[1] == 2000, pois copiamos o valor index de uma outra array. E os outros valores da array? Se os outros valores da array não foram copiados, retornaram 0 em caso de uso incorreto. Vamos falar agora do comando DeleteArray. Esse comando vai deletar um VALOR ESPECÍFICO em uma array. setarray @i[0],1000,2000,3000,4000; Agora caso eu usar: deletearray @i[0],1; O deletearray irá DELETAR o valor 1000, e irá mover os outros, se tornando: setarray @i[0],2000,3000,4000; Então @i[0] passará a ser 2000 e não mais 1000, e assim por diante! Fim da aula de Arrays, e vejamos para finalizar, um exemplo de uso: mes "Deseja registrar sua banda em nosso concurso?"; if (select("Sim:Não")==2) close; next; input @banda$; setarray $banda$,[getarraysize($banda$)+1],@banda$; // Essa array adicionará o nome da banda (@banda$) na array $banda$. next; mes "Banda registrada com sucesso!"; for (set @i,0; @i <= getarraysize($bandas$); set@i, @i+1) { mes $bandas$,[@i]; } set registrado$,@str$; // Isso deixará o jogador registrado permanentemente no script. close; Agradeço ao Keoy por ter me instruído a criar as aulas, ser meu professor antigamente, e eu por criar as aulas com base nas aulas que ele fazia, adicionando os comandos copyarray, deletearray, cleararray e atualizar o snippet.1 point
-
Script Intermediário! - 3 Como prometido, estarei começando com a terceira aula de script (Menu dinâmico e suas teorias). Primeiro assunto da aula: - Menus dinâmicos e suas teorias Menus dinâmicos são essenciais hoje em dia justamente pelo fato da necessidade de otimizações e dinâmismo que podemos dar aos scripts. No meu método de seleção e aprendizado, utilizaremos uma string que será como se você estivesse digitando no select suas opções na hora, facilitando muito. Claro, existem diversas formas de fazer um menu dinâmico, porém essa é a mais simples e prática utilizada hoje em dia. Então partiremos para criar um menu. Para começar, precisamos ter uma variável do tipo STRING, na qual guardaremos as intruções do select. //Faremos ela sem valor nenhum inicialmente, para deopis fazer um loop e adicionar as funções. //Observem que usei uma variável temporária do npc para essa função (mais simples e rápido) set .@cmd$,""; Agora precisamos e setaremos uma lista de opções que serão usadas no seu menu (pode ser feito antes do .@cmd$, caso você queira): setarray .@opt$[0],"Comprar","Vender","Trocar"; Nunca coloque opção de cancelar nessa array, ela será posta mais tarde. Então iniciamos nosso loop que fará a linha de comando, vejamos: for(set @i,0; @i <= getarraysize(.@opt$); set @i,@i+1) set .@cmd$, .@cmd$+.@opt$[@i] + ":"; Entendendo: .@cmd$+.@opt$[@i]+":" .@cmd$ = Prepara a variável que contém a linha do comando atual para adição de mais um item no menu. .@opt$[@i] = É a opção a ser adicionada na linha de comando. ":" = É o que separa as opções em um select. (Como qualquer select sem dinamização, só para exemplo). Agora para finalizar, adicionaremos por último: set .@cmd$, .@cmd$+"Fechar"; //Esse fechar é a última opção de nosso (seu) menu. Finalmente colocamos o select que usará a linha de comando, fazendo o código ficar desta maneira: set .@cmd$,""; setarray .@opt$[0],"Comprar","Vender","Trocar"; for(set @i,0; @i <= getarraysize(.@opt$); set @i,@i+1) set .@cmd$, .@cmd$+.@opt$[@i] + ":"; set .@cmd$, .@cmd$+"Fechar"; select(.@cmd$); Para utilizar o snippet utilize uma forma normal, com a variável retornada por todo tipo de menu, que é a @menu. Para lembrarmos, veja um exemplo simples: select("Oi":"Tchau"); if (@menu == 1) mes "Oi"; if (@menu == 2) mes "Tchau"; É simplesmente isso, o uso é bem simples como o tutorial, em caso de dúvidas, mande uma PM que ajudarei com toda certeza! Um abraço, Wolf.1 point