определение переменной в макросе, вывод переменной в файл

Разработка новых функций.

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

dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

определение переменной в макросе, вывод переменной в файл

Сообщение dvdc »

Вобщем, сейчас пишу суперконфиг для себя :) о чём уже неоднократно говорил.
Подумалось тут мне вот о чём, можно ли через eval в макросе использовать перл для передачи переменной в отдельный файл?
предположим, мне необходимо чтобы изначально существовал файл anyfile.txt, с такими строчками:

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

// Anyfile.txt
somethingDS=1 // бла-бла-бла, комментарии здесь
somethingAS=0 // например тоже комментарии
somestring="String here" // и такую переменную мне тоже надо использовать
в макросе мне необходимо сделать так, чтобы эти переменные считывались из файла, присваивались (или шла бы проверка предположим, например происходит событие, но если somethingAS=0 то пропустить обработку макроса). Но если, к примеру, изначально в моём файле somethingAS равнялось бы единице, то макрос выполнялся бы на ура, а потом этой переменной присваивалось значение 0 (к примеру) и макрос больше не выполнялся бы?

я знаю что в макросе можно самостоятельно задавать переменные, но, получается что с каждым запуском коры я буду постоянно "обнулять" свои переменные, а мне этого бы не очень хотелось. в описании макросов сказано что @eval используется для счёта чего-либо, а консольная команда eval - Evaluate a Perl expression... вот такая вот штука )
Sauron
Грамотный
Сообщения: 435
Зарегистрирован: Ср ноя 29, 2006 3:24 pm

Сообщение Sauron »

я знаю что из конфига можно реально значение получить, например в конфиге есть твоя строка:

MyParam 150

В макросе:

$XXX=@config(MyParam)
от РО до шестой палаты - один шаг...
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

отлично, а как насчёт изменения этого параметра? и как сделать так, чтобы этот изменённый параметр сразу же включился во все мои другие конфиги? бот будет плавно переходить 7 различных конфиг-файлов при разных событиях.
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

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

а решение своего вопроса я пока узерл в run-once 1, но я не уверен что при повторном запуске бота он не начнёт делать то же самое, что уже сделал. именно поэтому хотелось бы иметь "внешний" файл с переменными, которые можно крутить как угодно. при этом желательно, чтобы в файле с переменными можно было писать еще комментарии, и прочие прелести )) всё ведь для удобства ботоводов )
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

порылся еще немного, нашёл фразу одного умного Senior Member'а "@eval is for really simple perl expressions that do not contain brackets '(', ')'. The parser is not powerful enough to evaluate more complex commands."
то есть для моей задачи видимо придётся писать еще и плагин?
Sauron
Грамотный
Сообщения: 435
Зарегистрирован: Ср ноя 29, 2006 3:24 pm

Сообщение Sauron »

Решений два ..
1. поискать плагин, более менее отвечающий задаче на опенкоре http://forums.openkore.com/viewforum.php?f=15
2. написать свой плагин...
//то, о чем ты говоришь, мне кажется, не входит в функционал плагина поддерживающего макрос.txt хотя могу ошибаться...
от РО до шестой палаты - один шаг...
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

я уже нашёл решение. просто сегодня весь день прочёсывал форум опенкора, понял что такой задачей вообще никто не задавался... и даже написал сам себе техзадание. собственно, сейчас сяду писать плагин.

выдержка из моего техзадания:
Использование

Для обеспечения независимости переменной от переменных текущего конфигурационного файла.
Например, боту необходимо сделать какое-то событие один раз. При этом необходимо, чтобы ему поставился "флаг" об осуществлённой операции, чтобы при дальнейших запусках бота не возникало зацикливания на это операции. Пример: бот нашёл карту пупы и броню, воткнул карту в броню и одел. Событие должно произойти только один раз, потому что все другие карты пупы и броня
боту уже не нужны для себя, он их должен складировать в кафру.
Второй пример: связка из двух ботов. Один бот стоит в определённом месте, и при каком-либо внешнем событии (например, появился какой-то персонаж), сразу же пишет во внешний файл
переменную о том, что такой персонаж появился. Второй бот раз в определённое количество времени проверяет файл на переменную, и если вдруг натыкается на изменённую первым ботом - делает определённое действие.
Третий пример: бот работает над выбиванием определённого лута или какой-либо вещи. Когда эта вещь появляется у бота в инвентаре - он записывает во внешний файл соответствующую переменную. Сторонная программа или скрипт (например php) при инициализации (зашли на страничку) считывает из этого файла переменную, и обрабатывает её выводя на экран соответствующую информацию.
Например, я поставил бота на несколько дней автоматически качаться и выбивать разные рары. Сижу на работе, на компе с ботом открыт веб-сервер. Периодически я захожу на свою страничку, где мне сообщается, выбил ли бот что-нибудь ценное или нет. (В данном случае список "ценностей" на php можно брать из item_control.txt).
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

dvdc
Первое. Легче всего через файлик в лог папоче написать например.
Второе. Лучше юзать IPC.
Третье.... ХМ был старенький плагинчик, вебконтрол или в таком роде, глянь.
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

