CODE:
//---------------------------------Настройки резервирования------------------------------------
int CountHotBarSlots=36;//может принимать значения, кратные 12 до 36
int CountMapCheckPoints=10;
int CountCritPoints=10;
//-----------------------------Используемые переменные и массивы-------------------------------
int MinPressPeriod=80;
int HotbarIcons[CountHotBarSlots][33][33];
int HotbarIconPos[CountHotBarSlots][2];
int HotbarDefine[CountHotBarSlots+1];
int maskey[CountHotBarSlots][4];
FillMassive2(#maskey[0][0],CountHotBarSlots,4,0);
FillMassive(#HotbarDefine[0],CountHotBarSlots+1,-1);
int MapCheckPoints[CountMapCheckPoints][2];
int MapScreens[CountMapCheckPoints][71][14];
int MapDefine[CountMapCheckPoints+1];
FillMassive(#MapDefine[0],CountMapCheckPoints+1,-1);
int CritPointXY[CountCritPoints][2];
int CritPointAssoc[CountCritPoints];
int CritPointClr[CountCritPoints];
int CritPointDefine[CountCritPoints+1];
FillMassive(#CritPointDefine[0],CountCritPoints+1,-1);
int UserInput;
int MoveNow[71][14];
int MoveOld[71][14];
//Номера кнопок
int TargetKey=32;
sleep(3000);
main:
NewAutoSlot();
sleep(1000);
goto main;
function DefineIconsPosition()//Расчитывает экранные координаты иконок на горячей панели
{int n;
//задаем координаты 1й иконки для первых 12 слотов
if (HotbarDefine[1]>=12)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=683;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n=2;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=683;n++;}}
//задаем координаты 1й иконки для cледующих 12 слотов
if (HotbarDefine[1]>=24)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=718;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n++;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=718;n++;}}
//задаем координаты 1й иконки для cледующих 12 слотов
if (HotbarDefine[1]=36)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=757;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n++;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=757;n++;}}
}
function NewCritPoint()//создает новую критическую точку маны\здоровья
{int AssocNum;
int FreeSlot=FindFreeSlot(#CritPointDefine[0]);//поиск свободного слота и резервирование
if (FreeSlot==0){resettextout(1);textout(1, 20, 0, "Не осталось свободных слотов", 0);}
resettextout(1);textout(1, 20, 0, "Укажите точку на шкале здоровья\маны (обязательно левее числогого значения) ниже которой должен использоваться предмет", 0);
WaitForKey(1);
getmouse(CritPointXY[FreeSlot][1], CritPointXY[FreeSlot][2]);
CritPointClr[FreeSlot]=getmousecolor();
resettextout(1);textout(1, 20, 0, "Кликните левой клавишей по слоту, из которого должен использоваться предмет или скилл", 0);
CritPointAssoc[FreeSlot]=DetermineClickedSlot();}
function NewAutoSlot()//заполняет данные, необходимые для авто-использования предмета\скила
{int SlotNum;
resettextout(1);textout(1, 20, 0, "Кликните левой клавишей по слоту, из которого должен использоваться предмет или скилл", 0);
SlotNum=DetermineClickedSlot();
resettextout(1);textout(1, 20, 0, "Если нужно, дождитесь отката скила, уберите курсор с его иконки и нажмите F10", 0);
WaitForKey(121);
SkreenIcon(SlotNum);
resettextout(1);textout(1, 20, 0, "Нажмите и отпустите клавишу\сочетание клавиш этого скила. НЕ НАЖИМАЙТЕ посторонних кнопок", 0);
DefineShortcut(SlotNum);
HotbarDefine[SlotNum+1]=1;
resettextout(1);textout(1, 20, 0, "Скилл\предмет определен.", 0);}
//--------------------------------Основные функции-------------------------------------------
function IsInMove(int period=100)//по изменению координат на радаре определяет, движется ли персонаж
{screen (#MoveNow[0][0], 909, 176, 980, 190, -1);
DoubleImageMassive(#MoveNow[0][0], #MoveOld[0][0], 71, 14);
sleep(period);
screen (#MoveNow[0][0], 909, 176, 980, 190, -1);
if (findimage(1, #MoveOld[0][0], -1, #x[0], #y[0], 0, 0, 71, 14,#MoveNow[0][0])!=0)
return 1;
return 0;}
function IsFight()//определяет, выбран ли какой-либо моб, обьект или персонаж
{if(getcolor(447,46)==10856101)
return 1;
return 0;}
function MobHP()//определяет, обьем здоровья выделенного обьекта (погрешность +-0.5%)
{int n=0;
int x=464;
int y=50;
int color=getcolor(465,50);
while(scanpixel(x+n, y, color, 100, 100, 60, 60, 60, 60, -1)>0){
n++;}
return n/1.2;}
function TargetSearch()//выбирает ближайшую цель, возвращая 1, если целей не найдено возвращает 0
{mysendkey(TargetKey);
if (IsFight==1){return 1;}
return 0;}
function SkreenIcon(int num)//делает скриншот иконки под номером num
{screen(#HotbarIcons[num][0][0], HotbarIconPos[num][1], HotbarIconPos[num][2], HotbarIconPos[num][1]+33, HotbarIconPos[num][2]+33, -1);}
//---------------------------------Настройки резервирования------------------------------------
int CountHotBarSlots=36;//может принимать значения, кратные 12 до 36
int CountMapCheckPoints=10;
int CountCritPoints=10;
//-----------------------------Используемые переменные и массивы-------------------------------
int MinPressPeriod=80;
int HotbarIcons[CountHotBarSlots][33][33];
int HotbarIconPos[CountHotBarSlots][2];
int HotbarDefine[CountHotBarSlots+1];
int maskey[CountHotBarSlots][4];
FillMassive2(#maskey[0][0],CountHotBarSlots,4,0);
FillMassive(#HotbarDefine[0],CountHotBarSlots+1,-1);
int MapCheckPoints[CountMapCheckPoints][2];
int MapScreens[CountMapCheckPoints][71][14];
int MapDefine[CountMapCheckPoints+1];
FillMassive(#MapDefine[0],CountMapCheckPoints+1,-1);
int CritPointXY[CountCritPoints][2];
int CritPointAssoc[CountCritPoints];
int CritPointClr[CountCritPoints];
int CritPointDefine[CountCritPoints+1];
FillMassive(#CritPointDefine[0],CountCritPoints+1,-1);
int UserInput;
int MoveNow[71][14];
int MoveOld[71][14];
//Номера кнопок
int TargetKey=32;
sleep(3000);
main:
NewAutoSlot();
sleep(1000);
goto main;
function DefineIconsPosition()//Расчитывает экранные координаты иконок на горячей панели
{int n;
//задаем координаты 1й иконки для первых 12 слотов
if (HotbarDefine[1]>=12)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=683;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n=2;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=683;n++;}}
//задаем координаты 1й иконки для cледующих 12 слотов
if (HotbarDefine[1]>=24)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=718;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n++;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=718;n++;}}
//задаем координаты 1й иконки для cледующих 12 слотов
if (HotbarDefine[1]=36)
{HotbarIconPos[1][1]=402;
HotbarIconPos[1][2]=757;
//вычисляем позиции остальных иконок по формуле начиная со 2й
n++;
loop(11){
HotbarIconPos[n][1]=HotbarIconPos[n][1]+35;
HotbarIconPos[n][2]=757;n++;}}
}
function NewCritPoint()//создает новую критическую точку маны\здоровья
{int AssocNum;
int FreeSlot=FindFreeSlot(#CritPointDefine[0]);//поиск свободного слота и резервирование
if (FreeSlot==0){resettextout(1);textout(1, 20, 0, "Не осталось свободных слотов", 0);}
resettextout(1);textout(1, 20, 0, "Укажите точку на шкале здоровья\маны (обязательно левее числогого значения) ниже которой должен использоваться предмет", 0);
WaitForKey(1);
getmouse(CritPointXY[FreeSlot][1], CritPointXY[FreeSlot][2]);
CritPointClr[FreeSlot]=getmousecolor();
resettextout(1);textout(1, 20, 0, "Кликните левой клавишей по слоту, из которого должен использоваться предмет или скилл", 0);
CritPointAssoc[FreeSlot]=DetermineClickedSlot();}
function NewAutoSlot()//заполняет данные, необходимые для авто-использования предмета\скила
{int SlotNum;
resettextout(1);textout(1, 20, 0, "Кликните левой клавишей по слоту, из которого должен использоваться предмет или скилл", 0);
SlotNum=DetermineClickedSlot();
resettextout(1);textout(1, 20, 0, "Если нужно, дождитесь отката скила, уберите курсор с его иконки и нажмите F10", 0);
WaitForKey(121);
SkreenIcon(SlotNum);
resettextout(1);textout(1, 20, 0, "Нажмите и отпустите клавишу\сочетание клавиш этого скила. НЕ НАЖИМАЙТЕ посторонних кнопок", 0);
DefineShortcut(SlotNum);
HotbarDefine[SlotNum+1]=1;
resettextout(1);textout(1, 20, 0, "Скилл\предмет определен.", 0);}
//--------------------------------Основные функции-------------------------------------------
function IsInMove(int period=100)//по изменению координат на радаре определяет, движется ли персонаж
{screen (#MoveNow[0][0], 909, 176, 980, 190, -1);
DoubleImageMassive(#MoveNow[0][0], #MoveOld[0][0], 71, 14);
sleep(period);
screen (#MoveNow[0][0], 909, 176, 980, 190, -1);
if (findimage(1, #MoveOld[0][0], -1, #x[0], #y[0], 0, 0, 71, 14,#MoveNow[0][0])!=0)
return 1;
return 0;}
function IsFight()//определяет, выбран ли какой-либо моб, обьект или персонаж
{if(getcolor(447,46)==10856101)
return 1;
return 0;}
function MobHP()//определяет, обьем здоровья выделенного обьекта (погрешность +-0.5%)
{int n=0;
int x=464;
int y=50;
int color=getcolor(465,50);
while(scanpixel(x+n, y, color, 100, 100, 60, 60, 60, 60, -1)>0){
n++;}
return n/1.2;}
function TargetSearch()//выбирает ближайшую цель, возвращая 1, если целей не найдено возвращает 0
{mysendkey(TargetKey);
if (IsFight==1){return 1;}
return 0;}
function SkreenIcon(int num)//делает скриншот иконки под номером num
{screen(#HotbarIcons[num][0][0], HotbarIconPos[num][1], HotbarIconPos[num][2], HotbarIconPos[num][1]+33, HotbarIconPos[num][2]+33, -1);}
(Добавление)
Вторая часть (форум брыкается, не хочет в одно сообщение весь код пихать):
CODE:
//-----------------------------Вспомогательные функци-----------------------------------------
function MapInPix(int NumCheckPoint)//переводит игровые координаты в пиксельные координаты
{MapCheckPoints[NumCheckPoint][1]=(MapCheckPoints[NumCheckPoint][1]*2,75)+248;
MapCheckPoints[NumCheckPoint][2]=522-(MapCheckPoints[NumCheckPoint][2]*2,75);}
function mysendkey(int mykey)//отправляет нажатие заданной клавиши
{keydown(mykey);
sleep(rand(MinPressPeriod-10, MinPressPeriod+10));
keyup(mykey);}
function DoubleImageMassive(int #Massive1,int #Massive2,int Xcount, int Ycount)//дублирует изображение из одного массива в другой
{int thisX=0;
int thisY=0;
loop(Xcount){
thisY=0;
loop(Ycount){
Massive2[thisX][thisY]=Massive1[thisX][thisY];
thisY++;}
thisX++;}}
function WaitForKey(int mkey)//ожидает нажатия и отпускания заданной клавиши
{while(getkeystate(mkey)==0)
sleep(1);
while(getkeystate(mkey)>0)
sleep(1);}
function getmousecolor()//получает цвет пиксела под курсором, отодвигая его (иначе он перекрывает заданный пиксел)
{int x;
int y;
int color;
getmouse(x, y);
mousemove(x+1, y+1);
color=getcolor(x, y);
mousemove(x, y);
return color;}
function FillMassive(int #massive, int MassiveLength, int vaule)//заполняет заданный одномерный массив заданным значением, указывая его длинну в первой ячейке
{int n=2;
massive[1]=MassiveLength;
loop(MassiveLength+1){
massive[n]=vaule;
n++;}}
function FillMassive2(int #massive[0][0], int MassiveLength, int MassiveLength2, int vaule)//заполняет заданный двумерный массив заданным значением
{int n1=1;
loop(MassiveLength)
{int n2=1;
loop(MassiveLength2){massive[n1][n2]=vaule;n2++;}
n1++;}}
function FindFreeSlot(int #massive)//ищет свободный слот в массиве, резервирует его и возвращает его номер, если слотов нет, возвращает 0
{int n=1;loop(massive[1]-1){n++;if (massive[n]==-1){massive[n]=1;return n-1;}}return 0;}
function DetermineClickedSlot()//Определяет, по какому слоту хотбара кликнул пользователь и возвращает номер слота
{DCSStart:
int x;
int y;
int n=0;
WaitForKey(1);
getmouse(x, y);
loop(HotbarDefine[1]){n++; if((x>=HotbarIconPos[n][1])&&(y>=HotbarIconPos[n][2]&&(x<=HotbarIconPos[n][1]+33)&&(y<=HotbarIconPos[n][2]+33))return n;}
resettextout(1);textout(1, 20, 0, "Вы кликнули не по иконке, повторите попытку", 0);goto DCSStart;}
function ClearAll_ExpectColor(int #massive, int ExpectedColor, int XSize, YSize)//Удаляет из массива-изображения все цвета, кроме заданного
{int thisX=0;
int thisY=0;
loop(XSize){
thisY=0;
loop(YSize){
if (massive[thisX][thisY]!=ExpectedColor);massive[thisX][thisY]=0
thisY++;}
thisX++;}}
function DefineShortcut(int num)//определяет нажатое пользователем сочетание клавиш (до 4х)
{int n=1;int k=1;
while(getkeystate(maskey[num][1])==0){
while(n<=221){
if (getkeystate(n)==1){maskey[num][k]=n;k++;}
n++;}sleep(1);n=1;}
while((getkeystate(maskey[num][1])==1)||(getkeystate(maskey[num][2])==1)){
while(n<=221){
if ((getkeystate(n)==1)&&(n!=maskey[num][1])&&(n!=maskey[num][2])){maskey[num][k]=n;k++;}
n++;}sleep(1);n=1;}
messagebox(format(maskey[num][1])+" "+format(maskey[num][2])+" "+format(maskey[num][3])+" "+format(maskey[num][4]));
}
function PressShortcut(int num)//нажимает сочетание клавиш из массива maskey под номером num
{keydown(maskey[num][1]);
sleep(10);
keydown(maskey[num][2]);
sleep(10);
keydown(maskey[num][3]);
sleep(10);
keydown(maskey[num][4]);
sleep(rand(MinPressPeriod-10, MinPressPeriod+10));
keyup(maskey[num][4]);
sleep(10);
keyup(maskey[num][4]);
sleep(10);
keyup(maskey[num][2]);
sleep(10);
keyup(maskey[num][1]);
}
//-----------------------------Вспомогательные функци-----------------------------------------
function MapInPix(int NumCheckPoint)//переводит игровые координаты в пиксельные координаты
{MapCheckPoints[NumCheckPoint][1]=(MapCheckPoints[NumCheckPoint][1]*2,75)+248;
MapCheckPoints[NumCheckPoint][2]=522-(MapCheckPoints[NumCheckPoint][2]*2,75);}
function mysendkey(int mykey)//отправляет нажатие заданной клавиши
{keydown(mykey);
sleep(rand(MinPressPeriod-10, MinPressPeriod+10));
keyup(mykey);}
function DoubleImageMassive(int #Massive1,int #Massive2,int Xcount, int Ycount)//дублирует изображение из одного массива в другой
{int thisX=0;
int thisY=0;
loop(Xcount){
thisY=0;
loop(Ycount){
Massive2[thisX][thisY]=Massive1[thisX][thisY];
thisY++;}
thisX++;}}
function WaitForKey(int mkey)//ожидает нажатия и отпускания заданной клавиши
{while(getkeystate(mkey)==0)
sleep(1);
while(getkeystate(mkey)>0)
sleep(1);}
function getmousecolor()//получает цвет пиксела под курсором, отодвигая его (иначе он перекрывает заданный пиксел)
{int x;
int y;
int color;
getmouse(x, y);
mousemove(x+1, y+1);
color=getcolor(x, y);
mousemove(x, y);
return color;}
function FillMassive(int #massive, int MassiveLength, int vaule)//заполняет заданный одномерный массив заданным значением, указывая его длинну в первой ячейке
{int n=2;
massive[1]=MassiveLength;
loop(MassiveLength+1){
massive[n]=vaule;
n++;}}
function FillMassive2(int #massive[0][0], int MassiveLength, int MassiveLength2, int vaule)//заполняет заданный двумерный массив заданным значением
{int n1=1;
loop(MassiveLength)
{int n2=1;
loop(MassiveLength2){massive[n1][n2]=vaule;n2++;}
n1++;}}
function FindFreeSlot(int #massive)//ищет свободный слот в массиве, резервирует его и возвращает его номер, если слотов нет, возвращает 0
{int n=1;loop(massive[1]-1){n++;if (massive[n]==-1){massive[n]=1;return n-1;}}return 0;}
function DetermineClickedSlot()//Определяет, по какому слоту хотбара кликнул пользователь и возвращает номер слота
{DCSStart:
int x;
int y;
int n=0;
WaitForKey(1);
getmouse(x, y);
loop(HotbarDefine[1]){n++; if((x>=HotbarIconPos[n][1])&&(y>=HotbarIconPos[n][2]&&(x<=HotbarIconPos[n][1]+33)&&(y<=HotbarIconPos[n][2]+33))return n;}
resettextout(1);textout(1, 20, 0, "Вы кликнули не по иконке, повторите попытку", 0);goto DCSStart;}
function ClearAll_ExpectColor(int #massive, int ExpectedColor, int XSize, YSize)//Удаляет из массива-изображения все цвета, кроме заданного
{int thisX=0;
int thisY=0;
loop(XSize){
thisY=0;
loop(YSize){
if (massive[thisX][thisY]!=ExpectedColor);massive[thisX][thisY]=0
thisY++;}
thisX++;}}
function DefineShortcut(int num)//определяет нажатое пользователем сочетание клавиш (до 4х)
{int n=1;int k=1;
while(getkeystate(maskey[num][1])==0){
while(n<=221){
if (getkeystate(n)==1){maskey[num][k]=n;k++;}
n++;}sleep(1);n=1;}
while((getkeystate(maskey[num][1])==1)||(getkeystate(maskey[num][2])==1)){
while(n<=221){
if ((getkeystate(n)==1)&&(n!=maskey[num][1])&&(n!=maskey[num][2])){maskey[num][k]=n;k++;}
n++;}sleep(1);n=1;}
messagebox(format(maskey[num][1])+" "+format(maskey[num][2])+" "+format(maskey[num][3])+" "+format(maskey[num][4]));
}
function PressShortcut(int num)//нажимает сочетание клавиш из массива maskey под номером num
{keydown(maskey[num][1]);
sleep(10);
keydown(maskey[num][2]);
sleep(10);
keydown(maskey[num][3]);
sleep(10);
keydown(maskey[num][4]);
sleep(rand(MinPressPeriod-10, MinPressPeriod+10));
keyup(maskey[num][4]);
sleep(10);
keyup(maskey[num][4]);
sleep(10);
keyup(maskey[num][2]);
sleep(10);
keyup(maskey[num][1]);
}