ObjectID - Пропускаем
Type - можно пропустить
From - Ник написавшего, то что надо
Message - сообщение
Все строки передаются в формате UNICode, тоесть например "Amorality" будет - "41 00 6D 00 6F 00 72 00 61 00 6C 00 69 00 74 00 79 00" + "00 00"
ReadS() считывает эту строку уже в формате String "Amorality" = "41 6D 6F 72 61 6C 69 74 79"
Теперь попробуем написать скрипт
Delphi Код:
var
i:integer;
beginIn FromServer and(pck[1]=#$4A)thenbegin
i := 10; //Имя с 10 байтаif ReadS(i) = 'Amorality'then//Считываем, сравниваем и увеличиваем i на длину никаif ReadS(i) = 'dence me plz'then//Считываем, сравниваем сообщение
....И понеслось
end;
end.
Вот примерно так
это не совсем рабочий пример
Например - написав сообщение, вы получите этот пакет в оба окна, надо вставлять еще проверку на соединение (ConnectName)
Последний раз редактировалось PanAm, 30.07.2008 в 17:33.
Блин , сама хотела написать , ну спасибо ) Допишу еще , конект нейм и тип пати и буду использовать еще раз спасибо
Добавлено через 13 минут
var
i:integer;
o:integer;
begin
If FromServer and (ConnectName='BDGirl') and (pck[1]=#$4A) then begin
i := 10; //Имя с 10 байта
if ReadS(i) = 'Amorality' then //Считываем, сравниваем и увеличиваем i на длину ника
if ReadS(i) = '-dance' then //Считываем, сравниваем сообщение
buf:=hstr('2F 11 01 00 00 00 00 00 00 00');
SendToServer;
end;
If FromServer and (ConnectName='BDGirl') and (pck[1]=#$4A) then begin
i:= 10; //Имя с 10 байта
o:=11; //ник вроде как 11 длинной
if ReadS(o) = 'Amorality2' then //Считываем, сравниваем и увеличиваем i на длину ника
if ReadS(o) = '-dance' then //Считываем, сравниваем сообщение
buf:=hstr('2F 11 01 00 00 00 00 00 00 00');
SendToServer;
end;
end.
---
Я немного видоизменила скрипт , верен ли он? Задача скрипта .. Бд с ником BDGirl танцует , если в чат Amorality или Amorality2 напишет -dance
Последний раз редактировалось Amorality, 30.07.2008 в 18:11.
Причина: Добавлено сообщение
Не правильно ReadS(i) автоматом увеличивает i на длину строки
o:integer просто лишне.
длина "Amorality2" 10*2+2
тело внитри условия одинаково, лучше тогда так
delphi Код:
var
Commandir : string;
.......
i := 10; //Имя с 10 байта
Commandir := ReadS(i); //Сохранили ник написавшего и увеличиваем i на длину никаif(Commandir = 'Amorality')or(Commandir = 'Amorality2')then//сравниваем if ReadS(i) = '-dence'thenbegin//Считываем, сравниваем сообщение
buf:=hstr('2F 11 01 00 00 00 00 00 00 00');
SendToServer;
end;
........
Добавлено через 4 минуты
Вот и начинается интересное
вы получили один танец на команду, теперь есть 2 пути -
1. В лоб размножить скрипт и давать отдельную команду на каждый танец.
2. Подумать как танцевать серию танцев
Для примера можно почитать тут http://coderx.ru/showthread.php?t=14
и тут http://coderx.ru/showthread.php?t=397
Последний раз редактировалось PanAm, 30.07.2008 в 18:54.
Причина: Добавлено сообщение
var
i,x : integer;
Commandir : string;
Bissy : Boolean;
begin
case x of
1: begin //Блок магического танца начался
buf:=hstr('2F 11 01 00 00 00 00 00 00 00'); //Dance Of Mystic
SendToServer;
inc(x);
Bissy:=true;
end;
2: begin
buf:=hstr('2F 14 01 00 00 00 00 00 00 00'); //Dance Of Concentration
SendToServer;
inc(x);
Bissy:=false;
end;
3: begin //Блок воинского танца начался
buf:=hstr('2F 0F 01 00 00 00 00 00 00 00'); //Dance Of Warrior
SendToServer;
inc(x);
Bissy:=true;
end;
4: begin
buf:=hstr('2F 13 01 00 00 00 00 00 00 00'); //Dance Of Fury
SendToServer;
inc(x);
Bissy:=true;
end;
5: begin
buf:=hstr('2F 12 01 00 00 00 00 00 00 00'); //Dance Of Fire
SendToServer;
inc(x);
Bissy:=false;
end;
end;
end.
begin
If FromServer and (pck[1]=#$4A) then begin
i := 10; //Имя с 10 байта
Commandir := ReadS(i); //Сохранили ник написавшего и увеличиваем i на длину ника
if (Commandir = 'Amorality') or (Commandir = 'Amorality2') then //сравниваем
if ReadS(i) = '-mdance' then begin //Считываем, сравниваем сообщение
if not Bissy then begin
x:=1; //Ссылка на блок с магическим дансом
end;
end;
end;
end;
end;
begin
If FromServer and (pck[1]=#$4A) then begin
i := 10; //Имя с 10 байта
Commandir := ReadS(i); //Сохранили ник написавшего и увеличиваем i на длину ника
if (Commandir = 'Amorality') or (Commandir = 'Amorality2') then //сравниваем
if ReadS(i) = '-wdance' then begin //Считываем, сравниваем сообщение
if not Bissy then begin
x:=3; //Ссылка на блок с воинским дансом
end;
end;
end;
end;
end;
Вот написала скрипт , его задача, если чар Amorality или Amorality2 пишет в чат -mdance , То BDGirl бафает 2 данса: Mystic и Concentration , а есле -wdance , то BDGirl бафает 3 данса : Fury,warrior,fire.
В общем я почти уверена , что скрипт написан не правильно , поправьте пожалуйста , потестить сама не могу , сервер , где я играю на профилактике до сих пор.
Последний раз редактировалось Amorality, 30.07.2008 в 22:20.
Совсем все? Ну ладно если это уже не поправить , то буду водить ботов макросами в пати чат , туда вроде нету ограничений
Добавлено через 5 минут
Хм , сунула скрипт в l2phx , ошибок нету , запускается , но попробовать на деле к сожалению не могу .. Может все таки его можно исправить?
Последний раз редактировалось Amorality, 30.07.2008 в 22:19.
Причина: Добавлено сообщение
const
NickName = 'BDGirl'; // Ник сменить на ник БДvar
timer1 : TTimer;
i, x : integer;
Bissy: Boolean;
Commandir, Command : string;
procedure OnTimer; //Последовательность танцевbegincase x of1: begin
buf:=hstr('2F 11 01 00 00 00 00 00 00 00'); //Dance Of Mystic
SendToServerEx(NickName);
inc(x);
end;
2: begin
buf:=hstr('2F 14 01 00 00 00 00 00 00 00'); //Dance Of Concentration
SendToServerEx(NickName);
x:=0; //Последовательность сбрасываем
Bissy:=False; //БД свободен
timer1.enabled:=false; //таймер отключаемend;
3: begin
buf:=hstr('2F 0F 01 00 00 00 00 00 00 00'); //Dance Of Warrior
SendToServerEx(NickName);
inc(x);
end;
4: begin
buf:=hstr('2F 13 01 00 00 00 00 00 00 00'); //Dance Of Fury
SendToServerEx(NickName);
inc(x);
end;
5: begin
buf:=hstr('2F 12 01 00 00 00 00 00 00 00'); //Dance Of Fire
SendToServerEx(NickName);
x:=0;
Bissy:=False;
timer1.enabled:=false;
end;
end;
end;
procedure Init;
begin
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer;
timer1.enabled:=false;
timer1.interval:=2000; //интервал между танцами 2 сек
Bissy :=false;
x:=0;
end;
procedure Free; //Вызывается при выключении скриптаbegin
timer1.free;
end;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенbeginif FromServer and(ConnectName=NickName)and(pck[1]=#$4A)thenbegin
i := 10; //Имя с 10 байта
Commandir := ReadS(i); //Сохранили ник написавшего и увеличиваем i на длину ника
Command := ReadS(i); //Сохранили коммандуif(Commandir = 'Amorality')or(Commandir = 'Amorality2')then//Проверяем что комманда от начальникаifnot Bissy thenbegin//проверяем, что БД не занятcase Command of'-mdance' : x :=1; //последовательность танцев 1-2'-wdance' : x :=3; //последовательность танцев 3-4-5end;
timer1.enabled:=true; //запускаем таймер
Bissy := true; //у БД теперь есть чем занятсяend; //not Bissyend; //FromServer and (pck[1]=#$4A)end.
Добавлено через 4 часа 30 минут
А вот еще немножко подумав...
ваш чар и бот находятся на одном компе, зачем палится и посылать команды в чат через сервер? чтоб админу было легче ботов вычислить?
Значит надо отлавливать не 4A пакет с сервера, а пакет 38 с клиента, обрабатывать его и удалять, чтоб на сервер он не шел...
и сного переписываем основной скрипт
delphi Код:
beginif FromClient and(pck[1]=#$38)then//say2 От клиента (боты не говорят)ifnot Bissy thenbegin//проверяем, что БД не занятcase ReadS(2)of//Считываем команду'-mdance' : begin
x :=1; //последовательность танцев 1-2
pck :=''; //не палимся
timer1.enabled:=true; //запускаем таймер
Bissy := true; //у БД теперь есть чем занятсяend;
'-wdance' : begin
x :=3; //последовательность танцев 3-4-5
pck :=''; //не палимся
timer1.enabled:=true; //запускаем таймер
Bissy := true; //у БД теперь есть чем занятсяend;
end; //caseend; //not Bissyend.
вот примерно так
заодно убираем в начале описание Commandir, Command - теперь они не нужны.
тока я все это не тестю. т. к. не особо ботовод, и БД у мну нет
Последний раз редактировалось PanAm, 31.07.2008 в 04:01.
Причина: Добавлено сообщение
Абис заработал , ПНХ тоже , удалось потестить , все отлично работает..
Собираюсь еще написать скрипт для ЕЕшки , но вот вопрос , как заставить чара с ником EvasS взять ассист(проще говорю взять тот же таргет) на моего мейна (Amorality) ?
Порылась в описаниях к пакетам нашла несколько:
A6=MyTargetSelected
29=TargetSelected
Потом решила выделить чара и поймать пакет , поймался пакет Action , Решила я его разобрать , но ник там вроде не указывается , хотя можно попробовать (я думаю) реализовать через ObjectID , состав:
04=Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ )b(ActionID)
Других идей нет , может кто-нибуть подскажет , спасибо заранее
Добавлено через 3 минуты
А вот еще что , когда используешь Assist и ловишь пакеты , то от сервера приходит пакет Attack , клиент ничего не посылает , а если у этого чара кто-то выделен и ассист удался , то клиент посылает Action
Добавлено через 28 минут
Ага , все ясно , разобралась с пакетом (04) Action .. Вижу только этот способ реализации того , что я хочу , просто нужно будет запомнить ID человека , выделяемого мейном и составить пакет Action для бота , даже уже знаю как реализовать , хоть 1 скрипт сама напишу
Последний раз редактировалось Amorality, 02.08.2008 в 02:08.
Причина: Добавлено сообщение