Derrek
16.02.2013, 23:27
Нашел старенький плагин AntiBotKiller модифицированный под русский язык Moonlight. Мне он нужен был в инглиш варианте и я решил попробовать сам его преобразовать. В итоге работает иногда сразу, иногда с 3ей попытки из 5ти. Пока ни разу все 5 раз не сфейлил. Хотелось бы мнения знатаков как можно исправить ещё лучше.
Вот некоторые ошибки:
[Feb 16 22:40:23 2013.43] [АвтоБот] Вроди нашел ту строчку: "one Hundred seventy nine".
[Feb 16 22:40:23 2013.43] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 1: "one".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 3: "seventy".
[Feb 16 22:40:23 2013.44] [АвтоБот] Итого в граммах: "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд
Проблема из-за двойного пробела, в итоге в последнюю переменную попадает пустота вместо числа.
[Feb 16 22:40:17 2013.16] [АвтоБот] Вроди нашел ту строчку: "seven Hundred meighty oney".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 1: "seven".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 3: "eight".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 4: "one".
[Feb 16 22:40:17 2013.17] [АвтоБот] Итого в граммах: "709".
[Feb 16 22:40:17 2013.17] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "709".
[Feb 16 22:40:17 2013.18] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд
Проблема в том что плагин путает 8 и 80, считает что окончание "y" это мусор.
плагин:
# =======================
# АвтоБот v.1.2.666
#( с помощью ебаной матери и перла, русификация Moonlight)
# =======================
# Copyright 2006
# Base Script : hakore(reactOnNPC)
# Modified by : AqlX
# Далее помог : Moonlight 2007
# Далее помог : Derrek 2013
#
package AntiBotkiller;
use strict;
use Plugins;
use Globals;
use Utils;
use Commands;
use Log qw(message debug);
use encoding 'Russian';
Plugins::register('АвтоБот', "Умно объебем тупого антибота", \&Unload);
my $hooks = Plugins::addHooks(
['packet/npc_talk', \&onNPCTalk, undef],
['packet/npc_talk_close', \&onClo, undef],
['packet/npc_talk_continue', \&onCon, undef],
['packet/npc_talk_number', \&onNPCAction, undef]
);
sub Unload
{
Plugins::delHooks($hooks);
};
my %reactOnNPC;
my $code;
my $str;
sub onNPCTalk
{
my (undef, $args) = @_;
my $msg = unpack("Z*", substr($args->{RAW_MSG}, 8));
$msg = I18N::bytesToString($msg);
$msg =~ s/\^[a-fA-F0-9]{6}//g;
if (!defined %reactOnNPC || $reactOnNPC{action})
{
undef %reactOnNPC if defined %reactOnNPC;
$reactOnNPC{index} = 1;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
else
{
$reactOnNPC{index}++;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
}
sub onNPCAction
{
$code = reply();
message "[АвтоБот] Эрегиру.. тоесть реагируем - пиздим \"$code\".\n", "success";
message "[АвтоБот] ах да, •••••, для приличия ждем 5 секунд ...\n", "success";
my $cmd = "talk num $code";
sleep 5;
Commands::run($cmd);
}
sub onClo
{
undef %reactOnNPC if defined %reactOnNPC;
}
sub onCon
{
message "[АвтоБот] 0 \"$reactOnNPC{msg}[0]\".\n", "success";
message "[АвтоБот] 1 \"$reactOnNPC{msg}[1]\".\n", "success";
message "[АвтоБот] 2 \"$reactOnNPC{msg}[2]\".\n", "success";
message "[АвтоБот] 3 \"$reactOnNPC{msg}[3]\".\n", "success";
message "[АвтоБот] 4 \"$reactOnNPC{msg}[4]\".\n", "success";
$reactOnNPC{msg}[3] =~ s/> //;
$reactOnNPC{msg}[4] =~ s/> //;
undef $str;
$str = $reactOnNPC{msg}[3];
if (length($str) < 2) {
undef $str;
$str = $reactOnNPC{msg}[4];
}
undef %reactOnNPC if defined %reactOnNPC;
}
sub reply
{
message "[АвтоБот] Вроди нашел ту строчку: \"$str\".\n", "success";
my %sn = ("one", 1, "two", 2, "three", 3, "four", 4, "five", 5, "six", 6, "seven", 7, "eight", 8, "nine", 9, "ten", 10, "eleven", 11, "twelve", 12, "thirteen", 13, "fourteen", 14, "fifteen", 15,"sixteen", 16,"seventeen", 17, "eighteen", 18, "nineteen", 19 ,"twenty", 20, "thirty", 30, "forty", 40, "fifty", 50, "sixty", 60, "seventy", 70, "eighty", 80, "ninety", 90,"one Hundred",100,"two Hundred",200,"three Hundred",300,"four Hundred",400,"five Hundred",500,"six Hundred",600,"seven Hundred",700,"eight Hundred",800,"nine Hundred",900);
my @sl = ("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "one Hundred","two Hundred","three Hundred","four Hundred","five Hundred","six Hundred","seven Hundred","eight Hundred","nine Hundred");
my @sy = ("Hundred","hundred");
my ($str1, $str2, $str3,$str4) = split(/ /, $str);
my $tmp;
my $tmr;
my $kflag=0;
foreach $tmr (@sy){
if ($str2 =~/^.?$tmr.?$/) {
$kflag=1;
message "[АвтоБот] Распознал СОТНЮ: \"$tmr\".\n", "success";
}
}
if ($kflag==1) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}
foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}
foreach $tmp (@sl){
if ($str4 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 4: \"$tmp\".\n", "success";
$str4 = $tmp;
}
}
}
if ($kflag==0) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}
foreach $tmp (@sl){
if ($str2 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 2: \"$tmp\".\n", "success";
$str2 = $tmp;
}
}
foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}
}
if ($kflag==0) {
$code = $sn{$str1}+$sn{$str2}+$sn{$str3};
}
if ($kflag==1) {
$code = $sn{$str1}*100+$sn{$str3}+$sn{$str4};
$kflag=0;
}
message "[АвтоБот] Итого в граммах: \"$code\".\n", "success";
return $code;
}
return 1;
Вот некоторые ошибки:
[Feb 16 22:40:23 2013.43] [АвтоБот] Вроди нашел ту строчку: "one Hundred seventy nine".
[Feb 16 22:40:23 2013.43] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 1: "one".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 3: "seventy".
[Feb 16 22:40:23 2013.44] [АвтоБот] Итого в граммах: "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд
Проблема из-за двойного пробела, в итоге в последнюю переменную попадает пустота вместо числа.
[Feb 16 22:40:17 2013.16] [АвтоБот] Вроди нашел ту строчку: "seven Hundred meighty oney".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 1: "seven".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 3: "eight".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 4: "one".
[Feb 16 22:40:17 2013.17] [АвтоБот] Итого в граммах: "709".
[Feb 16 22:40:17 2013.17] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "709".
[Feb 16 22:40:17 2013.18] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд
Проблема в том что плагин путает 8 и 80, считает что окончание "y" это мусор.
плагин:
# =======================
# АвтоБот v.1.2.666
#( с помощью ебаной матери и перла, русификация Moonlight)
# =======================
# Copyright 2006
# Base Script : hakore(reactOnNPC)
# Modified by : AqlX
# Далее помог : Moonlight 2007
# Далее помог : Derrek 2013
#
package AntiBotkiller;
use strict;
use Plugins;
use Globals;
use Utils;
use Commands;
use Log qw(message debug);
use encoding 'Russian';
Plugins::register('АвтоБот', "Умно объебем тупого антибота", \&Unload);
my $hooks = Plugins::addHooks(
['packet/npc_talk', \&onNPCTalk, undef],
['packet/npc_talk_close', \&onClo, undef],
['packet/npc_talk_continue', \&onCon, undef],
['packet/npc_talk_number', \&onNPCAction, undef]
);
sub Unload
{
Plugins::delHooks($hooks);
};
my %reactOnNPC;
my $code;
my $str;
sub onNPCTalk
{
my (undef, $args) = @_;
my $msg = unpack("Z*", substr($args->{RAW_MSG}, 8));
$msg = I18N::bytesToString($msg);
$msg =~ s/\^[a-fA-F0-9]{6}//g;
if (!defined %reactOnNPC || $reactOnNPC{action})
{
undef %reactOnNPC if defined %reactOnNPC;
$reactOnNPC{index} = 1;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
else
{
$reactOnNPC{index}++;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
}
sub onNPCAction
{
$code = reply();
message "[АвтоБот] Эрегиру.. тоесть реагируем - пиздим \"$code\".\n", "success";
message "[АвтоБот] ах да, •••••, для приличия ждем 5 секунд ...\n", "success";
my $cmd = "talk num $code";
sleep 5;
Commands::run($cmd);
}
sub onClo
{
undef %reactOnNPC if defined %reactOnNPC;
}
sub onCon
{
message "[АвтоБот] 0 \"$reactOnNPC{msg}[0]\".\n", "success";
message "[АвтоБот] 1 \"$reactOnNPC{msg}[1]\".\n", "success";
message "[АвтоБот] 2 \"$reactOnNPC{msg}[2]\".\n", "success";
message "[АвтоБот] 3 \"$reactOnNPC{msg}[3]\".\n", "success";
message "[АвтоБот] 4 \"$reactOnNPC{msg}[4]\".\n", "success";
$reactOnNPC{msg}[3] =~ s/> //;
$reactOnNPC{msg}[4] =~ s/> //;
undef $str;
$str = $reactOnNPC{msg}[3];
if (length($str) < 2) {
undef $str;
$str = $reactOnNPC{msg}[4];
}
undef %reactOnNPC if defined %reactOnNPC;
}
sub reply
{
message "[АвтоБот] Вроди нашел ту строчку: \"$str\".\n", "success";
my %sn = ("one", 1, "two", 2, "three", 3, "four", 4, "five", 5, "six", 6, "seven", 7, "eight", 8, "nine", 9, "ten", 10, "eleven", 11, "twelve", 12, "thirteen", 13, "fourteen", 14, "fifteen", 15,"sixteen", 16,"seventeen", 17, "eighteen", 18, "nineteen", 19 ,"twenty", 20, "thirty", 30, "forty", 40, "fifty", 50, "sixty", 60, "seventy", 70, "eighty", 80, "ninety", 90,"one Hundred",100,"two Hundred",200,"three Hundred",300,"four Hundred",400,"five Hundred",500,"six Hundred",600,"seven Hundred",700,"eight Hundred",800,"nine Hundred",900);
my @sl = ("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "one Hundred","two Hundred","three Hundred","four Hundred","five Hundred","six Hundred","seven Hundred","eight Hundred","nine Hundred");
my @sy = ("Hundred","hundred");
my ($str1, $str2, $str3,$str4) = split(/ /, $str);
my $tmp;
my $tmr;
my $kflag=0;
foreach $tmr (@sy){
if ($str2 =~/^.?$tmr.?$/) {
$kflag=1;
message "[АвтоБот] Распознал СОТНЮ: \"$tmr\".\n", "success";
}
}
if ($kflag==1) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}
foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}
foreach $tmp (@sl){
if ($str4 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 4: \"$tmp\".\n", "success";
$str4 = $tmp;
}
}
}
if ($kflag==0) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}
foreach $tmp (@sl){
if ($str2 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 2: \"$tmp\".\n", "success";
$str2 = $tmp;
}
}
foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}
}
if ($kflag==0) {
$code = $sn{$str1}+$sn{$str2}+$sn{$str3};
}
if ($kflag==1) {
$code = $sn{$str1}*100+$sn{$str3}+$sn{$str4};
$kflag=0;
}
message "[АвтоБот] Итого в граммах: \"$code\".\n", "success";
return $code;
}
return 1;