Перейти к содержимому


Фотография

(sfall) дополнения


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1246

#1061 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 17 ноября 2017 - 01:10

QUOTE
это команда CMP. Она сравнивает операнды и изменяет регистр флагов.

А где в вашей табличке флаг ZF ? — она его меняет(уст. в 1) если результат сравнения равен 0, т.е. если операнды равны.


#1062 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 17 ноября 2017 - 01:27

QUOTE (Fakeman)
А где в вашей табличке флаг ZF ? — она его меняет(уст. в 1) если результат сравнения равен 0, т.е. если операнды равны.
Всю таблицу нужно было скопировать? Добавил :-p


#1063 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 17 ноября 2017 - 02:25

Добавил молодец)
Теперь разбирайся почему не устанавливается флаг ZERO если второй операнд больше 127 :)
CODE
cmp     [eax+iobj.pid], PID_ACTIVE_MOTION_SENSOR
jz      short loc_41BC17



#1064 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 17 ноября 2017 - 03:30

QUOTE (Fakeman)
Теперь разбирайся почему не устанавливается флаг ZERO если второй операнд больше 127 :)
Для jz без разницы больше или меньше — она выполнится если оба операнда равны.
У тебя pid объекта (который [eax+iobj.pid]) не равен PID_ACTIVE_MOTION_SENSOR или у переменной MotionScannerFlags установлен первый бит (Allow sensor use on automap when motion sensor is in pack rather than hands) и в этом случае игнорируется изменяемый тобою код (а именно write_byte(0x41BBFC, PID_ACTIVE_MOTION_SENSOR);).


#1065 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 17 ноября 2017 - 05:02

В сфале стоит дефолтное для движка поведение.
Если я записываю другой пид write_byte(0x41BBFC, 100) то этот предмет становится как датчик.
Да тут явно проц считает что ему дают отрицательное число для сравнения, поэтому в операции сравнения не уст флаг zero. Не зря же там разные машинные коды.


#1066 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 17 ноября 2017 - 05:49

QUOTE (Fakeman)
Не зря же там разные машинные коды.
Как скажешь ;)


#1067 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 17 ноября 2017 - 16:20

Смотри из движка.
CODE
00411231 cmp     eax, 0FFFFFFFEh
нех opcode: 83 F8 FE

это же число -2, а не 4294967294, хотя это так-же можно считать числом 254.

В общем везде где нужно сравнить число больше 7F в исходниках используется не одно байтовый второй операнд.

Это сообщение отредактировано Fakeman - 17 ноября 2017 | 16:47


#1068 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 17 ноября 2017 - 17:34

QUOTE (Fakeman)
это же число -2, а не 4294967294, хотя это так-же можно считать числом 254.
Поэтому и важно какая команда идёт следом — для jl = -2, а для jb = 254.
Часто использую этот трюк обработки — к примеру, в движке проверка правильности скилла сделана как для знакового операнда и выглядит так:
CODE
 test eax, eax // или если удобнее cmp  eax, 0
 jl   .fail // меньше 0
 cmp  eax, 18
 jl   .success // меньше 18
.fail: // eax содержит неправильный скилл, то есть не в пределах 0-17 (SKILL_SMALL_GUNS-SKILL_OUTDOORSMAN)
.success: // eax содержит правильный скилл

Вместо этого достаточно обрабатывать как для беззнакового:
CODE
 cmp  eax, 18
 jb   .success // 0-17
.fail:
.success:

Но в твоём случае (jz) это не существенно:
QUOTE
###  Команда CMP #########################################################

### Производит  сравнение операндов, вычитая  из первого  операнда  второй.
При этом операнды остаются без изменения.

### Устанавливает  флажки  CF,  AF,  SF,  ZF,  PF,  OF  в  соответствии  с
результатом операции. Причем флажки  CF и  AF становятся  флажками  заема и
устанавливаются в 1, если вычитаемое больше уменьшаемого.

В конце-то концов напиши маленький компилируемый пример своего скрипта :-p


#1069 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 17 ноября 2017 - 19:06

Я же написал пример, логика скрипта вообще тут не важна.
CODE

write_byte(0x41BBFC, PID_ACTIVE_MOTION_SENSOR);
write_byte(0x41BC12, PID_ACTIVE_MOTION_SENSOR);

Подставляем любой пид больше 127, ложим этот предмет в руку открываем карту и нажимаем кнопку "сканер", игра будет думать что указанного предмета в руке нет.
Заменим на любой пид меньше 128 и пробуем, все работает.
Короче забей.



#1070 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 17 ноября 2017 - 22:15

QUOTE (Fakeman)
Короче забей.
Таки ты прав, снимаю шляпу :)
Я затупил и не раглядывал опкоды, а там же dword (write_byte заманипулировал) сравнение и этот байт "разворачивается" в знаковое двойное слово если больше 127 (208 в 0xFFFFFFD0 или 4294967248). Не повезло, что PID_MOTION_SENSOR=59, а был бы больше 127 и компилятор сразу сгенерировал бы более универсальный код для тёмных делишек:
CODE
81 78 64 D0 00 00 00          cmp  [eax+iobj.pid], PID_ACTIVE_MOTION_SENSOR



