PDA

Просмотр полной версии : помошник в PvP и PK.//by mks как переделать


TAMBIK
09.04.2009, 16:44
Здравствуйте.Вот скрипт мне понравился
№ 1
//by mks
//помошник в PvP и PK.
//пьет CP и HP пробирки в нужное время(можно добавить и MP для пвп серваков), и освобождает вас от небоходимости зажатия клавиши Ctrl, которая так меня раздражает!(думаю это раздражает и не только меня)
///////////////////////////////////////////////////////
///////////////Master PvP by MKS v.1.0/////////////////
///////////////////////////////////////////////////////

//после активации скрипта необходимо выпить сначала банку CP, потом HP для получения их ID
const
Name='Arispar'; //ник перса
var
CurHP,MaxHP,CurCP,MaxCP: integer;
CPuse,HPuse: string;

TimerCP,TimerHP: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
TimerCP.interval:=1000; //интервал 1сек, т.к. чаще пить CP всеравно не будет, дабы не засорять трафик

TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=false;
TimerHP.interval:=15000; //интервал 15сек, т.к. действие одной бутылки = 15сек
end;

procedure OnTimerCP(Sender: TObject);
begin
buf:=CPuse;
SendToServerEx(Name);
end;
procedure OnTimerHP(Sender: TObject);
begin
buf:=HPuse;
SendToServerEx(Name);
end;

procedure Free; //Вызывается при выключении скрипта
begin
TimerCP.free;
TimerHP.free;
HPuse:='';
CPuse:='';
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//пьем сначала CP, потом HP банку что б запомнить их ID(я решил взять эти пакеты целиком, дабы не усложнять)
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse='') then CPuse:=pck;
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse<>pck) and (HPuse='') then HPuse:=pck;

