Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Plugin para jogar adedonha no Ragnarok
- # by KeplerBR
- package adedonha;
- use strict;
- use warnings;
- use Plugins;
- use Globals;
- use Skill;
- use Misc qw(look center);
- use Log qw(message);
- use Commands;
- use DBI;
- # Register Plugin and Hooks
- Plugins::register("adedonha", "Adedonha no Ragnarok!", \&on_unload);
- my $hooks = Plugins::addHooks(
- ['start3', \&start],
- ['packet/received_sync', \&inform],
- ['packet_privMsg', \&informPM],
- ['packet/map_loaded', \&startGame],
- #['packet_pubMsg', \&analyzeResponse],
- );
- my $commandAdedonha = Commands::register(
- ["inform", "Informa o placar e respostas recentementes usadas", \&commandInform]
- );
- my $currentLetter;
- my $inform = 0;
- my $alert = 0;
- my $gameType = 0;
- my @listGameType = ('ITEM', 'SKILL', 'MONSTRO');
- my (@recentLetters, @monsterList, @skillList, %scoreboard, %listItens, %recentAnswers, %nickListTime, %alphabet);
- # Database info
- my $hostname= "127.0.0.1";
- my $port = 3306;
- my $user = "ragnarok";
- my $password = "ragnarok";
- my $database = "ragna4fun";
- my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port;mysql_enable_utf8=1";
- my $dbh = DBI->connect($dsn, $user, $password); # Connect to the database
- my $datadir = $Plugins::current_plugin_folder;
- ################################
- #On Unload code
- sub on_unload {
- Plugins::delHooks($hooks);
- Commands::unregister($commandAdedonha);
- }
- ################################
- # Carregar lista de palavras e placar
- sub start {
- # Carregar palavras
- for (keys %items_lut) {
- $items_lut{$_} = lc($items_lut{$_});
- }
- %listItens = reverse %items_lut;
- open my $fileListMonster,"<" . $datadir . '\listMonster.txt' or die $!;
- while (<$fileListMonster>) {
- my $line = $_;
- $line =~ s/\R//g;
- push (@monsterList, lc($line));
- }
- close $fileListMonster;
- open my $fileListSkill,"<" . $datadir . '\listSkill.txt' or die $!;
- while (<$fileListSkill>) {
- my $line = $_;
- $line =~ s/\R//g;
- push (@skillList, lc($line));
- }
- close $fileListSkill;
- # Listar alfabeto
- if ($config{alphabet}) {
- %alphabet = (
- 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g', 7 => 'h', 8 => 'i',
- 9 => 'j', 10 => 'l', 11 => 'm', 12 => 'n', 13 => 'o', 14 => 'p', 15 => 'q', 16 => 'r', 17 => 's',
- 18 => 't', 19 => 'u', 20 => 'v', 21 => 'z',
- );
- } else {
- %alphabet = (
- 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g', 7 => 'h', 8 => 'i',
- 9 => 'j', 10 => 'k', 11 => 'l', 12 => 'm', 13 => 'n', 14 => 'o', 15 => 'p', 16 => 'q', 17 => 'r',
- 18 => 's', 19 => 't', 20 => 'u', 21 => 'v', 22 => 'x', 23 => 'w', 24 => 'y', 25 => 'z',
- );
- }
- # Carregar placar
- my $sth = $dbh->prepare("SELECT * FROM $config{table}");
- $sth->execute();
- while (my $ref = $sth->fetchrow_hashref()) {
- $scoreboard{$ref->{nick}} = $ref->{points};
- }
- $sth->finish();
- }
- ################################
- # Iniciar partida de adedonha
- sub startGame {
- look(3, 2);
- # Anti-bug
- return if ($currentLetter);
- randLetter:
- # Pegar letra
- my $alphabetCount = scalar keys %alphabet;
- my $chooseLetter = int(rand($alphabetCount));
- $currentLetter = $alphabet{$chooseLetter};
- # Evitar usar letras que tenham sido usadas recentementes
- if ($currentLetter ~~ @recentLetters) {
- goto randLetter;
- } else {
- @recentLetters = () if (scalar @recentLetters == $alphabetCount - 1);
- push (@recentLetters, $currentLetter);
- # Selecionar tipo de jogo
- $gameType++;
- $gameType = 0 if ($gameType >= scalar @listGameType);
- $recentAnswers{$gameType}{$currentLetter} = '' if (!exists $recentAnswers{$gameType}{$currentLetter});
- # Adicionar hook
- $hooks = Plugins::addHooks(
- ['packet_pubMsg', \&analyzeResponse],
- );
- # Informar
- Commands::run("c Letra do adedonha: '" . uc($currentLetter) . "' ! Envie PM para ver o placar e como jogar!");
- Commands::run("c Informe um(a) " . $listGameType[$gameType] . " do Ragnarok que comece com a letra '" . uc($currentLetter) . "' !");
- Commands::run("e heh") if $config{sendEmoticon};
- }
- }
- ################################
- # Verificar se mensagem global corresponde a adedonha
- sub analyzeResponse {
- my $hookname = shift;
- my $args = shift;
- # Verificar se resposta esta certa
- my $nickPlayer = $args->{pubMsgUser};
- my $chatMessage = lc($args->{Msg});
- my $initialLetter = substr($chatMessage, 0, 1);
- if ($chatMessage eq "jogo") {
- Commands::run("c Informe um(a) " . $listGameType[$gameType] . " que comece com a letra " . uc($currentLetter) . "!");
- $inform = 0;
- return;
- }
- my $currentAnalysis = $currentLetter;
- $currentAnalysis = "/ã|á|à|â|a|/i" if ($currentLetter eq 'a'); $currentAnalysis = "/é|è|ê|e|/i" if ($currentLetter eq 'e');
- $currentAnalysis = "/í|ì|î|i|/i" if ($currentLetter eq 'i'); $currentAnalysis = "/õ|ó|ò|ô|o|/i" if ($currentLetter eq 'o');
- $currentAnalysis = "/ú|ù|ô|u|/i" if ($currentLetter eq 'u');
- if ($initialLetter =~ $currentAnalysis) {
- if (($listGameType[$gameType] eq "ITEM" && exists $listItens{$chatMessage}) ||
- ($listGameType[$gameType] eq "SKILL" && $chatMessage ~~ @skillList) ||
- ($listGameType[$gameType] eq "MONSTRO" && $chatMessage ~~ @monsterList)) {
- if ($recentAnswers{$gameType}{$currentLetter} ne $chatMessage) {
- # Acertou
- &saveScores($nickPlayer, 2);
- Commands::run("c Parabéns, $nickPlayer! Acertou! Sua pontuação é de $scoreboard{$nickPlayer} pontos!");
- Commands::run("e e11") if $config{sendEmoticon};
- $recentAnswers{$gameType}{$currentLetter} = $chatMessage;
- # Iniciar nova partida
- undef $currentLetter;
- Plugins::delHook('packet_pubMsg', $hooks);
- unless ($taskManager->countTasksByName('pluginAdedonhaRecomeçar')) {
- $taskManager->add(Task::Timeout->new(
- name => 'pluginAdedonhaRecomeçar',
- inGame => 1,
- function => sub {&startGame;},
- seconds => 4,
- ));
- }
- } else {
- # Resposta repetida
- Commands::run("c '$chatMessage' já foi usado! Não pode repetir a mesma palavrava 2x seguidas!");
- Commands::run("e ??") if $config{sendEmoticon};
- }
- } else {
- # Repetiu a palavra
- exists $scoreboard{$nickPlayer} ?
- Commands::run("c $nickPlayer, '$chatMessage' não é um(a) $listGameType[$gameType]! (Você tem $scoreboard{$nickPlayer} pontos)") :
- Commands::run("c $nickPlayer, '$chatMessage' não é um(a) $listGameType[$gameType]!");
- Commands::run("e ??") if $config{sendEmoticon};
- }
- $inform = 0;
- } else {
- # Errou a letra inicial
- $alert++;
- if ($alert == 3) { # Evitar flood
- Commands::run("c O(A) $listGameType[$gameType] deve começar com a letra '" . uc($currentLetter) . "'!");
- Commands::run("e !") if $config{sendEmoticon};
- $alert = 0;
- $inform = 0;
- }
- }
- }
- ################################
- # Misc: Salvar pontos dos players
- sub saveScores {
- my ($nickPlayer, $pointsEarned) = @_;
- if (exists $scoreboard{$nickPlayer}) {
- # Atualizar placar
- $scoreboard{$nickPlayer} += $pointsEarned;
- my $sth = $dbh->prepare("UPDATE $config{table} SET points = ? WHERE nick = ?")
- or die "Couldn't prepare statement";
- $sth->execute($scoreboard{$nickPlayer}, $nickPlayer)
- or die "Couldn't execute the query";
- $sth->finish;
- } else {
- # Adicionar player
- $scoreboard{$nickPlayer} = $pointsEarned;
- my $sth = $dbh->prepare("INSERT into $config{table}(nick, points) values(?,?)")
- or die "Couldn't prepare statement";
- $sth->execute($nickPlayer, $scoreboard{$nickPlayer})
- or die "Couldn't execute the query";
- $sth->finish;
- }
- }
- ################################
- # Informar da partida de adedonha
- sub inform {
- $inform++;
- if ($inform == 3) { # Evitar flood
- Commands::run("c Jogue adedonha no Ragnarok! Mande PM para mim para ver o placar ou instruções!");
- Commands::run("c Informe, pelo chat público, um(a) " . $listGameType[$gameType] . " do Ragnarok que comece com '" . uc($currentLetter) . "'!");
- $inform = 0;
- }
- }
- ################################
- # Ao receber uma PM, irá da umas infos
- sub informPM {
- my $hookname = shift;
- my $args = shift;
- my $nick = $args->{privMsgUser};
- my $message = $args->{privMsg};
- # Anti-Spam
- if ((time - $nickListTime{$nick}) < 10) {
- Commands::run("pm \"$nick\" Desculpe-me, você mandou PM a pouco tempo! Tente daqui a 10s!");
- return;
- }
- $nickListTime{$nick} = time;
- # Analisando PM
- if ($message =~ /placar completo/i) {
- my $i = 0;
- for ( sort {$scoreboard{$b} <=> $scoreboard{$a}} keys %scoreboard) {
- $i++;
- last if (!$_);
- Commands::run("pm \"$nick\" * $i° - $_ - $scoreboard{$_} pontos");
- last if ($i == 100);
- }
- } elsif ($message =~ /comentário:/i || $message =~ /comentario:/i) {
- # Anti-flood
- my $sth = $dbh->prepare("SELECT * FROM adedonha_comment WHERE nick = ?")
- or die "Couldn't prepare statement";
- $sth->execute($nick)
- or die "Couldn't execute the query";
- $sth->finish;
- if ($sth->rows < 2) {
- $message =~ s/comentário://i;
- my $sth = $dbh->prepare("INSERT into adedonha_comment(server, nick, comment) value(?,?,?)")
- or die "Couldn't prepare statement";
- $sth->execute($config{master}, $nick, $message)
- or die "Couldn't execute the query";
- $sth->finish;
- Commands::run("pm \"$nick\" Obrigado, $nick! Seu comentário foi enviado com sucesso! Irei lê-lo depois.");
- } else {
- Commands::run("pm \"$nick\" Desculpe, $nick, mas não é possível enviar mais que 2 comentários por personagem...");
- }
- } elsif ($scoreboard{$message}) {
- my $i = 0;
- for (sort {$scoreboard{$b} <=> $scoreboard{$a}} keys %scoreboard) {
- $i++;
- last if ($_ eq $message);
- }
- Commands::run("pm \"$nick\" $message tem $scoreboard{$message} pontos e esta em $i° lugar!");
- } else {
- Commands::run("pm \"$nick\" Para participar da adedonha, basta você mandar MENSAGEM PÚBLICA (NÃO por PM, é por MENSAGEM PÚBLICA) com um nome do que é pedido!");
- Commands::run("pm \"$nick\" Pode ser uma skill, um item ou um montro! Atualmente é " . $listGameType[$gameType] . " que comece com a letra informada '" . uc($currentLetter) . "'!");
- Commands::run("pm \"$nick\" -------------------");
- Commands::run("pm \"$nick\" Dica: Envie, pelo chat público (NÃO por PM):");
- Commands::run("pm \"$nick\" * 'jogo' -> para exibir a letra inicial do que deve dizer");
- Commands::run("pm \"$nick\" -------------------");
- Commands::run("pm \"$nick\" Placar dos 15 primeiros lugares:");
- my $i = 0;
- for ( sort {$scoreboard{$b} <=> $scoreboard{$a}} keys %scoreboard) {
- $i++;
- last if (!$_);
- Commands::run("pm \"$nick\" * $i° - $_ - $scoreboard{$_} pontos");
- last if ($i == 15);
- }
- Commands::run("pm \"$nick\" Total de jogadores: " . scalar (keys %scoreboard));
- Commands::run("pm \"$nick\" -------------------");
- Commands::run("pm \"$nick\" Se quiser me enviar um comentário, mande PM com o texto e escrito 'Comentário:'");
- Commands::run("pm \"$nick\" Exemplo: 'Comentário: Adedonha é muito legal =)'");
- Commands::run("pm \"$nick\" -------------------");
- Commands::run("pm \"$nick\" Para visualizar a pontuação específica de um jogador, envie, por PM, o nick dele");
- Commands::run("pm \"$nick\" Para visualizar os 100 primeiros lugares, envie, por PM, 'placar completo'!");
- }
- }
- ################################
- # Função do comando "inform"
- sub commandInform {
- my $message;
- $message = center('Placar atual', 50, '-') . "\n";
- my $i = 0;
- for ( sort {$scoreboard{$b} <=> $scoreboard{$a}} keys %scoreboard) {
- $i++;
- $message .= "* $i° - $_ - $scoreboard{$_} pontos\n";
- last if ($i == 50);
- }
- $message .= "Total: " . scalar (keys %scoreboard) . "\n";
- $message .= center('Informações da Adedonha atual', 50, '-') . "\n";
- $message .= "Respostas recentementes usadas:\n";
- for (my $i = 0; $i < scalar @listGameType; $i++) {
- $message .= center($listGameType[$i], 10, '-') . "\n";
- my $size = $recentAnswers{$i};
- for (my $i2 = 0; $i2 < scalar (keys %alphabet); $i2++) {
- next if (!$recentAnswers{$i}{$alphabet{$i2}});
- $message .= "* $alphabet{$i2} - $recentAnswers{$i}{$alphabet{$i2}}\n";
- }
- }
- $message .= "Jogo Atual: " . $currentLetter . " - " . $listGameType[$gameType] . "\n";
- message $message, "list";
- }
- 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement