Выкладываю вам свою всё ещё бэтку:
Код: Выделить всё
# 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 секунд:
DInvalid писал(а):если эта фигня нам уже встречалась (т.е. существует в нашем "кэше") то присвоить ее нафиг, и не мучаться
т.е. фактически это используется после команды
reload items_control??
потому что при первом запуске коры %cache у нас пустая..