xConf.pl - меняем на ходу mon_control/pickupitems/items
Модератор: 4epT
- 4epT
- macro-маньячина
- Сообщения: 2795
- Зарегистрирован: Чт дек 21, 2006 1:23 pm
- Сервер RO:: 4game
- Discord: ya4ept#8494
- Контактная информация:
что-то я не сразу вкурил твоё "сообщение об использовании комманды" 
у меня чем дальше, тем больше я хочу запихнуть в плагинчек.
раньше у меня була процедура чтения данных с файла, а теперь думаю проверять наличие данных в хэше.. стоит ли?
- процедура одна, а хэшей 3
- процедура открывает файл каждый раз, а хэш вроде как быстрее (хотя и то и то быстро)


у меня чем дальше, тем больше я хочу запихнуть в плагинчек.
раньше у меня була процедура чтения данных с файла, а теперь думаю проверять наличие данных в хэше.. стоит ли?
- процедура одна, а хэшей 3
- процедура открывает файл каждый раз, а хэш вроде как быстрее (хотя и то и то быстро)

- 4epT
- macro-маньячина
- Сообщения: 2795
- Зарегистрирован: Чт дек 21, 2006 1:23 pm
- Сервер RO:: 4game
- Discord: ya4ept#8494
- Контактная информация:
хакей, тогда ломаем хэши дальше 
Вопрос на засыпку, в файле item_control.txt можно писать ID итемов?
вот смотрю я на то как он парсится:
и у меня возникает вопрос, занафига тут условие "if ($cache{$args_text}) {" ??

