0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

call WMem(offset+0x10,mR2I(bj_meleeNearestMineDist))
А вот это неожиданно!)
// либо так
WMem(offset+0x10, mI2R(newValue))
DracoL1ch:
просто вспомни, что там степени двойки должны быть, в типе атаки/урона, а не голые числа. ну а про отрицательные значения хз
Тип атаки,вроде бы имеет значения 0..6, т.е. без степени 2
	attackType[0] = "Заклинание"
	attackType[1] = "Обычная"
	attackType[2] = "Дальний бой"
	attackType[3] = "Артиллерия"
	attackType[4] = "Магическая"
	attackType[5] = "Сила Тьмы"
	attackType[6] = "Герой"

а еще стоит заметить, что источник урона это:
set tt_unit1=I2Unit(RMem(offset))//tt_unit1 == source
о чем я писал ранее
Я не сразу понял, что offset == источник урона (DamageSource)
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

quq_CCCP, пока нет какого-либо руководства, приходится все проверять эмпирическим методом.
Фигня или не фигня (хотя я склоняюсь как раз к первому варианту), только она пока что работает и без сбоев
Загруженные файлы
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

Ige:
quq_CCCP, суть было в том, что бы отловить урон ДО расчета брони
Сам сморозил глупость и сам повелся на нее -_- Хотел сказать не "отловить" урон, а "изменить" его.
Чем чреват подобный финт:
// чтение
DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])
// запись (обратный процесс)
Memory[offset/4+0x10/4] = mI2R(newValue)
// либо так
WMem(offset+0x10, mI2R(newValue))
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

quq_CCCP, на скрине показан урон до расчета брони и после
50 -> 40
100 -> 35
51->41
0
7
7 лет назад
Отредактирован Ige
0

» WarCraft 3 / Ловим урон с Мемхаком

quq_CCCP, суть было в том, что бы отловить урон ДО расчета брони

quq_CCCP, над кодом еще работаю
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

Сработало!)
Загруженные файлы
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

quq_CCCP, я, наверно, неправильно выразился. То что ты мне скинул - это совсем не то, что я имел ввиду. Минуту, я итоговый скрин сделаю.
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

Вроде бы откопал в доте, то что нужно. Проверю и отпишусь
    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
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

вот приблизительный пример того, что мне нужно
	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
0
7
7 лет назад
0

» WarCraft 3 / Ловим урон с Мемхаком

quq_CCCP, так в том и дело, что GetTriggerUnit(), GetEventDamageSource() возвращают null
1
7
7 лет назад
1

» WarCraft 3 / Ловим урон с Мемхаком

pro100master, очевидно, что RMem(pDamageTarget) возвращает адрес юнита, значит нужен некий "конвертер" (как я уже писал выше Int2Unit())
1
7
7 лет назад
1

» WarCraft 3 / Ловим урон с Мемхаком

pro100master, как с помощью этого получить юнита(ов)?
1
7
7 лет назад
1

» WarCraft 3 / Ловим урон с Мемхаком

Как с этим вообще можно разобраться?
Код в шапке и в примере(карте) разный. Более того, в карте такой бардак, что пока найдешь что-нибудь и поймешь за что это отвечает, можно состариться. Словом, жуть какая-то =)
  • зачем здесь используется массив? - это что-то связанное с дотой, т.е. для работоспособности он не требуется?
  • как получить юнитов (GetTriggerUnit() и GetEventDamageSource() возвращают null)?
Вроде бы есть target, но это integer => нужно что-то типа Int2Unit();
Я не сразу понял, что offset == источник урона (DamageSource), мб тогда изменить имя переменной?
  • если перезаписать значение урона до расчета брони, не будет ли проблем?
2
7
7 лет назад
Отредактирован Ige
2

» RenderEdge / [RenderEdge] Memory Hack

ADOLF, работает! я сам его использую)
Typecast
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
3
7
7 лет назад
3

» WarCraft 3 / Как отследить цвет юнита?

avuremybe:
Ну и видимо да, мне придется писать свою функцию
cjass устроит?)
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)) // если нет, то возвращаем цвет владельца
	}
}
2
7
7 лет назад
2

» WarCraft 3 / Хак на память Warcraft3

ClotPh:
quq_CCCP, так, минутку, то есть равкод я не откопаю?
Ок, сейчас хоть цифры попробую снова... жопа =/
если я тебя правильно понял, то тебе нужна библиотека Ascii
пример использования
local integer id = 'hfoo'
local string raw = A2S(id) // raw == "hfoo" (строка)
id = S2A(raw) // id == 'hfoo' (число)
2
7
7 лет назад
2

