xConf.pl - меняем на ходу mon_control/pickupitems/items

Дополнения к OpenKore, расширяющиее её функциональность, называются плагинами.

Модератор: 4epT

DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

DeniZka

Неа.
s/^$key [0-9].*/$key $value/i - не работает.

s/^$key [\-0-3].*/$key $value/i - может так? но плохо если напишут неправильные значения.

или

s/^$key [\-\d].*/$key $value/i
Аватара пользователя
DeniZka
Разработчик
Сообщения: 410
Зарегистрирован: Ср ноя 15, 2006 6:36 pm
Сервер RO:: rRO AsgardRO
Откуда: Mos-Cow Citadel
Контактная информация:

Сообщение DeniZka »

+
Если не воводятся значения для монстра (предмета), то отображается нынешнее состояние параметра

А пустая комманда mconf(pconf, iconf) выдаст сообщение об использовании комманды.

Ждем еще реализации этого плагина от 4epTа. =)
Изображение
1t 1$ t00 900d d4y 2 d1e

?(???)?(???)?( ?Д?)?
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Сообщение 4epT »

что-то я не сразу вкурил твоё "сообщение об использовании комманды" :)

у меня чем дальше, тем больше я хочу запихнуть в плагинчек.

раньше у меня була процедура чтения данных с файла, а теперь думаю проверять наличие данных в хэше.. стоит ли?

- процедура одна, а хэшей 3
- процедура открывает файл каждый раз, а хэш вроде как быстрее (хотя и то и то быстро)
:)
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
DeniZka
Разработчик
Сообщения: 410
Зарегистрирован: Ср ноя 15, 2006 6:36 pm
Сервер RO:: rRO AsgardRO
Откуда: Mos-Cow Citadel
Контактная информация:

Сообщение DeniZka »

Хеши полюбас быстрее будут, т.к. они уже в оперативке висят, а то пока головки по кластерам будут искать файл, пока он загрузится в оперативку, пока пререгонится в массивчег.. даж глазом моргнуть успеешь =)))
Изображение
1t 1$ t00 900d d4y 2 d1e

?(???)?(???)?( ?Д?)?
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Сообщение 4epT »

хакей, тогда ломаем хэши дальше :)

Вопрос на засыпку, в файле 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;
}
и у меня возникает вопрос, занафига тут условие "if ($cache{$args_text}) {" ??
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

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-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Сообщение 4epT »

Выкладываю вам свою всё ещё бэтку:

Код: Выделить всё

# 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)) ??

как вам такая "королева"? можно её е**ть или ещё подрисовать? :twisted:

Добавлено спустя 7 минут 37 секунд:
DInvalid писал(а):если эта фигня нам уже встречалась (т.е. существует в нашем "кэше") то присвоить ее нафиг, и не мучаться
т.е. фактически это используется после команды reload items_control??

потому что при первом запуске коры %cache у нас пустая..
Вложения
xConf.rar
бэтка плагина (24.01.2008)
(1.43 КБ) 233 скачивания
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Ёперный театр! Так какой же из вариантов плагина надо юзать?! :shock:
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
DeniZka
Разработчик
Сообщения: 410
Зарегистрирован: Ср ноя 15, 2006 6:36 pm
Сервер RO:: rRO AsgardRO
Откуда: Mos-Cow Citadel
Контактная информация:

Сообщение DeniZka »

piroJOKE
немного оффтоп, но вцелом по сути твоего вопроса ;)

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

:ROFL:
Изображение
1t 1$ t00 900d d4y 2 d1e

?(???)?(???)?( ?Д?)?
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Сообщение 4epT »

юзай мой, дениZка мне помогает ;)

кстате, Ден, потри свой вариант, чтоб потом толпа не путалась
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
Cooot
Грамотный
Сообщения: 306
Зарегистрирован: Пт апр 25, 2008 8:02 am

Сообщение Cooot »

Начал использовать плагин версии:

Код: Выделить всё

# 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. Почему только при "неправильном" вводе должен быть желтый цвет надписи? Как раз заметил, что только после желтого цвета срабатывает смена приоритета.
Изображение
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

Cooot
Видимо там регексп немного кривоват.
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Re: xConf.pl - меняем на ходу mon_control/pickupitems/items

Сообщение 4epT »

товарищи утверждают что плагин не фига не работает, может кто-то более конкретно напишет что и почему??
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
Святой Инквизитор
Грамотный
Сообщения: 455
Зарегистрирован: Вт окт 28, 2008 3:57 am
Сервер RO:: DarkRO
Откуда: Далёкая и тёмная страна Украина
Контактная информация:

Re: xConf.pl - меняем на ходу mon_control/pickupitems/items

Сообщение Святой Инквизитор »

Напишу:
Ссылки битые так что брал из поста немного выше...
1) При попытке сменить значение из pickupitems.txt не меняет...
Если это all то ошибка
Скрин:
Изображение
или если что-то другое то белая надпись с его значением при этом ничего не меняет:
Изображение

2) Баг с проверкой all - так как его нет в таблицах то выбивает ошибку. (Обошёл добавив в таблицы под несуществующим номер - можно не исправлять)
Изображение Изображение
Настрою конфиг, напишу макрос - не дорого.
Стучать в асю (есть в профиле).
Dairey
Начинающий
Сообщения: 21
Зарегистрирован: Пт ноя 07, 2008 7:45 pm

Re: xConf.pl - меняем на ходу mon_control/pickupitems/items

Сообщение Dairey »

Вот вам версия исправленная и дополненная.
Добавлена комманда 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;
Ответить