|
Клиенты для игры Все что связано с клиентами для игры. Jmc, MMC, ZMud etc... |
|
Опции темы | Опции просмотра |
12.02.2005, 23:40 | #1 |
Super Moderator
Регистрация: 11.11.2004
Сообщений: 20
|
пример конфига для ММС (с) Потапий
Код:
# **************************************************************************** # Определяю основные переменные # **************************************************************************** # Основной контэйнер $U::container; # Состояние # 0 - нет битвы # 1 - битва $U::isFighting = 0; # Режим боя ( 0 - оборона, 1 - атака ) # 0 (ЗАЩИТА) - используется осторожный стиль, парирование или веерная защита # 1 (АТАКА) - используется обычный стиль, обезоруживание и пинок # Для смены тактики необходимо использовать функцию setTactic() $U::tactic = 0; # Способ отражения атак при обороне # 0 - не отражать # 1 - парировать # 2 - веерная защита $U::parry = 0; # Необходимость применить парирование $U::doParry = 1; # Текущее вооружение, чтобы поднимать с земли $U::wpnRight = 0; # В правой руке $U::wpnLeft = 0; # В левой руке # Оружие для быстрой смены $U::wpnPrime = ""; # Оружие в правую руку $U::wpnOff = ""; # Оружие в левую руку $U::wpnBoth = ""; # Двуручник $U::wpnShield = ""; # Щит $U::wpnMode = 0; # Режим боя # Признак того, что отослана команда 'встать' $U::standingUp = 0; # Цель для боевых умений # если пусто - атаковать текущего противника $U::sTarget = ""; @indexList = ( '1', '2', '3', '4', '5', '6' ); @victimList = (); # Текущий список жертв $U::victimCount = 0; $U::tank; # Основной танк группы # **************************************************************************** # создание строки статуса # **************************************************************************** $crap = ''; Status::new_sv( $crap, 1 ); Status::new_sv( $U::strTactic, 7, 15 ); Status::new_sv( $crap, 1 ); Status::new_sv( $U::strParry, 4, 15 ); Status::new_sv( $crap, 1 ); Status::new_sv( $U::wpnMode, 2, 15 ); Status::new_sv( $crap, 1 ); Status::new_sv( $U::sTarget, 10, 15 ); Status::new_sv( $crap, 0 ); for ( my $cnt = 0; $cnt < 6; $cnt++ ) { Status::new_sv( @indexList[$cnt], 1, 11 ); Status::new_sv( @victimList[$cnt], 7, 14 ); } # **************************************************************************** # Функция обработки prompt # **************************************************************************** hook { # вычленение первой строки my $prompt = shift; if ( $prompt =~ /\[.*]/ ) { # Идет бой !!! if ( $U::isFighting == 0 ) { &startFight(); } fightRound(); } else { $U::isFighting = 0; } # Возвращает строку $prompt; } "prompt"; # Отработка холд trig { $: = "\003F********** \003P$_ \003F**********"; } '^(.*?) замер(л.)? на месте !', '2000fn:AFIGHT'; sub startFight { # Начиная бой, быть готовым $U::doParry = 1; # Парировать $mparry = 0; $U::isFighting = 1; # бой НАЧАЛСЯ ! } # При смене противника, начинать заново trig { startFight; } 'Вы переключили внимание на', '1500fn:AFIGHT'; # Отклонение # trig { $U::doParry = 0; } 'Вы попробуете отклонить следующую атаку\.', '1500fn:AFIGHT'; trig { $U::doParry = 1; } '^Вы не смогли отбить атаку ', '1500fn:AFIGHT'; trig { $U::doParry = 1; } '^Вы не можете отклонить атаку безоружным\.', '1500fn:AFIGHT'; trig { $U::doParry = 1; } '^Вы (частично|немного|полностью) отклонили атаку ', '1500fn:AFIGHT'; trig { $mparry = 1; } 'Вы попробуете использовать веерную защиту\\.', '1500fn:AFIGHT'; # Обезоруживание # Пинок # Встать! trig { if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); } } '^Вам лучше встать на ноги !', '1500fn:AFIGHT'; trig { if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); } } '^Пожалуй, Вам лучше встать на ноги', '1500fn:AFIGHT'; trig { if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); } } '^Вы полетели на землю от мощного удара ', '1500fn:AFIGHT'; trig { if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); } } 'Вас на землю\\. Поднимайтесь!', '1500fn:AFIGHT'; trig { $U::standingUp = 0; $U::doParry = 1; &fightRound(); } 'Вы встали\\.', '1500fn:AFIGHT'; # Процедура обработки раунда боя sub fightRound { # Не зависит от стиля. if ( $U::parry == 0 ) { # ничего не предпринимать } elsif ( $U::parry == 1 ) { if ( $U::doParry == 1 ) { $U::doParry = 0; sendl( 'парировать' ); } } elsif ( $U::parry == 2 ) { if ( $mparry == 0 ) { sendl( 'отразить' ); } $mparry = 0; } else { # ничего не предпринимать } } sub switchParry { if ( $U::parry == 0 ) { $U::parry = 1; $U::strParry = "ПАР"; } elsif ( $U::parry == 1 ) { $U::parry = 2; $U::strParry = "ОТР"; } elsif ( $U::parry == 2 ) { $U::parry = 0; $U::strParry = ""; } } sub setTactic( $ ) { if ( $_[0] != -1 ) { $U::tactic = $_[0]; } else { if ( $U::tactic == 0 ) { $U::tactic = 1; } elsif ( $U::tactic == 1 ) { $U::tactic = 0; } } if ( $U::tactic == 1 ) { sendl( 'стиль обычный' ); startFight; $U::strTactic = 'АТАКА'; } else { sendl( 'стиль осторожный' ); startFight; $U::strTactic = 'ЗАЩИТА'; } } # Выбор secondary target sub CMD::cmd_st { $U::sTarget = @_[0]; echo ( "Вторичная цель = ".$U::sTarget ); } # Триггеры автореска # Работа со списком # Сравниваются два слова без учета падежей # @_[0] - именительный падеж образца # @_[1] - претендент в неизвестном падеже sub rStrEq { my $l = length( @_[0] ) - 1; # Убираю падежное окончание return 0 if ( length( @_[1] ) < $l ); # Очень короткая вторая строка return ( substr( @_[0], 0, $l ) eq substr( @_[1], 0, $l ) ); } # Поиск элемента, возвращает индекс в массиве или -1 # При поиске используется строковое сравнение без падажей # Вызов: searchItem( \@array, $item ); sub searchItem { my $n = scalar @{@_[0]}; # Количество элементов в массиве for( my $i = 0; $i < $n; $i++ ) # По всем элементам { return $i if ( rStrEq( @{@_[0]}[$i], @_[1] ) ); } return -1; # Не нашел } @U::AssistList = (); # Список тех, кого нужно спасать # Построение списка по группе sub CMD::cmd_albuild { enable('GFIGHT'); sendl('гр'); } # Очистка списка sub CMD::cmd_alclear { @U::AssistList = (); } # Добавление элемента в AssistList sub CMD::cmd_aladd { if ( searchItem( \@U::AssistList, @_[0] ) == -1 ) { my $i = scalar @U::AssistList; @U::AssistList[$i] = @_[0]; } } # Удаление элемента из AssistList sub CMD::cmd_aldel { my $i = searchItem( \@U::AssistList, @_[0] ); return if $i == -1; splice @U::AssistList, $i, 1; } # Распечатка списка sub CMD::cmd_aldump { printc( "Список ассистирования:" ); printc( "----------------------" ); foreach $char ( @U::AssistList ) { printc( $char ); } printc( "----------------------" ); } #******************************************************************************* #******************************************************************************* #******************************************************************************* # Построение списка группы # Триггер запускает сбор группы trig { enable('GASSEMBLE'); } '^Ваша группа состоит из:', 'n-:GFIGHT'; trig { disable('GFIGHT'); } '^Но Вы же не член (в лучшем смысле этого слова) группы!', 'n-:GFIGHT'; trig { if ( /(\S+)/ ) { if ( $1 !~ /Персонаж/ ) { CMD::cmd_aladd( $1 ); } } else { disable('GASSEMBLE'); disable('GFIGHT'); } } '.*', 'fn-:GASSEMBLE'; sub startRecall { return if @_[0] >= $U::victimCount; $lastRescueIndex = @_[0]; sendl( '~' ); sendl( 'взять возврат ' . $U::container ); sendl( 'зачит возврат .' . @victimList[$lastRescueIndex] ); } my $lastRescueIndex = -1; # Запуск спасения # Параметр - индекс в victimList sub startRescue { return if @_[0] >= $U::victimCount; $lastRescueIndex = @_[0]; sendl( '~' ); sendl( 'спас .' . @victimList[$lastRescueIndex] ); enable('AUTORESC'); } # Спасение закончено sub stopRescue { my $i; # wprintc( 1, 'stop rescue ' . @_[0] . ' ' . @_[1] . '(', @victimList, ')' ); disable('AUTORESC'); if ( defined @_[0] ) { # Правда ли, что имя и индекс совпадают $i = searchItem( \@victimList, @_[0] ); if ( $i != $lastRescueIndex ) { # wprintc( 1, 'Index mismatch: ', $lastRescueIndex, ' ', $i ); } $lastRescueIndex = $i; } if ( (@_[1] != 0) && ($lastRescueIndex != -1) ) { # wprintc( 1, 'remove ', $lastRescueIndex, @victimList ); for ( $i = $lastRescueIndex; $i < $U::victimCount-1; $i++ ) { @victimList[$i] = @victimList[$i+1]; } @victimList[$i] = ''; $U::victimCount--; } $lastRescueIndex = -1; } sub listAllRescue { my $i; for ( $i = 0; $i < scalar @U::AssistList; $i++ ) { # @victimList[$i] = @U::AssistList[$i]; AttackDetected( "", @U::AssistList[$i], 1 ); } $U::victimCount = $i; $lastRescueIndex = -1; } # Реакция на спасение # trig { stopRescue( $1, 1 ); } 'Хвала Богам, Вы героически спасли (.*) !', 'n-:AUTORESC'; trig { stopRescue( undef, 0 ); } 'Хвала Богам, Вы героически спасли (.*) !', 'n-:AUTORESC'; trig { stopRescue( $1, 1 ); } 'Но никто не сражается с (.*)!', 'n-:AUTORESC'; trig { stopRescue( undef, 1 ); } 'Кого Вы хотите спасти \?', 'n-:AUTORESC'; trig { stopRescue( undef, 1 ); } 'Ваше спасение Вы можете доверить только Богам\.', 'n-:AUTORESC'; trig { stopRescue( undef, 0 ); } 'Вы временно не в состоянии сражаться\.', 'n-:AUTORESC'; trig { stopRescue( undef, 0 ); } 'Вы безуспешно пытались спасти (.*)\.', 'n-:AUTORESC'; trig { stopRescue( undef, 0 ); } 'Вы пытаетесь спасти атакующего Вас \?', 'n-:AUTORESC'; trig { stopRescue( undef, 0 ); } 'Вы пытаетесь спасти чужого противника\.', 'n-:AUTORESC'; bindkey { startRescue( 0 ); } "C-f1"; bindkey { startRescue( 1 ); } "C-f2"; bindkey { startRescue( 2 ); } "C-f3"; bindkey { startRescue( 3 ); } "C-f4"; bindkey { startRescue( 4 ); } "C-f5"; bindkey { startRescue( 5 ); } "C-f6"; bindkey { startRecall( 0 ); } "M-C-f1"; bindkey { startRecall( 1 ); } "M-C-f2"; bindkey { startRecall( 2 ); } "M-C-f3"; bindkey { startRecall( 3 ); } "M-C-f4"; bindkey { startRecall( 4 ); } "M-C-f5"; bindkey { startRecall( 5 ); } "M-C-f6"; bindkey { listAllRescue; } "C-k+"; # Попытка добавить элемент в очередь текущих жертв sub AttackDetected { # $_[0] - агессор # $_[1] - жертва # $_[2] - попал или нет # wprintc( 1, ( "Agressor: ", $_[0], " Victim: ", $_[1], " Result: ", $_[2] ) ); my $i = searchItem( \@U::AssistList, @_[1] ); return if $i == -1; # Этого спасать не нужно return if $U::tank eq @U::AssistList[$i]; # Танка не спасаю # wprintc( 1, "resc" ); my $j = searchItem( \@victimList, @U::AssistList[$i] ); return if $j != -1; # Уже спасаю # wprintc( 1, "enqueue" ); # Добавляю в очередь на спасение @victimList[$U::victimCount] = @U::AssistList[$i]; # wprintc( 1, $U::victimCount, @victimList ); $U::victimCount++; } my @hitting = ( 'бодну','клюну','лягну','ободра','огре','оцарапа','подстрели','проткну','пырну', 'резану','рубану','сокруши','ткну','удари','уколо','укуси','хлестну' ); # ************** ПОПАДАНИЕ *************** sub HitDetected { AttackDetected( $1, $5, 1 ); } foreach ( @hitting ) { trig( \&HitDetected, "^(.*?) (легонько |слегка |сильно |очень сильно |чрезвычайно сильно |БОЛЬНО |ОЧЕНЬ БОЛЬНО |ЧРЕЗВЫЧАЙНО БОЛЬНО |УЖАСНО |НЕВЫНОСИМО БОЛЬНО |СМЕРТЕЛЬНО )?($_)л(а|о|и)? (.*?)\\.", "n:AUTOHIT" ); } # ************** ПРОМАХИ ***************** sub Miss1Detected { AttackDetected( $3, $1, 0 ); } foreach ( @hitting ) { trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? попытки (.*?) ($_)ть (.*?)\\.", "n:AUTOHIT" ); } trig( \&Miss1Detected, "^(.*?) сумел(а|о|и)? избежать удара (.*?)\\.", "n:AUTOHIT" ); # **************************************** sub Miss2Detected { AttackDetected( $1, $5, 0 ); } foreach ( @hitting ) { trig( \&Miss2Detected, "^(.*?) промазал(а|о|и)?, когда хотел(а|о|и)? ($_)ть (.*?)\\.", "n:AUTOHIT" ); } # **************************************** sub Miss3Detected { AttackDetected( $1, $5, 0 ); } foreach ( @hitting ) { trig( \&Miss3Detected, "^(.*?) промахнул(ся|ась|ись|ось), когда пытал(ся|ась|ись|ось) ($_)ть (.*?)\\.", "n:AUTOHIT" ); } # **************************************** sub Miss4Detected { AttackDetected( $1, $4, 0 ); } foreach ( @hitting ) { trig( \&Miss4Detected, "^(.*?) попытал(ся|ась|ись|ось) ($_)ть (.*?)(, но| - )", "n:AUTOHIT" ); } # **************************************** sub Miss5Detected { AttackDetected( $2, $1, 0 ); } trig( \&Miss5Detected, "^Доспехи (.*?) полностью поглотили удар (.*?)\\.", "n:AUTOHIT" ); # **************************************** sub Miss6Detected { AttackDetected( $4, $1, 0 ); } trig( \&Miss6Detected, "^(.*?) полностью (отклони|отрази)л(а|о|и)? атаку (.*)", "n:AUTOHIT" ); # **************************************** sub Miss7Detected { AttackDetected( $1, $2, 0 ); } trig( \&Miss7Detected, "^Удар (.*?) прошел мимо (.*?)\\.", "n:AUTOHIT" ); trig( \&Miss7Detected, "^Попытка (.*?) хлестнуть (.*?) оказалась неудачной\\.", "n:AUTOHIT" ); # **************************************** sub Miss8Detected { AttackDetected( $1, $3, 0 ); } trig( \&Miss8Detected, "^(.*?) не смог(ла|ло|ли)? ободрать (.*?) ", "n:AUTOHIT" ); # **************************************** undef @hitting; # ************** BACKSTAB **************** sub Back1Detected { AttackDetected( $1, $3, 1 ); } trig( \&Back1Detected, "^(.*?) нанес(ла|ло|ли)? удар своим оружием в спину (.*?)\\.", "n:AUTOHIT" ); trig( \&Back1Detected, "^(.*?) воткнул(а|о|и)? свое оружие в спину (.*?)\\.", "n:AUTOHIT" ); sub Back2Detected { AttackDetected( $1, $3, 0 ); } trig( \&Back2Detected, "^(.*?) не попал(а|о|и)? своим оружием в спину (.*?)\\.", "n:AUTOHIT" ); trig( \&Back2Detected, "^(.*?) попытал(ся|ась|ось|ись) нанести (.*?) удар в спину, но (.*?) заметили\\.", "n:AUTOHIT" ); # ************** магические атаки ******** trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? огненного дыхания (.*?)\\.", "n:AUTOHIT" ); trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? газовой атаки от (.*?)\\.", "n:AUTOHIT" ); trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? участия стать ледышкой от холодного дыхания (.*?)\\.", "n:AUTOHIT" ); trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? воздействия ослепляющего дыхания (.*?)\\.", "n:AUTOHIT" ); trig( \&Miss7Detected, "^Кислотного дыхания (.*?) прошло мимо (.*?)\\.", "n:AUTOHIT" ); sub Magic1Detected { AttackDetected( $3, $1, 1 ); } sub Magic2Detected { AttackDetected( $2, $1, 1 ); } trig( \&Magic1Detected, "^(.*?) подгорел(а|о|и)? в нескольких местах, когда (.*?) дыхнул(а|о|и)? на н(его|ее|их) огнем\\.", "n:AUTOHIT" ); trig( \&Back1Detected, "^(.*?) напустил(а|о|и)? газ на (.*?)\\.", "n:AUTOHIT" ); trig( \&Magic2Detected, "^(.*?) медленно покрывается льдом, после морозного дыхания (.*?)\\.", "n:AUTOHIT" ); trig( \&Magic2Detected, "^(.*?) бьется в судорогах от кислотного дыхания (.*?)\\.", "n:AUTOHIT" ); trig( \&Magic1Detected, "^(.*?) ослеплен(а|о|и)? дыханием (.*?)\\.", "n:AUTOHIT" ); # ************** магический кокон ******** trig( \&Magic2Detected, "^Магический кокон вокруг (.*?) полностью поглотил удар (.*?)\\.", "n:AUTOHIT" ); # Триггеры отслеживания оружия # Работа с переменными $U::wpnRight и $U::wpnLeft # Если переменная равна 0 - оружия в руке нет, # иначе переменная содержит 3х буквенный контекст оружия # ВНИМАНИЕ! Ожидаются проблемы, если в обеих руках одинаковое оружие # выделение сложного многословного контекста, разделенного точками # sub complex_cntx # { # wecho( 0, @_[0] ); # return substr( @_[0], 0, 3 ); # } # Снял оружие $1 trig { my $item; # предмет, который снял $item = substr( $1, 0, 3 ); # 3х символьный контекст if ( $U::wpnRight =~ $item ) { $U::wpnRight = 0; } if ( $U::wpnLeft =~ $item ) { $U::wpnLeft = 0; } } 'Вы прекратили использовать (.*)\\.', '1500fn:AFIGHT'; # Вооружиться (правая рука) trig { my $item; # предмет, который снял $item = substr( $1, 0, 3 ); # 3х символьный контекст $U::wpnRight = $item; # $U::wpnPrime = complex_cntx( $1 ); # Автоматическое обновление переменной } 'Вы вооружились (.*)\\.', '1500fn:AFIGHT'; # Вооружиться (двуручник) trig { my $item; # предмет, который снял $item = substr( $1, 0, 3 ); # 3х символьный контекст $U::wpnRight = $item; # $U::wpnBoth = complex_cntx( $1 ); # Автоматическое обновление переменной $U::wpnMode = 0; # SINGLE } 'Вы взяли (.*) в обе руки\\.', '1500fn:AFIGHT'; # Держать (левая рука) trig { my $item; # предмет, который снял $item = substr( $1, 0, 3 ); # 3х символьный контекст $U::wpnLeft = $item; # $U::wpnOff = complex_cntx( $1 ); # Автоматическое обновление переменной $U::wpnMode = 1; # DUAL } 'Вы взяли (.*) в левую руку\\.', '1500fn:AFIGHT'; # Одевание щита trig { my $item; # предмет, который снял $item = substr( $1, 0, 3 ); # 3х символьный контекст # $U::wpnShield = complex_cntx( $1 ); # Автоматическое обновление переменной $U::wpnMode = 2; # BASH } 'Вы начали использовать (.*) как щит\\.', '1500fn:AFIGHT'; # Выбивание оружия. Поднять и вооружиться. trig { # Само оружие $3. my $item; # предмет, который снял my $str; $item = substr( $3, 0, 3 ); # 3х символьный контекст $str = 'вз ' . $item; sendl( $str ); printc( $str ); # Подобрал if ( $U::wpnRight =~ $item ) { $str = 'воор ' . $item; sendl( $str ); } if ( $U::wpnLeft =~ $item ) { $str = 'держ ' . $item; sendl( $str ); } } '(.*) ловко выбил(.?) (.*) из Ваших рук\.', '2000fn:AFIGHT'; trig { # Само оружие $3. my $item; # предмет, который снял my $str; $item = substr( $3, 0, 3 ); # 3х символьный контекст # $str = 'вз ' . $item; # Можно подбирать именно оружие, но # вдруг не подойдет алиас $str = 'вз все'; # Лучше захапаю все :) sendl( $str ); printc( $str ); # Подобрал my $i = searchItem( \@U::AssistList, $4 ); return if $i == -1; # Не в списке ассистирования, нифига не отдам $str = 'дать ' . $item . ' ' . @U::AssistList[$i]; sendl( $str ); printc( $str ); # Передал } '(.*) ловко выбил(.?) (.*) из рук (.*)\.', '2000fn:AFIGHT'; # Смена режима боя # Single(0), Dual(1), Bash(2) # Режим Single - использование только одного оружия. Обычно это двуручник, # переменная $U::wpnBoth. Если такая переменная не определена, # используется $U::wpnPrime. # Режим Dual - использование оружия в обеих руках. Используются переменные # $U::wpnPrime и $U::wpnOff # Режим Bash - основное оружие и щит. Соответсвенно переменные $U::wpnPrime и # $U::wpnShield # sub CMD::cmd_wpnmode { my $action; # return if ( $U::wpnMode == @_[0] ); $action = $U::wpnMode*3 + @_[0]; # $U::wpnMode = @_[0]; if ( $action == 0 ) { # Single->Single return if ( $U::wpnBoth eq "" ); sendl( "взять $U::wpnBoth $U::container\nвоор $U::wpnBoth" ); return; } if ( $action == 1 ) { # Single->Dual return if ( $U::wpnPrime eq "" || $U::wpnOff eq "" ); sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnOff $U::container" ); sendl( "снять $U::wpnBoth" ) unless ( $U::wpnBoth eq "" ); sendl( "воор $U::wpnPrime\nдерж $U::wpnOff" ); sendl( "полож $U::wpnBoth $U::container" ) unless ( $U::wpnBoth eq "" ); return; } if ( $action == 2 ) { # Single->Bash return if ( $U::wpnPrime eq "" || $U::wpnShield eq "" ); sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnShield $U::container" ); sendl( "снять $U::wpnBoth" ) unless ( $U::wpnBoth eq "" ); sendl( "воор $U::wpnPrime\nодеть $U::wpnShield" ); sendl( "полож $U::wpnBoth $U::container" ) unless ( $U::wpnBoth eq "" ); return; } if ( $action == 3 ) { # Dual->Single return if ( $U::wpnBoth eq "" ); sendl( "взять $U::wpnBoth $U::container" ); sendl( "снять $U::wpnPrime" ) unless ( $U::wpnPrime eq "" ); sendl( "снять $U::wpnOff" ) unless ( $U::wpnOff eq "" ); sendl( "воор $U::wpnBoth" ); sendl( "полож $U::wpnPrime $U::container" ) unless ( $U::wpnPrime eq "" ); sendl( "полож $U::wpnOff $U::container" ) unless ( $U::wpnOff eq "" ); return; } if ( $action == 4 ) { # Dual->Dual return if ( $U::wpnPrime eq "" || $U::wpnOff eq "" ); sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnOff $U::container\nвоор $U::wpnPrime\nдерж $U::wpnOff" ); return; } if ( $action == 5 ) { # Dual->Bash return if ( $U::wpnShield eq "" ); sendl( "взять $U::wpnShield $U::container" ); sendl( "снять $U::wpnOff" ) unless ( $U::wpnOff eq "" ); sendl( "одеть $U::wpnShield" ); sendl( "полож $U::wpnOff $U::container" ) unless ( $U::wpnOff eq "" ); return; } if ( $action == 6 ) { # Bash->Single return if ( $U::wpnBoth eq "" ); sendl( "взять $U::wpnBoth $U::container" ); sendl( "снять $U::wpnPrime" ) unless ( $U::wpnPrime eq "" ); sendl( "снять $U::wpnShield" ) unless ( $U::wpnShield eq "" ); sendl( "воор $U::wpnBoth" ); sendl( "полож $U::wpnPrime $U::container" ) unless ( $U::wpnPrime eq "" ); sendl( "полож $U::wpnShield $U::container" ) unless ( $U::wpnShield eq "" ); return; } if ( $action == 7 ) { # Bash->Dual return if ( $U::wpnOff eq "" ); sendl( "взять $U::wpnOff $U::container" ); sendl( "снять $U::wpnShield" ) unless ( $U::wpnShield eq "" ); sendl( "держ $U::wpnOff" ); sendl( "полож $U::wpnShield $U::container" ) unless ( $U::wpnShield eq "" ); return; } if ( $action == 8 ) { # Bash->Bash sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnShield $U::container" ); sendl( "воор $U::wpnPrime\nодеть $U::wpnShield" ); return; } return; } # Триггеры обработки заклинаний trig { sendl( 'гг **********[ СИЛА ]**********' ); } '^Вы чувствуете себя немного слабее', '1500fn:GMSG'; trig { sendl( 'гг **********[ ЗАЩИТА ]**********' ); } '^Вы почувствовали себя менее защищенно', '1500fn:GMSG'; trig { sendl( 'гг **********[ ДОБЛЕСТЬ ]**********' ); } '^Вы почувствовали себя менее доблестно', '1500fn:GMSG'; trig { sendl( 'гг **********[ ПОЛЕТ ]**********' ); } '^Вы приземлились на землю', '1500fn:GMSG'; trig { sendl( 'гг **********[ ЗАТУМАНИВАНИЕ ]**********' ); } '^Ваши очертания приобрели отчетливость', '1500fn:GMSG'; trig { sendl( 'гг **********[ ОСВЯЩЕНИЕ ]**********' ); } '^Белая аура вокруг Вашего тела угасла', '1500fn:GMSG'; trig { sendl( 'гг **********[ КАМНЕКОЖА ]**********' ); } '^Ваша кожа вновь стала мягкой и бархатистой','1500fn:GMSG'; trig { sendl( 'гг ++++++++++[ СЛЕПОТА КОНЧИЛАСЬ ]++++++++++' ); } '^Вы вновь можете видеть', '1500fn:GMSG'; trig { sendl( 'гг **********[ УСКОРЕНИЕ ]**********' ); } '^Вы стали более медлительны', '1500fn:GMSG'; trig { sendl( 'гг **********[ МИГАНИЕ ]**********' ); } '^Вы перестали мигать', '1500fn:GMSG'; trig { sendl( 'гг **********[ ТЕМНОТЫ БОЮСЬ ]**********' ); } '^Вы вновь ощущаете страх перед тьмой', '1500fn:GMSG'; trig { sendl( 'гг **********[ ЗЕРКАЛО ]**********' ); } '^Вы вновь чувствительны к магическим поражениям','1500fn:GMSG'; trig { sendl( 'гг !!!!!!!!!!! СУД БОГОВ !!!!!!!!!!!' ); } '(.*) указал(.?) на Вас обвиняющим жестом\\. Высодрогнулись\\.', '1500fn:GMSG'; # Умения trig { sendl( 'эм принимает поздравления и подарки в связи с улучшением умения ' . $1 ); } 'Вы повысили уровень умения (.*)\.', '1500fn:EMSG'; # Загрузка ПК листа sub CMD::cmd_readpkl { open h, "pk.lst"; @p = <h>; close h; chomp @p; foreach $i (@p) { @fields = split / /,$i; subst( $fields[0], "\003P".$fields[1], "nf-:PKMODE" ); } enable('PKMODE'); } trig { sendl( 'вз все все.труп' ); } 'Кровушка стынет в жилах от предсмертного крика', '500fn:LOOT'; trig { sendl( 'разделить ' . $1 ); } '^Это составило (\d+)', '500fn:LOOT'; trig { sendl( 'вз все.труп' ); } 'Кровушка стынет в жилах от предсмертного крика', '500fn-:PKLOOT'; @U::EnemyList = (); # Текущий список целей $U::EnemyCount = 0; $U::EnemyAttack = ""; # Тип атаки # Очистка списка целей sub CMD::cmd_pkclear { @U::EnemyList = (); } # Добавление элемента в EnemyList sub CMD::cmd_pkadd { if ( searchItem( \@U::EnemyList, @_[0] ) == -1 ) { my $i = scalar @U::EnemyList; @U::EnemyList[$i] = @_[0]; } } # Удаление элемента из EnemyList sub CMD::cmd_pkdel { my $i = searchItem( \@U::EnemyList, @_[0] ); return if $i == -1; splice @U::EnemyList, $i, 1; } # Распечатка списка sub CMD::cmd_pkdump { printc( "Список целей:" ); printc( "----------------------" ); foreach $char ( @U::EnemyList ) { printc( $char ); } printc( "----------------------" ); } my @positions = ( 'лежит','летит','летает','спит','отдыхает','сидит','сражается','стоит', 'при' ); # ************** ЗАМЕЧЕН ВРАГ *************** sub EnemyDetected { return if length( $U::EnemyAttack ) == 0; # Проверка, что в строке $1 есть имя из списка EnemyList foreach $char ( @U::EnemyList ) { if ( $1 =~ /$char/i ) { # Это действительно враг sendl( $U::EnemyAttack.' .'.$char ); return; } } } foreach ( @positions ) { trig( \&EnemyDetected, "^(.*?) ($_)", "2500nf-:AUTOPK" ); } sub CMD::cmd_ec { if ( length( @_[0] ) == 0 ) { if ( length( $U::EnemyAttack ) == 0 ) { echo( 'Не выбран тип атаки' ); } else { foreach $char ( @U::EnemyList ) { sendl( $U::EnemyAttack.' .'.$char ); } } return; } if ( @_[0] =~ /(\d+)/ ) { my $i = scalar @U::EnemyList; # Количество целей echo( $i ); echo( $1 ); if ( $1 > $i || $1 == 0 ) { echo( 'Неверный номер цели' ); } else { $i = $1 - 1; sendl( $U::EnemyAttack.' .'.@U::EnemyList[$i] ); echo( 'Атакую цель #'.$1. ':'.@U::EnemyList[$i] ); } return; } if ( @_[0] eq "+" ) { enable('AUTOPK'); echo( 'Режим охоты включен' ); return; } if ( @_[0] eq "-" ) { disable('AUTOPK'); echo( 'Режим охоты вывключен' ); return; } $U::EnemyAttack = @_[0]; } # Настройка кнопок bindkey { sendl( "вст" ); } "C-s"; bindkey { sendl( "вз все" ); } "f5"; bindkey { startFight; } "C-r"; bindkey { sendl("вз возврат ".$U::container); sendl("зачит возврат"); } "C-f12"; bindkey { switchParry; } "M-p"; bindkey { switchParry; } "M-з"; bindkey { setTactic(-1); } "M-t"; bindkey { setTactic(-1); } "M-е"; bindkey { sendl( "пнуть ".$U::sTarget ); } "S-f3"; bindkey { sendl( "сбить ".$U::sTarget ); } "S-f4"; bindkey { sendl( "обезо ".$U::sTarget ); } "S-f6"; bindkey { sendl( "пнуть" ); } "f3"; bindkey { sendl( "сбить" ); } "f4"; bindkey { sendl( "обезо" ); } "f6"; bindkey { CMD::cmd_wpnmode( 0 ); } "C--"; # SINGLE bindkey { CMD::cmd_wpnmode( 1 ); } "C-="; # DUAL bindkey { CMD::cmd_wpnmode( 2 ); } "C-\\"; # BASH bindkey { sendl( "север" ); } "C-k8"; bindkey { sendl( "юг" ); } "C-k2"; bindkey { sendl( "запад" ); } "C-k4"; bindkey { sendl( "восток" ); } "C-k6"; bindkey { sendl( "вверх" ); } "C-k9"; bindkey { sendl( "вниз" ); } "C-k3"; bindkey { sendl( "см" ); } "k5"; bindkey { sendl( "выход" ); } "kdel"; bindkey { sendl( "огляд" ); } "C-k5"; bindkey { sendl( "см пент" ); } "k7"; bindkey { sendl( "войти пент" ); } "C-k7"; sub CMD::cmd_startlog { my ($year,$month,$day) = (localtime)[5,4,3]; ++$month; $year = substr($year,2); $year = "0".$year if ( $year<10 ); $month = "0".$month if ( $month<10 ); $day = "0".$day if ( $day<10 ); MUD::logopen("$year$month$day"."w.log"); } __DATA__ [triggers] [complete] ^/v p/1/v/ ^/unv p/1/v/ ^/unal p/1/a/ ^/en p/1-/t/ ^/di p/1-/t/ ^/h p/1/H/ ^/unh p/1/h/ ^/ki p/1-/p/ ^/ p/0/c/ ^ p/0/a/ c//u/ [tablist] [sounds] Editor beep [hooks] [aliases] стар /st $1 цц /ec $1 чмок эмоц нежно чмокнул $1 в щечку [keys] С-q спас 1.страж; спас 2.страж f1 беж f2 отраз f7 огл f8 пом f9 отвязать; вскочить f10 соскочить; привязать C-f11 зачитать свит C-L вз все все.тр [history] вз кн сун постой 0 [run] #alias стар #st \$1 #alias цц #ec \$1 #alias чмок эмоц нежно чмокнул \$1 в щечку #startlog [vars] strTactic ЗАЩИТА wpnBoth сек.позо standingUp 0 wpnPrime дым.топор wpnMode 2 wpnRight дым strParry victimCount 1 isFighting 0 doParry 1 wpnShield щит EnemyCount 0 wpnOff изя.топ c пояс.кожанный doDisarm 1 isArmed 1 doKick 1 tactic 0 sTarget EnemyAttack сбить parry 0 container сумка wpnLeft 0 _ticker |
14.02.2005, 13:49 | #2 |
Занятой мадер
Регистрация: 05.03.2004
Сообщений: 105
|
RE: пример конфига для ММС (с) Потапий
Кстати, а где сам Потапий? Играет сейчас?
|
14.02.2005, 22:07 | #3 |
Super Moderator
Регистрация: 11.11.2004
Сообщений: 20
|
RE: пример конфига для ММС (с) Потапий
уже давненько не играет...
|