Вопрос на засыпку, в файле item_control.txt можно писать ID итемов?
вот смотрю я на то как он парсится:
Код: Выделить всё
sub parseItemsControl {
my $file = shift;
my $r_hash = shift;
undef %{$r_hash};
my ($key, $args_text, %cache);
my $reader = new Utils::TextReader($file);
while (!$reader->eof()) {
my $line = $reader->readLine();
$line =~ s/\x{FEFF}//g;
next if ($line =~ /^#/);
$line =~ s/[\r\n]//g;
$line =~ s/\s+$//g;
($key, $args_text) = lc($line) =~ /([\s\S]+?) (\d+[\s\S]*)/;
next if ($key eq "");
if ($cache{$args_text}) {
$r_hash->{$key} = $cache{$args_text};
} else {
my @args = split / /, $args_text;
my %item = (
keep => $args[0],
storage => $args[1],
sell => $args[2],
cart_add => $args[3],
cart_get => $args[4]
);
# Cache similar entries to save memory.
$r_hash->{$key} = $cache{$args_text} = \%item;
}
}
return 1;
}
4epT писал(а):хакей, тогда ломаем хэши дальше
Вопрос на засыпку, в файле item_control.txt можно писать ID итемов?
вот смотрю я на то как он парсится:
и у меня возникает вопрос, занафига тут условие "if ($cache{$args_text}) {" ??
Код: Выделить всё
sub parseItemsControl {
.......
if ($cache{$args_text}) {
если эта фигня нам уже встречалась (т.е. существует в нашем "кэше")
то присвоить ее нафиг, и не мучаться
$r_hash->{$key} = $cache{$args_text};
} else {
а если не встречалась то разбираем аргументы
my @args = split / /, $args_text;
my %item = (
keep => $args[0],
storage => $args[1],
sell => $args[2],
cart_add => $args[3],
cart_get => $args[4]
);
# Cache similar entries to save memory.
записываем результат и в нашу переменную и в "кэш" что бы потом не разбирать аргументы
$r_hash->{$key} = $cache{$args_text} = \%item;
}
}
return 1;
}
- 4epT
- macro-маньячина
- Сообщения: 2795
- Зарегистрирован: Чт дек 21, 2006 1:23 pm
- Сервер RO:: 4game
- Discord: ya4ept#8494
- Контактная информация:
Выкладываю вам свою всё ещё бэтку:
+ пишем mconf <имя_или_ID_моба>, идёт проверка есть ли такой моб вообще в коре (файл tables\monsters.txt), если моба нет, то выдаётся предупреждение об этом. Далее идёт проверка есть ли такой моб в нашем файле mon_control.txt. Если есть то выводится значение (белый цвет), если нету, то предупреждение.
+ плаг понимает имена с пробелами
+ баз данных РО много, мобы и имена в них могут писаться по разному, единственное что связывает данные этих баз - это ID. Мы можем вести команду mconf <ID> <значение>, а в файл mon_control.txt нам запишется <имя_моба> <значение>
+ если мы ввели неправильно имя моба, то нам высветится предупреждение, но строчка всё равно запишется (жёлтый цвет).
+ если в конфиге поставить "debug 1", то плагинчик будет выводить на пару полезных строчек больше.
в планах:
- может сделать команду "xconf <имя_или_ID> none" которая будет удалять строчку из файла.. (стоит ли?)
- думаю посмотреть как ДениZки записывается в файл и подправить свой механизм, а то что-то он более грамозский..
- стоит ли сделать вывод информации как у встровеной команды conf (Config 'char' set to 3 (was 0)) ??
как вам такая "королева"? можно её е**ть или ещё подрисовать?
Добавлено спустя 7 минут 37 секунд:
потому что при первом запуске коры %cache у нас пустая..
Код: Выделить всё
# xConf plugin by 4epT (ICQ 2227733)
# Based on Lims idea
# Last changes 24.01.2008
# Plug-in for change mon_control/pickupitems/items_control files, using console commands.
#
# Examples of commands:
# mconf Spore 0 0 0
# mconf 1014 0 0 0
#
# iconf Meat 50 1 0
# iconf 517 50 1 0
#
# pconf Fluff -1
# pconf 914 -1
package xConf;
use strict;
use Plugins;
use Globals;
use Log qw(message error debug);
## startup
Plugins::register('xConf', 'commands for change items_control, mon_control, pickupitems', \&Unload, \&Reload);
## Register command 'xConf'
my $chooks = Commands::register(
['iconf', 'edit items_control.txt', \&xConf],
['mconf', 'edit mon_control.txt', \&xConf],
['pconf', 'edit pickupitems.txt', \&xConf]
);
sub Reload {
Commands::unregister($chooks);
message "xConf plugin reloading\n", 'success'
}
sub Unload {
Commands::unregister($chooks);
message " xConf plugin unloading, ", 'success'
}
sub xConf {
my ($cmd, $args) = @_;
my ($key, $value) = $args =~ /([\s\S]+?) ([\-\d\.]+[\s\S]*)/;
$key = $args if !$key;
debug "KEY: $key, VALUE: $value\n";
if (!$key) {
error "Syntax Error in function '$cmd'. Not found <key>\nUsage: $cmd <key> [<value>]\n";
return
}
my ($file,$found,$name, %inf_hash, %ctrl_hash) = undef;
if ($cmd eq 'mconf') {
%inf_hash = %monsters_lut;
%ctrl_hash = %mon_control;
$file = 'mon_control.txt'
} elsif ($cmd eq 'pconf') {
%inf_hash = %items_lut;
%ctrl_hash = %pickupitems;
$file = 'pickupitems.txt'
} elsif ($cmd eq 'iconf') {
%inf_hash = %items_lut;
%ctrl_hash = %items_control;
$file = 'items_control.txt'
}
## Check $key in tables\monsters.txt & items.txt
if ($inf_hash{$key}) {
debug "'$inf_hash{$key}' ID: $key is found in 'tables\\monsters.txt'.\n";
$found = 1;
$key = $inf_hash{$key}
} else {
foreach $name (values %inf_hash) {
if ($found = (lc($key) eq lc($name))) {
$key = $name;
debug "'$name' is found in 'tables\\monsters.txt'.\n";
last
}
}
}
if (!$found) {error "WARNING: '$key' is not found in 'tables\\monsters.txt'!\n"}
if(!$value) {
if ($ctrl_hash{lc $key}) {
if ($cmd eq 'mconf') {
message "\n$file:\n------------------------------\n $key $ctrl_hash{lc $key}{attack_auto} $ctrl_hash{lc $key}{teleport_auto} $ctrl_hash{lc $key}{teleport_search} $ctrl_hash{lc $key}{skillcancel_auto} $ctrl_hash{lc $key}{attack_lvl} $ctrl_hash{lc $key}{attack_jlvl} $ctrl_hash{lc $key}{attack_hp} $ctrl_hash{lc $key}{attack_sp} $ctrl_hash{lc $key}{weight}\n------------------------------\n\n", 'list'
} elsif ($cmd eq 'pconf') {
message "\n$file:\n------------------------------\n $key $pickupitems{lc($key)}\n------------------------------\n\n", 'list'
} elsif ($cmd eq 'iconf') {
message "\n$file:\n------------------------------\n $key $items_control{lc $key}{keep} $items_control{lc $key}{storage} $items_control{lc $key}{sell} $items_control{lc $key}{cart_add} $items_control{lc $key}{cart_get}\n------------------------------\n\n", 'list'
}
} else {error "The key '$key' is not found in '$file'\n"}
return
}
filewrite($file, $key, $value)
}
## write FILE
sub filewrite {
my ($file, $key, $value) = @_;
my @folders = Settings::getControlFolders();
debug "sub WRITE = FILE: $file, KEY: $key, VALUE: $value\n";
open (FILE, "$folders[0]/$file");
my @lines = <FILE>;
close (FILE);
chomp @lines;
my @new = ();
my $used = 0;
foreach my $line (@lines) {
my ($what, $is) = $line =~ /([\s\S]+?) ([\-\d\.]+[\s\S]*)/;
if(lc($what) eq lc($key)) {
$line = join (' ', $key, $value);
$used = 1
}
push (@new, $line)
}
if($used == 0){
push (@new, $key.' '.$value)
}
open (WRITE, ">$folders[0]/$file");
print WRITE join ("\n", @new);
close (WRITE);
message "\n $file:\n------------------------------\n $key $value\n------------------------------\n\n", 'system';
Commands::run("reload $file")
}
return 1;
+ пишем mconf <имя_или_ID_моба>, идёт проверка есть ли такой моб вообще в коре (файл tables\monsters.txt), если моба нет, то выдаётся предупреждение об этом. Далее идёт проверка есть ли такой моб в нашем файле mon_control.txt. Если есть то выводится значение (белый цвет), если нету, то предупреждение.
+ плаг понимает имена с пробелами
+ баз данных РО много, мобы и имена в них могут писаться по разному, единственное что связывает данные этих баз - это ID. Мы можем вести команду mconf <ID> <значение>, а в файл mon_control.txt нам запишется <имя_моба> <значение>
+ если мы ввели неправильно имя моба, то нам высветится предупреждение, но строчка всё равно запишется (жёлтый цвет).
+ если в конфиге поставить "debug 1", то плагинчик будет выводить на пару полезных строчек больше.
в планах:
- может сделать команду "xconf <имя_или_ID> none" которая будет удалять строчку из файла.. (стоит ли?)
- думаю посмотреть как ДениZки записывается в файл и подправить свой механизм, а то что-то он более грамозский..
- стоит ли сделать вывод информации как у встровеной команды conf (Config 'char' set to 3 (was 0)) ??
как вам такая "королева"? можно её е**ть или ещё подрисовать?