» RenderEdge / [RenderEdge] Memory Hack

ENAleksey, в мемхаке есть функции
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
С их помощью можно получить кое-какие адреса
GetFrameTextAddress("ResourceBarGoldText", 0)
GetFrameTextAddress("ResourceBarLumberText", 0)
GetFrameTextAddress("ResourceBarSupplyText", 0)
GetFrameTextAddress("ResourceBarUpkeepText", 0)

GetFrameTextAddress("InfoPanelIconHeroStrengthLabel", 6) //Сила (текст)
GetFrameTextAddress("InfoPanelIconHeroStrengthValue", 6) //Сила (значение)
GetFrameTextAddress("InfoPanelIconHeroAgilityLabel", 6) //Ловкость (текст)
GetFrameTextAddress("InfoPanelIconHeroAgilityValue", 6) //Ловкость (значение)
GetFrameTextAddress("InfoPanelIconHeroIntellectLabel", 6) //Разум (текст)
GetFrameTextAddress("InfoPanelIconHeroIntellectValue", 6) //Разум (значение)

GetFrameTextAddress("InfoPanelIconLabel", 0) //Атака 1
GetFrameTextAddress("InfoPanelIconLabel", 1) //Атака 2
GetFrameTextAddress("InfoPanelIconLabel", 2) //Защита
GetFrameTextAddress("InfoPanelIconLabel", 3) //Ранг
GetFrameTextAddress("InfoPanelIconLabel", 4) //Пища
GetFrameTextAddress("InfoPanelIconLabel", 5) //Золото
// и соответственно
GetFrameTextAddress("InfoPanelIconValue", 0) //значение Атака 1
GetFrameTextAddress("InfoPanelIconLevel", 0) //уровень Атака 1
0
7
7 лет назад
0

» RenderEdge / [RenderEdge] Memory Hack

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
10
7
7 лет назад
10
0
7
7 лет назад
Отредактирован Ige
0

» RenderEdge / [RenderEdge] Memory Hack

Кет,
  • скачиваешь 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 обновит карту
6
7
7 лет назад
Отредактирован Ige
6

» WarCraft 3 / Почему в этом коде даммик не кидает сетку

ClotPh, GetLastCreatedUnit - это не native-функция, а BJ
function GetLastCreatedUnit takes nothing returns unit
    return bj_lastCreatedUnit
endfunction
bj_lastCreatedUnit - это глобалка, а значение, на которое она ссылается, указывается вручную. Например, как в BJ-функции
function CreateUnitAtLocSaveLast takes player id, integer unitid, location loc, real face returns unit
    if (unitid == 'ugol') then
        set bj_lastCreatedUnit = CreateBlightedGoldmine(id, GetLocationX(loc), GetLocationY(loc), face)
    else
        set bj_lastCreatedUnit = CreateUnitAtLoc(id, unitid, loc, face)
    endif

    return bj_lastCreatedUnit
endfunction

function CreateNUnitsAtLoc takes integer count, integer unitId, player whichPlayer, location loc, real face returns group
    call GroupClear(bj_lastCreatedGroup)
    loop
        set count = count - 1
        exitwhen count < 0
        call CreateUnitAtLocSaveLast(whichPlayer, unitId, loc, face)
        call GroupAddUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
    endloop
    return bj_lastCreatedGroup
endfunction
1
7
7 лет назад
1

» WarCraft 3 / Добыча ресурсов

Поясняю, почему работает только красный игрок:
событие "Юнит получает урон" -> Атакующий юнит == null следовательно Владелец(null) вернет 0, а 0 - порядковый номер красного игрока.
2
7
7 лет назад
2

» WarCraft 3 / Система захвата зданий

Maniac_91, несколько предложений по улучшению
  • сделай из башни "транспорт" (чтобы были ячейки)
  • или сделай ячейки с помощью предметов (причем зарядами можно отображать здоровье юнитов)
  • перенеси уведомления ("в здании нет мест", "здание повреждено") в привычное место (посередине экрана), покрась в желтый цвет и добавь звуковое сопровождение (поищи SimError)
Загруженные файлы
0
7
7 лет назад
0

» WarCraft 3 / Пассивная способность с перезарядкой и с мана костом

ScopteRectuS, ну можно попробовать заменить DISBTN иконку на нормальную <- не проверял, т.ч. не уверен
2
7
7 лет назад
2

» WarCraft 3 / Пассивная способность с перезарядкой и с мана костом

ScopteRectuS:
Ige, но там нельзя сделать мана кост. И способность еще затемняется, чтр неекрасиво.
манакост указывается не у сферы, а у способности, которая должна использоваться
Загруженные файлы