-
igrik
- Подмастерье
-
- Сообщения: 108
- Зарегистрирован: 14 сен 2017, 12:35
- Пол:
- Поблагодарили: 84 раз.
|
igrik » 28 мар 2019, 14:02
Вопрос к igrik по плагину "защита объектов". На какие адреса нужно еще поставить хуки для защиты ресурсов, сундуков, костра и ученого? Я переписал код, чтобы не ставить уеву тучу хуков. - Код: Выделить всё
// ФУНКЦИЯ: есть ли стража рядом с объектом (возвращает координаты клетки с монстрами) _int_ isGuardNearTheObject(_AdvMgr_* advMng, _int_ xyz) { int xd = b_unpack_x(xyz); int yd = b_unpack_y(xyz); int z = b_unpack_z(xyz);
if (!(0x0100 & CALL_3(WORD, __fastcall, 0x4F8040, xd, yd, z)) ) { return 0; // монстров вокруг клетки нет }
int x, y; int size = advMng->map->size; // ряд на уровне арта -------------------------------------------------------------------------------------- x = xd -1; y = yd; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
x = xd +1; y = yd; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } } // ряд ниже арта -------------------------------------------------------------------------------------------- x = xd -1; y = yd +1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
x = xd; y = yd +1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
x = xd +1; y = yd +1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
// ряд выше арта -------------------------------------------------------------------------------------------- x = xd -1; y = yd -1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
x = xd; y = yd -1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } }
x = xd +1; y = yd -1; if ( x >= 0 && x < size && y >= 0 && y < size) { if (advMng->map->GetItem(x,y,z)->object_type == 54) { return b_pack_xyz(x,y,z); } } // ----------------------------------------------------------------------------------------------------- return 0; // монстров вокруг клетки нет }
// при движении мыши на КП _int_ __stdcall Y_GetCursorFrameOnAdvMap(HiHook* hook, _AdvMgr_* advMng, _MapItem_* obj) { switch (obj->object_type) { case 5: case 6: case 12: case 79: case 81: case 82: case 93: case 101: // типы защищаемых объектов if ( isGuardNearTheObject(advMng, advMng->pack_xyz) ) { return 5; // возвращаем боевой курсор } break;
default: break; } return CALL_2(_int_, __thiscall, hook->GetDefaultFunc(), advMng, obj); }
void __stdcall Y_Hero_Enter_To_Object(HiHook* hook, _AdvMgr_* advMng, _Hero_* hero, _MapItem_* obj, _int_ xyz, _int_ isPlayer) { int xyz_54 = 0; // инициализации переменной - координаты охранников
switch (obj->object_type) { case 5: case 6: case 12: case 79: case 81: case 82: case 93: case 101: // типы защищаемых объектов xyz_54 = isGuardNearTheObject(advMng, xyz); // проверка стражи объекта в соседних клетках if ( xyz_54 ){ // если стража есть _MapItem_* obj_54 = advMng->map->GetItem(b_unpack_x(xyz_54), b_unpack_y(xyz_54), b_unpack_z(xyz_54)); // получаем структуру объекта "стража" advMng->monBattle_type = (_word_)obj_54->os_type; // (advMng+<536>) advMng->monBattle_num = (_word_)obj_54->draw_num; // (advMng+<540>) advMng->monBattle_side = hero->x < (_word_)((_word_)(xyz_54 << 6) >> 6) ? 1 : 0; // поворот монстра при атаке (advMng+<544>)
CALL_5(void, __thiscall, 0x4A73B0, advMng, obj_54, hero, xyz_54, isPlayer); // нападаем на монстра рядом с артом
advMng->monBattle_type = -1; // после битвы возвращаем параметры advMng->monBattle_num = -1; // после битвы возвращаем параметры if (hero->owner_id < 0) { // если герой убит или сбежал (т.е. номер хозяина героя стал == -1) return; // выйти из функции ПОСЕЩЕНИЕ ОБЪЕКТА } } break;
default: break; }
CALL_5(void, __thiscall, hook->GetDefaultFunc(), advMng, hero, obj, xyz, isPlayer); return; }
///////////////////////////////////////////////////////////////////////////////////// _PI->WriteHiHook(0x40E97F, CALL_, EXTENDED_, THISCALL_, Y_GetCursorFrameOnAdvMap); _PI->WriteHiHook(0x4AA766, CALL_, EXTENDED_, THISCALL_, Y_Hero_Enter_To_Object); upd: для уменьшения нагрузки добавлена предложенная RoseKavalier функция 0x4F8040
Последний раз редактировалось igrik 28 мар 2019, 14:54, всего редактировалось 1 раз.
|