grBIN |
Отправлено: 23 Марта, 2018 - 16:37:33
|
Наблюдатель
Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017
Откуда: Псков
Репутация: 2
|
В принципе немного разобрался, со структурами и поиском по маске.
Написал Скрипт который берет нужные данные, затем переводит их в маску для CE,
Затем вручную искал байт код в CE, его записывал в файл настроек, и уже по нему искал адрес нужного значения.
Уже было начал думать нехорошие вещи про разработчика который сказал что codhex переводит int и дробные до 4 байт. в массив байт, а сам с флоат этого не делает.
Начал писать этот текст и понял что сам дебил и то что:
codhex(450, #char[0]); выводит 194 1 0 0 , а не: 0 0 225 67
Потому что для флоат писать нужно так: codhex(450.0, #char[0]);
P.S. Добавьте этот пункт в справку, вдруг я не один такой T___T
P.S. Пол дня убил из-за невнимательности. |
|
|
grBIN |
Отправлено: 24 Марта, 2018 - 23:35:14
|
Наблюдатель
Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017
Откуда: Псков
Репутация: 2
|
Продолжаем эту тему T_T:
при вызове функции
int amount_adr[7];
amount_adr[0]=amount_addr("AC43 Rapier", 0);
amount_adr[1]=amount_addr("Growl", 0);
messagebox(format(amount_adr[0]));
messagebox(format(readmem4(amount_adr[0])));
messagebox(format(amount_adr[1]));
messagebox(format(readmem4(amount_adr[1])));
Если 1 предмет есть в памяти, а второго нет, возвращает в итоге адрес и значение 1 предмета оба раза, вместо того что бы на втором предмете выдать ошибку, или пустое значение например. странно.
Структура заполняется верно.
P.S. Только что еще раз проверил все. поставил проверку на входе и выходе из функции findmemorymask
При первом вызове функции amount_addr("AC43 Rapier", 0); значения в result[0] нет (выводится очень большое отрицательное число), после выполнения функции findmemorymask, в result[0] валидное значение адреса все нормально.
А вот когда 2 раз вызываю amount_addr("Growl", 0); но с другим условием, значение в result[0] уже равно тому что было в 1 раз, и так как findmemorymask ничего не находит, соотв значение не меняет.
P.S.S. Это баг или я зря раньше думал что за переменными внутри функции можно особо не следить. и они влияют только сейчас, во время отработки функции.
функция (Отобразить)
CODE:function amount_addr(string NAME, int sadr)
{
/*TYPE
пропуск
POWERSCORE
пропуск
MASS
STRUCTURE
RARITY*/
char char64[28];
char mask64[28];
int result[1];
////////////////////////////////////////////////////////////////////////////
///Заполняем структуру с данными.
codhex(formatsn(iniread("TYPE", NAME)), #char64[0]);
codhex(0, #char64[4]);
codhex(formatsn(iniread("POWERSCORE", NAME)), #char64[8]);
codhex(0, #char64[12]);
codhex(formatsn(iniread("MASS", NAME)), #char64[16]);
codhex(formatsn(iniread("STRUCTURE", NAME)), #char64[20]);
codhex(formatsn(iniread("RARITY", NAME)), #char64[24]);
/////////////////////////////////////////////////////////////
/*messagebox("TYPE="+iniread("TYPE", NAME));
messagebox("POWERSCORE="+iniread("POWERSCORE", NAME));
messagebox("MASS="+iniread("MASS", NAME));
messagebox("STRUCTURE="+iniread("STRUCTURE", NAME));
messagebox("RARITY="+iniread("RARITY", NAME));*/
////////////////////////////////////////////////////////////
mask64[0]=1; mask64[1]=1; mask64[2]=1; mask64[3]=1;
mask64[4]=0; mask64[5]=0; mask64[6]=0; mask64[7]=0;
mask64[8]=1; mask64[9]=1; mask64[10]=1; mask64[11]=1;
mask64[12]=0; mask64[13]=0; mask64[14]=0; mask64[15]=0;
mask64[16]=1; mask64[17]=1; mask64[18]=1; mask64[19]=1;
mask64[20]=1; mask64[21]=1; mask64[22]=1; mask64[23]=1;
mask64[24]=1; mask64[25]=1; mask64[26]=1; mask64[27]=1;
////////////////////////////////////////////////////////////
/*messagebox(formatci(char64[0]));
messagebox(formatci(char64[1]));
messagebox(formatci(char64[2]));
messagebox(formatci(char64[3]));
messagebox(formatci(char64[4]));
messagebox(formatci(char64[5]));
messagebox(formatci(char64[6]));
messagebox(formatci(char64[7]));
messagebox(formatci(char64[8]));
messagebox(formatci(char64[9]));
messagebox(formatci(char64[10]));
messagebox(formatci(char64[11]));
messagebox(formatci(char64[12]));
messagebox(formatci(char64[13]));
messagebox(formatci(char64[14]));
messagebox(formatci(char64[15]));*/
////////////////////////////////////////////////////////////
messagebox(NAME+format(result[0]));
findmemorymask (1, #char64[0], 28, #result[0], sadr, #mask64[0], 100, prc);
messagebox(NAME+format(result[0]));
return result[0]+8
}
P.S.S. есть 2 функции:
findmemory (-1, #poisk[0], 8, #adr[0], 25567892, prc);
findmemorymask (-1, #poisk[0], 46, #adr[0], 0, #poiskmask[0], 100, prc);
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.(Отредактировано автором: 24 Марта, 2018 - 23:41:47) |
|
|
Kibor |
Отправлено: 24 Марта, 2018 - 23:54:51
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
grBIN пишет: Если 1 предмет есть в памяти, а второго нет, возвращает в итоге адрес и значение 1 предмета оба раза, вместо того что бы на втором предмете выдать ошибку, или пустое значение например. странно.
Странно то что у вас необычный способ определения, нашел что то findmemorymask или не нашел.
findmemorymask не находит второй раз. В result ничего не записывается. В нем остается значение которое было раньше.
Вообще то для контроля нашел findmemorymask или нет, как и для контроля выполнения другой любой функции есть возвращаемое значение функции.
findmemorymask возвращает количество найденных объектов.
CODE:if (findmemorymask (1, #char64[0], 28, #result[0], sadr, #mask64[0], 100, prc)==1)
{
messagebox("нашел "+NAME+format(result[0]));
return result[0]+8;
}
else
{
messagebox("НЕ нашел "+NAME+format(result[0]));
return 0;
} |
|
|
Kibor |
Отправлено: 25 Марта, 2018 - 00:07:11
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
grBIN пишет: если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:int adr[55];
в функции
#adr[0]
если просто переменная
CODE:int adr;
в функции
#adr
Работает одинаково в findmemory и findmemorymask |
|
|
grBIN |
Отправлено: 25 Марта, 2018 - 00:17:16
|
Наблюдатель
Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017
Откуда: Псков
Репутация: 2
|
Kibor пишет: Странно то что у вас необычный способ определения, нашел что то findmemorymask или не нашел.
Я просто знаю, что findmemorymask сейчас не найдет потому что нет предмета на складе, а так же предварительно проверил в CE. И решил проверить что будет если предмета нет, а он проверит =)
Цитата: findmemorymask не находит второй раз. В result ничего не записывается. В нем остается значение которое было раньше.
Всегда считал, что переменная объявленная внутри функции "существует" только во время ее отработки, то есть например вызываешь функцию, она берет заявленные в вызове переменные, создает свои необходимые для отработки, отрабатывает, затем возвращает необходимый результат(или не возвращает). Ну и в конце концов, "Убивает" все создаваемые переменные со всеми значениями. А в следующем вызове она всегда начинает "с чистого листа"
Цитата: Вообще то для контроля нашел findmemorymask или нет, как и для контроля выполнения другой любой функции есть возвращаемое значение функции.
findmemorymask возвращает количество найденных объектов.
Ок, буду знать, просто вот тут этого нигде не указано, а вы обычно пишите что возвращает =) не проверил T_T
(Добавление)
Zireael пишет: Цитата:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.
Я в курсе, просто для примера скопировал примеры функции из справки.
Kibor пишет:
Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:
int adr[55];
в функции
#adr[0]
если просто переменная
CODE:
int adr;
в функции
#adr
Работает одинаково в findmemory и findmemorymask
Сорян, сейчас еще раз проверил все работает, видимо в прошлый раз когда баг у себя в скрипте ловил, что то не заметил и запомнил этот момент |
|
|
Kibor |
Отправлено: 25 Марта, 2018 - 00:40:25
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
grBIN пишет: Всегда считал, что переменная объявленная внутри функции "существует" только во время ее отработки, то есть например вызываешь функцию, она берет заявленные в вызове переменные, создает свои необходимые для отработки, отрабатывает, затем возвращает необходимый результат(или не возвращает). Ну и в конце концов, "Убивает" все создаваемые переменные со всеми значениями. А в следующем вызове она всегда начинает "с чистого листа"
Надо опираться на правильную структуру проверку данных, а не на гипотетические знания или домыслы что будет в том или ином случае.
grBIN пишет: Сорян, сейчас еще раз проверил все работает, видимо в прошлый раз когда баг у себя в скрипте ловил, что то не заметил и запомнил этот момент
Это было. Объявление простой переменной и указанием в функции указателя на массив.
Ошибка.
CODE:char char64[28];
char mask64[28];
int prc;
int adr;
if (findmemory (-1, #char64[0], 8, #adr[0], 25567892, prc)==1)
{
messagebox("нашел ");
}
else
{
messagebox("НЕ нашел ");
} |
|
|
|