Добавлено спустя 7 минут 37 секунд:
т.е. фактически это используется после команды reload items_control??DInvalid писал(а):если эта фигня нам уже встречалась (т.е. существует в нашем "кэше") то присвоить ее нафиг, и не мучаться
потому что при первом запуске коры %cache у нас пустая..
- Вложения
-
- xConf.rar
- бэтка плагина (24.01.2008)
- (1.43 КБ) 278 скачиваний
Начал использовать плагин версии:
Заметил небольшую проблему.
Пример: в mon_control стоит Condor 1, при попытке команды mconf Condor 0 просто пишет белым цветом Condor 1 и ничего не меняется, но стоит написать mconf Condor 0 0 0 (это пример) как сразу же он перезапишет и покажет это желтым уже цветом. С любым другим синтаксисом все работает, кроме "имя моба 0".
P.S. Почему только при "неправильном" вводе должен быть желтый цвет надписи? Как раз заметил, что только после желтого цвета срабатывает смена приоритета.
Код: Выделить всё
# xConf plugin by 4epT (ICQ 2227733)
# Based on Lims idea
# Last changes 24.01.2008
# Plug-in for change mon_control/pickupitems/items_control files, using console commands.
Пример: в mon_control стоит Condor 1, при попытке команды mconf Condor 0 просто пишет белым цветом Condor 1 и ничего не меняется, но стоит написать mconf Condor 0 0 0 (это пример) как сразу же он перезапишет и покажет это желтым уже цветом. С любым другим синтаксисом все работает, кроме "имя моба 0".
P.S. Почему только при "неправильном" вводе должен быть желтый цвет надписи? Как раз заметил, что только после желтого цвета срабатывает смена приоритета.
- 4epT
- macro-маньячина
- Сообщения: 2795
- Зарегистрирован: Чт дек 21, 2006 1:23 pm
- Сервер RO:: 4game
- Discord: ya4ept#8494
- Контактная информация:
Re: xConf.pl - меняем на ходу mon_control/pickupitems/items
товарищи утверждают что плагин не фига не работает, может кто-то более конкретно напишет что и почему??
- Святой Инквизитор
- Грамотный
- Сообщения: 455
- Зарегистрирован: Вт окт 28, 2008 3:57 am
- Сервер RO:: DarkRO
- Откуда: Далёкая и тёмная страна Украина
- Контактная информация:
Re: xConf.pl - меняем на ходу mon_control/pickupitems/items
Напишу:
Ссылки битые так что брал из поста немного выше...
1) При попытке сменить значение из pickupitems.txt не меняет...
Если это all то ошибка
Скрин:

