Страница 6 из 7

Добавлено: Вт янв 22, 2008 11:28 pm
DInvalid
DeniZka

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

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

или

s/^$key [\-\d].*/$key $value/i

Добавлено: Ср янв 23, 2008 11:16 am
DeniZka
+
Если не воводятся значения для монстра (предмета), то отображается нынешнее состояние параметра

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

Ждем еще реализации этого плагина от 4epTа. =)

Добавлено: Ср янв 23, 2008 10:09 pm
4epT
что-то я не сразу вкурил твоё "сообщение об использовании комманды" :)

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

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

- процедура одна, а хэшей 3
- процедура открывает файл каждый раз, а хэш вроде как быстрее (хотя и то и то быстро)
:)

Добавлено: Ср янв 23, 2008 10:44 pm
DeniZka
Хеши полюбас быстрее будут, т.к. они уже в оперативке висят, а то пока головки по кластерам будут искать файл, пока он загрузится в оперативку, пока пререгонится в массивчег.. даж глазом моргнуть успеешь =)))

Добавлено: Чт янв 24, 2008 12:52 am
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}) {" ??

Добавлено: Чт янв 24, 2008 1:53 am
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;
}

Добавлено: Чт янв 24, 2008 2:08 am
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 у нас пустая..

Добавлено: Пт янв 25, 2008 12:24 am
piroJOKE
Ёперный театр! Так какой же из вариантов плагина надо юзать?! :shock:

Добавлено: Пт янв 25, 2008 6:52 am
DeniZka
piroJOKE
немного оффтоп, но вцелом по сути твоего вопроса ;)

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

:ROFL:

Добавлено: Пт янв 25, 2008 1:39 pm
4epT
юзай мой, дениZка мне помогает ;)

кстате, Ден, потри свой вариант, чтоб потом толпа не путалась

Добавлено: Сб сен 27, 2008 10:40 pm
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. Почему только при "неправильном" вводе должен быть желтый цвет надписи? Как раз заметил, что только после желтого цвета срабатывает смена приоритета.

Добавлено: Сб сен 27, 2008 11:28 pm
kLabMouse
Cooot
Видимо там регексп немного кривоват.

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

Добавлено: Вт фев 03, 2009 11:21 pm
4epT
товарищи утверждают что плагин не фига не работает, может кто-то более конкретно напишет что и почему??

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

Добавлено: Вт фев 03, 2009 11:50 pm
Святой Инквизитор
Напишу:
Ссылки битые так что брал из поста немного выше...
1) При попытке сменить значение из pickupitems.txt не меняет...
Если это all то ошибка
Скрин:
Изображение
или если что-то другое то белая надпись с его значением при этом ничего не меняет:
Изображение

2) Баг с проверкой all - так как его нет в таблицах то выбивает ошибку. (Обошёл добавив в таблицы под несуществующим номер - можно не исправлять)

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

Добавлено: Ср фев 04, 2009 1:41 pm
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;