Я имею ввиду тормоза сети и серва, а не тормаза графики.
Добавлено через 4 минуты
Я не думаю, что с моим железом могут быть тормаза в такой далеко не самой технологичной и навороченной вплане графики и физике игре.
Последний раз редактировалось APXAHGEJI, 31.05.2008 в 03:37.
Причина: Добавлено сообщение
Какая бы зона видимости ни была прописана в л2ини или Options.ini пакеты все равно приходят все, просто клиент не все обрабатывает.
очередной бредок..
попробуй уменьшить зону видимости клиента через утилиты любые или ручками...
поставь там для прикола=10 вметсто =1000 или вместо =10000
думаеш никово не увидиш? -))
и трафик секономиш? нет конечно.. радиус общета игроков прописан не у тебя на клиенте а на серваке..
сервер тебе всё равно запихнет информацию об мобах и нпц и игроках и предметах на полу в определенном радиусе вокруг тебя...
ты ето не можеш контролировать..
впринципе наверно мы об од одном и томже говорим.. просто твоя фраза:
Цитата:
Сообщение от ChiterEPT
просто клиент не все обрабатывает.
смутила.. он все обрабатывает еще как... ему тока дай инфу-).. он всё обработает-)
для примера такая бага есть во всех версиях ЛА2:
если найти место где нет никаво- (например на рейтах х100 приползти на пиратский остров) то есть возможность собрать паравоз- и увести их за собой далеко.. и огда уведеш- далеко- то вторым чаром который там остался- наблюдать что будет?
тот кто увел паравоз- должен просто выйти из игры когда увел парик или БСОЕ..
оказывается если НПЦ (которые пронумерованы- каждый под определенным ИД идет в базе сервака.. ) не попадают в зону общета неодного из персонажа- то сервер про них забывает...
просто сервер економит быстродейтствие на них.. нефик общитывать НПЦ (мобов) которые вне зоны видимости у персонажей живых...
как тока любопытный нос решит навестить уведенных мобов то мобы сразу начнут общитываться серваком и реснутся на месте респауна.. но если их не тревожить своим пресутствием то они там замрут- надолго пока их неразбудит рестарт или живой чар..
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Последний раз редактировалось VORON, 02.06.2008 в 00:04.
Т.е. если кто то находиться в катах рядом с мамоном, то другой челоек который находиться скажем в гиране может уловить инфу о том что мамон гдето реснулся и присутствует? Нее, что то тут не так помоему. Скорее всего Если про то что сервак забывает о мобах и начинает их обробатывать только тогда когда появляеться какой либо чар правда, то скорее ксего обработка эта идёт как раз только для тех кто находиться в той локации, и данные об этом не идут в другие локации, иначе бы все обработке слились бы в одну большую кашу, ну это чисто моё мнение конечно!
__________________
Всё можно починить, если вертеть в руках достаточно долго!
Т.е. если кто то находиться в катах рядом с мамоном, то другой челоек который находиться скажем в гиране может уловить инфу о том что мамон гдето реснулся и присутствует?
Несмотря на то, что в этой ветке уже многократно выкладывались всяческие хилеры-баферы, я посчитал своим долгом "вернуть в копилку OpenSource" то что взял оттуда
Итак, Пати Лекарь-Бафер Клерик 35 лвл.
Работа скрипта "как есть" гарантируется при выученных скилах соответствующих этому классу на 35 уровне и выше. Скрипт проверялся только на Интерлюде в пати с живым хозяином и локомотивом от nezabudkin (в катах без бега).
delphi Код:
{
Cleric party healer-buffer from MHz
v0.4.2
Благодарности:
Изначально делался из бота
mks "SE party healer" [url]http://coderx.ru/showpost.php?p=2252&postcount=176[/url]
Идея каста последовательности скилов
Grinch "Бешенный бафер" [url]http://coderx.ru/showpost.php?p=7169&postcount=513[/url]
Окно лога
VORON [url]http://coderx.ru/showpost.php?p=2648&postcount=217[/url]
Бег прицепом и разные фишки
nezabudkin "БОТ - Воин помошник от Alexus" [url]http://coderx.ru/showpost.php?p=6348&postcount=1[/url]
Инструкция по использованию
Вписываем в скрипт имена клера и командира, дополнительно можно подкорректировать время перебафа и
пороговые значения HP, свободно можно уменьшить константу LogicTimerInterval до 500, что сделает клера более "активным".
Запускаем скрипт.
Если клер еще не в пати, зовем его в пати (вообще-то должен работать и оффпати но я так его не проверял).
В окне командира появляются надписи "Now in party NNN members", кидаем на сопартийцев какой-нибудь полезный баф
типа ВВ пока кол-во NNN не будет соответствовать реальному кол-ву членов в пати.
Теперь бот готов к работе. Бот управляется социальными действиям со стороны командира. В ответ на социальные действия
бот переключает свои режимы
1. Режим хиляния. Если включен, то клер мониторит здоровье сопартийцев и при падении здоровья до 1-й границы хиляет
Heal, при падении здоровья ниже 2-й границы хиляет подряд Battle Heal + Heal
2. Режим бега. При включении клер "даблкликает" по командиру. Больше по командиру не долбит, поэтом в принципе может
отцепиться, если это произошло, снова выключите-включите режим бега. При выключении режима бега клер встает на том
месте где стоял и никуда больше не бегает.
3. Режим перебафа. При включении клер перебафывает всю пати в соответствии со своими "настройками" вообще имеет 3 вида
бафов "самобаф", баф бойца и баф "прицепа" (более детально см. листинг). Далее клер запоминает когда кого бафал и
перебафывает по мере необходимости. Режим перебафа менее приоритетен чем хил, т.е. если есть выбор хилять или бафать,
то клер будет хилять. Клер помнит когда кого бафал последний раз, так что можете свободно включать-выключать этот режим
дабы клер не "сорвался" с места и не побежал вас перебафывать потому что посчитал что пора.
4. Принудительный перебаф всей пати.
}const
BotName = 'Cleric'; // Имя бота
MasterName = 'Master'; // Имя командира
AssistantName = 'Assistant'; // Необязательный ассистент
RebuffTime = 1000*60*18; // Время перебафывания в миллисекундах
HP1=1000; // Порог HP для Heal
HP2=300; // Порог HP для Battle Heal + Heal
tt_MillisecondsInDay = 86400000;
LogicTimerInterval = 1000;
Chaos=100;
SkillDelay = 10;
DEBUG = False;
//****************************************************************************************************// Инфомационная таблица по скилам
SkillsSize = 32; // Максимальная длина последовательности кастуемых скилов
cst_BattleHeal = 1015;
cst_Heal = 1011;
cst_SelfHeal = 1216;
cst_WindWalk = 1204;
cst_Shield = 1040;
cst_Might = 1068;
cst_Focus = 1077;
cst_Acumen = 1085;
cst_HolyWeapon = 1043;
cst_MentalShield = 1035;
cst_Concentration = 1078;
cst_ResistFire = 1191;
cst_Regeneration = 1044;
cst_BerserkerSpirit = 1062;
// Смещения инфы о касте в пакте 48 MagicSkillUse
cstc_DoerIdOffset = 2;
cstc_SkillIdOffset = 10;
cstc_SkillTimeOffset = 18;
cstc_ReuseDelayOffset = 22;
var
frm: Tform;
memo: Tmemo;
//****************************************************************************************************// Таблица каста
Skills: array [1..SkillsSize] ofInteger; // Собственно буфер
SkillsLastIndex: Integer; // Используется записей
SkillsCurIndex: Integer; // Текущая запись
EndCastTimer: TTimer; // Таймер, разматывающий таблицу каста
ImCasting: Boolean; // Признак что я нахожусь в состоянии каста
CurRebuffedChar: Integer; // Индекс перебафываемого чара
TimeBeginRebuff: Integer; // Время начала перебафа тек. чара
OldRunKey: Boolean; // Старое состояние флага бега, чтобы при перецеливани при перебафе не сбивался прицел
AlreadyDoubleClicked: Boolean; // Флаг что уже дабликнули по мастеру//****************************************************************************************************// Эти переменные возможно используются в других модулях
BotId: Integer; // Id бота
BotIdx: Integer; // Индекс бота в массиве пати
BotTargetId: Integer; // Id цели бота
MyX, MyY, MyZ: Integer; // Координаты бота
MasterId: Integer; // Id командира//****************************************************************************************************// От se_healer
PartyCount: Integer; // Текущее кол-во обслуживаемых персов
CharName: array[1..9] ofstring;
CharID: array[1..9] ofinteger;
CurHP: array[1..9] ofinteger;
MaxHP: array[1..9] ofinteger;
CurMP: array[1..9] ofinteger;
MaxMP: array[1..9] ofinteger;
//Dev: array[1..9] of extended; // Пока не используется это % здоровья
LastBuffTime: array[1..9] ofinteger;
//xe, ye: extended;
e,t,x,y,z: integer;
HealKey, RunKey, BuffKey: boolean; // Флажки режимов: Лечения, Бега и Перебафа
LogicTimer: TTimer; // Таймер, организующий "разум" бота//****************************************************************************************************// "Разум" бота // Подготовить посл скилов для бойцового бафаprocedure FighterBuffSequence;
begin
Skills[1] := cst_Shield;
Skills[2] := cst_Might;
Skills[3] := cst_WindWalk;
Skills[4] := cst_Focus;
Skills[5] := cst_HolyWeapon;
Skills[6] := cst_MentalShield;
Skills[7] := cst_ResistFire;
Skills[8] := cst_Regeneration;
Skills[9] := cst_BerserkerSpirit;
SkillsLastIndex := 9;
end;
// Подготовить посл скилов для магаprocedure WizardBuffSequence;
begin
Skills[1] := cst_Acumen;
Skills[2] := cst_Shield;
Skills[3] := cst_WindWalk;
Skills[4] := cst_MentalShield;
Skills[5] := cst_Concentration;
Skills[6] := cst_ResistFire;
Skills[7] := cst_Regeneration;
SkillsLastIndex := 7;
end;
// Подготовить посл скилов для "прицепа" сидящего в коридореprocedure SitterBuffSequence;
begin
Skills[1] := cst_Shield;
Skills[2] := cst_WindWalk;
SkillsLastIndex := 2;
end;
// Выбираем как будем лечить и лечимprocedure Heal(idx: Integer);
beginif(CurHP[idx] <= HP2)thenbegin
Skills[1] := cst_BattleHeal;
Skills[2] := cst_Heal;
SkillsLastIndex := 2;
CastSequence;
endelsebegin
Cast(cst_Heal);
end;
end;
// Выбираем как будем бафать и бафаемprocedure Rebuff(idx: Integer);
begin// Здесь выбор варианта бафов по имени персаif CharName[idx] = BotName then
WizardBuffSequence
elseif(CharName[idx] = MasterName)or(CharName[idx] = AssistantName)then
FighterBuffSequence
else
SitterBuffSequence;
CurRebuffedChar := idx;
TimeBeginRebuff := GetTime;
CastSequence;
end;
// Поиск нуждающегося в лечении (возвращает его индекс)function WhoNeedHPIndex: Integer;
var
i: Integer;
curMinHP, curNeeded: Integer;
begin
curMinHP := 100000;
curNeeded := -1;
for i:=1to PartyCount dobeginif(CurHP[i] > 0)and(CurHP[i] <= HP1)and(CurHP[i] < MaxHP[i])thenbeginif CurHP[i] < curMinHP thenbegin
curNeeded := i;
curMinHP := CurHP[i];
end;
end;
end;
Result := curNeeded;
end;
// Поиск нуждающегося в перебафе (возвращает его индекс)function WhoNeedBuffIndex: Integer;
var
i: Integer;
curTime: Integer;
curDeltaTime: Integer;
curMinTime: Integer;
curNeeded: Integer;
begin
curNeeded := -1;
curTime := GetTime;
curMinTime := 2147483647;
for i:=1to PartyCount dobeginif CurHP[i] > 0thenbegin
curDeltaTime := curTime - LastBuffTime[i];
if curDeltaTime > RebuffTime thenbeginif curDeltaTime < curMinTime thenbegin
curNeeded := i;
curMinTime := curDeltaTime;
end;
end;
end;
end;
Result := curNeeded;
end;
// Выработка "общей" линии поведения бота (обработчик таймера логики)procedure OnLogicTimer(Sender: TObject);
var
selectedForHeal: Integer;
selectedForBuff: Integer;
beginif PartyCount <= 0thenexit; // Если еще ничего не знаем ни о ком, ничего не делаемfor t:=1to PartyCount dobegin// Id командира и ботаif CharName[t]=MasterName then MasterId:=CharID[t];
if CharName[t]=BotName thenbegin
BotID:=CharID[t];
BotIdx:=t;
end;
end;
if MyHP = 0thenexit; // Если я мертв - то все пофигу// Если я что-то кастую, то докастую и будем выбирать что делать дальшеif ImCasting thenbegin
AddLog('************ Im casting ****************');
exit;
end;
// Не прерываем последовательность перебафа!if CurRebuffedChar > 0thenbegin
AddLog('************ Im rebuffing char ' + CharName[CurRebuffedChar] + '****************');
exit;
end;
// Если включен режим лечения, то это приоритетная задача, сначала займемся ейif HealKey thenbegin
selectedForHeal := WhoNeedHPIndex;
if selectedForHeal > 0thenbeginif CharID[selectedForHeal] <> BotTargetId then// Проверяем прицел если надо переставляем его
Action(CharID[selectedForHeal]); // но не контролируем результат,
Heal(selectedForHeal); // и сразу ХИЛ!exit; // Щас бой, не до бафов, оббафаю потомend;
end;
// Если включен режим перебафа и время пришло, то запускаем перебафif BuffKey thenbegin
selectedForBuff := WhoNeedBuffIndex;
if selectedForBuff > 0thenbegin// Нашелся перс для перебафа
AddLog('Im going to rebuff ' + CharName[selectedForBuff]);
OldRunKey := RunKey;
RunKey := False;
if BotTargetId = CharID[selectedForBuff] then// Не бафаем кого попало! Убеждаемся что выбрана правильная
Rebuff(selectedForBuff)// цельelse
Action(CharID[selectedForBuff]);
end;
end;
end;
//****************************************************************************************************// Отладка и тестированиеprocedure PrintLastBuffTime;
var
i: Integer;
begin
AddLog('');
PrintFlag('BuffKey', BuffKey);
PrintFlag('ImCasting', ImCasting);
AddLog('СurRebufedChar='+IntToStr(CurRebuffedChar));
AddLog('Time='+IntToStr(GetTime));
for i:=1to PartyCount dobegin
AddLog('Member='+CharName[i]+' Time='+IntToStr(LastBuffTime[i]));
end;
end;
procedure PrintFlag(caption: String; flag: Boolean);
beginif flag then
AddLog(caption + '=True')else
AddLog(caption + '=False');
end;
//****************************************************************************************************// OnEndCastTimer procedure OnEndCastTimer(Sender: TObject);
begin
AddLog('End casting');
// Выключаем таймер потому что не знаем сколько продлится следующий каст. Таймер включает обработчик MagicSkillUse
EndCastTimer.Enabled := False;
ImCasting := False;
Inc(SkillsCurIndex);
if SkillsCurIndex <= SkillsLastIndex thenbegin// Если еще есть касты в последовательности, то отправляем их дальше
Cast(Skills[SkillsCurIndex]);
endelsebegin// Если последовательность кончилась, то проверяем, если это был режим перебафа, // то фиксируем его окончание и окончательно фиксируем время когда начинали бафать персаif CurRebuffedChar > 0thenbegin
LastBuffTime[CurRebuffedChar] := TimeBeginRebuff;
TimeBeginRebuff := 0;
CurRebuffedChar := 0;
RunKey := OldRunKey; // Перебаф окончен, если надо, можно бегать
AlreadyDoubleClicked := False;
end;
end;
end;
// Обработчик получения инфы о текущем кастеprocedure OnMagicSkillUse;
var
skillId, skillTime, reuseDelay: Integer;
curTime: Integer;
skillIndex: Integer;
beginif(pck[1] <> #$48)or(ReadD(cstc_DoerIdOffset) <> BotID)then// Блокируем затупленияexit;
ImCasting := True;
skillId := ReadD(cstc_SkillIdOffset);
skillTime := ReadD(cstc_SkillTimeOffset);
reuseDelay := ReadD(cstc_ReuseDelayOffset);
AddLog('');
AddLog('MagicSkillUse');
AddLog('Id=' + IntToStr(skillId));
AddLog('Time=' + IntToStr(skillTime));
AddLog('Delay=' + IntToStr(reuseDelay));
EndCastTimer.Interval := skillTime + SkillDelay;
EndCastTimer.Enabled := True;
end;
procedure OnActionFail;
begin
AddLog('ActionFail');
end;
function MyHP: Integer;
beginif BotIdx <= 0then
Result := 0else
Result := CurHP[BotIdx];
end;
// Кастуй последовательность скилов описаную в Skills массивеprocedure CastSequence;
begin
SkillsCurIndex := 1;
Cast(Skills[1]);
end;
procedure Init; //Вызывается при включении скриптаvar
i: Integer;
beginif DEBUG thenbegin
frm := TForm.Create(nil);
frm.Caption := 'Chat';
frm.BorderStyle := bsSizeable;
frm.Position := poScreencenter;
frm.Width:=600;
frm.Height:=700;
//frm.FormStyle:=FsStayOnTop;
frm.Show;
memo :=TMemo.create(nil);
memo.parent:=frm;
memo.align:=alClient;
end;
AddLog('Init');
BotId := 0;
BotIdx := 0;
// Очистка содержимого таблиц
BotTargetId := 0; // Если сначала если бот дважды кликнет по кому-то то нестрашно
PartyCount := 0;
for i:=1to9dobegin
CharName[i] := '';
CharID[i] := 0;
CurHP[i] := 0;
MaxHP[i] := 0;
CurMP[i] := 0;
MaxMP[i] := 0;
LastBuffTime[i] := 0;
end;
ClearLastBuffTime;
BuffKey := False;
HealKey := False;
RunKey := False;
AlreadyDoubleClicked := False;
ImCasting := False;
CurRebuffedChar := 0;
TimeBeginRebuff := 0;
EndCastTimer := TTimer.Create(nil);
EndCastTimer.OnTimer := @OnEndCastTimer;
EndCastTimer.Enabled := False;
LogicTimer:=TTimer.Create(nil);
LogicTimer.OnTimer:=@OnLogicTimer;
LogicTimer.Interval:=LogicTimerInterval;
LogicTimer.Enabled:=True;
end;
procedure ClearLastBuffTime;
var
i: Integer;
beginfor i:=1to9dobegin
LastBuffTime[i] := 0;
end;
end;
// Взять цель в таргет или мочить ее пухойprocedure Action(targetId: integer);
begin
AddLog('Action on ID=' + IntToStr(targetId));
buf:=#$04;
WriteD(targetId);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(0);
SendToServerEx(BotName);
end;
procedure Cast(skillId: integer);
begin// Формируем пакет на каст и отправляем его
buf:=hstr('2F 00 00 00 00 00 00 00 00 00');
WriteD(skillId, 2);
SendToServerEx(BotName);
//ImCasting := True;end;
function GetTime: Integer;
begin
Result := Round(Time*tt_MillisecondsInDay);
end;
procedure AddLog(msg: string);
beginif DEBUG then
memo.Lines.Add(IntToStr(GetTime) + '; ' + msg);
end;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(BotName);
WriteS(msg);
SendToClientEx(MasterName);
end;
procedure Free; //Вызывается при выключении скриптаbeginif DEBUG thenbegin
memo.Free;
frm.Free;
end;
EndCastTimer.Free;
LogicTimer.free;
PartyCount:=0;
HealKey:=false;
RunKey:=false;
BuffKey:=False;
end;
procedure OnPartySmallWindowUpdate;
var
i, f: Integer;
exist: Boolean;
begin
exist := False;
i:=6;
for f:=1to(PartyCount+1)dobegin
exist := CharID[f]=ReadD(2);
if exist=truethenbegin
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
//Dev[f]:=CurHP[f]/MaxHP[f]; // Пока не используется это % здоровьяbreak;
end;
end;
if exist=falsethenbegin
PartyCount:=PartyCount+1;
Say('Now in party '+IntToStr(PartyCount) + ' members');
f:=PartyCount;
CharID[f]:=ReadD(2);
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
//Dev[f]:=CurHP[f]/MaxHP[f]; // Пока не используется это % здоровьяend;
end;
procedure FollowMaster;
beginif AlreadyDoubleClicked then// Не тычем по 100 раз в хозяинаexit;
if BotTargetId = MasterId then
Action(MasterId)elsebegin
Action(MasterId); Action(MasterId);
end;
AlreadyDoubleClicked := True;
end;
procedure OnValidatePosition;
begin
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;
//****************************************************************************************************// Обработка пакетов скриптомbeginif pck=''thenexit;
// Управление составом патиif FromServer and(pck[1]=#$52)and((ConnectName=MasterName)or(ConnectName=BotName))thenbegin
OnPartySmallWindowUpdate;
exit;
end;
if FromClient and(ConnectName=MasterName)and(pck[1]=#$01)thenbeginif RunKey and(not ImCasting)then// Прицепляемся в хвост только если включен режим, и ничего не кастуем
FollowMaster;
// Остаемся в скриптеend;
// Обновляем свои координатыif FromClient and(ConnectName=BotName)and(pck[1]=#$48)thenbegin
OnValidatePosition;
end;
if FromServer and(ConnectName = BotName)thenbegincase pck[1] of
#$04: BotId:=ReadD(18); // StatusUpdate
#$48: begin// MagicSkillUseif ReadD(cstc_SkillTimeOffset) = 0thenexit;
if ReadD(cstc_DoerIdOffset) = BotId thenbegin
OnMagicSkillUse;
exit;
end;
end;
#$25: OnActionFail;
#$A6: begin//TargetSelected
BotTargetId := ReadD(2);
AddLog('Selected target ID=' + IntToStr(BotTargetId));
end;
#$2A: begin//TargetUnselected
BotTargetId := 0;
AddLog('UnSelected target');
end;
end;
end;
// Управление ботом со стороны командира через соц. действияif FromClient and(ConnectName=MasterName)and(pck[1] = #$1B)thenbegincase pck[2] of
#$02: begin
pck := '';
HealKey:=not(HealKey);
Case HealKey oftrue: Say('Heal mode ON');
false: Say('Heal mode OFF');
end;
end;
#$03: begin
pck := '';
RunKey:=not(RunKey);
if RunKey thenbegin
Say('Run mode ON');
AlreadyDoubleClicked := False;
endelsebegin
Say('Run mode OFF');
Action(BotId); // Прицеливаемся на себя чтобы сбить "привязку хвостом к командиру"
Action(BotId);
end;
end;
#$04: begin
pck := '';
BuffKey:=not(BuffKey);
if BuffKey thenbegin
Say('Buff mode ON');
endelsebegin
Say('Buff mode OFF');
end;
end;
#$05: begin
pck := '';
ClearLastBuffTime;
Say('Buffs times table cleared');
end;
end;
end;
end.
Для тех, кто "асилил".
Основная сложность в написании скриптов для баферов это то, что у разных расс разные бафы. Что касается лекарей, то основные споры идут вокруг "принятия решения о том кого хилять". В вышеприведенном скрипте все эти "спорные" моменты выделены в отдельные функции, таким образом "заточка" под конкретные нужды не представляется проблематичной.
В боте расширена и "зарефакторена" идея каста последовательности скилов из бота Grinch, так что бот кастует практически со скоростью макроса.
Бот очень "трепетно" следит за своим таргетом. Возможно я чересчур уделил этому внимание и "перегрузил" код, если вы считаете это излишним, то можете выкинуть эту часть кода и значительно упростить логику.
Бот в отличие от других "не долбит" по командиру в ответ на каждое его перемещение. Я посчитал что это более "правильно" и менее палевно. Опять же вернуть код как в "помощнике от nezabudkin не составит труда.
Последний раз редактировалось MHz, 07.06.2008 в 10:27.
Причина: подправил косяк с RunKey
Для тех, кто "асилил".
Основная сложность в написании скриптов для баферов это то, что у разных расс разные бафы. Что касается лекарей, то основные споры идут вокруг "принятия решения о том кого хилять". В вышеприведенном скрипте все эти "спорные" моменты выделены в отдельные функции, таким образом "заточка" под конкретные нужды не представляется проблематичной.
В боте расширена и "зарефакторена" идея каста последовательности скилов из бота Grinch, так что бот кастует практически со скоростью макроса.
Бот очень "трепетно" следит за своим таргетом. Возможно я чересчур уделил этому внимание и "перегрузил" код, если вы считаете это излишним, то можете выкинуть эту часть кода и значительно упростить логику.
Бот в отличие от других "не долбит" по командиру в ответ на каждое его перемещение. Я посчитал что это более "правильно" и менее палевно. Опять же вернуть код как в "помощнике от nezabudkin не составит труда.
Где ты такие макросы видел в моём скрипте 12 бафов пп кидает на 5 секунд быстрей, примерно, чем через макрос.