или если что-то другое то белая надпись с его значением при этом ничего не меняет:

2) Баг с проверкой all - так как его нет в таблицах то выбивает ошибку. (Обошёл добавив в таблицы под несуществующим номер - можно не исправлять)
Ссылки битые так что брал из поста немного выше...
1) При попытке сменить значение из pickupitems.txt не меняет...
Если это all то ошибка
Скрин:

или если что-то другое то белая надпись с его значением при этом ничего не меняет:

2) Баг с проверкой all - так как его нет в таблицах то выбивает ошибку. (Обошёл добавив в таблицы под несуществующим номер - можно не исправлять)
Re: xConf.pl - меняем на ходу mon_control/pickupitems/items
Вот вам версия исправленная и дополненная.
Добавлена комманда sconf, которая работает с файлом shop.txt.
Исправлена некорректная работа с "all" и ошибка "xconf name 0"
Добавлена комманда sconf, которая работает с файлом shop.txt.
Исправлена некорректная работа с "all" и ошибка "xconf name 0"
Код: Выделить всё
# xConf plugin by 4epT (ICQ 2227733)
# Based on Lims idea
# Edited by Dairey
# Last changes 03.02.2009
# Plug-in for change mon_control/pickupitems/items_control files, using console commands.
#
# Examples of commands:
# mconf Spore 0 0 0
# mconf 1014 0 0 0
#
# iconf Meat 50 1 0
# iconf 517 50 1 0
#
# pconf Fluff -1
# pconf 914 -1
package xConf;
use strict;
use Plugins;
use Globals;
use Log qw(message error debug);
## startup
Plugins::register('xConf', 'commands for change items_control, mon_control, pickupitems', \&Unload, \&Reload);
## Register command 'xConf'
my $chooks = Commands::register(
['iconf', 'edit items_control.txt', \&xConf],
['mconf', 'edit mon_control.txt', \&xConf],
['pconf', 'edit pickupitems.txt', \&xConf],
['sconf', 'edit shop.txt', \&xConf]
);
sub Reload {
Commands::unregister($chooks);
message "xConf plugin reloading\n", 'success'
}
sub Unload {
Commands::unregister($chooks);
message " xConf plugin unloading, ", 'success'
}
sub xConf {
my ($cmd, $args) = @_;
my ($key, undef, $value) = $args =~ /([\s\S]+?)( | )([\-\d\.]+[\s\S]*)/;
$key = $args if !$key;
debug "KEY: $key, VALUE: $value\n";
if (!$key) {
error "Syntax Error in function '$cmd'. Not found <key>\nUsage: $cmd <key> [<value>]\n";
return
}
my ($file,$found,$name, %inf_hash, %ctrl_hash) = undef;
if ($cmd eq 'mconf') {
%inf_hash = %monsters_lut;
%ctrl_hash = %mon_control;
$file = 'mon_control.txt'
} elsif ($cmd eq 'pconf') {
%inf_hash = %items_lut;
%ctrl_hash = %pickupitems;
$file = 'pickupitems.txt'
} elsif ($cmd eq 'iconf') {
%inf_hash = %items_lut;
%ctrl_hash = %items_control;
$file = 'items_control.txt'
} elsif ($cmd eq 'sconf') {
%inf_hash = %items_lut;
%ctrl_hash = %shop;
$file = 'shop.txt'
}
## Check $key in tables\monsters.txt & items.txt
if ($key ne "all") {
if ($inf_hash{$key}) {
debug "'$inf_hash{$key}' ID: $key is found in 'tables\\monsters.txt'.\n";
$found = 1;
$key = $inf_hash{$key}
} else {
foreach $name (values %inf_hash) {
if ($found = (lc($key) eq lc($name))) {
$key = $name;
debug "'$name' is found in 'tables\\monsters.txt'.\n";
last
}
}
}
if (!$found) {error "WARNING: '$key' is not found in 'tables\\monsters.txt'!\n"}
}
if($value eq '') {
if ($ctrl_hash{lc $key}) {
if ($cmd eq 'mconf') {
message "\n$file:\n------------------------------\n $key $ctrl_hash{lc $key}{attack_auto} $ctrl_hash{lc $key}{teleport_auto} $ctrl_hash{lc $key}{teleport_search} $ctrl_hash{lc $key}{skillcancel_auto} $ctrl_hash{lc $key}{attack_lvl} $ctrl_hash{lc $key}{attack_jlvl} $ctrl_hash{lc $key}{attack_hp} $ctrl_hash{lc $key}{attack_sp} $ctrl_hash{lc $key}{weight}\n------------------------------\n\n", 'list'
} elsif ($cmd eq 'pconf') {
message "\n$file:\n------------------------------\n $key $pickupitems{lc($key)}\n------------------------------\n\n", 'list'
} elsif ($cmd eq 'iconf') {
message "\n$file:\n------------------------------\n $key $items_control{lc $key}{keep} $items_control{lc $key}{storage} $items_control{lc $key}{sell} $items_control{lc $key}{cart_add} $items_control{lc $key}{cart_get}\n------------------------------\n\n", 'list'
} elsif ($cmd eq 'sconf') {
message "\n$file:\n------------------------------\n $key $shop{lc $key}\n------------------------------\n\n", 'list'
}
} else {error "The key '$key' is not found in '$file'\n"}
return
}
filewrite($file, $key, $value)
}
## write FILE
sub filewrite {
my ($file, $key, $value) = @_;
my @folders = Settings::getControlFolders();
debug "sub WRITE = FILE: $file, KEY: $key, VALUE: $value\n";
open (FILE, "$folders[0]/$file");
my @lines = <FILE>;
close (FILE);
chomp @lines;
my @new = ();
my $used = 0;
foreach my $line (@lines) {
my ($what, undef, $is) = $line =~ /([\s\S]+?)( | )([\-\d\.]+[\s\S]*)/;
if(lc($what) eq lc($key)) {
if($file eq 'shop.txt') {
$line = join (' ', $key, $value);
} else {
$line = join (' ', $key, $value);
}
$used = 1
}
push (@new, $line)
}
if($used == 0){
if($file eq 'shop.txt') {
push (@new, $key.' '.$value)
} else {
push (@new, $key.' '.$value)
}
}
open (WRITE, ">$folders[0]/$file");
print WRITE join ("\n", @new);
close (WRITE);
message "\n $file:\n------------------------------\n $key $value\n------------------------------\n\n", 'system';
Commands::run("reload $file")
}
return 1;