[дубликат сообщения удалён]
Последний раз редактировалось dvdc Чт фев 08, 2007 2:45 am, всего редактировалось 1 раз.
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

вот кстати, что родил мой воспалённый разум. примерно такой функциональности плагин был бы идеален. тогда создавать макросы можно опираясь на этот плагин.
и в принципе связка хорошо работать должна такая:

automacro something {
do extvar get $extvariable $intvariable
$intvariable==1
location prontera
run-once 1
call blablabla
}

хотя мне по душе и такая фигня:

macro something {
extvar get $extvariable1 $intvariable
if ($intvariable == 1) goto one
if ($intvariable == 2) goto two
goto end

:one
do something 1
goto end
:two
do something 2
:end
release something
}
Есть внешний файл, в котором задаются разные переменные вида: $variable=int или $variable='string'.
В основном config.txt определяется имя этого файла: "ExtVarFilename additional.txt"
В самом файле переменные должны считываться и записываться. Также там должны быть переменные по умолчанию, а если их нет - создаются уже из макроса.

Какие комманды планируются использовать:
extvar get $extVariable $intVariable
(присвоить локальной переменной intVariable значение extVariable)

extvar put $extVariable $intVariable
(присвоить внешней переменной extVariable значение intVariable)

extvar nul $extVariable
(присвоить внешней переменной $extVariable нулевое значение)
чтобы не городить схему:
$intVariable = 0
extvar put $extVariable $intVariable
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Как загрузить содержимое файла в переменную: пример из Settings.pm
# Example:
# # Configuration file account.txt looks like this:
# username blabla
# password 1234
#
# # Perl source:
# use FileParsers; # This is where parseDataFile() is defined
#
# # Add configuration file
# my %account;
# my $ID = Settings::addConfigFile("account.txt", \%account, \&parseDataFile);
# # %account is now still empty
# Settings::load($ID); # Now account.txt is loaded %account is filled
# print "$account{username}\n"; # -> "blabla"
Точно так же надо организовать запись в этот файл содержимого переменной...
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

вопрос решён очень интересным способом ))
практическое применение этому способу - мой конфиг-макрос автобота. всё сводится к config.txt, даже внешних файлов и обработок не требуется.
всё что нужно - правильно считывать, и записывать переменные.
и не забывать о синтаксисе объявления переменных в макросах.
в config.txt вставляем любую переменную. например "vasya 1"
макрос:

automacro load {
location prontera
call loading
run-once 1
}

macro loading {
$vasya = @config (vasya)
log Vasya is $vasya
}

automacro test {
var vasya == 1
call testtest
run-once 1
}

macro testtest {
log Vasya makes +1 !
do something
do that
do else... something more...
pause n
do conf vasya 2
release load
}

поясню. когда мы находимся в пронтере мы инициируем единичное использование "загрузчика" переменной - макроса loading.
макрос загружает васю, и больше нифига не делает.
автомакрос тест направлен на обработку этой переменной. если вася идентичен единице, то единоразово переходить на макрос тесттест, в котором происходят действия, а в конце в наш config.txt вносятся изменения "на лету", и вася больше не 1, вася 2 !!!
после чего любуемся на последнюю строчку тесттеста - там релиз лоада, то есть освобождение автомакроса-загрузчика переменных от обязанности запускаться один раз.
а это значит (!) что если мы снова вернёмся в пронтеру (условия могут быть любыми), то переменная вася снова загрузится. но уже с тем значением, которое мы так хотели туда привсунуть. :))
таким образом, мы можем ставить контрольные точки в каких-либо макросах, для получения полного контроля за всеми действиями бота. такая схема может быть не очень оптимизирована, и занимает большое количество кода и памяти, зато (!) мы осуществляем полный контроль за всеми действиями бота.

важно учитывать разницу синтаксиса макро и автомакро. на изучение этих возможностей я потратил один день, но я собой доволен.
теперь, например, мой бот не просто автоматически работает, но и самостоятельно контролирует себя. если интернет вдруг дисконнектнуло, или он умер в самом неподходящем для смерти месте (с введением эвента на волшебные поленья в городах мидгарда) - это очень и очень полезно :) вот.
HuHb391
Новичок
Сообщения: 8
Зарегистрирован: Чт фев 15, 2007 12:39 pm

Сообщение HuHb391 »

а как сделать так чтобы допустим не vasya 1 менялся на vasya 2 а чтоб username vasya менялся на юзернейм fedya потом на tolya и так далее но порядок чтоб был именно такой, мне это нужно чтоб загружать нескольких аккаунтов на одного и того же бота одним кликом не прописывая каждый раз Username i Password.
типа открыл допустим 3 раза бота и каждый раз чтоб в Config.txt был прописанн другой Username и чтоб в итоге получилось 3 окна бота с разных акаунтов (vasya, fedya i tolya)

такое возможно сделать?
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

HuHb391
Боян.
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

Клаб, кстати спасибо за идею с блоками, вроде фурычит всё. :)
Скоро начну кусками публиковать примеры
Ответить