//считываем текущие и максимальные значения CP и HP
if FromServer and (pck[1]+pck[6]=#$0E#$04) then
begin
CurHP:=ReadD(14);
MaxHP:=ReadD(22);
CurCP:=ReadD(30);
MaxCP:=ReadD(38);
end;

if CurHP<>0 then
begin

//если вы используете не грэйтер CP то вместо 200 подставьте кол-во CP сколько восстанавливает 1 банка
if (CurCP<MaxCP-200) and (CPuse<>'') then TimerCP.enabled:=true else TimerCP.enabled:=false;
if (CurHP<MaxHP) and (HPuse<>'') then TimerHP.enabled:=true else TimerHP.enabled:=false;

//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;

//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;
end
else
begin
TimerHP.enabled:=false;
TimerCP.enabled:=false;
end;


end.

Вот скрипт в нем можно вкл\выкл функции прямо в окне клиента
при вкл скрипта появляется рамка где можно вкл\выкл отдельно каждую функцию.В нем ошибка в строке
function StrToHex(packet: string):string;

Скрипт № 2
const
Name='xxxxx';
var
CurHP,CurCP,MaxCP,MyID,TargetID,o,x,y,z,Delta: integer;
CPuse,action,Msg: string;
TimerCP,TimerHP: TTimer;
AutoCtrl,AutoCP,AutoTarget,AutoRadar: boolean;
procedure Init;
begin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
//configs
TimerCP.interval:=1000; //cpuse delay
AutoCtrl:=true; //autoctrl default
AutoCP:=true; //autocp default
AutoTarget:=false; //autotarget default
AutoRadar:=true; //autoradar default
Delta:=200; //if (currentCP)<(maxCP-delta) then cpuse

Say;
end;
procedure OnTimerCP(Sender: TObject);
begin
buf:=CPuse;
SendToServerEx(Name);
end;
procedure Free;
begin
TimerCP.free;
CPuse:='';
end;
function booleantostr(b:boolean):string;
begin
if b then
result:='True'
else
result:='False';
end;
procedure Say;
var s:string;
begin
if autoctrl then
s:='<tr><td>AutoCtrl=<a action="bypass autoctrl_off">'+booleantostr(autoctrl)+'</a></td></tr>'
else
s:='<tr><td>AutoCtrl=<a action="bypass autoctrl_on">'+booleantostr(autoctrl)+'</a></td></tr>';
if autocp then
s:=s+'<tr><td>AutoCP=<a action="bypass autocp_off">'+booleantostr(autocp)+'</a></td></tr>'
else
s:=s+'<tr><td>AutoCP=<a action="bypass autocp_on">'+booleantostr(autocp)+'</a></td></tr>';
if autotarget then
s:=s+'<tr><td>AutoTarget=<a action="bypass autotarget_off">'+booleantostr(autotarget)+'</a></td></tr>'
else
s:=s+'<tr><td>AutoTarget=<a action="bypass autotarget_on">'+booleantostr(autotarget)+'</a></td></tr>';
if autoradar then
s:=s+'<tr><td>AutoRadar=<a action="bypass autoradar_off">'+booleantostr(autoradar)+'</a></td></tr>'
else
s:=s+'<tr><td>AutoRadar=<a action="bypass autoradar_on">'+booleantostr(autoradar)+'</a></td></tr>';
s:=s+'<tr><td><br><center><img src="L2UI_CH3.herotower_deco" width=256 height=32></center><br><br></td></tr>';
if cpuse='' then
s:=s+'<tr><td>CPuse=<font color="LEVEL">[!] Выпей бутыль ЦП [!]</font></td></tr>'
else
s:=s+'<tr><td>CPuse=<a action="bypass autouse">'+strtohex(cpuse)+'</a></td></tr>';
buf:=hstr('0F 01 00 00 00');
WriteS('<html><title>PVP помошнегг (с) raid</title><body><center><img src="L2UI_CH3.herotower_deco" width=256 height=32></center><br><table width=100%>'+s+'</table><br><br><br><br><br><br>'+
'<br><center><img src="L2UI_CH3.herotower_deco" width=256 height=32><br><br><br><br><br><br>(c) raid aka Mamy</center></body></html>');
WriteD(0);
SendToClientEx(Name);
end;
function StrToHex(packet: string):string;
var
i:integer;
tmp:byte;
function ByteToHex(b: byte): Char;
begin
if b<10 then result:=chr(b+$30)
else result:=chr(b+$37);
end;
begin
result:='';
for i:=1 to length(packet) do begin
tmp:=ord(packet[i]) div 16;
result:=result+ByteToHex(tmp);
tmp:=ord(packet[i]) - tmp*16;
result:=result+ByteToHex(tmp)+' ';
end;
end;
begin
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse='') then begin
CPuse:=pck;
Say;
pck:='';
exit;
end;
if FromServer and (pck[1]+pck[6]=#$0E#$04) then
begin
MyID:=ReadD(2);
CurHP:=ReadD(14);
CurCP:=ReadD(30);
MaxCP:=ReadD(38);
end;
if FromServer and (pck[1]=#$A6) then begin
TargetID:=ReadD(2);
end;
{if FromServer and (pck[1]=#$29) and autotarget then begin
o:=ReadD(2);
if (ReadD(6)=MyID)and(o<>MyID)and(o<>TargetID) then begin
x:=ReadD(10);
y:=ReadD(14);
z:=ReadD(18);
delay(100);
buf:=hstr('04');
WriteD(o);
WriteD(x);
WriteD(y);
WriteD(z);
WriteC(0);
SendToServerEx(Name);
end;
end;
}
if FromServer and (pck[1]=#$05) and autotarget then begin
o:=ReadD(2);
if (ReadD(6)=MyID)and(o<>MyID)and(o<>TargetID) then begin
x:=ReadD(15);
y:=ReadD(19);
z:=ReadD(23);
delay(100);
buf:=hstr('04');
WriteD(o);
WriteD(x);
WriteD(y);
WriteD(z);
WriteC(0);
SendToServerEx(Name);
end;
end;
if (CurCP<MaxCP-Delta)and(CPuse<>'')and(CurHP>0)and AutoCP then
TimerCP.enabled:=true
else
TimerCP.enabled:=false;
if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
Say;
pck:='';
exit;
end;
if FromServer and(pck[1]=#$61)and AutoRadar then begin
x:=ReadD(6);
y:=ReadD(10);
z:=ReadD(14);
buf:=#$EB;
WriteD(0);
WriteD(1);
WriteD(x);
WriteD(y);
WriteD(z);
SendToClientEx(Name);
end;
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) and AutoCtrl then
pck[6]:=#$01;
if FromClient and (ConnectName=Name) and (pck[1]=#$21) then begin
action:=ReadS(2);
if pos('auto',action)>0 then begin
if action='autocp_on' then autocp:=true;
if action='autocp_off' then autocp:=false;
if action='autoctrl_on' then autoctrl:=true;
if action='autoctrl_off' then autoctrl:=false;
if action='autotarget_on' then autotarget:=true;
if action='autotarget_off' then autotarget:=false;
if action='autoradar_on' then autoradar:=true;
if action='autoradar_off' then begin
autoradar:=false;
buf:=#$EB;
WriteD(0);
WriteD(1);
WriteD(0);
WriteD(0);
WriteD(0);
SendToClientEx(Name);
end;
if action='autouse' then CPuse:='';
Say;
pck:='';
end;
end;

if FromServer and (pck[1]=#$4A) then begin
o:=ReadD(2);
x:=10;
action:=ReadS(x);
Msg:=ReadS(x);
x:=pos('? E?AE? YOIO NA?AA?!!!', Msg);
while x>0 do begin
delete(Msg, x, length('? E?AE? YOIO NA?AA?!!!'));
insert('[мат]', Msg, x);
x:=pos('? E?AE? YOIO NA?AA?!!!', Msg);
end;
x:=ReadD(6);
buf:=#$4A;
WriteD(o);
WriteD(x);
WriteS(action);
WriteS(Msg);
pck:=buf;
end;
end.

Просьба помогите сделать управление скриптом №1
так как в скрипте № 2

alexteam
09.04.2009, 17:05
MyFuncs.Add('function StrToHex(str1:String):String;');
такая уже есть, встроенная. смысл обьявлять функцию делающую тожесамое да еще и с тем же именем.
убей ее вообще.

lexayar
09.04.2009, 17:42
Скрипт был написан раньше, чем появилась встроенная функция.

DashKAaa
10.04.2009, 11:38
хз как у вас..но у нас так этот скрипт и не работал...

Auromy
29.04.2009, 00:29
А может кто извлечь функцию зажатия ctrl?
И если ли возможность сделать авто таргет, по сути работы "я" выделяю игрока с миражем(автосброс таргета) и чтобы он брался автоматически в таргет, до тех пор пока я не поменяю цель или не нажму эскейп?

TAMBIK
29.04.2009, 18:05
//помошник в PvP освобождает вас от небоходимости зажатия клавиши Ctrl,
const
Name='хххххххх'; //ник перса

begin
//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;

//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;

end.

работало на Интерлюде
для ХБ заменить 2F на 39 и 04 на 1F и 0A на 01 01 на 0F
помоему так

ЗНАТОКИ мож допишут чтоб работало без этого Name='хххххххх'; //ник перса

Добавлено через 8 минут
А может кто извлечь функцию зажатия ctrl?
И если ли возможность сделать авто таргет, по сути работы "я" выделяю игрока с миражем(автосброс таргета) и чтобы он брался автоматически в таргет, до тех пор пока я не поменяю цель или не нажму эскейп?

а это как

Auromy
29.04.2009, 20:30
Мираж автоматом сбрасывает таргет, чтобы не приходилось его заного брать в таргет и он выделялся автоматом пока не переключить на другую или не сбросить таргет кнопкой Esc (слева вверху ^_^')

TAMBIK
29.04.2009, 20:44
Мираж -это прога так

dfackk
29.04.2009, 21:21
Мираж, эт чит у тх на 79 лвл с 3 джобом.

Auromy
29.04.2009, 21:28
Мираж - это скил активно-пасивный, которые сбрасывает таргет автоматом, есть ещё свич - аналог миража, но его нужно каставать. Мираж весит в бафах и срабатывает в определенной очередности.

Grinch
29.04.2009, 22:11
да убить пакет который до клиента идёт, о том что на тебя мираж сработал ну и для пущего понта актион пакет отправить сразу же, правда надо тестить возможно повторный актион будет фатален для магов :)

Auromy
29.04.2009, 23:45
Хм.. а можно поподробнее?

Добавлено через 5 минут
И ещё вопрос что нужно из пакетов (значений) поменять, чтобы на грации2 работало?

TAMBIK
30.04.2009, 12:32
// Автоматический поиск PK поблизости. Если PK игрок находится рядом с вами, то можно:
// Автоматически взять его в цель и/или вывести сообщение в чат
// Команды для управления скриптом (все они вводятся в чат):
// Включить автоматическое взятие PK в цель - %pk_target 1
// Выключить автоматическое взятие PK в цель - %pk_target 0
// Включить уведомление в чат при обнаружении поблизости PK - %pk_msg 1
// Выключить уведомление в чат при обнаружении поблизости PK - %pk_msg 0
// Автор: Furious
// Версия: 0.1

var
ObjectID, Karma, Target, Message, i: Integer;
Name, Cvar: String;

procedure SendMsg(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(Msg);
SendToClient;
end;

procedure TargetPK(ObjectID: Integer);
begin
buf:=#$04;
WriteD(ObjectID);
SendToServer;
end;

begin
if FromServer and (pck[1]=#$03) then
begin
i:=18;
ObjectID:=ReadD(i);
Name:=ReadS(i);
Karma:=ReadD(i+60);
if (Karma>0) then
begin
if Message=1 then SendMsg('PK с ником '+Name+' находится поблизости!');
if Target=1 then TargetPK(ObjectID);
end;
end;
if FromClient and (pck[1]=#$38) then
begin
Cvar:=ReadS(2);
case Cvar of
'pk_target 1':
begin
Target:=1;
SendMsg('Автоматическое взятие PK в цель включено!');
end;
'pk_target 0':
begin
Target:=0;
SendMsg('Автоматическое взятие PK в цель выключено!');
end;
'pk_msg 1':
begin
Message:=1;
SendMsg('Вывод сообщения в чат при обнаружении PK включено!');
end;
'pk_msg 0':
begin
Message:=0;
SendMsg('Вывод сообщения в чат при обнаружении PK выключено!');
end;
end;
end;
end.

из скрипта использовать .Автотаргент

Добавлено через 32 минуты

// будет блокироваться пакет( 24) от сервера сброс таргента
begin

if FromServer and (pck[1]=#$24) then pck:='';
end.

lamer
30.04.2009, 15:13
кстати такой скриптик очень поможет на олимпе, такчто подожду готовую версию!!

TAMBIK
30.04.2009, 18:32
//помошник в PvP освобождает вас от небоходимости зажатия клавиши Ctrl,
const
Name='хххххххх'; //ник перса

begin
//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;

//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;

end.
Как сделать чтоб по соц действиям
ДА-вкл скрипт
НЕТ-выключить
ша проьовал куски от разных скриптов клеел неполучилось
Я ТУП!!!!!!!!!!!!!!!!!!

Тему так и начинал чтоб управление скриптом сделать

Stasrus
30.04.2009, 19:18
Пробуй
ДА-вкл скрипт
НЕТ-выключить

//помошник в PvP освобождает вас от небоходимости зажатия клавиши Ctrl,
const
Name='хххххххх'; //ник перса
var
x: integer;
procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClient;
end;
begin
if x=1 then begin
//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;

//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;
end;
begin
if FromClient and (pck[1]=#$34) and (pck[2]=#$06) then begin
x:=1;
SendMsg('Включено!');
end;
if FromClient and (pck[1]=#$34) and (pck[2]=#$05) then begin
x:=0;
SendMsg('Выключено!');
end;
end;
end.

TAMBIK
30.04.2009, 21:56
procedure SendMsg(msg:string);

ошибка

Stasrus
01.05.2009, 00:55
Можно полный текст ошибки? такого не должно быть...

alexteam
01.05.2009, 01:13
переименовать все SendMsg в скрипте на SendMsg2
ибо есть встроенная SendMsg пишушая сообщения в лог PH

TAMBIK
07.05.2009, 15:01
так вроде лучше
var
x: integer;
procedure SendMsg2(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(9);
WriteS('');
WriteS(msg);
SendToClient;
end;
begin
if x=1 then begin
//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было

//удерживать контрол
if FromClient and (pck[1]=#$39) then pck[6]:=#$0F;
//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же

//что б не удерживать контрол
if FromClient and (pck[1]=#$1F) then pck[1]:=#$01;
end;
begin
if FromClient and (pck[1]=#$34) and (pck[2]=#$06) then begin
x:=1;
SendMsg2('Включено!');
pck:='';
exit;
end;
if FromClient and (pck[1]=#$34) and (pck[2]=#$05) then begin
x:=0;
SendMsg2('Выключено!');
pck:='';
exit;
end;
end;
end.
а е с 3 шока

Гема
17.05.2009, 23:19
Чет я или туплю под вечер, ни кто не подскажет в каком пакете HP передается других персонажей. Может плохо ищу. Валкер же видит как то HP других игроков и л2контрол тоже.
П.С. Искал в пакете CharInfo. Щас поищу по форуму еще...

0rfin
14.03.2010, 15:35
Как правильно считывать значения хп цп? Красный ХП, Орандж ЦП
18 E0 51 02 10 03 00 00 00 09 00 00 00 E3 12 00 00 0B 00 00 00 61 07 00 00 21 00 00 00 78 09 00 00
Tип: 0x18 (StatusUpdate)
Pазмер: 33+2
Время прихода: 16:32:09:553
0002 d ObjectID: 268587488 (0x100251E0)
0006 d AttribCount: 3 (0x00000003)
[Начало повторяющегося блока 1/3]
0010 d AttrID: cur_HP ID:9 (0x0009) (0x00000009)
0014 d AttrValue: 4835 (0x000012E3)
[Конец повторяющегося блока 1/3]
[Начало повторяющегося блока 2/3]
0018 d AttrID: cur_MP ID:11 (0x000B) (0x0000000B)
0022 d AttrValue: 1889 (0x00000761)
[Конец повторяющегося блока 2/3]
[Начало повторяющегося блока 3/3]
0026 d AttrID: cur_CP ID:33 (0x0021) (0x00000021)
0030 d AttrValue: 2424 (0x00000978)
[Конец повторяющегося блока 3/3]



if FromServer and (pck[1]=#$18) then //берем значения из пакета StatusUpdate
begin
CurHP:=ReadD(5);
CurCP:=ReadD(20); // НЕ понимаю как работает реадд
SAY(IntToStr(CurCP));
end;

Liiion911
14.03.2010, 16:34
insert('[мат]', Msg, x);

очень интересно для чего вот такая строка xD если тут просто форум сам заменил ее то скиньте как-нить эту строку. походу из-за нее меня банит сервер ((( хорошо хоть твинаками эксперементирую

Vilson
14.03.2010, 19:29
Еще откуда брать значение макс ЦП? в пакете UserInfo его нет

Точно нет? А это тогда что такое? :D


procedure UserInfo;
var
i, tmpCharObjectId: integer;
tmpMyName: string;
begin
tmpCharObjectId:=ReadD(18);

if CharObjectId=0 then CharObjectId:=tmpCharObjectId;
case tmpCharObjectId of
CharObjectId:
begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
MaxCP:=ReadD(655);
CurCP:=ReadD(659);
end;
end;


Только сразу предпреждаю что отсюда ты возьмешь только начальные значения, а потом отслеживай StatsUpdate. Из моего пвп-скрипта:

procedure StatsUpdate;
var
i, tmpMaxHP, tmpCurHP, tmpMaxMP, tmpCurMP, tmpMaxCP, tmpCurCP, tmpCharObjectId :integer;
begin
tmpCharObjectId:=ReadD(2);
if (tmpCharObjectId<>CharObjectId) then Exit;
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: tmpCurHP:=ReadD(i*8+14);
#$0A: tmpMaxHP:=ReadD(i*8+14);
#$0B: tmpCurMP:=ReadD(i*8+14);
#$0C: tmpMaxMP:=ReadD(i*8+14);
#$21: tmpCurCP:=ReadD(i*8+14);
#$22: tmpMaxCP:=ReadD(i*8+14);
end;
if (tmpMaxHP<>0) then MaxHP:=tmpMaxHP;
if (tmpCurHP<>0) then CurHP:=tmpCurHP;
if (tmpMaxCP<>0) then MaxCP:=tmpMaxCP;
if (tmpCurCP<>0) then CurCP:=tmpCurCP;
if (tmpMaxMP<>0) then MaxMP:=tmpMaxMP;
if (tmpCurMP<>0) then CurMP:=tmpCurMP;

if (BSOEAutoUse) and (BSOEAmount>1) and (CurHP<>0) and (not TimerBSOE.Enabled) and (CurHP<((MaxHP*BSOEUsePercent)/100)) then
begin
UseItem(MyName, BSOEObjectId);
TimerBSOE.Enabled:=True;
end;

if (PotsAutoUse) then
begin
if (GCPAutoUse) and (GCPAmount>1) and (not TimerGCP.Enabled) and (CurCP<((MaxCP*GCPUsePercent)/100)) then
begin
UseItem(MyName, GCPObjectId);
TimerGCP.Enabled:=True
end;
if (QHPAutoUse) and (QHPAmount>1) and (CurHP<>0) and (not TimerQHP.Enabled) and (CurHP<((MaxHP*QHPUsePercent)/100)) then
begin
UseItem(MyName, QHPObjectId);
TimerQHP.Enabled:=True
end;

if (GHPAutoUse) and (GHPAmount>1) and (CurHP<>0) and (not TimerGHP.Enabled) and (CurHP<((MaxHP*GHPUsePercent)/100)) then
begin
UseItem(MyName, GHPObjectId);
TimerGHP.Enabled:=True;
end;
if (MPAutoUse) and (MPAmount>1) and (not TimerMP.Enabled) and (CurMP<((MaxMP*MPUsePercent)/100)) then
begin
UseItem(MyName, MPObjectId);
TimerMP.Enabled:=True;
end;
end;
end;

alexteam
14.03.2010, 20:07
019E d PAtk: 0 (0x00000000)
01A2 d AtkSpd: 0 (0x00000000)
01A6 d PDef: 0 (0x00000000)

хиленький какойто персонаж )

0rfin
14.03.2010, 20:09
Не правильно расшифровывается наверно l2ph 3.5.11.118, сервер epilogue.
Vislon сложно как то всё у тебя, я так и не понял как инфу взять из пакета
http://coderx.ru/showpost.php?p=71122&postcount=22
Объясните

alexteam
14.03.2010, 20:15
расшифровывает правильно. инишку под сервер подгонять надо.

Vilson
14.03.2010, 20:28
Ну вот где тут максЦП

Давай реальный пакет (саму строку) в студию и напиши реальное макс СП твоего чара.


Vislon сложно как то всё у тебя, я так и не понял как инфу взять из пакета
Объясните
Это не у меня, это у сервера линейки. Говори какая буква не понятна, попробую пояснить.

0rfin
14.03.2010, 20:43
Вот же (http://coderx.ru/showpost.php?p=71122&postcount=22) я спрашивал как инфу выдрать наверно с помощь readd не пойму как он работает. Макс цп 2424


Пакет UserInfo

32 84 39 01 00 68 D1 00 00 E5 F9 FF FF 00 00 00 00 E0 51 02 10 18 04 33 04 3E 04 40 04 4C 04 00 00 00 00 00 00 00 00 00 00 5D 00 00 00 55 00 00 00 7F FC D4 E4 05 00 00 00 28 00 00 00 25 00 00 00 24 00 00 00 15 00 00 00 0B 00 00 00 19 00 00 00 E3 12 00 00 E3 12 00 00 90 07 00 00 90 07 00 00 69 C3 F1 7F 27 F3 00 00 71 DA 01 00 28 00 00 00 07 BB 06 10 31 90 03 10 3C 90 03 10 87 90 03 10 B2 90 03 10 B1 90 03 10 E1 B8 03 10 B3 44 01 10 00 00 00 00 05 B9 03 10 98 DA 03 10 C1 B8 03 10 33 B9 03 10 45 B9 06 10 00 00 00 00 27 2A 08 10 27 2A 08 10 FB 22 07 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 8E 04 10 12 29 00 00 EF 24 00 00 EF 24 00 00 F0 24 00 00 F1 24 00 00 F1 24 00 00 D5 24 00 00 D0 28 00 00 00 00 00 00 D6 24 00 00 D2 24 00 00 D4 24 00 00 D7 24 00 00 43 36 00 00 00 00 00 00 B0 16 00 00 B0 16 00 00 77 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 36 00 00 00 00 00 00 C1 11 00 00 57 03 00 00 7A 11 00 00 83 03 00 00 70 11 00 00 00 00 00 00 B5 18 B4 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 01 00 00 00 7E 04 00 00 75 02 00 00 98 04 00 00 A4 00 00 00 92 00 00 00 FD 00 00 00 84 01 00 00 D5 00 00 00 75 02 00 00 41 05 00 00 00 00 00 00 00 00 00 00 72 00 00 00 50 00 00 00 72 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 85 2C F4 3F 00 00 00 E0 5E 73 02 40 00 00 00 00 00 00 22 40 00 00 00 00 00 00 37 40 03 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 20 00 42 04 30 04 3C 04 20 00 33 04 34 04 35 04 20 00 40 04 30 04 3D 04 4C 04 48 04 35 04 20 00 00 00 A1 9B 01 10 A9 38 06 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 0C 5C 09 00 09 00 00 00 00 00 00 00 64 00 5D 00 00 00 00 00 00 00 78 09 00 00 78 09 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 01 03 00 00 00 00 00 00 00 77 FF FF 00 00 00 00 00 00 00 00 00 00 00 96 00 5B 00 33 00 51 00 74 00 51 00 77 00 00 00 00 00 B5 01 00 00 00 00 00 00 20 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00

alexteam
14.03.2010, 21:03
замени в пакетс ини.
32=UserInfo:d(X)d(Y)d(Z)d(isInAirShip)d(ObjectID)s (Name)d(Race)d(Sex)d(ClassID:Get.ClassID)d(Level)q (Exp)d(Str)d(Dex)d(Con)d(Int)d(Wit)d(Men)d(MaxHP)d (CurrentHP)d(MaxMP)d(CurrentMP)d(Sp)d(CurrentLoad) d(MaxLoad)d(WeaponEquipment 20=no,40=yes)d(OIDUnder)d(OIDRear)d(OIDLear)d(OIDN eck)d(OIDFinger)d(OIDLfinger)d(OIDHead)d(OIDRhand) d(OIDLhand)d(OIDGloves)d(OIDChest)d(OIDLegs)d(OIDF eet)d(OIDBack)d(OIDLrhand)d(OIDHair)d(OIDHair2)d(O IDRbracelet)d(OIDLbracelet)d(OIDDeco)d(OIDDeco2)d( OIDDeco3)d(OIDDeco4)d(OIDDeco5)d(OIDDeco6)d(OIDBel t)d(IDUnder:Get.Func01)d(IDRear:Get.Func01)d(IDLea r:Get.Func01)d(IDNeck:Get.Func01)d(IDFinger:Get.Fu nc01)d(IDLfinger:Get.Func01)d(IDHead:Get.Func01)d( IDRhand:Get.Func01)d(IDLhand:Get.Func01)d(IDGloves :Get.Func01)d(IDChest:Get.Func01)d(IDLegs:Get.Func 01)d(IDFeet:Get.Func01)d(IDBack:Get.Func01)d(IDLrh and:Get.Func01)d(IDHair:Get.Func01)d(IDHair2:Get.F unc01)d(IDRbracelet:Get.Func01)d(IDLbracelet:Get.F unc01)d(IDDeco:Get.Func01)d(IDDeco2:Get.Func01)d(I DDeco3:Get.Func01)d(IDDeco4:Get.Func01)d(IDDeco5:G et.Func01)d(IDDeco6:Get.Func01)d(IDBelt:Get.Func01 )d(AugIDUnder)d(AugIDRear)d(AugIDLear)d(AugIDNeck) d(AugIDFinger)d(AugIDLfinger)d(AugIDHead)d(AugIDRh and)d(AugIDLhand)d(AugIDGloves)d(AugIDChest)d(AugI DLegs)d(AugIDFeet)d(AugIDBack)d(AugIDLrhand)d(AugI DHair)d(AugIDHair2)d(AugIDRbracelet)d(AugIDLbracel et)d(AugIDDeco)d(AugIDDeco2)d(AugIDDeco3)d(AugIDDe co4)d(AugIDDeco5)d(AugIDDeco6)d(AugIDBelt)d(Talism anSlots)d(CloakStatus)d(Patk)d(PatkSpd)d(Pdef)d(Ev asionRate)d(Accuracy)d(CriticalHit)d(Matk)d(MatkSp d)d(PatkSpd)d(Mdef)d(PvPFlag)d(Karma)d(RunSpd)d(Wa lkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(0)d(0)d(FlyRunS pd)d(FlyWalkSpd)f(MoveMul)f(AtkSpeedMul)f(ColRadiu s)f(ColHeight)d(HairStyle)d(HairColor)d(Face)d(isG M:1,0)s(Title)d(ClanID)d(ClanCrestID)d(AllyID)d(Al lyCrestID)d(Relation)c(MountType)c(PrivateStoreTyp e)c(DwarvenCraft:1,0)d(PkKills)d(PvPKills)h(Cubics Size:Loop.01.0001)h(CubicID)c(0)d(AbnormalEffect)c (FlayingMounted:2,0)d(ClanPrivileges)h(RecomLeft)h (RecomHave)d(MountNpcID)h(InventoryLimit)d(ClassID :Get.ClassID)h(0)d(MaxCP)d(CurrentCP)c(isMounted)c (Team:1-blue,2-red)d(ClanCrestLargeID)c(isNoble)c(isHero)c(isFish ing)d(FishingX)d(FishingY)d(FishingZ)d(NameColor)c (isRunning)d(PledgeClass)d(PledgeType)d(TitleColor )d(CursedWeaponEquipID)d(TranformationID)h(AtkElem entAttr)h(AttackElementVal)h(DefAttrFire)h(DefAttr Water)h(DefAttrWind)h(DefAttrEarth)h(DefAttrHoly)h (DefAttrDark)d(AgathionId)d(Fame)d(Unknown)d(Vital ityPoints)d(SpecialEffect)d(0)d(0)d(0)d(0)

Vilson
14.03.2010, 21:12
Вот же (http://coderx.ru/showpost.php?p=71122&postcount=22) я спрашивал как инфу выдрать наверно с помощь readd не пойму как он работает. Макс цп 2424
Пакет UserInfo

Ну вот же оно твое сп 78 09 00 00 = 2424 следовательно
MaxCP:=ReadD(657);
CurCP:=ReadD(661);

alexteam
14.03.2010, 21:13
MaxCP:=ReadD(657);
CurCP:=ReadD(661);
будет работать только для этого персонажа. и то. пока он титул не сменит. либо кубиков на себя не навешает.

0rfin
14.03.2010, 21:39
Заменил в packetsT1.ini ни чо не изменилось, есть еще с4 с5 t0

Добавлено через 11 минут
Ну вот же оно твое сп 78 09 00 00 = 2424 следовательно
MaxCP:=ReadD(657);
CurCP:=ReadD(661);
как ты узнал что 657? это 657 байт по порядку? Я в расшифровке смортю 78 09 00 00 там тупость cudicID какой то

как из StatusUpdate взять?
18 E0 51 02 10 03 00 00 00 09 00 00 00 E3 12 00 00 0B 00 00 00 8B 07 00 00 21 00 00 00 78 09 00 00

alexteam
14.03.2010, 21:50
Заменил в packetsT1.ini ни чо не изменилось
молодец. убедись что ты т1 юзаешь, это раз. во вторых, перезапусти пх после правки.. как бэ.

Добавлено через 7 минут
как ты узнал что 657?
при правильном парсинге пакета по инишке детальной расшифровке пакета видно оффсет по которому значение брать.

правда с юзерлист не все так просто.
там 2 строковых типа (имя, титул) и один массив (перечень кубиков на персонаже). т.е. нельзя прописать статически параметр для реадд и чтобы оно работало везде.

да и с статус апдейт тоже не все просто, там цикл. как бэ. т.е. он как минимум может содержать разное кол-во элементов. и не обязательно там будет в наличии цп.

0rfin
14.03.2010, 22:07
В настройках стоит Т1, да я перезапускал л2пх
при правильном парсинге пакета по инишке детальной расшифровке пакета видно оффсет по которому значение брать.
уу как сложно. Ну да видел статус обдейт разный приходит, большой и маленький

Вобще то ищу рабочий или подстоить под свой сервер скрипт автоцп, авто хомяк не пашет, в списке не появляется ник перса

Vilson
15.03.2010, 04:32
да и с статус апдейт тоже не все просто, там цикл. как бэ. т.е. он как минимум может содержать разное кол-во элементов. и не обязательно там будет в наличии цп.
Ну так если не пришло СП в StatusUpdate значит оно и не изменилось, считаем что осталось старое значение.


как из StatusUpdate взять?
Я же готовый пример выложил как взять.

Добавлено через 3 часа 47 минут
Вобщем не поленился и переписал обработку UserInfo на более универсальную у себя в скриптах, теперь должно работать не зависимо от имени чара, титула и кубиков.


procedure UserInfo;
var
i, CubicsSize, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;
begin
tmpCharObjectId:=ReadD(18);
if CharObjectId=0 then CharObjectId:=tmpCharObjectId;
case tmpCharObjectId of
CharObjectId:
begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
end;
end;

Infernale
06.04.2010, 16:47
Из того что нашел на форуме, решил переделать скрипт под эпилог, вот что получилось

const
Name='Infernal';
var
CurHP,MaxHP,CurCP,MaxCP,MyCorX,MyCorY,MyCorZ,MaxMP ,CurMP: integer;
CPuse,HPuse,MPuse: string;
i, CubicsSize, CharObjectId, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;

TimerMP,TimerCP,TimerHP: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
TimerCP.interval:=1000; //интервал 1сек, т.к. чаще пить CP всеравно не будет, дабы не засорять трафик

TimerMP:=TTimer.Create(nil);
TimerMP.OnTimer:=@OnTimerMP;
TimerMP.enabled:=false;
TimerMP.interval:=1000; //интервал 1сек, т.к. чаще пить MP всеравно не будет, дабы не засорять трафик

TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=false;
TimerHP.interval:=15000; //интервал 15сек, т.к. действие одной бутылки = 15сек
end;

procedure OnTimerCP(Sender: TObject);
begin
buf:=CPuse;
SendToServerEx(Name);
end;
procedure OnTimerMP(Sender: TObject);
begin
buf:=MPuse;
SendToServerEx(Name);
end;
procedure OnTimerHP(Sender: TObject);
begin
buf:=HPuse;
SendToServerEx(Name);
end;

procedure Free; //Вызывается при выключении скрипта
begin
TimerCP.free;
TimerMP.free;
TimerHP.free;
HPuse:='';
CPuse:='';
end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//пьем сначала CP, потом HP банку что б запомнить их ID(я решил взять эти пакеты целиком, дабы не усложнять)
if FromClient and (pck[1]=#$19) and (CPuse='') then CPuse:=pck;
if FromClient and (pck[1]=#$19) and (CPuse<>pck) and (HPuse='') then HPuse:=pck;
if FromClient and (pck[1]=#$19) and (CPuse<>pck) and (HPuse<>pck) and (MPuse='') then MPuse:=pck;

if FromServer and (pck[1]=#$32) then

begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);

end;


if FromServer and (pck[1]=#$18) then
begin
CurHP:=ReadD(14);
CurCP:=ReadD(30);
CurMP:=ReadD(22);
// ShowMessage(IntToStr(CurMP));




//если вы используете не грэйтер CP то вместо 200 подставьте кол-во CP сколько восстанавливает 1 банка
if (CurCP<MaxCP-200) then TimerCP.enabled:=true else TimerCP.enabled:=false;
if (CurHP<MaxHP) then TimerHP.enabled:=true else TimerHP.enabled:=false;
if (CurMP<MaxMP-2500) then TimerMP.enabled:=true else TimerMP.enabled:=false;
end;



end.

Проблема в том что использование банок начинается не сразу после изменения параметров, а только спустя интервал, заданный в таймере. Для Cp и MP это не критично при задержке в 1 сек, а для HP и в дальнейшем элексиров доставляет неудобства. Как это можно исправить?

J-Fobos
06.04.2010, 23:11
Infernale, запустить процедуру юзания банки сразу после/перед включением таймера. Вот так:
//.........
if (CurMP<MaxMP-2500) then
beign
OnTimerMP();
TimerMP.enabled:=true;
end
else
TimerMP.enabled:=false;
//........


Или еще вариант менять время таймера в самом таймере. Вот так:
//.........
TimerHP.interval:=1; //интервал 0.001сек
end;

//.........
procedure OnTimerHP(Sender: TObject);
begin
buf:=HPuse;
SendToServerEx(Name);
TimerHP.interval:=15000; //сделали как надо интервал 15сек
end;
//.........

Vilson
07.04.2010, 06:06
Два примера тебе уже привели, приведу еще и третий, кусочек из моего скрипта:


const
MyName = 'Nooooob';
TargetCheckTime = 500; //интервал для проверки возможности вернуть таргет после хейта/миража, 0.5 сек

InventorySize = 180;
GCPReuseTime = 800;
QHPReuseTime = 200; //маленький интервал делает практически не убиваемым, 10 юзов * 480 хп = 4800 хп/сек
//но при этом клиент может тормозить на медленном инете из-за количества быстро отсылаемых пакетов
//в случае притормаживания надо увеличить интервал срабатывания
GHPReuseTime = 14500;
MPReuseTime = 2000;
BSOEReuseTime = 120000; //!!если в течении двух минут после BSOE ХП не станет больше BSOEUsePercent опять используем BSOE

GCPUsePercent = 98; //% после достижения которого банки перестают использоватся
QHPUsePercent = 75;
GHPUsePercent = 97;
MPUsePercent = 30;
BSOEUsePercent = 15; //% HP при котором использовать BSOE

//id итемов
GCPItemId = 5592; //Greater CP Potion
QHPItemId = 1540; //Quick Healing Potion
GHPItemId = 1539; //Greater Healing Potion
MPItemId = 728; //Mana Potion
BSOEItemId = 1538; //BSOE

//............................

procedure StatsUpdate;
var
i, tmpMaxHP, tmpCurHP, tmpMaxMP, tmpCurMP, tmpMaxCP, tmpCurCP, tmpCharObjectId :integer;
begin
tmpCharObjectId:=ReadD(2);
if (tmpCharObjectId<>CharObjectId) then Exit;
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: tmpCurHP:=ReadD(i*8+14);
#$0A: tmpMaxHP:=ReadD(i*8+14);
#$0B: tmpCurMP:=ReadD(i*8+14);
#$0C: tmpMaxMP:=ReadD(i*8+14);
#$21: tmpCurCP:=ReadD(i*8+14);
#$22: tmpMaxCP:=ReadD(i*8+14);
end;

if (tmpMaxHP<>0) then MaxHP:=tmpMaxHP;
if (tmpCurHP<>0) then CurHP:=tmpCurHP;
if (tmpMaxCP<>0) then MaxCP:=tmpMaxCP;
if (tmpCurCP<>0) then CurCP:=tmpCurCP;
if (tmpMaxMP<>0) then MaxMP:=tmpMaxMP;
if (tmpCurMP<>0) then CurMP:=tmpCurMP;

if (BSOEAutoUse) and (BSOEAmount>1) and (CurHP<>0) and (not TimerBSOE.Enabled) and (CurHP<((MaxHP*BSOEUsePercent)/100)) then
begin
UseItem(MyName, BSOEObjectId);
TimerBSOE.Enabled:=True;
end;

if (PotsAutoUse) then
begin
if (GCPAutoUse) and (GCPAmount>1) and (not TimerGCP.Enabled) and (CurCP<((MaxCP*GCPUsePercent)/100)) then
begin
UseItem(MyName, GCPObjectId);
TimerGCP.Enabled:=True
end;
if (QHPAutoUse) and (QHPAmount>1) and (CurHP<>0) and (not TimerQHP.Enabled) and (CurHP<((MaxHP*QHPUsePercent)/100)) then
begin
UseItem(MyName, QHPObjectId);
TimerQHP.Enabled:=True
end;

if (GHPAutoUse) and (GHPAmount>1) and (CurHP<>0) and (not TimerGHP.Enabled) and (CurHP<((MaxHP*GHPUsePercent)/100)) then
begin
UseItem(MyName, GHPObjectId);
TimerGHP.Enabled:=True;
end;
if (MPAutoUse) and (MPAmount>1) and (not TimerMP.Enabled) and (CurMP<((MaxMP*MPUsePercent)/100)) then
begin
UseItem(MyName, MPObjectId);
TimerMP.Enabled:=True;
end;
end;
end;


Запостил с секцией const что бы было более понятно о чем речь.


Проблема в том что использование банок начинается
Кстати, при твем "упрощенном" подходе возникнет еще одна проблема - когда у тебя закончатся банки, а скрипт по прежнему будет отправлять ранее сохраненные пакеты на UseItem с уже не существующим id очень велика вероятность схватить бан аккаунта, потому как палево 100%. Советую не упрощать, а делать все по уму с чтением инвентаря, нахождением нужных банок и последующим подсчетом их количества.

Liiion911
27.04.2010, 00:48
Давно не читал форумю понял что щас уже не модно делиться скриптами, каждый ботит и скриптит у себя на ПК и отдать на пользование жалко.

Попробовал написать свое, все что накшел на форуме выкладываю тут:

написал для таких же как 0rfin
запускаем скрипт. либо жмем Соц действие ДА! либо свиток который хз как но появится на паннели во втором ряду в первой ячейке. дальше все по открывшемуся меню ) АЦП забыл, банки небыло.

не пишите что у меня кривые руки.
напишите лучше что сделал не так или сразу выложите готовую версию.

заранее спс )):give_rose:

Vilson
28.04.2010, 04:58
Давно не читал форумю понял что щас уже не модно делиться скриптами, каждый ботит и скриптит у себя на ПК и отдать на пользование жалко.
Здесь форум для обучения, а не для клонирования тупиц. Если что-то конкретно не понятно - пояснят и разжуют кому не лень, но делать всю за лентяев всю работу и выкладывать готовое почему-то никто не хочет. :D


Попробовал написать свое, все что накшел на форуме выкладываю тут:

Ну и нафига этот мусор выкладывать? Скрипт кривой и заведомо не рабочий, в этой же теме парой постов выше уже выкладывал нормальную обработку UserInfo и StatusUpdate, неужели даже скопировать так тяжело?

запускаем скрипт. либо жмем Соц действие ДА!
После чего нигуя не произойдет, так как вероятность того что совпадет ObjectId банок у тебя и у того кто запустит этот скрипт меньше чем выиграть лимон баксов в лоторее. :D Хотя скорее всего кое-что все таки произойдет, тот кто запустит скрипт схватит автобан акка за попытку использовать не существующий предмет.


напишите лучше что сделал не так или сразу выложите готовую версию.

Читай инвентарь, считай количество банок, работай с CP. Этот твой скрипт перестанет работать как только у тебя кончатся банки, после чего ты еще и бан можешь получить.

air911
29.04.2010, 12:03
Два примера тебе уже привели, приведу еще и третий, кусочек из моего скрипта:

[highlight="delphi"]
const
MyName = 'Nooooob';
TargetCheckTime = 500; //интервал для проверки возможности вернуть таргет после хейта/миража, 0.5 сек

InventorySize = 180;
GCPReuseTime = 800;
QHPReuseTime = 200; //маленький интервал делает практически не убиваемым, 10 юзов * 480 хп = 4800 хп/сек
//но при этом клиент может тормозить на медленном инете из-за количества быстро отсылаемых пакетов
//в случае притормаживания надо увеличить интервал срабатывания
GHPReuseTime = 14500;
MPReuseTime = 2000;
BSOEReuseTime = 120000; //!!если в течении двух минут после BSOE ХП не станет больше BSOEUsePercent опять используем BSOE



Запостил с секцией const что бы было более понятно о чем речь.


Кстати, при твем "упрощенном" подходе возникнет еще одна проблема - когда у тебя закончатся банки, а скрипт по прежнему будет отправлять ранее сохраненные пакеты на UseItem с уже не существующим id очень велика вероятность схватить бан аккаунта, потому как палево 100%. Советую не упрощать, а делать все по уму с чтением инвентаря, нахождением нужных банок и последующим подсчетом их количества.
Как запускать скрипт!?, при нажатии на скрипт все вроде работает и ничего не происходит, может кто-то описать цыкл действий (непреймите за тупость). Немного обрезал скрипт а то непомещалось.

Asmoday
29.04.2010, 13:03
Сори если повторюсь за кем-то, темку читал очень бегло. Хочу немного разъяснить про работу миража у ТХ а так же по системе "анти-дагер". Мираж не срабатывает "с каким-то там тайм аутом", скил работает по принципу как только кто-то хочет проатачить перса под миражом у атакующего сбрасывается таргет. Кстати шанс сброса таргета не 100%. Теперь как этого избежать, убивать пакет идущий на клиент бесполезно, по скольку сервер только уведомляет о том что он уже сделал. По такой аналогии "если убить пакет что мой дб на +15 сломался при попытке заточки на +16, я буду бегать с со сломаным дб xD". По этому выход тут только один, ловим два пакета TargetSelected (это для защиты от агра танков) и TargetDelete идущие от сервера к клиенту, а так же ловим пакеты на таргет которые идут от клиента к серверу (кажется TargetSelect и TargetDelete). Далее сокращения "От ГС" - от гейм сервера к клиенту, "К ГС" от клиента к гейм серверу.

Алгоритм работы анти-дагер системы:
- если мы видим пакет TargetSelect (к ГС) выдергиваем из него ObjID цели
- если видим пакет TargetDelete (к ГС) то сбрасываем запомненый ObjID (например делаем -1).
- если мы видим пакет TargetSelected (от ГС) то сравниваем ObjID из него с ране сохраненным, если не совпадает, отправляем пакет на взятие в таргет цели с сохраненым ObjID.
- если видим пакет TargetDelete (от ГС) отправляем пакет на взятие в таргет цели с сохраненым ObjID.

Думаю объяснил достаточно понятно.

Vilson
29.04.2010, 17:49
Алгоритм работы анти-дагер системы:
- если мы видим пакет TargetSelect (к ГС) выдергиваем из него ObjID цели

Я это делаю по команде "_lock" набранной в чат с клиента, так на много правильнее получается.


- если видим пакет TargetDelete (к ГС) то сбрасываем запомненый ObjID (например делаем -1).

Такой команды нет, есть RequestTargetCanceld. А еще есть Die, по нему я тоже отменяю таргет.

#$00:if (TargetObjectId=ReadD(2)) then //Die (target)
begin
TargetObjectId:=0;
RequestTargetCanceld(MyName);
end;


Вообще мираж как и сетовый "мираж" легко решаемая проблема. На порядок большая проблема - танковый хейт который лочит на себе таргет на интервал времени. Из-за этого приходится отлавливать когда прийдет пакет с отменой этого абнормал статуса и только потом делать новый TargetSelect и AttackRequest. Впрочем, если играешь контактником можно не глядя на таргет слать AttackRequest(TargetObjectId) с нужным (предварительно залоченным по какой-то команде в чат с клиента) TargetObjectId, на ряде фришек это прокатывает даже когда перс залочен танковым хейтом.

Добавлено через 15 минут
Как запускать скрипт!?, при нажатии на скрипт все вроде работает и ничего не происходит, может кто-то описать цыкл действий (непреймите за тупость). Немного обрезал скрипт а то непомещалось.
Никак, это не весь скрипт, а очень маленькая его часть.

Liiion911
01.05.2010, 17:45
Да, счет кол-ва банок добавляю. все использования предметов ввожу через итем ИД процедурой.

Ты много написал, даже пару раз пошутил, похвально.

Но на форуме от тебя ничего так и не нашел (((

Добавлено через 10 минут
Спасибо, критика этого придурка мне понятна.

Уже многое переделал чтобы не спамить уже закончившимися банками и поправил пару процедур и функций (юзитем и юзеринфо)

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

По соц действию действительно все заработает и бан не схватить ,поскольку пакет не идет к серверу а перехватывается.

Vilson
03.05.2010, 00:13
Да, счет кол-ва банок добавляю. все использования предметов ввожу через итем ИД процедурой.
МБ через ObjectId? Через ItemId не возможно ничего использовать.


Ты много написал, даже пару раз пошутил, похвально.
Но на форуме от тебя ничего так и не нашел (((
А зачем нужно именно от меня? На форуме сотни рабочих примеров от уважаемых людей.. Но если вопрос в том что "именно от меня", то хотя бы отсюда мог бы взять чтение инвентаря - http://coderx.ru/showthread.php?t=4070


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

Breadfan
03.05.2010, 12:18
to Liiion911

...Но на форуме от тебя ничего так и не нашел ((( - на 4ую страницу вернись обратно - четкие, прозрачные и понятные процедуры, именно от него, юзнув поиск - еще найдешь примеры....чего еще надо-то?
Если взять несколько скриптов от NLObP (ессно не умаляю заслуг и других авторов) и разобрать их по процедурам - то вообще получится практически полностью укомплектованная подборка функций...и для боя, и для бафа, и для бега по пути, координаты которого можно загружать с отдельного файла...причем все будет красиво оформлено отдельной панелью управления, с кнопочками, списками...Но ведь лень, матушка...

И, кстати о лени, поиск все-таки опробуй, а то уже год существует скрипт от Stekloreza & NL0bP (http://coderx.ru/showpost.php?p=30047&postcount=548), единственно под свой сервер править надо и все...естественно, твой скрипт, в сравнении с ним - выглядит именно как мусор....

ЗЫ: "...ищущий да обрящет..."

Liiion911
09.05.2010, 02:27
извините за мусор, писал его для себя...

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

Breadfan
09.05.2010, 14:53
да нет, еще как введен, любую сборку посмотри - везде есть это, просто какое действие выполнять (кик\бан\игнорить) - выставляет в настройках администратор сервера.

ЗЫ: я не говорю что не надо тут ничего выкладывать...я клоню к тому, что неплохо было бы ознакомиться с работами других авторов

Liiion911
10.05.2010, 01:15
Да я 2 месяца в ла2 не играл, зашел в пару тем, увидел эти примеры и выложил что у самого было.

Извините ^_^

щас вообще играть стало не возможно, везде ботоводы, скачали настроили и играй.... стало как-то не спортивно ((( все готовенькое...

J-Fobos
10.05.2010, 01:53
щас вообще играть стало не возможно, везде ботоводы, скачали настроили и играй.... стало как-то не спортивно ((( все готовенькое...
солидарен, кстати под словом "настроили" теперь надо понимать "прописали в set.ini" айпи сервера :)

Liiion911
10.05.2010, 19:11
Да не , ты что, какой set.ini

Как я понял уже все проще, пара галочек поле для ввода IP и все ))))

Сорри за оффтоп ))