quq_CCCP, пока нет какого-либо руководства, приходится все проверять эмпирическим методом.
Фигня или не фигня (хотя я склоняюсь как раз к первому варианту), только она пока что работает и без сбоев
quq_CCCP, суть было в том, что бы отловить урон ДО расчета брони
Сам сморозил глупость и сам повелся на нее -_- Хотел сказать не "отловить" урон, а "изменить" его.
Чем чреват подобный финт:
// чтение
DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])
// запись (обратный процесс)
Memory[offset/4+0x10/4] = mI2R(newValue)
// либо так
WMem(offset+0x10, mI2R(newValue))
Вроде бы откопал в доте, то что нужно. Проверю и отпишусь
integer Int2Unit
integer l__Int2Unit
function setInt2Unit takes integer i returns nothing
set l__Int2Unit = i
return //Prevents JassHelper from inlining this function
endfunction
function Typecast4 takes nothing returns nothing
local unit Int2Unit
endfunction
integer pGetUnitForAddress = 0
function GetUnitForAddress takes integer addr returns integer // не знал какое имя дать -> дал первое, что пришло в голову)
if pGetUnitForAddress == 0 then
pGetUnitForAddress = GameDLL + 0x2DCC40
endif
return CallFastCallWith2Args(pGetUnitForAddress, addr, 0)
endfunction
function Int2Unit takes integer i returns unit
call setInt2Unit(GetUnitForAddress(i))
return l__Int2Unit
endfunction
integer Int2Unit
integer l__Int2Unit
function setInt2Unit takes integer i returns nothing
set l__Int2Unit = i
return //Prevents JassHelper from inlining this function
endfunction
function Typecast4 takes nothing returns nothing
local unit Int2Unit
endfunction
function Int2Unit takes integer i returns unit
call setInt2Unit(???) // вот что сюда писать?)
return l__Int2Unit
endfunction
Как с этим вообще можно разобраться?
Код в шапке и в примере(карте) разный. Более того, в карте такой бардак, что пока найдешь что-нибудь и поймешь за что это отвечает, можно состариться. Словом, жуть какая-то =)
зачем здесь используется массив? - это что-то связанное с дотой, т.е. для работоспособности он не требуется?
как получить юнитов (GetTriggerUnit() и GetEventDamageSource() возвращают null)?
Вроде бы есть target, но это integer => нужно что-то типа Int2Unit();
Я не сразу понял, что offset == источник урона (DamageSource), мб тогда изменить имя переменной?
если перезаписать значение урона до расчета брони, не будет ли проблем?
native MergeUnits takes integer qty, integer a, integer b, integer make returns boolean
native ConvertUnits takes integer qty, integer id returns boolean
native IgnoredUnits takes integer unitid returns integer
library Typecast
//! nocjass
globals
code Code //This is not used, it's here just to fool Jasshelper
code l__Code
integer Int //This is not used, it's here just to fool Jasshelper
integer l__Int
string Str //This is not used, it's here just to fool Jasshelper
string l__Str
boolean Bool //This is not used, it's here just to fool Jasshelper
boolean l__Bool
integer Array
integer array l__Array
integer bytecode
integer array l__bytecode
integer array Memory
integer bytecodedata //used to pass data between regular code and bytecode
endglobals
function InitArray takes integer vtable returns nothing
set l__Array[4] = 0
set l__Array[1] = vtable
set l__Array[2] = -1
set l__Array[3] = -1
endfunction
function TypecastArray takes nothing returns nothing
local integer Array //typecast Array to integer
endfunction
//# +nosemanticerror
function GetArrayAddress takes nothing returns integer //not really needed
return l__Array
return 0
endfunction
function setCode takes code c returns nothing
set l__Code = c
return //Prevents Jasshelper from inlining this function
endfunction
function setInt takes integer i returns nothing
set l__Int = i
return //Prevents JassHelper from inlining this function
endfunction
function setStr takes string s returns nothing
set l__Str = s
return //Prevents JassHelper from inlining this function
endfunction
function setBool takes boolean b returns nothing
set l__Bool = b
return //Prevents Jasshelper from inlining this function
endfunction
private function Typecast1 takes nothing returns nothing
local integer Code //Jasshelper will implicitly rename this to l__Code
local code Int //Jasshelper will implicitly rename this to l__Int
endfunction
//# +nosemanticerror
function C2I takes code c returns integer
call setCode(c)
return l__Code
endfunction
//# +nosemanticerror
function I2C takes integer i returns code
call setInt(i)
return l__Int
endfunction
private function Typecast2 takes nothing returns nothing
local integer Str //Jasshelper will implicitly rename this to l__Str
local string Int //Jasshelper will implicitly rename this to l__Int
endfunction
//# +nosemanticerror
function SH2I takes string s returns integer
call setStr(s)
return l__Str
endfunction
//# +nosemanticerror
function I2SH takes integer i returns string
call setInt(i)
return l__Int
endfunction
private function Typecast3 takes nothing returns nothing
local integer Bool //Jasshelper will implicitly rename this to l__Bool
local boolean Int //Jasshelper will implicitly rename this to l__Int
endfunction
//# +nosemanticerror
function B2I takes boolean b returns integer
call setBool(b)
return l__Bool
endfunction
//# +nosemanticerror
function I2B takes integer i returns boolean
call setInt(i)
return l__Int
endfunction
//# +nosemanticerror
function realToIndex takes real r returns integer
return r
endfunction
function cleanInt takes integer i returns integer
return i
endfunction
//# +nosemanticerror
function indexToReal takes integer i returns real
return i
endfunction
function cleanReal takes real r returns real
return r
endfunction
function GetRealFromMemory takes integer i returns real
return cleanReal(indexToReal(i))
endfunction
function SetRealIntoMemory takes real r returns integer
return cleanInt(realToIndex(r))
endfunction
function ReadMemory takes integer address returns integer
return Memory[address/4] //Inline-friendly
endfunction
function WriteMemory takes integer address, integer value returns nothing
set Memory[address/4] = value //Inline-friendly
endfunction
function InitBytecode takes integer id, integer k returns nothing
set l__bytecode[0] = 0x0C010900 //op: 0C(LITERAL), type: 09(integer array), reg: 01,
set l__bytecode[1] = k //value: 0x2114D008
set l__bytecode[2] = 0x11010000 //op: 11(SETVAR), reg: 01
set l__bytecode[3] = id //id of variable udg_Memory
set l__bytecode[4] = 0x0C010400 //op: 0C(LITERAL), type: 04(integer), reg: 01, value: 0
set l__bytecode[6] = 0x27000000 //op: 27(RETURN)
set l__bytecode[8] = 0x07090000 //op: 07(GLOBAL), type: 09 (integer array) //Create new array
set l__bytecode[9] = 0x0C5F //name: C5F(?stand?)
set l__bytecode[10] = 0x0E010400 //op: 0E(GETVAR), type: 04(integer), reg: 01 //Obtain the desired amount of bytes
set l__bytecode[11] = id+1 //id of variable bytecodedata (variable ids are sequential)
set l__bytecode[12] = 0x12010100 //op: 12(SETARRAY), index=reg01, value=reg01 //Set index of the array, forcing allocation of udg_Memory
set l__bytecode[13] = 0x0C5F //name: C5F(?stand?)
set l__bytecode[14] = 0x0E010400 //op: 0E(GETVAR), type: 04(integer), reg: 01 //Read array variable as an integer
set l__bytecode[15] = 0x0C5F //name: C5F(?stand?)
set l__bytecode[16] = 0x11010000 //op: 11(SETVAR), reg: 01 //pass the value to the jass world
set l__bytecode[17] = id+1 //id of variable bytecodedata
set l__bytecode[18] = 0x27000000 //op: 27(RETURN)
endfunction
function Typecast takes nothing returns nothing
local integer bytecode
endfunction
//# +nosemanticerror
function GetBytecodeAddress takes nothing returns integer
return l__bytecode
return 0
endfunction
function NewGlobal takes nothing returns integer
return -0x0C5F0704 //op: 07(GLOBAL), type: 04(integer), name: 0x0C5F("stand")
return 0x2700 //op: 27(RETURN)
endfunction
function SetGlobal takes nothing returns nothing
//This will actually set the value of the global variable, not the local
local integer stand = 0x2114D008
endfunction
//# +nosemanticerror
function UnlockMemory takes nothing returns nothing
local integer array stand //The execution of this line is skipped
call ForForce(bj_FORCE_PLAYER[0], I2C(2+C2I(function NewGlobal)))
call ForForce(bj_FORCE_PLAYER[0], I2C(8+C2I(function SetGlobal)))
call InitArray( 0 )
call InitArray(stand[GetArrayAddress()/4])
call InitBytecode(stand[C2I(function ReadMemory)/4 + 13], stand[GetArrayAddress()/4+3]+4) //obtain the id of variable "Memory"
call ForForce(bj_FORCE_PLAYER[0], I2C(stand[GetBytecodeAddress()/4+3])) //run bytecode from the array
endfunction
function ReadRealMemory takes integer addr returns integer
if (addr/4*4 != addr) then
call BJDebugMsg("ReadMemory WARNING!")
//return ReadRealMemory_FIX(addr)
endif
return Memory[addr/4]
endfunction
function WriteRealMemory takes integer addr, integer val returns nothing
if (addr/4*4 != addr) then
call BJDebugMsg("WriteMemory WARNING!")
//call WriteRealMemory_FIX(addr,val)
else
set Memory[addr/4] = val
endif
endfunction
//! endnocjass
endlibrary
library UnitColor
{
#define HASHTABLE = // твоя хэш таблица
#define HAVE_CUSTOM_COLOR = 0 //номер ячейки, где хранится метка (bool) о нестандартном цвете
#define CUSTOM_COLOR_PLAYER = 0 //номер ячейки, где хранится игрок
player Color2Player(playercolor color)
{
for(integer i = 0; i < 12; i++) {
if color == ConvertPlayerColor(i) {
return Player(i)
}
}
return null
}
integer Color2PlayerId(playercolor color)
{
for(integer i = 0; i < 12; i++) {
if color == ConvertPlayerColor(i) {
return i
}
}
return -1
}
#define SetUnitColor(u, c) = {
SaveBoolean(HASHTABLE, GetHandleId(u), HAVE_CUSTOM_COLOR, true) //помечаем, что юнит имеет нестандартный цвет
SavePlayerHandle(HASHTABLE, GetHandleId(u), CUSTOM_COLOR_PLAYER, Color2Player(c)) //т.к. playercolor нельзя сохранить в hashtable, то сохраняем игрока
Set##UnitColor(u, c) //меняем цвет юниту
}
playercolor GetUnitColor(unit u)
{
if LoadBoolean(HASHTABLE, GetHandleId(u), HAVE_CUSTOM_COLOR) { // проверяем, имеет ли юнит нестандартный цвет
return GetPlayerColor(LoadPlayerHandle(HASHTABLE, GetHandleId(u), CUSTOM_COLOR_PLAYER)) // возвращаем нестандартный цвет
}
return GetPlayerColor(GetOwningPlayer(u)) // если нет, то возвращаем цвет владельца
}
}
function GetFrameTextAddress takes string name, integer id returns integer
function GetFrameItemAddress takes string name, integer id returns integer
function GetFrameSkinAddress takes string name, integer id returns integer
ENAleksey, несколько предложений/просьб от меня :)
function GetHeroBarButton takes integer id returns integer // не хотелось бы терять аж 7 кнопок!
А еще я заметил, что отсутствуют функции, работающие с иконками и текстом. Например, что-то типа такого
function GetUpperButtonBarText takes integer id returns integer
function GetResourceBarText takes integer id returns integer
function GetResourceBarIcon takes integer id returns integer
function GetInfoBarText takes integer id returns integer
function GetInfoBarIcon takes integer id returns integer
скачиваешь PJass (ссылка в шапке) и переносишь его в \JNGP\jasshelper\ с заменой, предварительно сделав бэкап заменяемого файла
затем скачиваешь демонстрационную карту (тоже есть в шапке) и открываешь ее с помощью JNGP
если при сохранении карты выдаются ошибки, то отключи cJass -> AdicParser и cJass -> AdicOptimizer
наслаждайся новыми возможностями :)
в примере из шапки не хватает последних функций
А вот и функции для чтения данных о фрейме:
раскрыть
function GetFrameWidth takes integer pFrame returns real
return GetRealFromMemory(Memory[pFrame/4 + 22])
endfunction
function GetFrameHeight takes integer pFrame returns real
return GetRealFromMemory(Memory[pFrame/4 + 23])
endfunction
function GetFramePointParent takes integer pFrame, integer point returns integer
return Memory[Memory[pFrame/4 + point + 2]/4 + 1]
endfunction
function GetFramePointRelativePoint takes integer pFrame, integer point returns integer
return Memory[Memory[pFrame/4 + point + 2]/4 + 2]
endfunction
function GetFramePointX takes integer pFrame, integer point returns real
return GetRealFromMemory(Memory[Memory[pFrame/4 + point + 2]/4 + 3])
endfunction
function GetFramePointY takes integer pFrame, integer point returns real
return GetRealFromMemory(Memory[Memory[pFrame/4 + point + 2]/4 + 4])
endfunction
function GetRealFromMemory takes integer i returns real
return cleanReal(indexToReal(i))
endfunction
function SetRealIntoMemory takes real r returns integer
return cleanInt(realToIndex(r))
endfunction
их можно добавить вручную или подождать пока ENAleksey обновит карту
Поясняю, почему работает только красный игрок:
событие "Юнит получает урон" -> Атакующий юнит == null следовательно Владелец(null) вернет 0, а 0 - порядковый номер красного игрока.
или сделай ячейки с помощью предметов (причем зарядами можно отображать здоровье юнитов)
перенеси уведомления ("в здании нет мест", "здание повреждено") в привычное место (посередине экрана), покрась в желтый цвет и добавь звуковое сопровождение (поищи SimError)
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
Фигня или не фигня (хотя я склоняюсь как раз к первому варианту), только она пока что работает и без сбоев
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
50 -> 40
100 -> 35
51->41
Отредактирован Ige
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
Код в шапке и в примере(карте) разный. Более того, в карте такой бардак, что пока найдешь что-нибудь и поймешь за что это отвечает, можно состариться. Словом, жуть какая-то =)
Я не сразу понял, что offset == источник урона (DamageSource), мб тогда изменить имя переменной?
Отредактирован Ige
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / Как отследить цвет юнита?
» WarCraft 3 / Хак на память Warcraft3
пример использования
» RenderEdge / [RenderEdge] Memory Hack
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / Аура без таймера
Отредактирован Ige
» RenderEdge / [RenderEdge] Memory Hack
Отредактирован Ige
» WarCraft 3 / Почему в этом коде даммик не кидает сетку
» WarCraft 3 / Добыча ресурсов
событие "Юнит получает урон" -> Атакующий юнит == null следовательно Владелец(null) вернет 0, а 0 - порядковый номер красного игрока.
» WarCraft 3 / Система захвата зданий
» WarCraft 3 / Пассивная способность с перезарядкой и с мана костом
» WarCraft 3 / Пассивная способность с перезарядкой и с мана костом