d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;
Без всего этого можно обойтись и только целочисленной математикой, ищи алгоритмы целочисленной геометрии в интернете.
исчи и выкладывай :) я просто плохо помню геометрию особенно координаты ет было давно и неправда :) просто это для чего я дадумался сам и главное работает, и впринципе скрипт узкозадачный для кач бота. возможно рано или поздно напишу
чтоб пришел пакет UserInfo надо просто открыть и закрыть окно инвенторя в клиенте)
ЗЫ а чтоб это сам скрипт делал надо прост заставить его при запуске слать пакет запроса инвенторя, я его номер непомню, так что прост поймай его и шли когда нужно получить UserInfo
NLObP не ты первый кто говорит об этом, но это пока начало кода бота возможно придётся ещё модернизировать чёнить а там ID сам проскочит, допустим в мониторинге сосок стрел и всякой ботвы :) мечтаю о таком скрипте хотя он почти готов на хп и цп подправить и гуд будет, а то у меня бывает в каче я робот :D соски заканчиваются неожидано особено у сумонеров 5к+ за баф в катах если и без пофа пп :) спириты вообще улетают так что цель есть :) next => :evil:
Хочу вот попробовать убить РБ в 1 окно.
1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.
2- может для етого пакет юзеринфо или атаки брать???
__________________
Пишите в асю если чего. 446-693-955
Хочу вот попробовать убить РБ в 1 окно.1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.2- может для етого пакет юзеринфо или атаки брать???
На основе скрипта автозаточки от NLObP
Попытался отредактировать скрипт под автокристаллизацию. Давно искал такой скрипт, но средствами Валкера он не реализуем в С6.
В природе его не существует (я потратив кучу времени лично не нашёл).
Код:
//Атоматизация кристаллизации предметов
//На полной основе "Автоматизация заточки предметов до необходимого уровня by NLObP"
//Необходимо затариться оружием, бронью или бижей
//Открываем инвентарь (С4) или делаем покупку (С6) для инициализации скрипта
//Социальное действие YES начать
//Социальное действие NO остановиться
//Enjoy!
//******************************************************************************
const
Name='ABC'; //заменить на имя своего чара
Weapon=6579; // ItemID Arcana Mace //что будем кристаллизовать
MaxEnchLvl=2; //max уровень заточки предмета, который не разрешаем ломать (типа защиты)
max=100; //max количество предметов в базе
var
// WpnObjID: array[1..maxwpn,1..maxwpn] of integer; //Weapon ObjID
WpnBase: array[1..2,1..max] of integer; //Weapon ObjID,lvl
add: boolean; //прошла заточка?
timer: TTimer;
CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
var
i:integer;
begin
//Enchant:=false;
CurEnchLvl:=0;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=1000; //время задержки
Say('Для инициализации скрипта сделайте покупку (С6) или откройте инвентарь (С4)');
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
WpnBase:=nil;
timer.Free;
end;
//******************************************************************************
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
i, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
ww:=1; //индекс в массиве предметов
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
if ListCount>max then ListCount:=max;
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
for i:=1 to ListCount do begin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Level
case ItemID of
weapon: begin
WpnBase[1,ww]:=ObjID;
WpnBase[2,ww]:=lvl;
ww:=ww+1;
//Say('ColvoWpn='+IntToStr(ww));
end;
end;
//j:=j+2; //для С4
j:=j+10; //для С6
end;
ColvoWpn:=ww-1;
Say('>ColvoWpn='+IntToStr(ColvoWpn)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
i, ii, j, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
begin
ListCount:=ReadH(2); //количество итемов
//Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
// Say('Апдейт базы!');
for i:=1 to ListCount do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItemID:=ReadD(j);
j:=j+14;
Lvl:=ReadH(j);
// Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
case UpdType of
1:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn+1;
//Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
for ii:=1 to max do
if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
end;
end;
2:case ItemID of
weapon:
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
end;
3:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn-1;
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
//Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
end;
end;
end;
//j:=j+2; //для С4
j:=j+10; //для С6 //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
end;
Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
i: integer;
begin
Result:=-1;
if CurEnchLvl>=MaxEnchLvl then begin
Result:=-2;
exit;
end;
for i:=1 to max do begin
//находим первый подходящий предмет
if (WpnBase[1,i]<>0) and (WpnBase[2,i]<=CurEnchLvl) then begin
Result:=WpnBase[1,i];
exit;
end;
end;
// CurEnchLvl:=CurEnchLvl+1;
// Result:=-3;
end;
//******************************************************************************
procedure UseItem(ObjectID: integer);
begin
buf:=#$72;
WriteD(ObjectID);
WriteD(01);
WriteD(00);
WriteD(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
var
wpn :integer;
begin
Wpn:=GetNextWeapon;
case wpn of
-1: begin
Say('Нет такого предмета! Прервано!');
timer.enabled:=false;
exit;
end;
-2: begin
Say('Достигли максимальный уровень заточки! Прервано!');
timer.enabled:=false;
exit;
end;
// -3: begin
// //Say('Подбираем текущий уровень заточки!');
// timer.enabled:=true;
// exit;
// end;
end;
//************************************************
UseItem(Wpn);
//************************************************
//Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//****************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
//социальное действие yes для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
CurEnchLvl:=0;
Say('Команда Старт!!!');
timer.enabled:=true;
end;
//****************************************************************************
//социальное действие no для остановки точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
Say('Команда Стоп!!!');
timer.enabled:=false;
end;
//****************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
// if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
//****************************************************************************
//если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.
Как это не странно, но скрипт работает.
Прошу мну не пинать, учитывая, что это первая программа в моей жизни (ну очень нужна была!).
Если автор исходника посчитает, что я как-то задел его профессиональные чувства - пусть удалит её!
const
Name='Ник перса тестера;
//первая координата квадрата
ax=-88370;
ay=142700;
az=3640;
//вторая координата квадрата
bx=-87427;
by=142700;
bz=-3640;
//третья координата квадрата
cx=-87427;
cy=141800;
cz=-3640;
//четвёртая координата квадрата
dx=-88368;
dy=141752;
dz=-3640;
var
mx, my: real;
MyID:integer;
pl,pl1,pl2,pl3,p2,p21,p22,p23:integer;
timer1 : TTimer;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
procedure Init; //Вызывается при включении скрипта
begin
// дык таймер но он выключен он нам не нужен в этом скрипте, но мало ли
// timer1:=TTimer.Create(nil);
//timer1.OnTimer:=@OnTimer1;
// timer1.enabled:=false;//по начал не запускаем таймер, только по команде
//timer1.interval:=2000;// 2 секунды - начальный интервал таймера
end;
procedure InitStats;
begin
MyID:=ReadD(18);
Say('ID'+inttostr(MyID));
end;
procedure InitXYZ;
begin
mx:=ReadD(6);
my:=ReadD(10);
//нород если криво то помидорами не кидай те кто закодит для n угольника
//тому респект и уважуха, особенно если квадрат будет с возможность мёртвыъ координат внутри, но ет мат задача не для моих мозгов
//ет квадрат АБЦД
pl:=Ploshad(ax,ay,bx,by,cx,cy);
pl1:=Ploshad(mx,my,bx,by,cx,cy);
pl2:=Ploshad(ax,ay,mx,my,cx,cy);
pl3:=Ploshad(ax,ay,bx,by,mx,my);
p2:=Ploshad(ax,ay,dx,dy,cx,cy);
p21:=Ploshad(mx,my,dx,dy,cx,cy);
p22:=Ploshad(ax,ay,mx,my,cx,cy);
p23:=Ploshad(ax,ay,dx,dy,mx,my);
//проверяем условие принадлежиности наших координат к квадрату АБЦД
if (pl<pl1+pl2+pl3+50)and((pl>pl1+pl2+pl3-50))or (p2<p21+p22+p23+50)and((p2>p21+p22+p23-50)) then Say('Мы в квадрате!')
else Say('МЫ НЕ в квадрете!')
end;
function Ploshad(ax,ay,bx,by,cx,cy:real):integer;
var d1,d2,d3,per:real;
//описываем по какой то там формуле лощадь треугольника
begin
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;
procedure Free; //Вызывается при выключении скрипта
begin
//timer1.enabled:=false;
//timer1.Free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit; //убераем пусты пакеты
//думаем о нашем ИД думаем...
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
// думаем о координатах своих
if FromServer and (ConnectName=Name) and (pck[1]=#$01)and (ReadD(2)=myID) then InitXYZ;
end.
Хочу вот попробовать убить РБ в 1 окно.1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.2- может для етого пакет юзеринфо или атаки брать???
1)Нет
2)Нет
ДЫК ведь можно попробовать, как со СЛИПом(там задержку на повторное накладывание можно убирать)..
Лана я пробону, мож получится че-нить подобное :oops:
__________________
Пишите в асю если чего. 446-693-955