#1071 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 18 ноября 2017 - 01:39

Такс у меня новая проблема.
Когда используешь какой-либо предмет (пиктограмма руки) из открытого инвентаря игрока, то этот предмет нельзя удалить, что-то блокирует по видимому его в движке, destroy_object(itemptr) как бы его удаляет, но предмет остается в инвентаре, и если выйти на глобал и зайти обратно то на месте этого предмета образуется всякий мусор(может стена появиться, или криттер какой-нибудь), но в итоге игра потом крашится.
В данный момент удаление происходит в хуке HOOK_USESKILL, и требуется удалить израсходованную аптечку которую использует игрок.
В общем какие скриптовые манипуляции нужно сделать что-бы двиг корректно удалил предмет, как он это делает в случае когда когда используешь аптечки.

В хуках HOOK_USEOBJ/HOOK_USEOBJON есть возможность удалить такой предмет.
CODE
int     ret1 - overrides hard-coded handler and selects what should happen with the item (0 - place it back, 1 - remove it, -1 - use engine handler)

Вот мне надо тоже самое проделать только скриптово.


#1072 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 18 ноября 2017 - 03:05

QUOTE (Fakeman)
В общем какие скриптовые манипуляции нужно сделать что-бы двиг корректно удалил предмет, как он это делает в случае когда когда используешь аптечки.
rm_obj_from_inven(source, item) перед destroy_object(item), не?


#1073 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 18 ноября 2017 - 04:56

Нет) тоже самое будет, если использовать другую функцию которая удаляет несколько экземпляров то она возвратит 0. Что-то в движке не дает удалить этот предмет.
Я уже напрямую использовал двиг.функцию _destroy_obj и без результата.

Это сообщение отредактировано Fakeman - 18 ноября 2017 | 05:01


#1074 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 18 ноября 2017 - 06:55

QUOTE (Fakeman)
Нет) тоже самое будет, если использовать другую функцию которая удаляет несколько экземпляров то она возвратит 0. Что-то в движке не дает удалить этот предмет.
rm_mult_objs_from_inven возвращает 0 если в инвентаре нет нужного предмета. И его нет, потому что "Когда используешь какой-либо предмет (пиктограмма руки) из открытого инвентаря игрока" то движок временно из инвентаря его удаляет. И в зависимости от результата использования или возвращает в инвентарь (0 — place it back) или удаляет фактически (1 — remove it).
Попробуй перехватывать HOOK_USEOBJ/HOOK_USEOBJON, сохранять какой предмет используется и проверять его в HOOK_USESKILL, а если совпадают то устанавливать любую свою переменную чтобы в HOOK_USEOBJ/HOOK_USEOBJON она проверялась и если нужно меняй код возврата на 1 (remove it).


#1075 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 18 ноября 2017 - 10:55

Я и так сохраняю указатель из хука при использовании, потом этот указатель в useskill использую, но проблема то в том что ноок использования отрабатывает до ноока скила.
Ладно я кажись понял как его удалить, те получается нужно удалять после отработки useskill.


#1076 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 19 ноября 2017 - 01:17

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

Или может есть какой-то механизм отделения их друг от друга)

Это сообщение отредактировано Fakeman - 19 ноября 2017 | 01:20


#1077 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 19 ноября 2017 - 17:59

проблема решена, уже есть такая функция
QUOTE
В общем как узнать сколько лежит предметов в такой стопке?

obj_is_carrying_obj


#1078 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 25 ноября 2017 - 01:18

CODE
addnamedhandler("iSeeYouInCombat", iSeeYouInCombat); // не addnamedevent!

О перечитывал тему и увидел такое, а в чем отличие AddNamedHandler от AddNamedEvent ?

Это сообщение отредактировано Fakeman - 25 ноября 2017 | 01:20


#1079 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 25 ноября 2017 - 15:04

QUOTE (Fakeman)
О перечитывал тему и увидел такое, а в чем отличие AddNamedHandler от AddNamedEvent ?
Event после срабатывания удаляется, а Handler существует до удаления с помощью ClearNamed.
Можно и с Event (но это лишние затраты), только в iSeeYouInCombat добавить создание события:
CODE
procedure iSeeYouInCombat begin
 if combat_is_initialized then begin
  if obj_can_see_obj(self_obj, dude_obj) and свои_условия_для_нападения then attack_setup(self_obj, dude_obj);
  else begin
   addnamedevent("iSeeYouInCombat", iSeeYouInCombat);
   signalnamed("iSeeYouInCombat");
  end
 end
end


#1080 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 25 ноября 2017 - 16:42

Почему в сфале не работает ProcessorIdle  — то что тут устанавливаешь значения ни как не влияет на загрузку проца, она всегда 50% да же в главном меню.
В HRP, если установишь данный фикс то там это работает.

Раньше до твоего фикса, в сфалее вообще нельзя было это включать, ибо скрипты глючили, сейчас вроде нормально.




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных

Рейтинг@Mail.ru