This was in Unryze's memhackwhere did you get this from?
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
This was in Unryze's memhackwhere did you get this from?
Maybe I use it wrong?yeah it's improved template made out of my code, but I have no idea how it fails for you. In dota it used widely across multiple abilities
Is it possible to 'listen' to a meele game in progress and send this information to some Deep Learning process? I'm wanting to create an AI but I don't know if the game gives me that possibility. In addition to receiving data, I need to send it back to move units, etc.Memory hack, basement and basic functions by @leandrotp
Extended API by DracoL1ch
Memory hooks, DLL, direct function calls by Karaul0v
What is it?
An innate WC3 tool which allows to access any data within user's PC. You can read and write any memory you want, except when it comes to inner Windows protection systems (ProcessLock, UDP, low level of access etc). Basically you can act like WC3 itself, reading and writing data as normal game does.
Why is it needed?
You can extend your map far beyond WC3 possibilities. Use any low-level function of game which is unaccessible from JASS without having to waste your time imitating it. You're working with a low-level memory language, so it's still diffucult but worthy.
What about security?
Sure you can write viruses basing on this. Heck, you were able to do so long ago, like Preload never been fixed since 2008 or w/e it comes. Thing is, atomic energy are also destructive, yet humanity somehow managed to make it most healthy way to get energy, so you can actually access this page right now via your PC, which is also mostly based on military researches. Everything has 2 sides.
From your side you can notify users about this hack, remind them about possible danger of playing unknown, non-official maps, or maps downloaded from different sources. That's best you can do. Rest is up to players.
What about cons?
This thing isn't OS-based, yet due to different approaches it may, and mostly, won't run on non-Windows systems. We had no Linux/Mac writes anyway, and there's literally less than 10 players from those systems. Yet you risk to lose those guys. All of these been tested on Windows 7 x64 & x86, windows 10 runs it as well, rest are unknown.
Declared code isn't supposed to work from within WC3 Map Editor. We did write it on plain txt files and put inside the maps with MPQEditor to check things out. Editor uses optimizations which may hurt it. If you really wanna to use it look for proper PJass and add proper syntax markers to get over any errors info.
You need at least good JASS skills in order to understand what happens and how to work with memory. You can't do it with GUI or so. That's really advanced level which is totally unfriendly for now.
This bug will be fixed with next official patch. Thing is - do you really care about updating? If yes, then you can close this tab right now. We don't need to hear another wave of messages "this is dangerous and should be fixed, you shouldn't spread it". Nobody else but fans made WC3 live long life till today, so we will carry this tradition. Blizzard did nothing to boost mapmaking back those years, so I can see no signs they will do that next years. Audience is dropping fast enough, game isn't money-making, so it's dead end. If your map really worth it people will stay with 1.26 or 1.27 versions (only 2 are supported for now, you can add support for other versions as well if you wanna to).
So, if you wanna carry this on, lets start
Init()
Whole project can be found at GitHub. You can improve or add commentary or make editor-friendly branch if you want to. Feel free to update outdated parts if you need or add new functions to get another data we didn't need to use (there's a lot of fields, duh).
GitHub contains ChekSynt.bat which runs PJass to check script. Note that default (correct) result of this check is:
![]()
It contains 11 errors, which is normal. Any others is your fault.
We also use some AI functions as a door to WC3 bytecode compilator, note that.
Whole script (as for 1st of November 2016):
JASS:// reserved native for call 4 integer function and return BOOLEAN value native MergeUnits takes integer qty, integer a, integer b, integer make returns boolean // reserved native for call 2 integer function and return BOOLEAN value (can be converted to int!) native ConvertUnits takes integer qty, integer id returns boolean // reserved native for call 1 integer function and return integer value native IgnoredUnits takes integer unitid returns integer // https://github.com/Karaulov/WarcraftIII_DLL_126-xxx (EXTRADLLNAME) // DLL is helpful ally which makes game easire // Basically there's no jass-way to detect whenever player leaves to rollback changes // so DLL does it for you with "AddNewOffsetToRestore" function // if DLL is missing global changes you did will affect whole game until it's restarted // You can detect function which uses DLL by "GetModuleProcAddress(EXTRADLLNAME" part inside of them\ globals integer TempInteger=0 integer Temp_GetSomeAdd1=0 integer Temp_GetSomeAdd2=0 integer DamageIncrementer=0 real array DamageValues integer array DamageAttackTypes integer array DamageDamageTypes player LocalPlayer=null hashtable TempHash=InitHashtable() hashtable RectData = InitHashtable() hashtable HY=InitHashtable() boolean IsL1ch=true//used in "echo" function to display debug messages boolean array WidescreenState real GJ_LastDmg=0//outdated yet could be useful integer GJ_LastDamageType=0 integer GJ_LastAttackType=0 hashtable ObjectDataPointersTable=InitHashtable() timer SuperTextPrinter_Timer=null hashtable AbilitiesHashtable=InitHashtable() integer testFunctionCount = 0 integer latestAddress1 = 0 integer latestAddress2 = 0 integer array Ascii__Ints string array Ascii__Chars code l__Code integer l__Int string l__Str boolean l__Bool constant string dotaconfigfle="config.dota" integer array l__Array string array HexNumber__Chars integer bytecode integer array l__bytecode integer array Memory integer bytecodedata //used to pass data between regular code and bytecode integer GameState integer pointers integer pUnitData integer pAbilityData constant gametype GAME_TYPE_ALL= ConvertGameType(0xFFFFFFFF) integer array H trigger l__library_init // For SetUnitFlags_2 (unit+0x20) constant integer UNIT_VISIBLED_TO_ALL = 0x10 constant integer UNIT_INVULNERABLE = 0x8 constant integer UNIT_SELECTABLE = 0x2 constant integer UNIT_HIDDEN = 0x1 constant integer UNIT_AUTOATTACK_DISABLED=0x10000000 constant integer UNIT_ILLUSION=0x40000000 // For SetUnitFlags (unit+0xD4) //flag 0x4 causes fatal if any damage received //flag 0x40 stands for red flash, but doesn't directly calls it constant integer UNIT_DEAD = 0x100 //like dead hero, provides no vision, cant be selected, enemies doesn't flee when attacked by unit with this flag constant integer UNIT_MINMAP_ICON_HIDE = 0x80000 constant integer UNIT_MINMAP_ICON_TAVERN = 0x40000 constant integer UNIT_MINMAP_ICON_GOLD = 0x20000 constant integer UNIT_MINMAP_SHAREVISIBLE = 0x10000 constant integer UNIT_STUNNED= 0x100000 constant integer UNIT_INVISIBLED = 0x1000000 constant integer UNIT_HAS_FLYING_VISION= 0x20000000 integer pCameraDefaultHeight real array DefaultCameraHeight // 126a 0xAB65F4 // 127a 0xBE4238 integer pGlobalPlayerClass // 127a 0xBEC464 // 126a 0xAB4450 integer pUnitMaxSpeedConstant integer pUnitMaxSpeedConstantD real UnitMaxSpeedConstant // 127a 0xBEC460 // 126a 0xAB444C integer pUnitMinSpeedConstant integer pUnitMinSpeedConstantD real UnitMinSpeedConstant // 127a 0xBEC46C // 126a 0xAB4458 integer pBuildingMaxSpeedConstant integer pBuildingMaxSpeedConstantD real BuildingMaxSpeedConstant // 127a 0xBEC468 // 126a 0xAB4454 integer pBuildingMinSpeedConstant integer pBuildingMinSpeedConstantD real BuildingMinSpeedConstant integer pUnitUIDefAddr integer pUnitDataDefAddr integer pAbilityUIDefAddr integer pAbilityDataDefAddr integer pAttackSpeedLimit real AttackSpeedLimit integer pAttackTimeLimit real AttackTimeLimit integer pWar3MapJLocation=0 integer pGameClass1=0 integer pGameClass2=0 integer pGameClass3=0 integer pTimerAddr=0 integer pCGameState=0 integer pJassEnvAddress=0 integer pLightEnv=0 integer pGetModuleHandle=0 integer pGetProcAddress=0 integer GameDLL=0 integer GameVersion=0 integer pMergeUnits=0 integer pMergeUnitsOffset=0 integer pIgnoredUnits=0 integer pIgnoredUnitsOffset=0 integer pConvertUnits=0 integer pConvertUnitsOffset=0 integer pLeaderboardSetItemLabelColor=0 integer pSetHPBarColorForPlayer=0 integer pSetHPBarXScaleForPlayer=0 integer pSetHPBarYScaleForPlayer=0 integer pSetHPCustomHPBarUnit=0 integer pSetMPBarXScaleForPlayer=0 integer pSetMPBarYScaleForPlayer=0 integer pSetMPBarYOffsetForPlayer=0 integer pExportFromMpq=0 integer pGetFrameItemAddress=0 integer pGetFrameSkinAddress=0 integer pGetFrameTextAddress=0 integer pUpdateFrameText=0 integer pFrameDefClass=0 integer pConvertString=0 integer pPacketClass=0 integer pPacketSend=0 integer pPingMinimapOffset=0 integer pPingMinimapExOffset=0 integer PingMinimapUnlocker = 0 integer PingMinimapExUnlocker = 0 boolean NotLockedPingMinimap = true boolean NotLockedPingMinimapEx = true integer pFindWindowA=0 integer pMessageBoxA=0 integer pGetAsyncKeyState=0 integer pWritePrivateProfileStringA=0 integer pGetPrivateProfileStringA=0 integer pLoadLibraryA=0 integer pGetFileAttributesA=0 integer pVirtualAlloc=0 integer pVirtualProtect=0 integer array RJassNativesBuffer integer RJassNativesBufferSize = 0 integer pReservedExecutableMemory=0 integer pReservedExecutableMemory2=0 integer pBitwiseOR_ExecutableMemory boolean NeedInitBitwiseOr = true integer pBitwiseXOR_ExecutableMemory boolean NeedInitBitwiseXor = true integer pBitwiseAND_ExecutableMemory boolean NeedInitBitwiseAnd = true integer pReservedWritableMemory integer pReservedWritableMemory2 constant integer szReservedWritableMemory = 3000 integer pStorm279 integer pPrintText1 integer pPrintText2 integer pPrintText3 integer pGetUnitAbility integer pGetUnitAddress integer p_sprintf integer pChangeFont integer pUpdateRestoreTimer=0 integer pAddNewOffsetToRestore=0 constant string EXTRADLLNAME="DotAAllstarsHelper688.dll" integer pReserverdIntArg1 integer pReserverdIntArg2 integer pReserverdIntArg3 integer pReserverdIntArg4 hashtable Addresses=InitHashtable() constant integer DEF_ADR_ABILITY_DATA=0 constant integer DEF_ADR_ABILITY_UI=1 constant integer DEF_ADR_UNIT_DATA=2 constant integer DEF_ADR_UNIT_UI=3 constant integer DEF_ADR_ITEM_DATA=4 constant integer ILLUSTION_BONUS_DAMAGE_RECEIVES=0 constant integer ILLUSTION_BONUS_DAMAGE_DEALS=1 integer pOrder1_offset integer pOrder2_offset integer pOrder3_offset integer pOrder4_offset integer pOrder5_offset integer pOrder6_offset integer pOrder7_offset integer pOrder8_offset integer Order1_unlockedvalue = 0 integer Order2_unlockedvalue = 0 integer Order3_unlockedvalue = 0 integer Order4_unlockedvalue = 0 integer Order5_unlockedvalue = 0 integer Order6_unlockedvalue = 0 integer Order7_unlockedvalue = 0 integer Order8_unlockedvalue = 0 integer Order1_lockedvalue integer Order2_lockedvalue integer Order3_lockedvalue integer Order4_lockedvalue integer Order5_lockedvalue integer Order6_lockedvalue integer Order7_lockedvalue integer Order8_lockedvalue boolean IsOrder1Locked = false boolean IsOrder2Locked = false boolean IsOrder3Locked = false boolean IsOrder4Locked = false boolean IsOrder5Locked = false boolean IsOrder6Locked = false boolean IsOrder7Locked = false boolean IsOrder8Locked = false boolean FogUpdateBlocked = false integer pUpdateFogManual=0 integer pFogUpdateBlockAddr=0 integer pFogUpdateBlockAddrOld1=0 integer pFogUpdateBlockAddrOld2=0 integer pFogUpdateBlockAddrNew1=0 integer pFogUpdateBlockAddrNew2=0 integer pGetLatestDownloadedString = 0 integer pGetDownloadStatus = 0 integer pSaveNewMapFromUrl = 0 integer pGetDownloadProgress = 0 integer pGetCurrentMapDir = 0 integer pStartAbilityCD=0 integer pSendCommandWithoutTarget integer pMissile integer pWindowIsActive integer pSendHttpGetRequest = 0 integer pAllianceOutput integer AllianceLocker = 0 boolean NotLockedAllianceOutput = true integer pMutePlayer=0 integer pUnMutePlayer=0 integer pSetWidescreenFixState=0 integer pSetCustomFovFix=0 boolean EXTRADLLLOADED = false integer RegionEditMode = 0 real LatestMouseX = 0. real LatestMouseY = 0. integer LatestSelectRect = 0 integer LatestOverRect = 0 integer gl_hRectID = 0 integer OPLimitAddress1=0 integer OPLimitAddress2=0 integer pCycloneFixCondition=0 constant integer CycloneFixCondition026a=0x808B08EB integer CycloneFixBaseValue=0 constant integer CycloneFixCondition027a=0x458B16EB integer pCaptionsOverTheCreeps=0 integer pPhaseShiftInvisibilityFlagByte=0 constant integer PhaseShiftInvisibilityFlagByteFixed0x26=0x00000060 constant integer PhaseShiftInvisibilityFlagByteFixed0x27=0x00000060 integer pMemcpy integer pSearchStringValue integer pSearchStringAddr1 integer pSearchStringAddr2 integer pReservedMemoryForUpdateFrameText integer pSimulateAttackInstance integer pGameTime integer pToggleForcedSubSelection=0 integer pToggleBlockKeyAndMouseEmulation=0 integer pToggleClickHelper=0 integer pSetStunToUnitTRUE integer pSetStunToUnitFALSE integer pReservedMemoryForSystemTime integer pGetLocalTime=0 integer pCommonSilence integer pAddSilenceOnAbility integer pRemoveSilenceFromAbility integer pPauseUnitDisabler integer pUpdateUnitsSpeedCurrent integer pSendMessageToChat=0 integer pCastSilenceToTarget integer pCastAbility=0 integer pDamageBlockIllusionCheck=0 integer pItemDropOrderTriggerFix=0 integer pFixModelCollisionSphere=0 integer pGetOrLoadFile integer pApplyTerrainFilterDirectly=0 integer pSetMainFuncWork=0 integer pFixModelTexturePath=0 integer StoreIntegerOffset = 0 integer StoreIntegerUnlocker = 0 boolean StoreIntegerLocked = false integer pPatchModel = 0 integer pChangeAnimationSpeed = 0 integer pSetSequenceValue = 0 integer pRedirectFile = 0 integer pReservedMemoryForMissileHandler=0 integer pReservedMemoryForDamageHandler=0 integer pUnitVtable = 0 integer pRealUnitDamageHandler = 0 integer pTriggerExecute = 0 integer pDamageTarget = 0 integer pMissileEspData = 0 integer pDamageEspData = 0 integer pMissileFuncStart = 0 integer pMissileJumpBack = 0 integer pItemDataNode=0 integer pJassLog = 0 endglobals function Char2Ascii takes string s returns integer local integer i= Ascii__Ints[StringHash(s) / 0x1F0748 + 0x3EA] if i == 47 and s == "\\" then set i=92 elseif i >= 65 and i <= 90 and s != Ascii__Chars[i] then set i=i + 32 endif return i endfunction function Char2Hex takes string s returns integer local integer i= Ascii__Ints[StringHash(s) / 0x1F0748 + 0x3EA] if i >= 48 and i <= 57 then return i - 48 elseif i >= 65 and i <= 70 then return i - 55 endif return - 1 endfunction function Ascii2Char takes integer i returns string return Ascii__Chars[i] endfunction function Ascii__onInit takes nothing returns nothing set Ascii__Ints[931]=8 set Ascii__Ints[1075]=9 set Ascii__Ints[1586]=10 set Ascii__Ints[1340]=12 set Ascii__Ints[412]=13 set Ascii__Ints[198]=32 set Ascii__Ints[1979]=33 set Ascii__Ints[1313]=34 set Ascii__Ints[1003]=35 set Ascii__Ints[1264]=36 set Ascii__Ints[983]=37 set Ascii__Ints[1277]=38 set Ascii__Ints[306]=39 set Ascii__Ints[904]=40 set Ascii__Ints[934]=41 set Ascii__Ints[917]=42 set Ascii__Ints[1972]=43 set Ascii__Ints[1380]=44 set Ascii__Ints[1985]=45 set Ascii__Ints[869]=46 set Ascii__Ints[1906]=47 set Ascii__Ints[883]=48 set Ascii__Ints[1558]=49 set Ascii__Ints[684]=50 set Ascii__Ints[582]=51 set Ascii__Ints[668]=52 set Ascii__Ints[538]=53 set Ascii__Ints[672]=54 set Ascii__Ints[1173]=55 set Ascii__Ints[71]=56 set Ascii__Ints[277]=57 set Ascii__Ints[89]=58 set Ascii__Ints[1141]=59 set Ascii__Ints[39]=60 set Ascii__Ints[1171]=61 set Ascii__Ints[51]=62 set Ascii__Ints[305]=0 //fixme 63 set Ascii__Ints[0]=64 set Ascii__Ints[222]=65 set Ascii__Ints[178]=66 set Ascii__Ints[236]=67 set Ascii__Ints[184]=68 set Ascii__Ints[1295]=69 set Ascii__Ints[1390]=70 set Ascii__Ints[1276]=71 set Ascii__Ints[203]=72 set Ascii__Ints[1314]=73 set Ascii__Ints[209]=74 set Ascii__Ints[1315]=75 set Ascii__Ints[170]=76 set Ascii__Ints[1357]=77 set Ascii__Ints[1343]=78 set Ascii__Ints[1397]=79 set Ascii__Ints[1420]=80 set Ascii__Ints[1419]=81 set Ascii__Ints[1396]=82 set Ascii__Ints[1374]=83 set Ascii__Ints[1407]=84 set Ascii__Ints[499]=85 set Ascii__Ints[1465]=86 set Ascii__Ints[736]=87 set Ascii__Ints[289]=88 set Ascii__Ints[986]=89 set Ascii__Ints[38]=90 set Ascii__Ints[1230]=91 set Ascii__Ints[1636]=93 set Ascii__Ints[1416]=94 set Ascii__Ints[1917]=95 set Ascii__Ints[217]=96 set Ascii__Ints[833]=123 set Ascii__Ints[1219]=124 set Ascii__Ints[553]=125 set Ascii__Ints[58]=126 set Ascii__Chars[0]="?" set Ascii__Chars[8]="\b" set Ascii__Chars[9]="\t" set Ascii__Chars[10]="\n" set Ascii__Chars[12]="\f" set Ascii__Chars[13]="\r" set Ascii__Chars[32]=" " set Ascii__Chars[33]="!" set Ascii__Chars[34]="\"" set Ascii__Chars[35]="#" set Ascii__Chars[36]="$" set Ascii__Chars[37]="%" set Ascii__Chars[38]="&" set Ascii__Chars[39]="'"//' set Ascii__Chars[40]="(" set Ascii__Chars[41]=")" set Ascii__Chars[42]="*" set Ascii__Chars[43]="+" set Ascii__Chars[44]="," set Ascii__Chars[45]="-" set Ascii__Chars[46]="." set Ascii__Chars[47]="/" set Ascii__Chars[48]="0" set Ascii__Chars[49]="1" set Ascii__Chars[50]="2" set Ascii__Chars[51]="3" set Ascii__Chars[52]="4" set Ascii__Chars[53]="5" set Ascii__Chars[54]="6" set Ascii__Chars[55]="7" set Ascii__Chars[56]="8" set Ascii__Chars[57]="9" set Ascii__Chars[58]=":" set Ascii__Chars[59]=";" set Ascii__Chars[60]="<" set Ascii__Chars[61]="=" set Ascii__Chars[62]=">" set Ascii__Chars[63]="?" set Ascii__Chars[64]="@" set Ascii__Chars[65]="A" set Ascii__Chars[66]="B" set Ascii__Chars[67]="C" set Ascii__Chars[68]="D" set Ascii__Chars[69]="E" set Ascii__Chars[70]="F" set Ascii__Chars[71]="G" set Ascii__Chars[72]="H" set Ascii__Chars[73]="I" set Ascii__Chars[74]="J" set Ascii__Chars[75]="K" set Ascii__Chars[76]="L" set Ascii__Chars[77]="M" set Ascii__Chars[78]="N" set Ascii__Chars[79]="O" set Ascii__Chars[80]="P" set Ascii__Chars[81]="Q" set Ascii__Chars[82]="R" set Ascii__Chars[83]="S" set Ascii__Chars[84]="T" set Ascii__Chars[85]="U" set Ascii__Chars[86]="V" set Ascii__Chars[87]="W" set Ascii__Chars[88]="X" set Ascii__Chars[89]="Y" set Ascii__Chars[90]="Z" set Ascii__Chars[91]="[" set Ascii__Chars[92]="\\" set Ascii__Chars[93]="]" set Ascii__Chars[94]="^" set Ascii__Chars[95]="_" set Ascii__Chars[96]="`" set Ascii__Chars[97]="a" set Ascii__Chars[98]="b" set Ascii__Chars[99]="c" set Ascii__Chars[100]="d" set Ascii__Chars[101]="e" set Ascii__Chars[102]="f" set Ascii__Chars[103]="g" set Ascii__Chars[104]="h" set Ascii__Chars[105]="i" set Ascii__Chars[106]="j" set Ascii__Chars[107]="k" set Ascii__Chars[108]="l" set Ascii__Chars[109]="m" set Ascii__Chars[110]="n" set Ascii__Chars[111]="o" set Ascii__Chars[112]="p" set Ascii__Chars[113]="q" set Ascii__Chars[114]="r" set Ascii__Chars[115]="s" set Ascii__Chars[116]="t" set Ascii__Chars[117]="u" set Ascii__Chars[118]="v" set Ascii__Chars[119]="w" set Ascii__Chars[120]="x" set Ascii__Chars[121]="y" set Ascii__Chars[122]="z" set Ascii__Chars[123]="{" set Ascii__Chars[124]="|" set Ascii__Chars[125]="}" set Ascii__Chars[126]="~" endfunction //library Ascii ends //library Typecast: 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 l__Array //typecast Array to integer endfunction function GetArrayAddress takes nothing returns integer //not really needed loop return l__Array endloop 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 endfunction function Typecast1 takes nothing returns nothing local integer l__Code local code l__Int endfunction function C2I takes code c returns integer call setCode(c) loop //Loop is not required, I'm using it just to fool Pjass return l__Code endloop return 0 endfunction function I2C takes integer i returns code call setInt(i) loop //Loop is not required, I'm using it just to fool Pjass return l__Int endloop return null endfunction function Typecast2 takes nothing returns nothing local integer l__Str local string l__Int endfunction function SH2I takes string s returns integer call setStr(s) loop //Loop is not required, I'm using it just to fool Pjass return l__Str endloop return 0 endfunction function I2SH takes integer i returns string call setInt(i) loop //Loop is not required, I'm using it just to fool Pjass return l__Int endloop return null endfunction function Typecast3 takes nothing returns nothing local integer l__Bool local boolean l__Int endfunction function B2I takes boolean b returns integer call setBool(b) loop //Loop is not required, I'm using it just to fool Pjass return l__Bool endloop return 0 endfunction function I2B takes integer i returns boolean call setInt(i) loop //Loop is not required, I'm using it just to fool Pjass return l__Int endloop return false endfunction function realToIndex takes real r returns integer loop return r endloop return 0 endfunction function cleanInt takes integer i returns integer return i endfunction function indexToReal takes integer i returns real loop return i endloop return 0.0 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 //library Typecast ends //library HexNumber: function BitwiseNot takes integer i returns integer return 0xFFFFFFFF - i endfunction function PowI takes integer x, integer power returns integer local integer res=1 local integer y=x if power==0 then return 1 endif set power=power-1 loop set x=x*y set power=power-1 exitwhen power==0 endloop return x endfunction function ShiftLeftForBits takes integer i, integer shiftval returns integer return i * (PowI(2,shiftval)) endfunction function ShiftRightForBits takes integer i, integer shiftval returns integer return i / (PowI(2,shiftval)) endfunction function ShiftLeftForBytes takes integer i, integer shiftval returns integer return ShiftLeftForBits(i,shiftval * 8) endfunction function ShiftRightForBytes takes integer i, integer shiftval returns integer return ShiftRightForBits(i,shiftval * 8) endfunction function GetByteFromInteger takes integer i, integer byteid returns integer local integer tmpval = i local integer retval = 0 local integer byte1 = 0 local integer byte2 = 0 local integer byte3 = 0 local integer byte4 = 0 if (tmpval < 0) then set tmpval = BitwiseNot(tmpval) set byte4 = 255 - ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte3 = 255 - ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte2 = 255 - ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte1 = 255 - tmpval else set byte4 = ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte3 = ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte2 = ModuloInteger(tmpval,256) set tmpval = tmpval / 256 set byte1 = tmpval endif if byteid == 1 then return byte1 elseif byteid == 2 then return byte2 elseif byteid == 3 then return byte3 elseif byteid == 4 then return byte4 endif return retval endfunction function CreateInteger1 takes integer byte1, integer byte2, integer byte3, integer byte4 returns integer local integer retval = byte1 set retval = ( retval * 256 ) + byte2 set retval = ( retval * 256 ) + byte3 set retval = ( retval * 256 ) + byte4 return retval endfunction function CreateInteger2 takes integer byte1, integer byte2, integer byte3, integer byte4 returns integer local integer retval = byte1 set retval = ShiftLeftForBytes(retval,1) + byte2 set retval = ShiftLeftForBytes(retval,1) + byte3 set retval = ShiftLeftForBytes(retval,1) + byte4 return retval endfunction function Hex2Int takes string s returns integer local integer result= 0 local integer i= 0 local integer char loop set char=Char2Hex(SubString(s, i, i + 1)) exitwhen i == 8 or char == - 1 set result=result * 16 + char set i=i + 1 endloop return result endfunction function Int2Hex_FIX takes integer i returns string set i = BitwiseNot(i) return HexNumber__Chars[255-(i/256/256/256)] + HexNumber__Chars[255-ModuloInteger(i/256/256,256)] + HexNumber__Chars[255-ModuloInteger(i/256,256)] + HexNumber__Chars[255-ModuloInteger(i,256)] endfunction function Int2Hex takes integer i returns string if (i < 0) then return Int2Hex_FIX(i) endif return HexNumber__Chars[(i/256/256/256)] + HexNumber__Chars[ModuloInteger(i/256/256,256)] + HexNumber__Chars[ModuloInteger(i/256,256)] + HexNumber__Chars[ModuloInteger(i,256)] endfunction function HexNumber__onInit takes nothing returns nothing set HexNumber__Chars[0]="00" set HexNumber__Chars[1]="01" set HexNumber__Chars[2]="02" set HexNumber__Chars[3]="03" set HexNumber__Chars[4]="04" set HexNumber__Chars[5]="05" set HexNumber__Chars[6]="06" set HexNumber__Chars[7]="07" set HexNumber__Chars[8]="08" set HexNumber__Chars[9]="09" set HexNumber__Chars[10]="0A" set HexNumber__Chars[11]="0B" set HexNumber__Chars[12]="0C" set HexNumber__Chars[13]="0D" set HexNumber__Chars[14]="0E" set HexNumber__Chars[15]="0F" set HexNumber__Chars[16]="10" set HexNumber__Chars[17]="11" set HexNumber__Chars[18]="12" set HexNumber__Chars[19]="13" set HexNumber__Chars[20]="14" set HexNumber__Chars[21]="15" set HexNumber__Chars[22]="16" set HexNumber__Chars[23]="17" set HexNumber__Chars[24]="18" set HexNumber__Chars[25]="19" set HexNumber__Chars[26]="1A" set HexNumber__Chars[27]="1B" set HexNumber__Chars[28]="1C" set HexNumber__Chars[29]="1D" set HexNumber__Chars[30]="1E" set HexNumber__Chars[31]="1F" set HexNumber__Chars[32]="20" set HexNumber__Chars[33]="21" set HexNumber__Chars[34]="22" set HexNumber__Chars[35]="23" set HexNumber__Chars[36]="24" set HexNumber__Chars[37]="25" set HexNumber__Chars[38]="26" set HexNumber__Chars[39]="27" set HexNumber__Chars[40]="28" set HexNumber__Chars[41]="29" set HexNumber__Chars[42]="2A" set HexNumber__Chars[43]="2B" set HexNumber__Chars[44]="2C" set HexNumber__Chars[45]="2D" set HexNumber__Chars[46]="2E" set HexNumber__Chars[47]="2F" set HexNumber__Chars[48]="30" set HexNumber__Chars[49]="31" set HexNumber__Chars[50]="32" set HexNumber__Chars[51]="33" set HexNumber__Chars[52]="34" set HexNumber__Chars[53]="35" set HexNumber__Chars[54]="36" set HexNumber__Chars[55]="37" set HexNumber__Chars[56]="38" set HexNumber__Chars[57]="39" set HexNumber__Chars[58]="3A" set HexNumber__Chars[59]="3B" set HexNumber__Chars[60]="3C" set HexNumber__Chars[61]="3D" set HexNumber__Chars[62]="3E" set HexNumber__Chars[63]="3F" set HexNumber__Chars[64]="40" set HexNumber__Chars[65]="41" set HexNumber__Chars[66]="42" set HexNumber__Chars[67]="43" set HexNumber__Chars[68]="44" set HexNumber__Chars[69]="45" set HexNumber__Chars[70]="46" set HexNumber__Chars[71]="47" set HexNumber__Chars[72]="48" set HexNumber__Chars[73]="49" set HexNumber__Chars[74]="4A" set HexNumber__Chars[75]="4B" set HexNumber__Chars[76]="4C" set HexNumber__Chars[77]="4D" set HexNumber__Chars[78]="4E" set HexNumber__Chars[79]="4F" set HexNumber__Chars[80]="50" set HexNumber__Chars[81]="51" set HexNumber__Chars[82]="52" set HexNumber__Chars[83]="53" set HexNumber__Chars[84]="54" set HexNumber__Chars[85]="55" set HexNumber__Chars[86]="56" set HexNumber__Chars[87]="57" set HexNumber__Chars[88]="58" set HexNumber__Chars[89]="59" set HexNumber__Chars[90]="5A" set HexNumber__Chars[91]="5B" set HexNumber__Chars[92]="5C" set HexNumber__Chars[93]="5D" set HexNumber__Chars[94]="5E" set HexNumber__Chars[95]="5F" set HexNumber__Chars[96]="60" set HexNumber__Chars[97]="61" set HexNumber__Chars[98]="62" set HexNumber__Chars[99]="63" set HexNumber__Chars[100]="64" set HexNumber__Chars[101]="65" set HexNumber__Chars[102]="66" set HexNumber__Chars[103]="67" set HexNumber__Chars[104]="68" set HexNumber__Chars[105]="69" set HexNumber__Chars[106]="6A" set HexNumber__Chars[107]="6B" set HexNumber__Chars[108]="6C" set HexNumber__Chars[109]="6D" set HexNumber__Chars[110]="6E" set HexNumber__Chars[111]="6F" set HexNumber__Chars[112]="70" set HexNumber__Chars[113]="71" set HexNumber__Chars[114]="72" set HexNumber__Chars[115]="73" set HexNumber__Chars[116]="74" set HexNumber__Chars[117]="75" set HexNumber__Chars[118]="76" set HexNumber__Chars[119]="77" set HexNumber__Chars[120]="78" set HexNumber__Chars[121]="79" set HexNumber__Chars[122]="7A" set HexNumber__Chars[123]="7B" set HexNumber__Chars[124]="7C" set HexNumber__Chars[125]="7D" set HexNumber__Chars[126]="7E" set HexNumber__Chars[127]="7F" set HexNumber__Chars[128]="80" set HexNumber__Chars[129]="81" set HexNumber__Chars[130]="82" set HexNumber__Chars[131]="83" set HexNumber__Chars[132]="84" set HexNumber__Chars[133]="85" set HexNumber__Chars[134]="86" set HexNumber__Chars[135]="87" set HexNumber__Chars[136]="88" set HexNumber__Chars[137]="89" set HexNumber__Chars[138]="8A" set HexNumber__Chars[139]="8B" set HexNumber__Chars[140]="8C" set HexNumber__Chars[141]="8D" set HexNumber__Chars[142]="8E" set HexNumber__Chars[143]="8F" set HexNumber__Chars[144]="90" set HexNumber__Chars[145]="91" set HexNumber__Chars[146]="92" set HexNumber__Chars[147]="93" set HexNumber__Chars[148]="94" set HexNumber__Chars[149]="95" set HexNumber__Chars[150]="96" set HexNumber__Chars[151]="97" set HexNumber__Chars[152]="98" set HexNumber__Chars[153]="99" set HexNumber__Chars[154]="9A" set HexNumber__Chars[155]="9B" set HexNumber__Chars[156]="9C" set HexNumber__Chars[157]="9D" set HexNumber__Chars[158]="9E" set HexNumber__Chars[159]="9F" set HexNumber__Chars[160]="A0" set HexNumber__Chars[161]="A1" set HexNumber__Chars[162]="A2" set HexNumber__Chars[163]="A3" set HexNumber__Chars[164]="A4" set HexNumber__Chars[165]="A5" set HexNumber__Chars[166]="A6" set HexNumber__Chars[167]="A7" set HexNumber__Chars[168]="A8" set HexNumber__Chars[169]="A9" set HexNumber__Chars[170]="AA" set HexNumber__Chars[171]="AB" set HexNumber__Chars[172]="AC" set HexNumber__Chars[173]="AD" set HexNumber__Chars[174]="AE" set HexNumber__Chars[175]="AF" set HexNumber__Chars[176]="B0" set HexNumber__Chars[177]="B1" set HexNumber__Chars[178]="B2" set HexNumber__Chars[179]="B3" set HexNumber__Chars[180]="B4" set HexNumber__Chars[181]="B5" set HexNumber__Chars[182]="B6" set HexNumber__Chars[183]="B7" set HexNumber__Chars[184]="B8" set HexNumber__Chars[185]="B9" set HexNumber__Chars[186]="BA" set HexNumber__Chars[187]="BB" set HexNumber__Chars[188]="BC" set HexNumber__Chars[189]="BD" set HexNumber__Chars[190]="BE" set HexNumber__Chars[191]="BF" set HexNumber__Chars[192]="C0" set HexNumber__Chars[193]="C1" set HexNumber__Chars[194]="C2" set HexNumber__Chars[195]="C3" set HexNumber__Chars[196]="C4" set HexNumber__Chars[197]="C5" set HexNumber__Chars[198]="C6" set HexNumber__Chars[199]="C7" set HexNumber__Chars[200]="C8" set HexNumber__Chars[201]="C9" set HexNumber__Chars[202]="CA" set HexNumber__Chars[203]="CB" set HexNumber__Chars[204]="CC" set HexNumber__Chars[205]="CD" set HexNumber__Chars[206]="CE" set HexNumber__Chars[207]="CF" set HexNumber__Chars[208]="D0" set HexNumber__Chars[209]="D1" set HexNumber__Chars[210]="D2" set HexNumber__Chars[211]="D3" set HexNumber__Chars[212]="D4" set HexNumber__Chars[213]="D5" set HexNumber__Chars[214]="D6" set HexNumber__Chars[215]="D7" set HexNumber__Chars[216]="D8" set HexNumber__Chars[217]="D9" set HexNumber__Chars[218]="DA" set HexNumber__Chars[219]="DB" set HexNumber__Chars[220]="DC" set HexNumber__Chars[221]="DD" set HexNumber__Chars[222]="DE" set HexNumber__Chars[223]="DF" set HexNumber__Chars[224]="E0" set HexNumber__Chars[225]="E1" set HexNumber__Chars[226]="E2" set HexNumber__Chars[227]="E3" set HexNumber__Chars[228]="E4" set HexNumber__Chars[229]="E5" set HexNumber__Chars[230]="E6" set HexNumber__Chars[231]="E7" set HexNumber__Chars[232]="E8" set HexNumber__Chars[233]="E9" set HexNumber__Chars[234]="EA" set HexNumber__Chars[235]="EB" set HexNumber__Chars[236]="EC" set HexNumber__Chars[237]="ED" set HexNumber__Chars[238]="EE" set HexNumber__Chars[239]="EF" set HexNumber__Chars[240]="F0" set HexNumber__Chars[241]="F1" set HexNumber__Chars[242]="F2" set HexNumber__Chars[243]="F3" set HexNumber__Chars[244]="F4" set HexNumber__Chars[245]="F5" set HexNumber__Chars[246]="F6" set HexNumber__Chars[247]="F7" set HexNumber__Chars[248]="F8" set HexNumber__Chars[249]="F9" set HexNumber__Chars[250]="FA" set HexNumber__Chars[251]="FB" set HexNumber__Chars[252]="FC" set HexNumber__Chars[253]="FD" set HexNumber__Chars[254]="FE" set HexNumber__Chars[255]="FF" endfunction function GetChar takes string s, integer pos returns string return SubString(s, pos, pos +1) endfunction //library HexNumber ends //library Memory: 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 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 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 l__bytecode endfunction function GetBytecodeAddress takes nothing returns integer loop return l__bytecode endloop 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 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))) // /*local array "stand" can now read memory, but not write. // The bytecode unlocks the ability to read and write memory // with the "Memory" array*/ 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 malloc takes integer bytes returns integer //I’m not at home, I’m writing this from head without testing, not sure if it works set bytecodedata = bytes/4 + 4 call ForForce(bj_FORCE_PLAYER[0], I2C(Memory[GetBytecodeAddress()/4+3]+32)) return ( Memory[bytecodedata/4+3] + 4 ) / 4 * 4 //Address of data in the newly created array endfunction // addr 0x10000 data 1C 2C 8A 7D 6D 5F 5A 4C 6C 3C 8C 7A // read memory at 0x10003 ( 7D 6D 5F 5A ) function CreateIntegerFromTwoByOffset takes integer i1, integer i2, integer offset returns integer local integer array pBytes set pBytes[0] = GetByteFromInteger(i1,4) set pBytes[1] = GetByteFromInteger(i1,3) set pBytes[2] = GetByteFromInteger(i1,2) set pBytes[3] = GetByteFromInteger(i1,1) set pBytes[4] = GetByteFromInteger(i2,4) set pBytes[5] = GetByteFromInteger(i2,3) set pBytes[6] = GetByteFromInteger(i2,2) set pBytes[7] = GetByteFromInteger(i2,1) return CreateInteger1(pBytes[offset+3],pBytes[offset+2],pBytes[offset+1],pBytes[offset+0]) endfunction function CreateDoubleIntegerAndGetOne takes integer i1, integer i2, integer value, integer offset, boolean first returns integer local integer array pBytes set pBytes[0] = GetByteFromInteger(i1,4) set pBytes[1] = GetByteFromInteger(i1,3) set pBytes[2] = GetByteFromInteger(i1,2) set pBytes[3] = GetByteFromInteger(i1,1) set pBytes[4] = GetByteFromInteger(i2,4) set pBytes[5] = GetByteFromInteger(i2,3) set pBytes[6] = GetByteFromInteger(i2,2) set pBytes[7] = GetByteFromInteger(i2,1) set pBytes[offset] = GetByteFromInteger(value,4) set pBytes[offset+1] = GetByteFromInteger(value,3) set pBytes[offset+2] = GetByteFromInteger(value,2) set pBytes[offset+3] = GetByteFromInteger(value,1) if (first) then return CreateInteger1(pBytes[3],pBytes[2],pBytes[1],pBytes[0]) else return CreateInteger1(pBytes[7],pBytes[6],pBytes[5],pBytes[4]) endif endfunction function ReadRealMemory_FIX takes integer addr returns integer local integer ByteOffset = addr - ( addr / 4 * 4 ) local integer FirstAddr = addr - ByteOffset return CreateIntegerFromTwoByOffset(Memory[FirstAddr/4],Memory[FirstAddr/4+1], ByteOffset) endfunction function ReadRealMemory takes integer addr returns integer if addr/4*4!=addr then call BJDebugMsg("ReadMemory WARNING! : " + Int2Hex(addr)) return ReadRealMemory_FIX(addr) endif return Memory[addr/4] endfunction function WriteRealMemory_FIX takes integer addr, integer val returns nothing local integer Int_1 local integer Int_2 local integer ByteOffset = addr - ( addr / 4 * 4 ) local integer FirstAddr = addr - ByteOffset set Int_1 = ReadRealMemory(FirstAddr) set Int_2 = ReadRealMemory(FirstAddr + 4) set Memory[FirstAddr/4] = CreateDoubleIntegerAndGetOne ( Int_1, Int_2, val, ByteOffset, true) set Memory[FirstAddr/4 + 1] = CreateDoubleIntegerAndGetOne ( Int_1, Int_2, val, ByteOffset, false) endfunction function WriteRealMemory takes integer addr, integer val returns nothing if addr/4*4!=addr then call BJDebugMsg("WriteMemory WARNING! : " + Int2Hex(addr) ) call WriteRealMemory_FIX(addr,val) else set Memory[addr/4] = val endif endfunction // read Game.dll + real offset function ReadOffset takes integer i returns integer return ReadRealMemory(GameDLL+i) endfunction function ReadOffsetUnsafe takes integer i returns integer return Memory[(GameDLL+i)/4] endfunction function ReadRealPointer1LVL takes integer addr, integer offset1 returns integer local integer retval = 0 if addr > 0 then set retval = ReadRealMemory(addr) if addr > 0 then set retval = ReadRealMemory(retval + offset1) else set retval = 0 endif endif return retval endfunction function WriteRealPointer1LVL takes integer addr, integer offset1, integer val returns nothing local integer retval = 0 if addr > 0 then set retval = ReadRealMemory(addr) if addr > 0 then call WriteRealMemory(retval + offset1,val) endif endif endfunction function ReadRealPointer2LVL takes integer addr, integer offset1, integer offset2 returns integer local integer retval = ReadRealPointer1LVL(addr,offset1) if retval > 0 then set retval = ReadRealMemory(retval + offset2) else set retval = 0 endif return retval endfunction function WriteRealPointer2LVL takes integer addr, integer offset1, integer offset2, integer val returns nothing local integer retval = 0 if addr > 0 then set retval = ReadRealPointer1LVL(addr,offset1) if addr > 0 then call WriteRealMemory(retval + offset2,val) endif endif endfunction function ReadRealPointer3LVL takes integer addr, integer offset1, integer offset2, integer offset3 returns integer local integer retval = ReadRealPointer2LVL(addr,offset1,offset2) if retval > 0 then set retval = ReadRealMemory(retval + offset3) else set retval = 0 endif return retval endfunction function WriteRealPointer3LVL takes integer addr, integer offset1, integer offset2,integer offset3, integer val returns nothing local integer retval = 0 if addr > 0 then set retval = ReadRealPointer2LVL(addr,offset1,offset2) if addr > 0 then call WriteRealMemory(retval + offset3,val) endif endif endfunction function ReadRealPointer4LVL takes integer addr, integer offset1, integer offset2, integer offset3, integer offset4 returns integer local integer retval = ReadRealPointer3LVL(addr,offset1,offset2,offset3) if retval > 0 then set retval = ReadRealMemory(retval + offset4) else set retval = 0 endif return retval endfunction function WriteRealPointer4LVL takes integer addr, integer offset1, integer offset2,integer offset3, integer offset4, integer val returns nothing local integer retval = 0 if addr > 0 then set retval = ReadRealPointer3LVL(addr,offset1,offset2,offset3) if addr > 0 then call WriteRealMemory(retval + offset4,val) endif endif endfunction function ReadRealPointer5LVL takes integer addr, integer offset1, integer offset2, integer offset3, integer offset4, integer offset5 returns integer local integer retval = ReadRealPointer4LVL(addr,offset1,offset2,offset3,offset4) if retval > 0 then set retval = ReadRealMemory(retval + offset5) else set retval = 0 endif return retval endfunction function WriteRealPointer5LVL takes integer addr, integer offset1, integer offset2,integer offset3, integer offset4,integer offset5, integer val returns nothing local integer retval = 0 if addr > 0 then set retval = ReadRealPointer4LVL(addr,offset1,offset2,offset3,offset4) if addr > 0 then call WriteRealMemory(retval + offset5,val) endif endif endfunction function IsJassNativeExists takes integer nativeaddress returns boolean //local integer FirstAddress = Memory[Memory[Memory[pJassEnvAddress]/4+0x5]/4+8]/4 local integer FirstAddress = ReadRealPointer2LVL(pJassEnvAddress*4, 0x14, 0x20)/4 local integer NextAddress = FirstAddress local integer i = 0 loop if Memory[NextAddress+3]/4 == nativeaddress then return NextAddress+3 > 0 endif set NextAddress = Memory[NextAddress]/4 if NextAddress == FirstAddress or NextAddress == 0 then return false endif endloop return false endfunction function CreateJassNativeHook takes integer oldaddress, integer newaddress returns integer //[[[[Game.dll+ADA848]+14]+20] //local integer FirstAddress = Memory[Memory[Memory[pJassEnvAddress]/4+0x5]/4+8]/4 local integer FirstAddress = ReadRealPointer2LVL(pJassEnvAddress*4, 0x14, 0x20) local integer NextAddress = FirstAddress local integer i = 0 if RJassNativesBufferSize > 0 then loop set i = i + 1 if RJassNativesBuffer[ i * 3 - 3 ] == oldaddress or RJassNativesBuffer[ i * 3 - 2 ] == oldaddress or RJassNativesBuffer[ i * 3 - 3 ] == newaddress or RJassNativesBuffer[ i * 3 - 2 ] == newaddress then call WriteRealMemory(RJassNativesBuffer[ i * 3 - 1 ], newaddress) //call BJDebugMsg("Loaded from buffset.") return RJassNativesBuffer[ i * 3 - 1 ] endif exitwhen i == RJassNativesBufferSize endloop endif loop if ReadRealMemory(NextAddress+12) < 0x3000 then return 0 endif if ReadRealMemory(NextAddress+12) == oldaddress then call WriteRealMemory(NextAddress+12, newaddress) // Maximum store 100 values for fast load if RJassNativesBufferSize < 100 then set RJassNativesBufferSize = RJassNativesBufferSize + 1 set RJassNativesBuffer[ RJassNativesBufferSize * 3 - 1 ] = NextAddress + 12 set RJassNativesBuffer[ RJassNativesBufferSize * 3 - 2 ] = oldaddress set RJassNativesBuffer[ RJassNativesBufferSize * 3 - 3 ] = newaddress endif return NextAddress+12 endif set NextAddress = ReadRealMemory(NextAddress) if NextAddress == FirstAddress or NextAddress == 0 then return 0 endif endloop return 0 endfunction function Init27 takes nothing returns nothing local integer base set GameDLL = ReadRealMemory(GetBytecodeAddress())-0xA63B30 set base=GameDLL / 4 set GameState = base + 0x2F908E set pGameClass1 = base + 0x2F902A set pGameClass2 = base + 0xBE6350 / 4 set pCGameState = base + 0xBE4EAC / 4 set pointers = Memory[pGameClass1]/4 set pUnitData = GameDLL + 0xBEC48C set pAbilityData = GameDLL + 0xBECD44 set pGlobalPlayerClass = GameState //They are the same thing set pUnitMaxSpeedConstant = base + 0xBEC454 / 4 set pUnitMinSpeedConstant = base + 0xBEC450 / 4 set pBuildingMaxSpeedConstant = base + 0xBEC45C / 4 set pBuildingMinSpeedConstant = base + 0xBEC458 / 4 set pUnitMaxSpeedConstantD = base + 0xBEC464 / 4 set pUnitMinSpeedConstantD = base + 0xBEC460 / 4 set pBuildingMaxSpeedConstantD = base + 0xBEC46C / 4 set pBuildingMinSpeedConstantD = base + 0xBEC468 / 4 set pUnitUIDefAddr = GameDLL + 0xBE6130 set pUnitDataDefAddr = pUnitData// base + 0xBEC48C / 4 set pAbilityUIDefAddr = GameDLL + 0xBE6158 set pAbilityDataDefAddr = pAbilityData//base + 0xBECD44 / 4 set pAttackSpeedLimit = base + 0xBE7A04 / 4 set pAttackTimeLimit = base + 0xb593a0 / 4 set pJassEnvAddress = base + 0xBE3740 / 4 set pLightEnv = base + 0xBEE150 / 4 set pGameClass3 = base + 0xBB9D8C / 4 set pTimerAddr = base + 0xBB82BC / 4 set pGetModuleHandle = base + 0x94E184 / 4 set pGetProcAddress = base + 0x94E168 / 4 set pVirtualAlloc = base + 0x94E270 / 4 set pMergeUnits = GameDLL + 0x891F20 set pIgnoredUnits = GameDLL + 0x890FB0 set pConvertUnits = GameDLL + 0x88E350 set pLeaderboardSetItemLabelColor = base + 0x1EFF90 / 4 set pExportFromMpq = GameDLL + 0x702C50 set pGetFrameItemAddress = GameDLL + 0x09EF40 set pGetFrameSkinAddress = GameDLL + 0x324AD0 set pGetFrameTextAddress = GameDLL + 0x0C8EF0 set pUpdateFrameText = GameDLL + 0x0C1020 set pFrameDefClass = GameDLL + 0xBB9CFC set pPacketClass = GameDLL + 0x973210 set pPacketSend = GameDLL + 0x30F1B0 set pConvertString = GameDLL + 0x1DA520 set pStorm279 = base + 0x94E6C4 / 4 set pPrintText1 = GameDLL + 0x3574B0 set pPrintText2 = GameDLL + 0x356A60 set pPrintText3 = GameDLL + 0xc2070 set pChangeFont = GameDLL + 0x153E10 set pCameraDefaultHeight = base + 0x9714D0 / 4 set pPingMinimapOffset = GameDLL + 0x1F1BD0 set pPingMinimapExOffset = GameDLL + 0x1F1C30 set pAllianceOutput = GameDLL + 0x34E2C0 set pWindowIsActive = base + 0xB673EC / 4 set pSendCommandWithoutTarget = GameDLL + 0x3AE4E0 set pMissile = base + 0xBED23C / 4 set pOrder1_offset = GameDLL + 0x3AE4E0 set pOrder2_offset = GameDLL + 0x3AE540 set pOrder3_offset = GameDLL + 0x3AE5D0 set pOrder4_offset = GameDLL + 0x3AE660 set pOrder5_offset = GameDLL + 0x3AE6F0 set pOrder6_offset = GameDLL + 0x3AE780 set pOrder7_offset = GameDLL + 0x3AE810 set pOrder8_offset = GameDLL + 0x3AE880 set Order1_lockedvalue = 0x900010C2 set Order2_lockedvalue = 0x900018C2 set Order3_lockedvalue = 0x900020C2 set Order4_lockedvalue = 0x90001CC2 set Order5_lockedvalue = 0x90001CC2 set Order6_lockedvalue = 0x900020C2 set Order7_lockedvalue = 0x900014C2 set Order8_lockedvalue = 0x900014C2 set pStartAbilityCD = GameDLL + 0x62D4C0 set pUpdateFogManual = GameDLL + 0x26B600 set pFogUpdateBlockAddr = base + 0x26B5A8 / 4 set pFogUpdateBlockAddrNew1 = 0xC25D0004 set pFogUpdateBlockAddrNew2 = 0xB8900004 set OPLimitAddress1=GameDLL+0x1BFB48 set OPLimitAddress2=GameDLL+0x1BFB4C set pCycloneFixCondition=GameDLL+0x65B3F0 set pCaptionsOverTheCreeps=GameDLL+0x3B4180 set pPhaseShiftInvisibilityFlagByte=GameDLL+0x7ffdb8 set pGetUnitAbility = GameDLL + 0x46F440 set pGetUnitAddress = GameDLL + 0x1D1550 set p_sprintf = GameDLL + 0x94E464 set pMemcpy = GameDLL + 0x94E468 set pSearchStringValue = GameDLL + 0x06B030 set pSearchStringAddr1 = GameDLL + 0xBB9CD4 set pSearchStringAddr2 = GameDLL + 0xBB9CAC set pSimulateAttackInstance = GameDLL + 0x476F80 set pGameTime = GameDLL + 0xBE3D70 set pSetStunToUnitTRUE = GameDLL+0x66B600 set pSetStunToUnitFALSE = GameDLL+0x65AE60 set pCommonSilence=GameDLL+0x471C40 set pAddSilenceOnAbility=GameDLL+0x3E9FA0 set pRemoveSilenceFromAbility=GameDLL+0x3EE3C0 set pPauseUnitDisabler=GameDLL+0x46F180 set pUpdateUnitsSpeedCurrent=GameDLL+0x10C690 set pCastSilenceToTarget=GameDLL+0x3DA3C0 set pCastAbility=GameDLL+0x3ECB70 set pDamageBlockIllusionCheck=GameDLL+0x4E3040 set pItemDropOrderTriggerFix=GameDLL+0x65D520//9090f03b set pGetOrLoadFile = GameDLL + 0x4A800 set StoreIntegerOffset = GameDLL + 0x1F8280 set pUnitVtable = GameDLL + 0xA4A704 set pRealUnitDamageHandler = GameDLL + 0x67DC40 set pTriggerExecute = GameDLL + 0x1F9100 set pMissileFuncStart = GameDLL+0x476F80 set pMissileJumpBack = GameDLL+0x476F85 set pItemDataNode=GameDLL+0xBEC254+0x10 set GameVersion = 0x27a endfunction function Init26 takes nothing returns nothing local integer base set GameDLL = ReadRealMemory(GetBytecodeAddress())-0x951060 set base=GameDLL / 4 set GameState = base+0x2AD97D set pGameClass1 = base+0x2ADDE2 set pGameClass2 = base + 0xAB4F80 / 4 set pCGameState = base + 0xAB6EA4 / 4 set pointers = Memory[pGameClass1]/4 set pUnitData = GameDLL + 0xAB4478 set pAbilityData = GameDLL + 0xAB3E64 set pGlobalPlayerClass = GameState //base + 0xAB65F4 / 4 set pUnitMaxSpeedConstant = base + 0xAB4440 / 4 set pUnitMinSpeedConstant = base + 0xAB443C / 4 set pBuildingMaxSpeedConstant = base + 0xAB4448 / 4 set pBuildingMinSpeedConstant = base + 0xAB4444 / 4 set pUnitMaxSpeedConstantD = base + 0xAB4450/ 4 set pUnitMinSpeedConstantD = base + 0xAB444C / 4 set pBuildingMaxSpeedConstantD = base + 0xAB4458 / 4 set pBuildingMinSpeedConstantD = base + 0xAB4454 / 4 set pUnitUIDefAddr = GameDLL + 0xAB58F0 set pUnitDataDefAddr = pUnitData set pAbilityUIDefAddr = GameDLL + 0xAB5918 set pAbilityDataDefAddr = pAbilityData set pAttackSpeedLimit = base + 0xAB0074 / 4 set pAttackTimeLimit = base + 0xAAE484 / 4 set pJassEnvAddress = base + 0xADA848 / 4 set pLightEnv = base + 0xAAE788 / 4 set pGameClass3 = base + 0xACE670 / 4 set pTimerAddr = base + 0xAB7368 / 4 set pGetModuleHandle = base + 0x86D1D0 / 4 set pGetProcAddress = base + 0x86D280 / 4 set pVirtualAlloc = base + 0x86D0F4 / 4 set pMergeUnits = GameDLL + 0x2DD320 set pIgnoredUnits = GameDLL + 0x2DCE80 set pConvertUnits = GameDLL + 0x2DD2E0 set pLeaderboardSetItemLabelColor = base + 0x3CC5B0 / 4 set pExportFromMpq = GameDLL + 0x737F00 set pGetFrameItemAddress = GameDLL + 0x5FA970 set pGetFrameSkinAddress = GameDLL + 0x31F530 set pGetFrameTextAddress = GameDLL + 0x61C7B0 set pUpdateFrameText = GameDLL + 0x60CA10 set pFrameDefClass = GameDLL + 0xACD264 set pPacketClass = GameDLL + 0x932D2C set pPacketSend = GameDLL + 0x54D970 set pConvertString = GameDLL + 0x3BAA20 set pStorm279 = base + 0x86D5B8 / 4 set pPrintText1 = GameDLL + 0x2F3CF0 set pPrintText2 = GameDLL + 0x2F3CB0 set pPrintText3 = GameDLL + 0x6049B0 set pChangeFont = GameDLL + 0x7AE910 set pCameraDefaultHeight = base + 0x93645C / 4 set pPingMinimapOffset = GameDLL + 0x3B4650 set pPingMinimapExOffset = GameDLL + 0x3B8660 set pAllianceOutput = GameDLL + 0x2FB1F0 set pWindowIsActive = base + 0xA9E7A4 / 4 set pSendCommandWithoutTarget = GameDLL + 0x339C60 set pMissile = base + 0xAB4CD8 / 4 set pOrder1_offset = GameDLL + 0x339C60 set pOrder2_offset = GameDLL + 0x339CC0 set pOrder3_offset = GameDLL + 0x339D50 set pOrder4_offset = GameDLL + 0x339DD0 set pOrder5_offset = GameDLL + 0x339E60 set pOrder6_offset = GameDLL + 0x339F00 set pOrder7_offset = GameDLL + 0x339F80 set pOrder8_offset = GameDLL + 0x33A010 set Order1_lockedvalue = 0x900010C2 set Order2_lockedvalue = 0x900018C2 set Order3_lockedvalue = 0x900014C2 set Order4_lockedvalue = 0x90001CC2 set Order5_lockedvalue = 0x900020C2 set Order6_lockedvalue = 0x900014C2 set Order7_lockedvalue = 0x90001CC2 set Order8_lockedvalue = 0x900020C2 set pStartAbilityCD = GameDLL + 0x126990 set pUpdateFogManual = GameDLL + 0x4299e0 set pFogUpdateBlockAddr = base + 0x42fcd4 / 4 set pFogUpdateBlockAddrNew1 = 0x0004C200 set pFogUpdateBlockAddrNew2 = 0x01B89090 set OPLimitAddress1=GameDLL+0x3A8388 set OPLimitAddress2=GameDLL+0x3A838C set pCycloneFixCondition=GameDLL+0x29C25C set pCaptionsOverTheCreeps=GameDLL+0x35BB20 set pPhaseShiftInvisibilityFlagByte=GameDLL+0x135D9C set pGetUnitAbility = GameDLL + 0x787D0 set pGetUnitAddress = GameDLL + 0x3BDCB0 set p_sprintf = GameDLL + 0x86D32C set pMemcpy = GameDLL + 0x86D3CC set pSearchStringValue = GameDLL + 0x5C8ED0 set pSearchStringAddr1 = GameDLL + 0xACD23C set pSearchStringAddr2 = GameDLL + 0xACD214 set pSimulateAttackInstance = GameDLL + 0xCF660 set pGameTime = GameDLL + 0xAB7E98 set pSetStunToUnitTRUE = GameDLL+0x2A6440 set pSetStunToUnitFALSE = GameDLL+0x282B30 set pCommonSilence=GameDLL+0x076770 set pAddSilenceOnAbility=GameDLL+0x052B60 set pRemoveSilenceFromAbility=GameDLL+0x052BC0 set pPauseUnitDisabler=GameDLL+0x0767F0 set pUpdateUnitsSpeedCurrent=GameDLL+0x4A73F0 set pCastSilenceToTarget=GameDLL+0xB65F0 set pCastAbility=GameDLL+0x05C3A0 set pDamageBlockIllusionCheck=GameDLL+0x1EA0F0 set pItemDropOrderTriggerFix=GameDLL+0x29E064//9090c83b set pGetOrLoadFile = GameDLL + 0x4C1300 set StoreIntegerOffset = GameDLL + 0x3CA0A0 set pUnitVtable = GameDLL + 0x931934 set pRealUnitDamageHandler = GameDLL + 0x2A40D0 set pTriggerExecute = GameDLL + 0x3C3F40 set pMissileFuncStart = GameDLL+0xCF660 set pMissileJumpBack = GameDLL+0xCF667 set pItemDataNode=GameDLL+0xAB4BF4+0x10 set GameVersion = 0x26a endfunction function Init24b takes nothing returns nothing local integer base = ReadRealMemory(GetBytecodeAddress())-0x9631A0 set GameDLL = base set base = base / 4 set GameState = base+0x2B3513 set pGameClass1 = base+0x2B3978 set pointers = Memory[pGameClass1]/4 set pUnitData = GameDLL+0xACB2D0 set pAbilityData = GameDLL+0xACACBC set pUnitDataDefAddr = pUnitData set pGlobalPlayerClass = GameState set pAbilityDataDefAddr = pAbilityData set GameVersion = 0x24b endfunction function SetMaxUnitSpeed takes real r returns nothing set Memory[pUnitMaxSpeedConstant] = cleanInt(realToIndex(r)) set Memory[pUnitMaxSpeedConstantD] = cleanInt(realToIndex(r)) endfunction function GetMaxUnitSpeed takes nothing returns real return GetRealFromMemory(Memory[pUnitMaxSpeedConstant]) endfunction function SetMinUnitSpeed takes real r returns nothing set Memory[pUnitMinSpeedConstant] = cleanInt(realToIndex(r)) set Memory[pUnitMinSpeedConstantD] = cleanInt(realToIndex(r)) endfunction function GetMinUnitSpeed takes nothing returns real return cleanReal(indexToReal(Memory[pUnitMinSpeedConstant])) endfunction function SetMaxBuildingSpeed takes real r returns nothing set Memory[pBuildingMaxSpeedConstant] = cleanInt(realToIndex(r)) set Memory[pBuildingMaxSpeedConstantD] = cleanInt(realToIndex(r)) endfunction function GetMaxBuildingSpeed takes nothing returns real return cleanReal(indexToReal(Memory[pBuildingMaxSpeedConstant])) endfunction function SetMinBuildingSpeed takes real r returns nothing set Memory[pBuildingMinSpeedConstant] = cleanInt(realToIndex(r)) set Memory[pBuildingMinSpeedConstantD] = cleanInt(realToIndex(r)) endfunction function GetMinBuildingSpeed takes nothing returns real return cleanReal(indexToReal(Memory[pBuildingMinSpeedConstant])) endfunction function GetAttackSpeedLimit takes nothing returns real return cleanReal(indexToReal(Memory[pAttackSpeedLimit])) endfunction function SetAttackSpeedLimit takes real r returns nothing set Memory[pAttackSpeedLimit] = cleanInt(realToIndex(r)) endfunction function GetAttackTimeLimit takes nothing returns real return cleanReal(indexToReal(Memory[pAttackTimeLimit])) endfunction function SetAttackTimeLimit takes real r returns nothing set Memory[pAttackTimeLimit] = cleanInt(realToIndex(r)) endfunction function SaveConstantsValues takes nothing returns nothing set UnitMaxSpeedConstant = GetMaxUnitSpeed( ) set UnitMinSpeedConstant = GetMinUnitSpeed( ) set BuildingMaxSpeedConstant = GetMaxBuildingSpeed( ) set BuildingMinSpeedConstant = GetMinBuildingSpeed( ) set AttackSpeedLimit = GetAttackSpeedLimit( ) set AttackTimeLimit = GetAttackTimeLimit( ) endfunction function ResetConstantsValues takes nothing returns nothing call SetMaxUnitSpeed( UnitMaxSpeedConstant) call SetMinUnitSpeed( UnitMinSpeedConstant) call SetMaxBuildingSpeed( BuildingMaxSpeedConstant ) call SetMinBuildingSpeed( BuildingMinSpeedConstant) call SetAttackSpeedLimit( AttackSpeedLimit) call SetAttackTimeLimit( AttackTimeLimit) call ExecuteFunc("RestoreCameraOffsets") endfunction // replace war3map.j to recovery.j function LockOtherMaps takes nothing returns nothing //0x6F636572 //0x726576 endfunction // replace recovery.j back to war3map.j function UnlockOtherMaps takes nothing returns nothing //0x33726177 //0x70616D endfunction //library Memory ends //library Bitwise: function GetGameTypeSupported takes nothing returns integer //return Memory[Memory[Memory[GameState] / 4 + 12] / 4 + 12] return ReadRealPointer2LVL(GameState*4,48,48) endfunction //function BitwiseNot takes integer i returns integer // return 0xFFFFFFFF - i //endfunction // //function BitwiseOrOld takes integer a,integer b returns integer // //set Memory[Memory[Memory[GameState]/4+12]/4+12] = a // call SetGameTypeSupported(GAME_TYPE_ALL, false) // call SetGameTypeSupported(ConvertGameType(a), true) // call SetGameTypeSupported(ConvertGameType(b), true) // return GetGameTypeSupported() //endfunction // //function BitwiseAndOld takes integer a,integer b returns integer // //set Memory[Memory[Memory[GameState]/4+12]/4+12] = a // call SetGameTypeSupported(GAME_TYPE_ALL, false) // call SetGameTypeSupported(ConvertGameType(a), true) // call SetGameTypeSupported(ConvertGameType(BitwiseNot(b)), false) // return GetGameTypeSupported() //endfunction //function BitwiseXorOld takes integer a,integer b returns integer // local integer i // //set Memory[Memory[Memory[GameState]/4+12]/4+12] = a // call SetGameTypeSupported(GAME_TYPE_ALL, false) // call SetGameTypeSupported(ConvertGameType(a), true) // call SetGameTypeSupported(ConvertGameType(b), false) // set i=GetGameTypeSupported() // call SetGameTypeSupported(ConvertGameType(b), true) // call SetGameTypeSupported(ConvertGameType(a), false) // call SetGameTypeSupported(ConvertGameType(i), true) // return GetGameTypeSupported() //endfunction function BitwiseOr takes integer arg1, integer arg2 returns integer local integer retval if NeedInitBitwiseOr == true then set NeedInitBitwiseOr = false set Memory[pBitwiseOR_ExecutableMemory/4] = 0x0424448B set Memory[pBitwiseOR_ExecutableMemory/4 + 1] = 0x0824548B set Memory[pBitwiseOR_ExecutableMemory/4 + 2] = 0xCCC3D009 endif if pConvertUnitsOffset == 0 then set pConvertUnitsOffset = CreateJassNativeHook(pConvertUnits,pBitwiseOR_ExecutableMemory ) else call WriteRealMemory(pConvertUnitsOffset, pBitwiseOR_ExecutableMemory) endif if pConvertUnitsOffset != 0 then set retval = B2I(ConvertUnits( arg1,arg2 )) call WriteRealMemory(pConvertUnitsOffset, pConvertUnits) return retval endif return 0 endfunction function BitwiseXor takes integer arg1, integer arg2 returns integer local integer retval if NeedInitBitwiseXor == true then set NeedInitBitwiseXor = false set Memory[pBitwiseXOR_ExecutableMemory/4] = 0x0424448B set Memory[pBitwiseXOR_ExecutableMemory/4 + 1] = 0x0824548B set Memory[pBitwiseXOR_ExecutableMemory/4 + 2] = 0xCCC3D031 endif if pConvertUnitsOffset == 0 then set pConvertUnitsOffset = CreateJassNativeHook(pConvertUnits,pBitwiseXOR_ExecutableMemory ) else call WriteRealMemory(pConvertUnitsOffset, pBitwiseXOR_ExecutableMemory) endif if pConvertUnitsOffset != 0 then set retval = B2I(ConvertUnits( arg1,arg2 )) call WriteRealMemory(pConvertUnitsOffset,pConvertUnits) return retval endif return 0 endfunction function BitwiseAnd takes integer arg1, integer arg2 returns integer local integer retval if NeedInitBitwiseAnd == true then set NeedInitBitwiseAnd = false set Memory[pBitwiseAND_ExecutableMemory/4] = 0x0424448B set Memory[pBitwiseAND_ExecutableMemory/4 + 1] = 0x0824548B set Memory[pBitwiseAND_ExecutableMemory/4 + 2] = 0xCCC3D021 endif if pConvertUnitsOffset == 0 then set pConvertUnitsOffset = CreateJassNativeHook(pConvertUnits,pBitwiseAND_ExecutableMemory ) else call WriteRealMemory(pConvertUnitsOffset, pBitwiseAND_ExecutableMemory) endif if pConvertUnitsOffset != 0 then set retval = B2I(ConvertUnits( arg1,arg2 )) call WriteRealMemory(pConvertUnitsOffset, pConvertUnits) return retval endif return 0 endfunction //library Bitwise ends //library StringId: function StringId__Int2Char takes integer i returns string local string s= Ascii2Char(i) if s == null then set s="\\x" + Int2Hex(i) endif return s endfunction function Id2String takes integer i returns string local string result= "" local integer char loop set char=i set i=i / 256 set result=StringId__Int2Char(char - i * 256) + result exitwhen i == 0 endloop return result endfunction function String2Id takes string s returns integer local integer result= 0 local integer i= 0 loop set result=result * 256 + Char2Ascii(SubString(s, i, i + 1)) set i=i + 1 exitwhen i == 4 endloop return result endfunction //library StringId ends //library ObjectData: function IntegerHash takes integer i returns integer local integer a= 0x7FED7FED local integer b= 0xEEEEEEEE local integer byte loop set byte=i * 16777216 / 16777216 set a=BitwiseXor(a + b , H[byte]) set i=i / 256 exitwhen i == 0 set b=b * 32 + a + b + byte + 3 endloop return a endfunction function GetObjectData takes integer pData,integer rawcode returns integer local integer hash = IntegerHash(rawcode) local integer list = ReadRealMemory(pData) / 4 + ModuloInteger(hash, ReadRealMemory(pData + 8) + 1) * 3 local integer i = Memory[list + 2] / 4 loop exitwhen i <= 0 if Memory[i] == hash and Memory[i + 5] == rawcode then return i endif set i = Memory[Memory[list] / 4 + i + 1] / 4 endloop return 0 endfunction function GetObjectDataCaching takes integer pData, integer rawcode returns integer local integer k if HaveSavedInteger(ObjectDataPointersTable,pData,rawcode) then return LoadInteger(ObjectDataPointersTable,pData,rawcode) endif set k=GetObjectData(pData,rawcode) call SaveInteger(ObjectDataPointersTable,pData,rawcode,k) return k endfunction function ObjectData__Init takes nothing returns nothing set H[1]=0xA22E726E set H[2]=0xD43D94C0 set H[3]=0x6DE064C7 set H[4]=0xFE8D4B2F set H[5]=0x345A287E set H[6]=0x13941BCF set H[7]=0xD822114D set H[8]=0xA79E1270 set H[9]=0xFB2D4CF9 set H[10]=0xCB25DDAE set H[11]=0x7B5E64D5 set H[12]=0x88544672 set H[13]=0xF201BF3F set H[14]=0x677CAF6E set H[15]=0x34502020 set H[16]=0x5DD18D92 set H[18]=0x320F2252 set H[19]=0xCBB1F259 set H[20]=0x5C5ED8C1 set H[21]=0x922BB610 set H[22]=0x7165A961 set H[23]=0x35F39EDF set H[24]=0x056FA002 set H[25]=0x58FEDA8B set H[26]=0x28F76B40 set H[27]=0xD92FF267 set H[28]=0xE625D404 set H[29]=0x4FD34CD1 set H[30]=0xC54E3D00 set H[31]=0x9221ADB2 set H[32]=0x2BC26B40 set H[33]=0xCDF0DDAE set H[35]=0x99A2D007 set H[36]=0x2A4FB66F set H[37]=0x601C93BE set H[38]=0x3F56870F set H[39]=0x03E47C8D set H[40]=0xD3607DB0 set H[41]=0x26EFB839 set H[42]=0xF6E848EE set H[43]=0xA720D015 set H[44]=0xB416B1B2 set H[45]=0x1DC42A7F set H[46]=0x933F1AAE set H[47]=0x60128B60 set H[48]=0x921F9B39 set H[49]=0x344E0DA7 set H[50]=0x665D2FF9 set H[52]=0x90ACE668 set H[53]=0xC679C3B7 set H[54]=0xA5B3B708 set H[55]=0x6A41AC86 set H[56]=0x39BDADA9 set H[57]=0x8D4CE832 set H[58]=0x5D4578E7 set H[59]=0x0D7E000E set H[60]=0x1A73E1AB set H[61]=0x84215A78 set H[62]=0xF99C4AA7 set H[63]=0xC66FBB59 set H[64]=0x0172B4D1 set H[65]=0xA3A1273F set H[66]=0xD5B04991 set H[67]=0x6F531998 set H[69]=0x35CCDD4F set H[70]=0x1506D0A0 set H[71]=0xD994C61E set H[72]=0xA910C741 set H[73]=0xFCA001CA set H[74]=0xCC98927F set H[75]=0x7CD119A6 set H[76]=0x89C6FB43 set H[77]=0xF3747410 set H[78]=0x68EF643F set H[79]=0x35C2D4F1 set H[80]=0xCBA5D782 set H[81]=0x6DD449F0 set H[82]=0x9FE36C42 set H[83]=0x39863C49 set H[84]=0xCA3322B1 set H[86]=0xDF39F351 set H[87]=0xA3C7E8CF set H[88]=0x7343E9F2 set H[89]=0xC6D3247B set H[90]=0x96CBB530 set H[91]=0x47043C57 set H[92]=0x53FA1DF4 set H[93]=0xBDA796C1 set H[94]=0x332286F0 set H[95]=0xFFF5F7A2 set H[96]=0xEC6BE431 set H[97]=0x8E9A569F set H[98]=0xC0A978F1 set H[99]=0x5A4C48F8 set H[100]=0xEAF92F60 set H[101]=0x20C60CAF set H[103]=0xC48DF57E set H[104]=0x9409F6A1 set H[105]=0xE799312A set H[106]=0xB791C1DF set H[107]=0x67CA4906 set H[108]=0x74C02AA3 set H[109]=0xDE6DA370 set H[110]=0x53E8939F set H[111]=0x20BC0451 set H[112]=0x27DDEEB3 set H[113]=0xCA0C6121 set H[114]=0xFC1B8373 set H[115]=0x95BE537A set H[116]=0x266B39E2 set H[117]=0x5C381731 set H[118]=0x3B720A82 set H[120]=0xCF7C0123 set H[121]=0x230B3BAC set H[122]=0xF303CC61 set H[123]=0xA33C5388 set H[124]=0xB0323525 set H[125]=0x19DFADF2 set H[126]=0x8F5A9E21 set H[127]=0x5C2E0ED3 set H[128]=0x5861ED90 set H[129]=0xFA905FFE set H[130]=0x2C9F8250 set H[131]=0xC6425257 set H[132]=0x56EF38BF set H[133]=0x8CBC160E set H[134]=0x6BF6095F set H[135]=0x3083FEDD set H[137]=0x538F3A89 set H[138]=0x2387CB3E set H[139]=0xD3C05265 set H[140]=0xE0B63402 set H[141]=0x4A63ACCF set H[142]=0xBFDE9CFE set H[143]=0x8CB20DB0 set H[144]=0x04D2B307 set H[145]=0xA7012575 set H[146]=0xD91047C7 set H[147]=0x72B317CE set H[148]=0x035FFE36 set H[149]=0x392CDB85 set H[150]=0x1866CED6 set H[151]=0xDCF4C454 set H[152]=0xAC70C577 set H[154]=0xCFF890B5 set H[155]=0x803117DC set H[156]=0x8D26F979 set H[157]=0xF6D47246 set H[158]=0x6C4F6275 set H[159]=0x3922D327 set H[160]=0x34DA2252 set H[161]=0xD70894C0 set H[162]=0x0917B712 set H[163]=0xA2BA8719 set H[164]=0x33676D81 set H[165]=0x69344AD0 set H[166]=0x486E3E21 set H[167]=0x0CFC339F set H[168]=0xDC7834C2 set H[169]=0x30076F4B set H[171]=0xB0388727 set H[172]=0xBD2E68C4 set H[173]=0x26DBE191 set H[174]=0x9C56D1C0 set H[175]=0x692A4272 set H[176]=0x84A19B2B set H[177]=0x26D00D99 set H[178]=0x58DF2FEB set H[179]=0xF281FFF2 set H[180]=0x832EE65A set H[181]=0xB8FBC3A9 set H[182]=0x9835B6FA set H[183]=0x5CC3AC78 set H[184]=0x2C3FAD9B set H[185]=0x7FCEE824 set H[186]=0x4FC778D9 set H[188]=0x0CF5E19D set H[189]=0x76A35A6A set H[190]=0xEC1E4A99 set H[191]=0xB8F1BB4B set H[192]=0x77ABB98E set H[193]=0x19DA2BFC set H[194]=0x4BE94E4E set H[195]=0xE58C1E55 set H[196]=0x763904BD set H[197]=0xAC05E20C set H[198]=0x8B3FD55D set H[199]=0x4FCDCADB set H[200]=0x1F49CBFE set H[201]=0x72D90687 set H[202]=0x42D1973C set H[203]=0xF30A1E63 set H[205]=0x69AD78CD set H[206]=0xDF2868FC set H[207]=0xABFBD9AE set H[208]=0x0DFE40C1 set H[209]=0xB02CB32F set H[210]=0xE23BD581 set H[211]=0x7BDEA588 set H[212]=0x0C8B8BF0 set H[213]=0x4258693F set H[214]=0x21925C90 set H[215]=0xE620520E set H[216]=0xB59C5331 set H[217]=0x092B8DBA set H[218]=0xD9241E6F set H[219]=0x895CA596 set H[220]=0x96528733 set H[222]=0x757AF02F set H[223]=0x424E60E1 set H[224]=0x98835092 set H[225]=0x3AB1C300 set H[226]=0x6CC0E552 set H[227]=0x0663B559 set H[228]=0x97109BC1 set H[229]=0xCCDD7910 set H[230]=0xAC176C61 set H[231]=0x70A561DF set H[232]=0x40216302 set H[233]=0x93B09D8B set H[234]=0x63A92E40 set H[235]=0x13E1B567 set H[236]=0x20D79704 set H[237]=0x8A850FD1 set H[239]=0xCCD370B2 set H[240]=0xCBAFDFE0 set H[241]=0x6DDE524E set H[242]=0x9FED74A0 set H[243]=0x399044A7 set H[244]=0xCA3D2B0F set H[245]=0x000A085E set H[246]=0xDF43FBAF set H[247]=0xA3D1F12D set H[248]=0x734DF250 set H[249]=0xC6DD2CD9 set H[250]=0x96D5BD8E set H[251]=0x470E44B5 set H[252]=0x54042652 set H[253]=0xBDB19F1F set H[254]=0x332C8F4E endfunction //library ObjectData ends //library Utils: function ConvertHandle takes handle h returns integer if GetHandleId(h)>0 then return Memory[Memory[Memory[Memory[GameState] / 4 + 7] / 4 + 103] / 4 + GetHandleId(h) * 3 - 0x2FFFFF] endif return 0 endfunction function ConvertPointer takes integer ptr returns integer local integer i= Memory[ptr / 4] if i < 0 then return Memory[Memory[pointers + 11] / 4 - i * 2 + 1] endif return Memory[Memory[pointers + 3] / 4 + i * 2 + 1] endfunction function GetUnitFlags takes unit u returns integer return Memory[ConvertHandle(u) / 4 + 23] endfunction function SetUnitFlags takes unit u,integer i returns nothing set Memory[ConvertHandle(u) / 4 + 23]=i endfunction function IsFlagBitSet takes integer flags, integer bit returns boolean return flags/bit*2147483648 != 0 endfunction //armor types: // 0 - Light; 1 - Medium; 2 - Heavy; 3 - Fortified; 4 - Normal; 5 - Hero; 6 - Divine; 7 - unarmored; //rest seems to have Light properties function GetUnitArmorType takes unit u returns integer return Memory[(ConvertHandle(u) + 0xE4)/4] endfunction function SetUnitArmorType takes unit u, integer id returns nothing set Memory[(ConvertHandle(u) + 0xE4)/4]=id endfunction function GetUnitArmor takes unit u returns real return indexToReal(Memory[ConvertHandle(u) / 4 + 56]) endfunction function SetUnitArmor takes unit u,real r returns nothing set Memory[ConvertHandle(u) / 4 + 56]=cleanInt(realToIndex(r)) endfunction function SetUnitTypeId takes unit u,integer i returns nothing set Memory[ConvertHandle(u) / 4 + 12]=i endfunction function GetUnitTypeIdReal takes integer i returns integer return Memory[i / 4 + 12] endfunction function SetUnitPhased takes unit u returns nothing local integer data= GetObjectDataCaching(pUnitData , GetUnitTypeId(u)) + 107 local integer p1= Memory[data] local integer p2= Memory[data + 1] // call BJDebugMsg(Int2Hex((data-107)*4)) set Memory[data]=8 set Memory[data + 1]=16 call SetUnitPathing(u, true) set Memory[data]=p1 set Memory[data + 1]=p2 endfunction function GetAbilityX takes ability a, integer x returns real if x==20 then return Memory[Memory[Memory[ConvertHandle(a)/4+21]/4+21]/4-(41-x)+1*26]*1.0 else return indexToReal(Memory[Memory[Memory[ConvertHandle(a)/4+21]/4+21]/4-(41-x)+1*26]) endif endfunction function SetAbilityX takes ability a, integer x, real d returns nothing if x==20 then set Memory[Memory[Memory[ConvertHandle(a)/4+21]/4+21]/4+1*26-(2+x)]=R2I(d) else set Memory[Memory[Memory[ConvertHandle(a)/4+21]/4+21]/4+1*26-(2+x)]=cleanInt(realToIndex(d)) endif endfunction function GetUnitFlags_2 takes unit u returns integer return Memory[ConvertHandle(u) / 4 + 8] endfunction function SetUnitFlags_2 takes unit u,integer i returns nothing set Memory[ConvertHandle(u) / 4 + 8]=i endfunction // Real - addres in memory function GetRealPlayerById takes integer i returns integer local integer pladdr = Memory[pGlobalPlayerClass] + ( i * 4 ) + 0x58 return Memory[pladdr/4] endfunction function GetLocalPlayerIdReal takes nothing returns integer return Memory[Memory[pGlobalPlayerClass]/4+0xA] endfunction function GetLocalPlayerReal takes nothing returns integer return GetRealPlayerById(GetLocalPlayerIdReal( ) ) endfunction // Get Selected Unit function GetPlayerSelectedUnitReal takes integer realplayer returns integer local integer pladdr = realplayer/4 + 0xD set pladdr = Memory[pladdr] set pladdr = pladdr + 0x1E0 return Memory[pladdr/4] endfunction function SetPlayerSelectedUnitReal takes integer realplayer, integer pConvertedHandle returns nothing local integer pladdr = realplayer/4 + 0xD set pladdr = Memory[pladdr] set pladdr = pladdr + 0x1E0 set Memory[pladdr/4] = pConvertedHandle endfunction function GetUnitVertexColorB takes unit u returns integer return GetByteFromInteger(Memory[(Memory[ConvertHandle(u) / 4 + 0xA]+328)/4],4) endfunction function GetUnitVertexColorG takes unit u returns integer return GetByteFromInteger(Memory[(Memory[ConvertHandle(u) / 4 + 0xA]+328)/4],3) endfunction function GetUnitVertexColorR takes unit u returns integer return GetByteFromInteger(Memory[(Memory[ConvertHandle(u) / 4 + 0xA]+328)/4],2) endfunction function GetUnitVertexColorA takes unit u returns integer return GetByteFromInteger(Memory[(Memory[ConvertHandle(u) / 4 + 0xA]+328)/4],1) endfunction function GetUnitVertexColorB_2 takes unit u returns integer return GetByteFromInteger(Memory[ConvertHandle(u) / 4 + 181],4) endfunction function GetUnitVertexColorG_2 takes unit u returns integer return GetByteFromInteger(Memory[ConvertHandle(u) / 4 + 181],3) endfunction function GetUnitVertexColorR_2 takes unit u returns integer return GetByteFromInteger(Memory[ConvertHandle(u) / 4 + 181],2) endfunction function GetUnitVertexColorA_2 takes unit u returns integer return GetByteFromInteger(Memory[ConvertHandle(u) / 4 + 181],1) endfunction function SetUnitColorDirectlyForAddresss takes integer pConvertedHandle, integer red, integer green, integer blue, integer alpha returns nothing //, real fadetime returns nothing local integer resultcolor = CreateInteger1(alpha,red,green,blue) local integer colorflag = 0 set Memory[(Memory[pConvertedHandle / 4 + 0xA]+328)/4] = resultcolor //set Memory[(Memory[pConvertedHandle / 4 + 0xA]+324)/4] = cleanInt(realToIndex(fadetime)) set Memory[(Memory[pConvertedHandle / 4 + 0xA]+320)/4] = 0 set Memory[(Memory[pConvertedHandle / 4 + 0xA]+316)/4] = 0 set colorflag = Memory[(Memory[pConvertedHandle / 4 + 0xA]+312)/4] if BitwiseAnd( colorflag, 0x800) == 0 then set Memory[(Memory[pConvertedHandle / 4 + 0xA]+312)/4] = BitwiseXor(colorflag, 0x800) endif endfunction function echo takes string s returns nothing if IsL1ch then call DisplayTimedTextToPlayer(LocalPlayer,0,0,30,s) endif endfunction function SetUnitColorDirectly takes unit u, integer red, integer green, integer blue, integer alpha returns nothing // call echo(Int2Hex(ConvertHandle(u))) call SetUnitColorDirectlyForAddresss(ConvertHandle(u),red,green,blue,alpha) endfunction function GetJassContext takes integer id returns integer return Memory[Memory[Memory[Memory[pJassEnvAddress]/4+5]/4+36]/4+id] endfunction function GetStringAddress takes string s returns integer return Memory[Memory[Memory[Memory[GetJassContext(1)/4+2589]/4+2]/4+SH2I(s)*4+2]/4+7] endfunction function WriteNullTerminatedString takes string s, integer i_address returns nothing set Memory[i_address/4] = GetStringAddress(s) endfunction function GetDefAddr takes integer id, integer class, integer first, integer currentOffset returns integer local integer FirstDataDefEntry = ReadRealMemory(first) local integer CurrentDefAddr = Memory[FirstDataDefEntry/4 + 2] + currentOffset local integer FirstDefAddr = CurrentDefAddr local integer CurrentDefId = 0 local integer CurrentDefId2 = 0 if FirstDataDefEntry == 0 then return 0 endif // if HaveSavedInteger(Addresses,id,class)then // return LoadInteger(Addresses,id,class) - 0xC // endif // if HaveSavedInteger(Addresses,class,0)then // set CurrentDefAddr=LoadInteger(Addresses,class,0) // set FirstDefAddr=LoadInteger(Addresses,class,1) // call echo("address preloaded") // elseif HaveSavedInteger(Addresses,class,1)==false then // call echo("first address saved") // call SaveInteger(Addresses,class,1,FirstDefAddr) // endif loop set CurrentDefId = Memory[CurrentDefAddr/4+2] // call SaveInteger(Addresses,CurrentDefId,class,CurrentDefAddr) // call SaveInteger(Addresses,class,0,CurrentDefAddr) // call echo(Id2String(CurrentDefId)) if HaveSavedInteger(ObjectDataPointersTable,class,CurrentDefId)==false then // call echo("Cached "+Id2String(CurrentDefId)) call SaveInteger(ObjectDataPointersTable,class,CurrentDefId,CurrentDefAddr - 0xC) endif exitwhen CurrentDefId == id set CurrentDefAddr = Memory[CurrentDefAddr/4] if CurrentDefAddr == 0 or CurrentDefAddr == FirstDefAddr then // if CurrentDefAddr == 0 then // call echo("drop for null") // else // call echo("drop for start") // endif return 0 endif endloop if CurrentDefAddr == 0 then // call echo("drop for zero") return 0 endif return CurrentDefAddr - 0xC// as GetObjectData*4 but search only by id.. endfunction function GetDefAddrCaching takes integer id, integer class, integer first, integer currentOffset returns integer if HaveSavedInteger(ObjectDataPointersTable,class,id) then // call echo("loaded") return LoadInteger(ObjectDataPointersTable,class,id) endif return GetDefAddr(id,class,first,currentOffset) endfunction function GetUnitDataDefAddr takes integer id returns integer return GetDefAddrCaching(id,DEF_ADR_UNIT_DATA,pUnitDataDefAddr,0xC) endfunction function GetUnitUIDefAddr takes integer id returns integer return GetDefAddrCaching(id,DEF_ADR_UNIT_UI,pUnitUIDefAddr,0x10) endfunction function GetAbilityDataDefAddr takes integer id returns integer return GetDefAddrCaching(id,DEF_ADR_ABILITY_DATA,pAbilityDataDefAddr,0xC) endfunction function GetAbilityUIDefAddr takes integer id returns integer return GetDefAddrCaching(id,DEF_ADR_ABILITY_UI,pAbilityUIDefAddr,0x10) endfunction //1 = str, 2 = int, 3 = agi function GetHeroPrimaryAttribute takes unit u returns integer local integer a=ConvertHandle(u) if a>0 then set a=ReadRealMemory(a + 0x1F0) if a>0 then return ReadRealMemory(a+0xCC) endif endif return 0 endfunction function GetHeroPrimaryAttributeById takes integer id returns integer local integer a=GetUnitDataDefAddr(id) if a>0 then return ReadRealMemory(a + 0x17C) endif return 0 endfunction function SetHeroPrimaryAttribute takes unit u,integer i returns nothing if IsUnitIdType(GetUnitTypeId(u),UNIT_TYPE_HERO) then set Memory[Memory[ConvertHandle(u) / 4 + 124] / 4 + 51]=i endif endfunction function PrintJassNatives takes nothing returns nothing //[[[[Game.dll+ADA848]+14]+20] local integer FirstAddress = Memory[Memory[Memory[pJassEnvAddress]/4+0x5]/4+8]/4 local integer NextAddress = FirstAddress call PreloadEndEx() call PreloadGenClear() call PreloadGenStart() loop set NextAddress = Memory[NextAddress]/4 set testFunctionCount = testFunctionCount + 1 call Preload("native add "+Int2Hex(Memory[NextAddress+0xC/4])) if NextAddress == FirstAddress or NextAddress == 0 then call PreloadGenEnd("natives"+R2S(GetRandomReal(0,500))+".txt") call PreloadGenClear() return endif endloop endfunction function SetAbilityManaCost takes integer abil, integer level, integer cost returns nothing local integer a=GetObjectDataCaching(pAbilityData, abil) if a>0 then set a=Memory[a+21] if a>0 then set Memory[a/4-22+level*26]=cost endif endif endfunction function GetAbilityManaCost takes integer abil, integer level returns integer local integer a=GetObjectDataCaching(pAbilityData, abil) if a>0 then set a=Memory[a+21] if a>0 then return Memory[a/4-22+level*26] endif endif return 0 endfunction function GetAbilityManaCostAddr takes integer add, integer level returns integer if Memory[add/4+0x54/4]>0 then return Memory[Memory[add/4+0x54/4]/4+level*0x68/4] endif return 0 endfunction function SetAbilityManaCostAddr takes integer add, integer level, integer mc returns nothing if Memory[add/4+0x54/4]>0 then set Memory[Memory[add/4+0x54/4]/4+level*0x68/4]=mc endif endfunction function SetAbilityCD takes integer abil, integer level, real cool returns nothing set Memory[Memory[GetObjectDataCaching(pAbilityData, abil)+21]/4-21+level*26]= cleanInt(realToIndex(cool)) endfunction function GetAbilityCD takes integer abil, integer level returns real local integer a=GetObjectDataCaching(pAbilityData, abil) if a>0 then if Memory[a+21]>0 then return cleanReal(indexToReal(Memory[Memory[a+21]/4-21+level*26])) // need clean/indextoreal ? endif endif return 0. endfunction function GetAbilCastTime takes ability abil returns real return cleanReal(indexToReal(Memory[ConvertHandle(abil)/4 + 0x84/4] )) endfunction function SetAbilCastTime takes ability abil ,real r returns nothing set Memory[ConvertHandle(abil)/4 + 0x84/4] = cleanInt(realToIndex(r )) endfunction function GetAbilityMaxLevel takes integer abil returns integer local integer a if abil==0 then return 0 endif set a=GetObjectDataCaching(pAbilityData, abil) if a>0 then return Memory[a+20] endif return 0 endfunction function AddAbilityCooldown takes ability a, real seconds returns nothing local integer pData = Memory[ConvertHandle(a)/4+55]/4 if pData != 0 then set Memory[pData+1] = cleanInt(realToIndex(seconds+cleanReal(indexToReal(Memory[pData+1])))) //set Memory[ConvertHandle(a)/4+45] = cleanInt(realToIndex(seconds+cleanReal(indexToReal(Memory[ConvertHandle(a)/4+45])))) This should not be modified together endif endfunction function AddAbilityCooldownConverted takes integer a, real seconds returns nothing local integer pData = Memory[a+55]/4 if pData != 0 then set Memory[pData+1] = cleanInt(realToIndex(seconds+cleanReal(indexToReal(Memory[pData+1])))) endif endfunction function AddAbilityBaseCooldown takes ability a, real seconds returns nothing local integer pData = Memory[ConvertHandle(a)/4+45] if pData != 0 then set Memory[pData] = cleanInt(realToIndex(seconds)) endif endfunction //This value holds the base cooldown of the ability at the last time it was casted. It’s used to calculate the % of elapsed cooldown. //This is completely irrelevant for the gameplay, it’s used only to determine which frame of the cooldown model will be displayed. function GetAbilityCurrentCooldown takes ability a returns real local integer pData = Memory[ConvertHandle(a)/4+55]/4 if pData != 0 then return cleanReal(indexToReal(Memory[pData+1])) - cleanReal(indexToReal(Memory[Memory[pData+3]/4+16])) endif return .0 endfunction function CopyCooldownStr takes integer from, integer to returns nothing local integer pData = Memory[from+55] if pData != 0 then //if Memory[to+55]==0 then set Memory[to+55]=pData //set Memory[to+52]=Memory[from+52] //set Memory[to+54]=to*4 set Memory[to+45]=Memory[from+45] if IsFlagBitSet(Memory[to+8],512)==false then set Memory[to+8]=Memory[to+8]+512 // call BJDebugMsg("add cd") else // call BJDebugMsg("already cd") endif //endif endif endfunction function GetAbilityCurrentCooldownConverted takes integer a returns real local integer pData = Memory[a+55]/4 if pData != 0 then return cleanReal(indexToReal(Memory[pData+1])) - cleanReal(indexToReal(Memory[Memory[pData+3]/4+16])) endif return .0 endfunction //This actually returns the timestamp, not the cooldown. To get the real cooldown you need to subtract this from the current game time. function GetAbilityCooldownReal takes ability a returns real local integer pData = Memory[ConvertHandle(a)/4+55]/4 if pData != 0 then return cleanReal(indexToReal(Memory[pData+1])) endif return 0. endfunction function IsAbilityOnCooldown takes integer z returns boolean return IsFlagBitSet(Memory[(z+0x20)/4],512) endfunction function SetAbilityDisabled takes integer pAbility, integer count returns nothing set Memory[pAbility/4+15] = count //not safe unless used with PauseUnit. Button will be blacked, but current casts of that ability won’t be interrupted. endfunction function GetAbilityDisabledCount takes integer pAbility returns integer return Memory[pAbility/4+15] endfunction function SetAbilityHidden takes integer pAbility, integer count returns nothing set Memory[pAbility/4+16] = count //This one is 100% safe. This hides the ability button, and order can’t be issued. endfunction function SetAbilityDisabled2 takes integer pAbility, integer count returns nothing set Memory[pAbility/4+17] = count //This one is used by Orb of Slow. Button is blacked, but cooldown is stil displayed. endfunction function GetAbilityDisabled2 takes integer pAbility returns integer return Memory[pAbility/4+17]//This one is used by Orb of Slow. Button is blacked, but cooldown is stil displayed. endfunction function DisableUnitsMovement takes unit u, boolean disable returns nothing local integer i=2 if disable==false then set i=1 endif call PauseUnit(u,true) call SetAbilityDisabled(Memory[ConvertHandle( u )/4+123], i) call PauseUnit(u,false) endfunction //pointer to 'Amov' is located at offset 123 of unit object, Aatk is at offset 122, and AInv is offset 124 //Hides all command buttons and sets the Ward flag. Unit will keep its current order, and player can’t give new orders //Notice the the unit can’t be ordered with triggers as well. To issue an order you need to temporarily reenable control function DisableUnitControl takes unit u returns nothing local integer pUnit = ConvertHandle(u)/4 local integer flags = Memory[pUnit+146] local integer Amov = Memory[pUnit+123]/4+16 local integer Aatk = Memory[pUnit+122]/4+16 // call echo("disabled on "+GetUnitName(u)) if not IsFlagBitSet(flags,512) then set Memory[pUnit+146] = flags + 512 endif if Amov != 16 then set Memory[Amov] = Memory[Amov] + 1 endif if Aatk != 16 then set Memory[Aatk] = Memory[Aatk] + 1 endif endfunction //Removes the Ward flag and reenables Amov and Aatk function EnableUnitControl takes unit u returns nothing local integer pUnit = ConvertHandle(u)/4 local integer flags = Memory[pUnit+146] local integer Amov = Memory[pUnit+123]/4+16 local integer Aatk = Memory[pUnit+122]/4+16 // call echo("enabled on "+GetUnitName(u)) if IsFlagBitSet(flags,512) then set Memory[pUnit+146] = flags - 512 endif if Amov != 16 and Memory[Amov]>0 then set Memory[Amov] = Memory[Amov] - 1 endif if Aatk != 16 and Memory[Aatk]>0 then set Memory[Aatk] = Memory[Aatk] - 1 endif endfunction function SetUnitModel takes integer uiobjectaddr, string s returns nothing call WriteNullTerminatedString(s, uiobjectaddr+0x30 ) endfunction function SetUnitModelUF takes unit u, string s returns nothing//user-friendly call SetUnitModel(GetUnitUIDefAddr(GetUnitTypeId(u)),s) endfunction function SetUnitModelUFAddress takes integer address, string s returns nothing call SetUnitModel(address,s) endfunction function GetUnitAttackAbilityForAddress takes integer pConvertedHandle returns integer return Memory[pConvertedHandle/4+0x1e8/4] endfunction function GetUnitAttackAbility takes unit u returns integer return GetUnitAttackAbilityForAddress(ConvertHandle(u)) endfunction function GetUnitMoveAbilityForAddress takes integer pConvertedHandle returns integer return Memory[pConvertedHandle/4+0x1eC/4] endfunction function GetUnitMoveAbility takes unit u returns integer return GetUnitMoveAbilityForAddress(ConvertHandle(u)) endfunction function GetUnitHeroAbilityForAddress takes integer pConvertedHandle returns integer return Memory[pConvertedHandle/4+0x1F0/4] endfunction function GetUnitHeroAbility takes unit u returns integer return GetUnitHeroAbilityForAddress(ConvertHandle(u)) endfunction function GetUnitBuildAbilityForAddress takes integer pConvertedHandle returns integer return Memory[pConvertedHandle/4+0x1F4/4] endfunction function GetUnitBuildAbility takes unit u returns integer return GetUnitBuildAbilityForAddress(ConvertHandle(u)) endfunction function GetUnitInventoryAbilityForAddress takes integer pConvertedHandle returns integer return Memory[pConvertedHandle/4+0x1F8/4] endfunction function GetUnitInventoryAbility takes unit u returns integer return GetUnitInventoryAbilityForAddress(ConvertHandle(u)) endfunction // Alternative for sub_6F4786B0 (126a) function GetSomeAddress takes integer pAddr1 ,integer pAddr2 returns integer //I just split your function into 2, it should be working as before local integer pOff1 = 44 if BitwiseAnd(pAddr1,pAddr2) == -1 then return 0 endif if pAddr1 >= 0 then set pOff1 = 12 endif set pOff1 = Memory[pGameClass1]/4 + pOff1/4 set pOff1 = Memory[pOff1] if pOff1 == 0 then return 0 endif set pOff1 = pOff1 + 8 * pAddr1 + 4 set pOff1 = Memory[pOff1/4] if pOff1 == 0 or Memory[pOff1/4 + 0x18/4] != pAddr2 then return 0 endif return pOff1 endfunction function GetSomeAddressForAbility takes integer pAddr1 ,integer pAddr2 returns integer //Second part of GetSomeAddressForAbility local integer pOff1 = GetSomeAddress(pAddr1,pAddr2) if pOff1==0 or Memory[pOff1/4 + 0x20/4] != 0 then return 0 endif return Memory[pOff1/4+0x54/4] endfunction function GetSomeAddressForLocustFlags takes integer pAddr1 ,integer pAddr2 returns integer local integer i = GetSomeAddress(pAddr1,pAddr2) return Memory[i/4+37] endfunction function SetLocustFlags takes unit u, integer i returns nothing //These flags can make unit immune to truesight local integer pOff1 = ConvertHandle(u)/4+91 set pOff1 = GetSomeAddressForLocustFlags(Memory[pOff1], Memory[pOff1+1]) set Memory[pOff1/4+13] = i endfunction function EnableTruesightImmunity takes unit u returns nothing //I don’t really know what other side effects may be caused by this, at least GroupEnum is not affected call SetLocustFlags(u, 0x08000000) endfunction function DisableTruesightImmunity takes unit u returns nothing call SetLocustFlags(u, 0) endfunction function UnStunUnit takes unit u returns nothing set Memory[ConvertHandle(u)/4+102] = 0 endfunction function IsUnitStunned2 takes unit u returns boolean return Memory[ConvertHandle(u)/4+102] > 0 endfunction function IsUnitInvulnerable takes unit u returns boolean local integer k // call BJDebugMsg(GetUnitName(u)) if u==null then return false endif set k=ConvertHandle(u) if k==0 then return false endif return Memory[k/4+8]/8*0x80000000 != 0 endfunction function GetUnitInvulnerableCounter takes unit u returns integer local integer k if u==null then return 0 endif set k=ConvertHandle(u) if k==0 then return 0 endif return Memory[k/4+0xE8/4] endfunction function SetUnitInvulnerableCounter takes unit u, integer i returns nothing local integer k if u==null then return endif set k=ConvertHandle(u) if k==0 then return endif set Memory[k/4+0xE8/4]=i endfunction function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer local integer pAddr1 = pConvertedHandle + 476 local integer pAddr2 = pConvertedHandle + 480 local integer pOff1 = 0 set pAddr1 = Memory[pAddr1/4] set pAddr2 = Memory[pAddr2/4] if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd(pAddr1,pAddr2) == -1 then return 0 endif set pOff1 = GetSomeAddressForAbility(pAddr1,pAddr2) if pOff1 == 0 then return 0 endif loop exitwhen pOff1 == 0 if Memory[pOff1/4+52/4] == abilid then return pOff1 endif set pOff1 = GetSomeAddressForAbility( Memory[pOff1/4+36/4], Memory[pOff1/4+40/4]) endloop return pOff1 endfunction function GetAbilityOrderID takes integer pAbility returns integer local integer pOffset2 local integer pOffset1 if pAbility<1 then return 0 endif // call BJDebugMsg(Int2Hex(pAbility)+" sent") // call PolledWait(1.) // mov ecx,[esp+04] // mov edx,[ecx+6C] // cmp edx,D0142 { 852290 } // je 0493413A // mov eax,00000000 { 0 } // ret // mov ecx,[ecx] // mov ecx,[ecx+00000308] // call ecx // ret set Memory[pReservedExecutableMemory/4] = 0x04244C8B set Memory[pReservedExecutableMemory/4 + 1] = 0x816C518B set Memory[pReservedExecutableMemory/4 + 2] = 0x0D0142FA set Memory[pReservedExecutableMemory/4 + 3] = 0xB8067400 set Memory[pReservedExecutableMemory/4 + 4] = 0x00000000 set Memory[pReservedExecutableMemory/4 + 5] = 0x8B098BC3 set Memory[pReservedExecutableMemory/4 + 6] = 0x00030889 set Memory[pReservedExecutableMemory/4 + 7] = 0x90E1FF00 if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif if pIgnoredUnitsOffset != 0 then set pOffset2 = IgnoredUnits(pAbility) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return pOffset2 endif return 0 endfunction function PrintAllUnitAbilities takes integer pConvertedHandle returns nothing local integer pAddr1 = pConvertedHandle + 476 local integer pAddr2 = pConvertedHandle + 480 local integer pOff1 = 0 set pAddr1 = Memory[pAddr1/4] set pAddr2 = Memory[pAddr2/4] if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd(pAddr1,pAddr2) == -1 then return endif set pOff1 = GetSomeAddressForAbility(pAddr1,pAddr2) if pOff1 == 0 then return endif loop exitwhen pOff1 == 0 call DisplayTextToPlayer(GetLocalPlayer(),0.0,0.0,"Address:"+Int2Hex(pOff1)+". ID:"+Id2String(Memory[pOff1/4+52/4])+" name: "+GetObjectName(Memory[pOff1/4+52/4])) set pOff1 = GetSomeAddressForAbility( Memory[pOff1/4+36/4], Memory[pOff1/4+40/4]) endloop endfunction //function PrintAllUnitAbilitiesOld takes integer pConvertedHandle returns nothing // local integer pAddr1 = pConvertedHandle + 476 // local integer pAddr2 = pConvertedHandle + 480 // // local integer pOff1 = 0 // // set pAddr1 = Memory[pAddr1/4] // set pAddr2 = Memory[pAddr2/4] // if pAddr1 == 0 or pAddr2 == 0 or BitwiseAndOld(pAddr1,pAddr2) == -1 then // return // endif // // set pOff1 = GetSomeAddressForAbility(pAddr1,pAddr2) // // if pOff1 == 0 then // return // endif // // loop // exitwhen pOff1 == 0 // // call DisplayTextToPlayer(GetLocalPlayer(),0.0,0.0,"Address:"+Int2Hex(pOff1)+". ID:"+Id2String(Memory[pOff1/4+52/4])+" name: "+GetObjectName(Memory[pOff1/4+52/4])) // // set pOff1 = GetSomeAddressForAbility( Memory[pOff1/4+36/4], Memory[pOff1/4+40/4]) // endloop // //endfunction function GetAllUnitAbilities takes unit u returns nothing local integer pConvertedHandle=ConvertHandle(u) local integer pAddr1 = pConvertedHandle + 476 local integer pAddr2 = pConvertedHandle + 480 local integer i=0 local integer h=GetHandleId(u) local integer pOff1 = 0 call FlushChildHashtable(TempHash,h) set pAddr1 = Memory[pAddr1/4] set pAddr2 = Memory[pAddr2/4] if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd(pAddr1,pAddr2) == -1 then return endif set pOff1 = GetSomeAddressForAbility(pAddr1,pAddr2) if pOff1 == 0 then return endif loop exitwhen pOff1 == 0 // call DisplayTextToPlayer(GetLocalPlayer(),0.0,0.0,"Address:"+Int2Hex(pOff1)+". ID:"+Id2String(Memory[pOff1/4+52/4])+" name: "+GetObjectName(Memory[pOff1/4+52/4])) if Memory[pOff1/4+0x34/4]!='Amov' and Memory[pOff1/4+0x34/4]!='AHer' and Memory[pOff1/4+0x34/4]!='Aatk' and Memory[pOff1/4+0x34/4]!='AInv' then call SaveInteger(TempHash,h,i,pOff1)//address call SaveInteger(TempHash,h+1,i,Memory[pOff1/4+0x34/4])//ability id set i=i+1 endif set pOff1 = GetSomeAddressForAbility( Memory[pOff1/4+36/4], Memory[pOff1/4+40/4]) //facepalm endloop call SaveInteger(TempHash,'abil',0,i) endfunction function CallFastCallWith1Args takes integer pFuncFastcallAddr, integer arg1 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0xB9F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg1) call WriteRealMemory(pReservedExecutableMemory2+8, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+12, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+16, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith2Args takes integer pFuncFastcallAddr, integer arg1, integer arg2 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0xBAF68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg2) call WriteRealMemory(pReservedExecutableMemory2+8, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg1) call WriteRealMemory(pReservedExecutableMemory2+16, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+20, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+24, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith3Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg3) call WriteRealMemory(pReservedExecutableMemory2+8, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg2) call WriteRealMemory(pReservedExecutableMemory2+16, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg1) call WriteRealMemory(pReservedExecutableMemory2+24, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+28, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+32, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function FUCKINGCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg4) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg3) call WriteRealMemory(pReservedExecutableMemory2+16, 0xB8F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg2) call WriteRealMemory(pReservedExecutableMemory2+24, 0xBFF68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg1) call WriteRealMemory(pReservedExecutableMemory2+32, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+36, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+40, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg4) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg3) call WriteRealMemory(pReservedExecutableMemory2+16, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg2) call WriteRealMemory(pReservedExecutableMemory2+24, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg1) call WriteRealMemory(pReservedExecutableMemory2+32, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+36, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+40, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith5Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg5) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg4) call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg3) call WriteRealMemory(pReservedExecutableMemory2+24, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg2) call WriteRealMemory(pReservedExecutableMemory2+32, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+36, arg1) call WriteRealMemory(pReservedExecutableMemory2+40, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+44, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+48, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith6Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg6) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg5) call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg4) call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg3) call WriteRealMemory(pReservedExecutableMemory2+32, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+36, arg2) call WriteRealMemory(pReservedExecutableMemory2+40, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+44, arg1) call WriteRealMemory(pReservedExecutableMemory2+48, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+52, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+56, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith7Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg7) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg6) call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg5) call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg4) call WriteRealMemory(pReservedExecutableMemory2+32, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+36, arg3) call WriteRealMemory(pReservedExecutableMemory2+40, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+44, arg2) call WriteRealMemory(pReservedExecutableMemory2+48, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+52, arg1) call WriteRealMemory(pReservedExecutableMemory2+56, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+60, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+64, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallFastCallWith8Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56) call WriteRealMemory(pReservedExecutableMemory2+4, arg8) call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+12, arg7) call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+20, arg6) call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+28, arg5) call WriteRealMemory(pReservedExecutableMemory2+32, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+36, arg4) call WriteRealMemory(pReservedExecutableMemory2+40, 0x68F68B90) call WriteRealMemory(pReservedExecutableMemory2+44, arg3) call WriteRealMemory(pReservedExecutableMemory2+48, 0xBAF68B90) call WriteRealMemory(pReservedExecutableMemory2+52, arg2) call WriteRealMemory(pReservedExecutableMemory2+56, 0xB9F68B90) call WriteRealMemory(pReservedExecutableMemory2+60, arg1) call WriteRealMemory(pReservedExecutableMemory2+64, 0xBEF68B90) call WriteRealMemory(pReservedExecutableMemory2+68, pFuncFastcallAddr) call WriteRealMemory(pReservedExecutableMemory2+72, 0xC35ED6FF) if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallThisCallWith1Args takes integer pFuncThiscallAddr, integer arg1 returns integer return CallFastCallWith2Args(pFuncThiscallAddr,arg1,0) endfunction function CallThisCallWith2Args takes integer pFuncThiscallAddr, integer arg1, integer arg2 returns integer return CallFastCallWith3Args(pFuncThiscallAddr,arg1,0,arg2) endfunction function CallThisCallWith3Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3 returns integer return CallFastCallWith4Args(pFuncThiscallAddr,arg1,0,arg2,arg3) endfunction function CallThisCallWith4Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4 returns integer return CallFastCallWith5Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4) endfunction function CallThisCallWith5Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5 returns integer return CallFastCallWith6Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5) endfunction function CallThisCallWith6Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6 returns integer return CallFastCallWith7Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5,arg6) endfunction function CallThisCallWith7Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7 returns integer return CallFastCallWith8Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5,arg6,arg7) endfunction function GetUnitAbilityReal takes integer UnitAddress, integer AbilCode, integer unk1, integer unk2, integer unk3, integer unk4 returns integer return CallThisCallWith6Args(pGetUnitAbility,UnitAddress,AbilCode,unk1,unk2, unk3, unk4) endfunction function GetUnitAddress takes unit u returns integer return CallThisCallWith1Args(pGetUnitAddress, GetHandleId(u)) endfunction function GetUnitAbility takes unit u, integer abilid returns integer if u==null then return 0 endif return CallThisCallWith6Args(pGetUnitAbility,GetUnitAddress(u),abilid,0, 1, 1, 1) endfunction //function GetUnitAbility takes unit u, integer abilid returns integer // // // if abilid == 'Aatk' then // return GetUnitAttackAbility(u) // endif // if abilid == 'Amov' then // return GetUnitMoveAbility(u) // endif // if abilid == 'AHer' then // return GetUnitHeroAbility(u) // endif // if abilid == 'AObu' or abilid == 'AUbu' or abilid == 'ANbu' or abilid == 'AHbu' or abilid == 'AEbu' or abilid == 'AGbu' then // return GetUnitBuildAbility(u) // endif // if abilid == 'AInv' then // return GetUnitInventoryAbility(u) // endif // // return GetUnitAbilityForAddresss(ConvertHandle(u),abilid) //endfunction function GetAbilityOrderIDbyID takes integer id returns integer local integer a if HaveSavedInteger(AbilitiesHashtable,id,'ordr') then return LoadInteger(AbilitiesHashtable,id,'ordr') endif if id=='AHer' or id=='ANeg' or id=='Aatk' or id=='AInv' then call SaveInteger(AbilitiesHashtable,id,'ordr',0) return 0 endif // call BJDebugMsg("Requested "+Int2Hex(id)) set bj_lastCreatedUnit=CreateUnit(Player(0),'e00E',0,0,0) call UnitAddAbility(bj_lastCreatedUnit,id) set a=GetUnitAbility(bj_lastCreatedUnit,id) set a=GetAbilityOrderID(a) call SaveInteger(AbilitiesHashtable,id,'ordr',a) return a endfunction function GetAbilityOrderIdAny takes integer a returns integer local integer base if Memory[(a+0x54)/4]!=0 and Memory[(a+0x6C)/4]!=0 then set base=Memory[(Memory[(a+0x54)/4]+0x30)/4] // call echo(Id2String(base)) if base>0 and base!='ANcl' then return GetAbilityOrderIDbyID(base) // return 0 elseif base=='ANcl' then return Memory[(a+0x124)/4] endif endif return 0 endfunction function ShowAbilityById_Main takes integer ConvertedHandle, integer d returns nothing if ConvertedHandle!=0 then if Memory[ConvertedHandle/4]!=0 then set Memory[(ConvertedHandle + 0x40)/4]=Memory[(ConvertedHandle + 0x40)/4]+d endif endif endfunction function HideAbilityButton takes unit u, integer id, boolean hide returns nothing local integer offset if u!=null and id!=0 then set offset=GetUnitAbility(u,id) if offset!=0 then if hide then call ShowAbilityById_Main(offset,1) else call ShowAbilityById_Main(offset,-1) endif endif endif endfunction function GetSpellCastpoint takes ability a returns real return cleanReal(indexToReal(Memory[(ConvertHandle(a)+0x8C)/4])) endfunction function SetSpellCastpoint takes ability a, real dur returns nothing set Memory[(ConvertHandle(a)+0x8C)/4]=cleanInt(realToIndex(dur)) endfunction function GetSpellBackswing takes ability a returns real return cleanReal(indexToReal(Memory[(ConvertHandle(a)+0x94)/4])) endfunction function SetSpellBackswing takes ability a, real dur returns nothing set Memory[(ConvertHandle(a)+0x94)/4]=cleanInt(realToIndex(dur)) endfunction function ToggleAbilityAutocast takes integer address, boolean on returns nothing local integer flags local integer flag128=0//0 if enabled local integer flag524288=0 if address>0 then set flags=Memory[(address+0x20)/4] if BitwiseAnd(flags,0x80)==0 then set flag128=0x80//not enabled // call echo("not enabled") // else // call echo("enabled") endif if BitwiseAnd(flags,0x80000)==0 then set flag524288=0x80000//not enabled endif if on and flag128>0 then set flags=flags+flag128 elseif on==false and flag128==0 then set flags=flags-0x80 endif if on and flag524288>0 then set flags=flags+flag524288 elseif on==false and flag524288==0 then set flags=flags-0x80000 endif set Memory[(address+0x20)/4]=flags endif endfunction function SetUnitAbiltyAutocast takes unit u, integer id, boolean on returns nothing call ToggleAbilityAutocast(GetUnitAbility(u,id),on) endfunction function SetUnitAttackType takes unit u, integer i, integer attacknum returns nothing if attacknum==1 then set Memory[(GetUnitAttackAbility(u) + 0xF4)/4]=i elseif attacknum==2 then set Memory[(GetUnitAttackAbility(u) + 0xF8)/4]=i endif endfunction function SetUnitAttackType1 takes unit u, integer i returns nothing call SetUnitAttackType(u,i,1) endfunction function SetUnitAttackType2 takes unit u, integer i returns nothing call SetUnitAttackType(u,i,2) endfunction //6 = hero, 5 = chaos, 4 = magic, 3 = siege, 2 = piercing, 1 = normal, 0 = spell? //values over 6 takes incorrect multipliers from nearby memory, do not use them function GetUnitAttackType1 takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xF4/4] endfunction function GetUnitAttackType2 takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xF8/4] endfunction //unit's weapon type is melee, ranged, splash, artillery, etc //values 1-8 // 2 = ranger, 1 = instante, 0 = melee, 5 = splash, 6 = mbounce, function SetUnitWeaponType takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0xDC/4]=i endfunction function GetUnitWeaponType takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xDC/4] endfunction //setting green bonus automatically adjusts base damage to fit function SetUnitGreenBonusDamage takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0xAC/4]=i endfunction function GetUnitGreenBonusDamage takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xAC/4] endfunction function AddUnitGreenBonusDamage takes unit u, integer i returns nothing call SetUnitGreenBonusDamage(u,GetUnitGreenBonusDamage(u)+i) endfunction function SetUnitBaseDamage takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0xA0/4]=i endfunction function GetUnitBaseDamage takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xA0/4] endfunction function AddUnitBaseDamage takes unit u, integer bonus returns nothing call SetUnitBaseDamage(u,GetUnitBaseDamage(u)+bonus) endfunction function SetUnitBaseAttributeDamage takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0xA4/4]=i endfunction function GetUnitBaseAttributeDamage takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0xA4/4] endfunction function SetUnitDamageDicesSideCount takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x94/4]=i endfunction function GetUnitDamageDicesSideCount takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0x94/4] endfunction function SetUnitDamageDicesCount takes unit u, integer i returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x88/4]=i endfunction function GetUnitDamageDicesCount takes unit u returns integer local integer a=GetUnitAttackAbility(u) if a>0 then return Memory[a/4 + 0x88/4] endif return 0 endfunction function SetUnitAttackRange1 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x258/4]=cleanInt(realToIndex(r)) endfunction function GetUnitAttackRange1 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x258/4])) endfunction function SetUnitAttackRange2 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x27C/4]=cleanInt(realToIndex(r)) endfunction function GetUnitAttackRange2 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x27C/4])) endfunction function SetUnitBAT1 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x158/4]=cleanInt(realToIndex(r)) endfunction function GetUnitBAT1 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x158/4])) endfunction function SetUnitBAT2 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x160/4]=cleanInt(realToIndex(r)) endfunction function GetUnitBAT2 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x160/4])) endfunction function SetUnitAttackPoint1 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x16C/4]=cleanInt(realToIndex(r)) endfunction function SetUnitAttackPoint2 takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x17C/4]=cleanInt(realToIndex(r)) endfunction function GetUnitAttackPoint1 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x16C/4])) endfunction function GetUnitAttackPoint2 takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x17C/4])) endfunction function GetUnitAttackEnabledIndex takes unit u returns integer return Memory[GetUnitAttackAbility(u)/4 + 0x104/4] endfunction function SetUnitAttackBackswing takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x190/4]=cleanInt(realToIndex(r)) endfunction function GetUnitAttackBackswing takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x190/4])) endfunction function SetUnitAttackSpeed takes unit u, real r returns nothing set Memory[GetUnitAttackAbility(u)/4 + 0x1B0/4]=cleanInt(realToIndex(r)) endfunction function GetUnitAttackSpeed takes unit u returns real return cleanReal(indexToReal(Memory[GetUnitAttackAbility(u)/4 + 0x1B0/4])) endfunction function AddUnitAttackSpeed takes unit u, real r returns nothing call SetUnitAttackSpeed(u,GetUnitAttackSpeed(u)+r) endfunction function GetUnitAddressFloatsRelated takes integer pConvertedHandle, integer step returns integer local integer pOffset1 = pConvertedHandle + step local integer pOffset2 = Memory[pGameClass1] set pOffset1 = Memory[pOffset1/4] set pOffset2 = Memory[(pOffset2+0xC)/4] set pOffset2 = Memory[(( pOffset1 * 8 ) + pOffset2 + 4)/4] return pOffset2 endfunction function SetUnitFacingInstant takes unit u, real a returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(ConvertHandle(u),0xA0) set Memory[Memory[(pOffset2+0x28)/4]/4 +0xA4/4]=cleanInt(realToIndex(bj_DEGTORAD*a)) endfunction function SetUnitMaxHP4Address takes integer pConvertedHandle, real newhp returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xA0) set Memory[(pOffset2+0x84)/4]=cleanInt(realToIndex(newhp)) endfunction function SetUnitMaxMP4Address takes integer pConvertedHandle, real newmp returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xC0) set Memory[(pOffset2+0x84)/4]=cleanInt(realToIndex(newmp)) endfunction function SetUnitMaxHP takes unit u, real newhp returns nothing call SetUnitMaxHP4Address(ConvertHandle(u),newhp) endfunction function SetUnitMaxMP takes unit u, real newmp returns nothing call SetUnitMaxMP4Address(ConvertHandle(u),newmp) endfunction function GetUnitHPRegenForAddress takes integer pConvertedHandle returns real local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xA0) return cleanReal(indexToReal(Memory[(pOffset2+0x7C)/4])) endfunction function SetUnitXSoft takes integer pConvertedHandle, real x returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xA0) set Memory[Memory[(pOffset2+0x28)/4]/4+0x54/4]=SetRealIntoMemory(x) endfunction function SetUnitHPRegenForAddress takes integer pConvertedHandle, real r returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xA0) set Memory[(pOffset2+0x7C)/4]=cleanInt(realToIndex(r)) endfunction function GetUnitMPRegenForAddress takes integer pConvertedHandle returns real local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xC0) // call echo(Int2Hex(pOffset2)) return cleanReal(indexToReal(Memory[(pOffset2+0x7C)/4])) endfunction function SetUnitMPRegenForAddress takes integer pConvertedHandle, real r returns nothing local integer pOffset2 = GetUnitAddressFloatsRelated(pConvertedHandle,0xC0) set Memory[(pOffset2+0x7C)/4]=cleanInt(realToIndex(r)) endfunction function GetUnitHPRegen takes unit u returns real return GetUnitHPRegenForAddress(ConvertHandle(u)) endfunction function GetWidgetHPRegen takes widget u returns real return GetUnitHPRegenForAddress(ConvertHandle(u)) endfunction function GetUnitMPRegen takes unit u returns real return GetUnitMPRegenForAddress(ConvertHandle(u)) endfunction function SetUnitHPRegen takes unit u, real r returns nothing local real curhp=GetWidgetLife(u) if curhp>0 then call SetUnitHPRegenForAddress(ConvertHandle(u),r) call SetWidgetLife(u,curhp) endif endfunction function AddUnitHPRegen takes unit u, real r returns nothing local real curhp=GetWidgetLife(u) local integer h if curhp>0 then set h=ConvertHandle(u) call SetUnitHPRegenForAddress(h,r+GetUnitHPRegenForAddress(h)) call SetWidgetLife(u,curhp) endif endfunction function SetUnitMPRegen takes unit u, real r returns nothing local real curhp=GetUnitState(u,UNIT_STATE_MANA) if GetUnitState(u,UNIT_STATE_MAX_MANA)>0 then call SetUnitMPRegenForAddress(ConvertHandle(u),r) call SetUnitState(u,UNIT_STATE_MANA,curhp) endif endfunction function AddUnitMPRegen takes unit u, real r returns nothing local real curhp=GetUnitState(u,UNIT_STATE_MANA) local integer h if GetUnitState(u,UNIT_STATE_MAX_MANA)>0 then set h=ConvertHandle(u) call SetUnitMPRegenForAddress(h,r+GetUnitMPRegenForAddress(h)) call SetUnitState(u,UNIT_STATE_MANA,curhp) endif endfunction function SetEffectX_ForAddress takes integer pConvertedHandle, real r returns nothing set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC0/4] = cleanInt(realToIndex(r)) endfunction function SetEffectX takes effect e, real r returns nothing call SetEffectX_ForAddress(ConvertHandle(e),r) endfunction function GetEffectX_ForAddress takes integer pConvertedHandle returns real return cleanReal(indexToReal(Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC0/4])) endfunction function GetEffectX takes effect e returns real return GetEffectX_ForAddress(ConvertHandle(e)) endfunction function SetEffectY_ForAddress takes integer pConvertedHandle, real r returns nothing set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC4/4] = cleanInt(realToIndex(r)) endfunction function SetEffectY takes effect e, real r returns nothing call SetEffectY_ForAddress(ConvertHandle(e),r) endfunction function GetEffectY_ForAddress takes integer pConvertedHandle returns real return cleanReal(indexToReal(Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC4/4])) endfunction function GetEffectY takes effect e returns real return GetEffectY_ForAddress(ConvertHandle(e)) endfunction function SetEffectZ_ForAddress takes integer pConvertedHandle, real r returns nothing set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC8/4] = cleanInt(realToIndex(r)) endfunction function SetEffectZ takes effect e, real r returns nothing call SetEffectZ_ForAddress(ConvertHandle(e),r) endfunction function GetEffectZ_ForAddress takes integer pConvertedHandle returns real return cleanReal(indexToReal(Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xC8/4])) endfunction function GetEffectZ takes effect e returns real return GetEffectZ_ForAddress(ConvertHandle(e)) endfunction function SetEffectPos takes effect e, real x, real y, real z returns nothing local integer pConvertedHandle = ConvertHandle(e) call SetEffectX_ForAddress(pConvertedHandle,x) call SetEffectY_ForAddress(pConvertedHandle,y) call SetEffectZ_ForAddress(pConvertedHandle,z) endfunction function SetObjectColor takes handle e, integer color returns nothing set Memory[Memory[ConvertHandle(e)/4 + 0x28/4]/4 + 0x148/4] = color endfunction function SetEffectSize takes effect e, real size returns nothing set Memory[Memory[ConvertHandle(e)/4 + 0x28/4]/4 + 0xE8/4] = cleanInt(realToIndex(size)) endfunction function SetEffectSizeEx takes effect e, real full, real x,real y, real z returns nothing local integer pConvertedHandle = ConvertHandle(e) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0xE8/4] = cleanInt(realToIndex(full)) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x120/4] = cleanInt(realToIndex(x)) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x124/4] = cleanInt(realToIndex(y)) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x128/4] = cleanInt(realToIndex(z)) endfunction function SetEffectFacing takes effect e, real angle returns nothing local integer pConvertedHandle = ConvertHandle(e) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4] = cleanInt(realToIndex(Cos(angle))) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x10C/4] = cleanInt(realToIndex(Sin(angle))) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x114/4] = cleanInt(realToIndex(-Sin(angle))) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x118/4] = cleanInt(realToIndex(Cos(angle))) endfunction function GetEffectFacing takes effect e returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(e) return Acos( cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4]) ))) * bj_RADTODEG endfunction function GetUnitFacingEx takes unit e returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(e) return Acos( cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4]) ))) * bj_RADTODEG endfunction function GetUnitAngle1 takes unit e returns real local integer pConvertedHandle = ConvertHandle(e) return cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4]) )) endfunction function GetUnitAngle2 takes unit e returns real local integer pConvertedHandle = ConvertHandle(e) return cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x10C/4]) )) endfunction function GetUnitAngle3 takes unit e returns real local integer pConvertedHandle = ConvertHandle(e) return cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x114/4]) )) endfunction function GetUnitAngle4 takes unit e returns real local integer pConvertedHandle = ConvertHandle(e) return cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x118/4]) )) endfunction function GetUnitFacingEx2 takes unit e returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(e) return Asin( cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x10C/4]) ))) * bj_RADTODEG endfunction function GetUnitFacingEx3 takes unit e returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(e) return Asin( -1 * cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x114/4]) ))) * bj_RADTODEG endfunction function GetUnitFacingEx4 takes unit e returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(e) return Atan2( cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x10C/4]) )), cleanReal(indexToReal((Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4]) ))) * bj_RADTODEG endfunction function GetTrackableX takes trackable t returns real return GetEffectX_ForAddress(ConvertHandle(t)) endfunction function GetTrackableY takes trackable t returns real return GetEffectY_ForAddress(ConvertHandle(t)) endfunction function GetTrackableZ takes trackable t returns real return GetEffectZ_ForAddress(ConvertHandle(t)) endfunction function SetTrackableX takes trackable t, real r returns nothing call SetEffectX_ForAddress(ConvertHandle(t),r) endfunction function SetTrackableY takes trackable t, real r returns nothing call SetEffectY_ForAddress(ConvertHandle(t),r) endfunction function SetTrackableZ takes trackable t, real r returns nothing call SetEffectZ_ForAddress(ConvertHandle(t),r) endfunction function SetTrackablePos takes trackable t, real x,real y,real z returns nothing local integer pConvertedHandle = ConvertHandle(t) call SetEffectX_ForAddress(pConvertedHandle,x) call SetEffectY_ForAddress(pConvertedHandle,y) call SetEffectZ_ForAddress(pConvertedHandle,z) endfunction function SetTrackableFacing takes trackable t, real angle returns nothing//takes RADIANS, use bj_DEGTORAD local integer pConvertedHandle = ConvertHandle(t) local real cos=Cos(angle) local real sin=Sin(angle) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4] = cleanInt(realToIndex( cos )) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x10C/4] = cleanInt(realToIndex( sin )) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x114/4] = cleanInt(realToIndex( -sin )) set Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x118/4] = cleanInt(realToIndex( cos )) endfunction function GetTrackableFacing takes trackable t returns real//returns DEGREES local integer pConvertedHandle = ConvertHandle(t) return Acos( cleanReal(indexToReal(Memory[Memory[pConvertedHandle/4 + 0x28/4]/4 + 0x108/4] ))) endfunction function ResetTimedLife takes integer pConvertedHandle, real time, real maxtime returns nothing set Memory[pConvertedHandle/4 + 0xD0/4] = cleanInt(realToIndex(maxtime)) // set Memory[Memory[Memory[pConvertedHandle/4 + 0x90/4]/4 + 0xC/4]/4 + 0x40/4] = cleanInt(realToIndex(time)) endfunction function CallStdcallWith1Args takes integer pFuncStdcallAddr, integer arg1 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+8, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+12, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+16, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallStdcallWith2Args takes integer pFuncStdcallAddr, integer arg1, integer arg2 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+16, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+20, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+24, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallStdcallWith3Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+24, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+28, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+32, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallStdcallWith4Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+32, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+36, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+40, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallStdcallWith5Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg5) // push arg5 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+32, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+36, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+40, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+44, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+48, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallStdcallWith6Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg6) // push arg6 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg5) // push arg5 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+32, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+36, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+40, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+44, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+48, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+52, pFuncStdcallAddr) // mov ecx, pFuncStdcallAddr call WriteRealMemory(pReservedExecutableMemory2+56, 0xC359D1FF) // call ecx, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith1Args takes integer pFuncCdeclAddr, integer arg1 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+8, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+12, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+16, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+20, 0xCCC35904) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith2Args takes integer pFuncCdeclAddr, integer arg1, integer arg2 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+16, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+20, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+24, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+28, 0xCCC35908) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith3Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+24, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+28, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+32, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+36, 0xCCC3590C) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith4Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+32, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+36, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+40, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+44, 0xCCC35910) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith5Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg5) // push arg5 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+32, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+36, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+40, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+44, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+48, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+52, 0xCCC35914) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function CallCdeclWith6Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer local integer pOffset1 call WriteRealMemory(pReservedExecutableMemory2, 0x68C98B51) // push ecx. mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+4, arg6) // push arg6 call WriteRealMemory(pReservedExecutableMemory2+8, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+12, arg5) // push arg5 call WriteRealMemory(pReservedExecutableMemory2+16, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+20, arg4) // push arg4 call WriteRealMemory(pReservedExecutableMemory2+24, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+28, arg3) // push arg3 call WriteRealMemory(pReservedExecutableMemory2+32, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+36, arg2) // push arg2 call WriteRealMemory(pReservedExecutableMemory2+40, 0x6890C98B) // mov ecx,ecx call WriteRealMemory(pReservedExecutableMemory2+44, arg1) // push arg1 call WriteRealMemory(pReservedExecutableMemory2+48, 0xB990C98B) // mov ecx,ecx , nop call WriteRealMemory(pReservedExecutableMemory2+52, pFuncCdeclAddr) // mov ecx, pFuncCdeclAddr call WriteRealMemory(pReservedExecutableMemory2+56, 0xC483D1FF) // call ecx, add esp, call WriteRealMemory(pReservedExecutableMemory2+60, 0xCCC35918) // 4, pop ecx, ret if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2) endif set pOffset1 = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return pOffset1 endfunction function ConvertNullTerminatedStringToString takes integer pNullTerminatedString returns string return I2SH(CallThisCallWith1Args(pConvertString,pNullTerminatedString)) endfunction function sprintf_1args takes string format, integer arg1 returns string call CallCdeclWith3Args(ReadRealMemory(p_sprintf),pReservedWritableMemory, GetStringAddress(format), arg1) return ConvertNullTerminatedStringToString(pReservedWritableMemory) endfunction function sprintf_2args takes string format, integer arg1, integer arg2 returns string call CallCdeclWith4Args(ReadRealMemory(p_sprintf),pReservedWritableMemory, GetStringAddress(format), arg1, arg2) return ConvertNullTerminatedStringToString(pReservedWritableMemory) endfunction function sprintf_3args takes string format, integer arg1, integer arg2, integer arg3 returns string call CallCdeclWith5Args(ReadRealMemory(p_sprintf),pReservedWritableMemory, GetStringAddress(format), arg1, arg2, arg3) return ConvertNullTerminatedStringToString(pReservedWritableMemory) endfunction function sprintf_4args takes string format, integer arg1, integer arg2, integer arg3, integer arg4 returns string call CallCdeclWith6Args(ReadRealMemory(p_sprintf),pReservedWritableMemory, GetStringAddress(format), arg1, arg2, arg3, arg4) return ConvertNullTerminatedStringToString(pReservedWritableMemory) endfunction function GetModuleHandle takes string nDllName returns integer return CallStdcallWith1Args(Memory[pGetModuleHandle], GetStringAddress(nDllName)) endfunction function GetModuleProcAddress takes string nDllName, string nProcName returns integer return CallStdcallWith2Args(Memory[pGetProcAddress], GetModuleHandle(nDllName),GetStringAddress(nProcName)) endfunction function GetFileAttributes takes string s returns integer local integer nhandle1 local integer nOffset1 if pGetFileAttributesA == 0 then set pGetFileAttributesA = GetModuleProcAddress("Kernel32.dll", "GetFileAttributesA" ) endif if pGetFileAttributesA != 0 then return CallStdcallWith1Args(pGetFileAttributesA,GetStringAddress(s)) endif return 0 endfunction function FileExists takes string s returns boolean return GetFileAttributes(s) != -1 endfunction function LoadLibrary takes string nDllName returns integer if pLoadLibraryA == 0 then set pLoadLibraryA = GetModuleProcAddress("Kernel32.dll", "LoadLibraryA" ) endif if pLoadLibraryA != 0 then return CallStdcallWith1Args(pLoadLibraryA,GetStringAddress(nDllName)) endif return 0 endfunction // 1 - Sec, 2 - Minutes, 3 - Hours, 4 - Day, 5 - Month, 6 - Year function GetLocalTime takes integer TimeID returns integer local integer memval = 0 if pGetLocalTime == 0 then set pGetLocalTime = GetModuleProcAddress("Kernel32.dll","GetLocalTime") endif if pGetLocalTime != 0 then call CallStdcallWith1Args(pGetLocalTime,pReservedMemoryForSystemTime) endif if TimeID == 1 then set memval = ReadRealMemory(pReservedMemoryForSystemTime+12) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) elseif TimeID == 2 then set memval = ReadRealMemory(pReservedMemoryForSystemTime+10) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) elseif TimeID == 3 then set memval = ReadRealMemory(pReservedMemoryForSystemTime+8) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) elseif TimeID == 4 then set memval = ReadRealMemory(pReservedMemoryForSystemTime+6) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) elseif TimeID == 5 then set memval = ReadRealMemory(pReservedMemoryForSystemTime+2) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) elseif TimeID == 6 then set memval = ReadRealMemory(pReservedMemoryForSystemTime) return CreateInteger1(0,0,GetByteFromInteger(memval,3),GetByteFromInteger(memval,4)) endif return 0 endfunction function ShellExecute takes string command, string path, string args returns nothing local integer pShellExecuteAddress = GetModuleProcAddress("Shell32.dll","ShellExecuteA") if pShellExecuteAddress != 0 then call CallStdcallWith6Args(pShellExecuteAddress, 0, GetStringAddress(command), GetStringAddress(path), GetStringAddress(args), 0, 0) endif endfunction function OpenUrlInDefaultBrowser takes string url returns nothing call ShellExecute("open", url, "") endfunction function OpenD1Stats takes nothing returns nothing call OpenUrlInDefaultBrowser("http://d1stats.ru") endfunction function MessageBox takes string message, string caption returns nothing if pMessageBoxA == 0 then set pMessageBoxA = GetModuleProcAddress("User32.dll", "MessageBoxA" ) endif if pMessageBoxA != 0 then call CallStdcallWith4Args(pMessageBoxA,0,GetStringAddress(message),GetStringAddress(caption),0) endif endfunction function FindWindow takes string name, string class returns integer local integer nOffset1 = 0 if pFindWindowA == 0 then set pFindWindowA = GetModuleProcAddress("User32.dll", "FindWindowA" ) endif if pFindWindowA != 0 then return CallStdcallWith2Args(pFindWindowA,GetStringAddress(class), GetStringAddress(name) ) endif return 0 endfunction function ReadStringFromFile takes string Filename, string Section, string Key, string DefaultValue returns string local integer pOffset1 local string s if pGetPrivateProfileStringA == 0 then set pGetPrivateProfileStringA = GetModuleProcAddress("Kernel32.dll", "GetPrivateProfileStringA" ) endif if pGetPrivateProfileStringA != 0 then call CallStdcallWith6Args(pGetPrivateProfileStringA,GetStringAddress(Section) , GetStringAddress(Key),GetStringAddress(DefaultValue) ,pReservedWritableMemory,szReservedWritableMemory, GetStringAddress(Filename) ) return ConvertNullTerminatedStringToString( pReservedWritableMemory ) endif return "" endfunction function WriteStringToFile takes string Filename, string Section, string Key, string Value returns nothing local integer nOffset1 if pWritePrivateProfileStringA == 0 then set pWritePrivateProfileStringA = GetModuleProcAddress("Kernel32.dll", "WritePrivateProfileStringA" ) endif if pWritePrivateProfileStringA != 0 then call CallStdcallWith4Args(pWritePrivateProfileStringA,GetStringAddress(Section),GetStringAddress(Key),GetStringAddress(Value),GetStringAddress(Filename)) endif endfunction function WriteStringToFileDebug takes string s returns nothing call WriteStringToFile("debug.log","",s,"") endfunction function ExportFileFromMpq takes string source, string dest returns boolean return CallFastCallWith2Args(pExportFromMpq, GetStringAddress(source), GetStringAddress(dest)) > 0 endfunction function SuperTextPrinter takes string s, integer color, real staytime returns nothing call CallThisCallWith4Args(pPrintText1, Memory[pGameClass2], GetStringAddress(s),cleanInt(realToIndex(staytime)),color ) endfunction function SuperTextPrinter2 takes string s, integer color, real staytime returns nothing call CallThisCallWith4Args(pPrintText2, Memory[pGameClass2], GetStringAddress(s),cleanInt(realToIndex(staytime)),color ) endfunction function CopyMemory takes integer dest, integer src, integer size returns integer return CallCdeclWith3Args(ReadRealMemory(pMemcpy), dest,src,size) endfunction function GetGameUIENV takes nothing returns integer return ReadRealMemory(Memory[pGameClass2]+0x3EC) endfunction // function GetGameICONENV takes nothing returns integer // return ReadRealMemory(Memory[pGameClass2]+0x3DC) // endfunction // function UpdateIcons takes nothing returns nothing // call CallThisCallWith2Args(GameDLL + 0x370A90,GetGameICONENV( ),1) // endfunction // function GetGameHeroIconListVal takes nothing returns integer // local integer pEnv2 = GetGameICONENV( ) // if pEnv2 > 0 then // return ReadRealMemory(pEnv2 + 0x168) // endif // return 0 // endfunction // function GetGameHeroIconListAddr takes nothing returns integer // local integer pEnv2 = GetGameICONENV( ) // if pEnv2 > 0 then // return pEnv2 + 0x168 // endif // return 0 // endfunction // function GetGameHeroIconListFirst takes nothing returns integer // local integer pEnv2 = GetGameICONENV( ) // if pEnv2 > 0 then // return ReadRealMemory(pEnv2 + 0x170) // endif // return 0 // endfunction // function SetUnitForHeroIcon takes integer iconaddr, integer u returns nothing // call CallThisCallWith2Args(GameDLL + 0x02A560, iconaddr + 8, u) // endfunction // function SetNumberForHeroIcon takes integer iconaddr, integer num returns nothing // call WriteRealMemory(iconaddr+12,num) // endfunction // function CreateNewHeroIconAndReturnAddr takes integer u returns integer // return CallThisCallWith4Args(GameDLL + 0x36C810,GetGameHeroIconListAddr( ),0,0,0) // endfunction // function GetHeroIconForUnitForAddress takes integer u returns integer // local integer FirstIconEntry = GetGameHeroIconListFirst( ) // if FirstIconEntry < 0 then // set FirstIconEntry = 0 // endif // if FirstIconEntry != 0 then // loop // if ReadRealMemory(FirstIconEntry + 8) != u then // set FirstIconEntry = ReadRealMemory(FirstIconEntry + 4) // else // return FirstIconEntry // endif // exitwhen FirstIconEntry == 0 // endloop // endif // set FirstIconEntry = CreateNewHeroIconAndReturnAddr(u) // call SetUnitForHeroIcon(FirstIconEntry,u) // call SetNumberForHeroIcon(FirstIconEntry,0) // call UpdateIcons( ) // return FirstIconEntry // endfunction // function GetHeroIconForUnit takes unit u returns integer // if u == null then // return 0 // else // return GetHeroIconForUnitForAddress(ConvertHandle(u)) // endif // endfunction function SuperTextPrinter3 takes string s, integer color, real staytime returns nothing call WriteRealMemory(pReserverdIntArg1,color) call CallThisCallWith5Args(pPrintText3,GetGameUIENV( ), GetStringAddress(s),pReserverdIntArg1, cleanInt(realToIndex(staytime)),0 ) endfunction function ErrorMsg takes string s, player p returns nothing if LocalPlayer==p then call SuperTextPrinter2(s,0xffffcc00,5.) endif endfunction function SuperTextPrinterRedraw takes nothing returns nothing local integer h=GetHandleId(GetExpiredTimer()) local integer c=LoadInteger(HY,h,0) local integer i=1 local string s="" local real d local integer k = 6 // limit lines shown loop exitwhen HaveSavedReal(HY,h,i)==false or c < i or k<=0 set d=LoadReal(HY,h,i) if d>0.2 then set s=s+"\n"+LoadStr(HY,h,i) call SaveReal(HY,h,i,d-0.2) set k=k-1 elseif d>0 then call SaveReal(HY,h,i,0.) endif set i=i+1 endloop call SuperTextPrinter(s,0xffffffff,0.2) endfunction function SuperTextPrinterClear takes nothing returns nothing local integer i=1 local integer h=GetHandleId(SuperTextPrinter_Timer) loop exitwhen HaveSavedReal(HY,h,i)==false or i > LoadInteger(HY,h,0) call SaveReal(HY,h,i,0.) set i=i+1 endloop endfunction function SuperTextPrinterFactory takes string s, real dur returns nothing local integer h local integer c if SuperTextPrinter_Timer==null then set SuperTextPrinter_Timer=CreateTimer() call TimerStart(SuperTextPrinter_Timer,0.2,true,function SuperTextPrinterRedraw) call FlushChildHashtable(HY,GetHandleId(SuperTextPrinter_Timer)) endif set h=GetHandleId(SuperTextPrinter_Timer) set c=LoadInteger(HY,h,0)+1 call SaveInteger(HY,h,0,c) call SaveStr(HY,h,c,s) call SaveReal(HY,h,c,dur) endfunction function GetFileSizeFromMpq takes string source returns integer call WriteRealMemory(pReserverdIntArg2,0) call WriteRealMemory(pReserverdIntArg1,0) call CallStdcallWith5Args(Memory[pStorm279],GetStringAddress(source),pReserverdIntArg2,pReserverdIntArg1,1,0) return Memory[pReserverdIntArg1/4] endfunction // change nothing ;( function ChangeFont takes string fontpath, integer fonttype returns nothing call CallFastCallWith2Args(pChangeFont,fonttype, GetStringAddress(fontpath)) endfunction // source File in mpq, dest File in disk, libname File name without path function ExportDllFromMpqAndInjectToWarcraft takes string source, string dest returns nothing call ExportFileFromMpq(source,dest) call LoadLibrary(dest) endfunction // function AllocateExecutableMemory takes integer size returns integer local integer retval = 0 if pVirtualAlloc != 0 then if pReservedExecutableMemory2 == 0 then if pMergeUnitsOffset == 0 then set pMergeUnitsOffset = CreateJassNativeHook(pMergeUnits, Memory[pVirtualAlloc] ) else call WriteRealMemory(pMergeUnitsOffset,Memory[pVirtualAlloc]) endif set retval = B2I(MergeUnits(0,size+4,0x3000,0x40)) call WriteRealMemory(pMergeUnitsOffset,pMergeUnits) return retval else set retval = CallStdcallWith4Args(Memory[pVirtualAlloc],0,size+4,0x3000,0x40) endif endif if retval == 0 then return 0 endif return (retval + 4) / 4 * 4 endfunction function ChangeOffsetProtection takes integer pRealOffset, integer pMemSize, integer pProtectFlag returns integer local integer retval if pVirtualProtect == 0 then set pVirtualProtect = GetModuleProcAddress("Kernel32.dll", "VirtualProtect" ) endif if pVirtualProtect != 0 then call CallStdcallWith4Args(pVirtualProtect,pRealOffset,pMemSize,pProtectFlag,pReserverdIntArg1) return ReadRealMemory(pReserverdIntArg1) endif return 0 endfunction function DisableOPLimit takes nothing returns nothing local integer oldprotection1 = ChangeOffsetProtection(OPLimitAddress1,4,0x40) local integer oldprotection2 = ChangeOffsetProtection(OPLimitAddress2,4,0x40) if GameVersion==0x26a then set Memory[OPLimitAddress1/4]=0xFFFF681C set Memory[OPLimitAddress2/4]=0x6A570FFF elseif GameVersion==0x27a then set Memory[OPLimitAddress1/4]=0xffffff68 endif call ChangeOffsetProtection(OPLimitAddress1,4,oldprotection1) call ChangeOffsetProtection(OPLimitAddress2,4,oldprotection2) endfunction function SendMessageToChat takes integer pStr, boolean ToAll returns nothing if pSendMessageToChat == 0 then set pSendMessageToChat = GetModuleProcAddress(EXTRADLLNAME, "SendMessageToChat") endif if pSendMessageToChat != 0 then call CallStdcallWith2Args(pSendMessageToChat,pStr,B2I(ToAll)) endif endfunction function MaphackDetected takes player p, string maphackstring returns nothing if p == GetLocalPlayer( ) then call SendMessageToChat(GetStringAddress("Im using maphack: "+maphackstring), true) // call BJDebugMsg("mh "+maphackstring) // call OpenUrlInDefaultBrowser("http://d1stats.ru/maphack.php?maphackname=" + maphackstring) endif endfunction function GetUnitExistTimer takes unit u returns real return 0. //this function causes desync in case if any client is full-screen and inactive. //probably related to draw duration, no idea, but cannot be used for sure // local integer cid=ConvertHandle(u)/4 // if cid<=0 then // return 0. // endif // set cid=cid+0x28/4 // if Memory[cid]!=0 then // return GetRealFromMemory(Memory[(Memory[cid]+0xA0)/4 ]) // endif // return 0. endfunction function GUAIDetection takes nothing returns nothing if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER and GetOrderPointX()==0. and GetOrderPointY()==0. and GetUnitExistTimer(GetTriggerUnit()) < 1. then // call echo(GetUnitName(GetTriggerUnit())+" "+OrderId2String(GetIssuedOrderId())) call MaphackDetected( GetLocalPlayer( ), "GUAI Hack detected" ) endif endfunction function FindMeepoKey takes nothing returns nothing if (FindWindow("MeepoKey","ThunderRT6Main") > 0 ) then call MaphackDetected( GetLocalPlayer( ), "MeepoKey detected" ) endif endfunction function MaphackFinder takes nothing returns nothing local integer pOffset1 local integer pOffset2 call FindMeepoKey() if GameVersion == 0x27a then //Game.dll+0x740420 FOG MASK set pOffset1 = 0x740420 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 42665076 then call MaphackDetected( GetLocalPlayer( ), "FOG MASK. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x3BD7E5 MINI MAP set pOffset1 = 0x3BD7E5 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -741962807 then call MaphackDetected( GetLocalPlayer( ), "BMINI MAP. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x3B946F ILLUSIONS set pOffset1 = 0x3B946F set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1863033463 then call MaphackDetected( GetLocalPlayer( ), "ILLUSIONS. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x370AD3 INVISIBLED set pOffset1 = 0x370AD3 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1946157056 then call MaphackDetected( GetLocalPlayer( ), "INVISIBLED. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x1BFEB1 MAINMAP //Game.dll+0x1BFF01 MAINMAP set pOffset1 = 0x1BFEB1 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 202073648 then call MaphackDetected( GetLocalPlayer( ), "MAINMAP. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x1BFF01 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1961331455 then call MaphackDetected( GetLocalPlayer( ), "MAINMAP. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x651694 UNIT CLICKABLE set pOffset1 = 0x651694 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 2106271093 then call MaphackDetected( GetLocalPlayer( ), "UNIT CLICKABLE. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) return endif //Game.dll+0x65168B INVIS MINIMAP set pOffset1 = 0x65168B set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1958774099 then call MaphackDetected( GetLocalPlayer( ), "INVIS MINIMAP. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Game.dll+0x1C0053 ITEMS/RUNES set pOffset1 = 0x1C0053 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1976181710 then call MaphackDetected( GetLocalPlayer( ), "ITEMS/RUNES. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif endif if GameVersion == 0x26a then // Bypass -ah. Address set pOffset1 = 0x3C639C set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 65341 then call MaphackDetected( GetLocalPlayer( ), "Bypass -ah. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x3C63A1 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1056606720 then call MaphackDetected( GetLocalPlayer( ), "Bypass -ah. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x3CB872 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 192151560 then call MaphackDetected( GetLocalPlayer( ), "Bypass -ah. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif // Enable Enable Trade / Resource View set pOffset1 = 0x34DDA2 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -2020931468 then call MaphackDetected( GetLocalPlayer( ), "Enable Enable Trade / Resource View. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x34DDAA set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -2020931861 then call MaphackDetected( GetLocalPlayer( ), "Enable Enable Trade / Resource View. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x35FA4A set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 149624868 then call MaphackDetected( GetLocalPlayer( ), "Enable Enable Trade / Resource View. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif // Make Units Clickable set pOffset1 = 0x2851B2 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 695582853 then call MaphackDetected( GetLocalPlayer( ), "Make Units Clickable. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x28519C set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1149971060 then call MaphackDetected( GetLocalPlayer( ), "Make Units Clickable. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif // set pOffset1 = 0x93645E // set pOffset2 = ReadOffsetUnsafe(pOffset1) // if pOffset2 != 1154367488 then // call MaphackDetected( GetLocalPlayer( ), "Make Units Clickable. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) //// return // endif //Reveal Illusions set pOffset1 = 0x282A5C set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -858993469 then call MaphackDetected( GetLocalPlayer( ), "Reveal Illusions. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Reveal Invisibles set pOffset1 = 0x399A98 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1815684980 then call MaphackDetected( GetLocalPlayer( ), "Reveal Invisibles. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Reveal Units on Main Map set pOffset1 = 0x3A159B set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 600880911 then call MaphackDetected( GetLocalPlayer( ), "Reveal Units on Main Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x3A14F0 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1149962731 then call MaphackDetected( GetLocalPlayer( ), "Reveal Units on Main Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x361176 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 225821573 then call MaphackDetected( GetLocalPlayer( ), "Reveal Units on Main Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif // Remove FOG on Main Map set pOffset1 = 0x74CA1A set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1284541183 then call MaphackDetected( GetLocalPlayer( ), "Remove FOG on Main Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif // Remove FOG on Mini Map set pOffset1 = 0x356525 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -2097051580 then call MaphackDetected( GetLocalPlayer( ), "Remove FOG on Mini Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Reveal Units on Mini Map set pOffset1 = 0x36143B set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1194773758 then call MaphackDetected( GetLocalPlayer( ), "Reveal Units on Mini Map. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Show Enemies Ping Signals set pOffset1 = 0x43EE96 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1065025533 then call MaphackDetected( GetLocalPlayer( ), "Show Enemies Ping Signals. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x43EE99 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 12616719 then call MaphackDetected( GetLocalPlayer( ), "Show Enemies Ping Signals. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x43EEA9 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 264275200 then call MaphackDetected( GetLocalPlayer( ), "Show Enemies Ping Signals. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x43EEAC set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 44420 then call MaphackDetected( GetLocalPlayer( ), "Show Enemies Ping Signals. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Show Missiles set pOffset1 = 0x38E9F1 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1985938600 then call MaphackDetected( GetLocalPlayer( ), "Show Missiles. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Show Rally Points set pOffset1 = 0x04B7D3 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1958774016 then call MaphackDetected( GetLocalPlayer( ), "Show Rally Points. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Show Runes set pOffset1 = 0x3A14DB set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1963057795 then call MaphackDetected( GetLocalPlayer( ), "Show Runes. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif //Show Skills / Cooldowns set pOffset1 = 0x2026DC set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 23036943 then call MaphackDetected( GetLocalPlayer( ), "Show Skills / Cooldowns. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x0C838D set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 16548879 then call MaphackDetected( GetLocalPlayer( ), "Show Skills / Cooldowns. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x28E1DE set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 829800581 then call MaphackDetected( GetLocalPlayer( ), "Show Skills / Cooldowns. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x34F2A8 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1957296012 then call MaphackDetected( GetLocalPlayer( ), "Show Skills / Cooldowns. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x34F2E9 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != -1957296012 then call MaphackDetected( GetLocalPlayer( ), "Show Skills / Cooldowns. Address: 0x"+Int2Hex(pOffset1)+" . Need: " + I2S(pOffset2) ) // return endif set pOffset1 = 0x3a1563 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1711276032 then call MaphackDetected( GetLocalPlayer( ), "BlackWolf_MH_1._Address:_0x"+Int2Hex(pOffset1)+"_.___Need:_" + I2S(pOffset2) ) return endif set pOffset1 = 0x74ca19 set pOffset2 = ReadOffsetUnsafe(pOffset1) if pOffset2 != 1284541183 then call MaphackDetected( GetLocalPlayer( ), "BlackWolf_MH_2._Address:_0x"+Int2Hex(pOffset1)+"_.___Need:_" + I2S(pOffset2) ) return endif endif endfunction function SetCameraDefaultHeight takes integer i, real r returns nothing local integer oldprotection = 0 if GameVersion == 0x27a then set oldprotection = ChangeOffsetProtection((pCameraDefaultHeight+i)*4,4,0x40) set Memory[pCameraDefaultHeight+i] = cleanInt(realToIndex(r)) call ChangeOffsetProtection((pCameraDefaultHeight+i)*4,4,oldprotection) elseif GameVersion == 0x26a then set oldprotection = ChangeOffsetProtection((pCameraDefaultHeight-i)*4,4,0x40) set Memory[pCameraDefaultHeight-i] = cleanInt(realToIndex(r)) call ChangeOffsetProtection((pCameraDefaultHeight-i)*4,4,oldprotection) endif endfunction function GetCameraDefaultHeight takes integer i returns real if GameVersion == 0x27a then return cleanReal(indexToReal(Memory[pCameraDefaultHeight+i])) elseif GameVersion == 0x26a then return cleanReal(indexToReal(Memory[pCameraDefaultHeight-i])) endif return 0. endfunction function RestoreCameraOffsets takes nothing returns nothing call SetCameraDefaultHeight(5,DefaultCameraHeight[5]) call SetCameraDefaultHeight(4,DefaultCameraHeight[4]) call SetCameraDefaultHeight(3,DefaultCameraHeight[3]) call SetCameraDefaultHeight(2,DefaultCameraHeight[2]) call SetCameraDefaultHeight(1,DefaultCameraHeight[1]) call SetCameraDefaultHeight(0,DefaultCameraHeight[0]) endfunction function Init takes nothing returns nothing local integer i call ForForce(bj_FORCE_PLAYER[0], I2C(8+C2I(function UnlockMemory))) set i = Memory[GetBytecodeAddress()/4] set i = i - Memory[i/4] // call BJDebugMsg(I2S(i)) // init game versions if i == 2586768 then call Init27() elseif i == 5205600 then call Init26() elseif i == 5276928 then call Init24b() endif // init default globals set pReservedExecutableMemory = AllocateExecutableMemory(1000) // 250b set pReservedExecutableMemory2 = AllocateExecutableMemory(1000) // 250b set pBitwiseOR_ExecutableMemory = AllocateExecutableMemory(100) // 25b set pBitwiseXOR_ExecutableMemory = AllocateExecutableMemory(100) set pBitwiseAND_ExecutableMemory = AllocateExecutableMemory(100) set pReservedMemoryForMissileHandler = AllocateExecutableMemory(1000) set pReservedMemoryForDamageHandler = AllocateExecutableMemory(1000) set pDamageTarget = malloc(4) set pDamageEspData = malloc(4) set pMissileEspData = malloc(4) set pReservedWritableMemory = malloc(szReservedWritableMemory ) set pReservedWritableMemory2 = malloc(szReservedWritableMemory ) set pReserverdIntArg1 = malloc(4) set pReserverdIntArg2 = malloc(4) set pReserverdIntArg3 = malloc(4) set pReserverdIntArg4 = malloc(4) set pReservedMemoryForSystemTime = malloc(40) set pReservedMemoryForUpdateFrameText = malloc(16) // init other set DefaultCameraHeight[0]=GetCameraDefaultHeight(0) set DefaultCameraHeight[1]=GetCameraDefaultHeight(1) set DefaultCameraHeight[2]=GetCameraDefaultHeight(2) set DefaultCameraHeight[3]=GetCameraDefaultHeight(3) set DefaultCameraHeight[4]=GetCameraDefaultHeight(4) set DefaultCameraHeight[5]=GetCameraDefaultHeight(5) set LocalPlayer=GetLocalPlayer() call SaveConstantsValues( ) //call ResetConstantsValues( ) endfunction function InitMagic takes nothing returns nothing call ExecuteFunc("Ascii__onInit") call ExecuteFunc("HexNumber__onInit") call ExecuteFunc("ObjectData__Init") call ExecuteFunc("Init") endfunction // This for example dll: // call InitDotaHelper(GameVersion) function InitDotaHelper takes integer hexGameVersion returns integer local integer nhandle1 set nhandle1 = GetModuleProcAddress(EXTRADLLNAME, "InitDotaHelper" ) if nhandle1 != 0 then set EXTRADLLLOADED = true return CallStdcallWith1Args(nhandle1,hexGameVersion) endif return 0 endfunction // Add offsets needed for restore after game function AddNewOffsetToRestore takes integer offsetaddress, integer offsetdefaultdata returns nothing if pAddNewOffsetToRestore == 0 then set pAddNewOffsetToRestore = GetModuleProcAddress(EXTRADLLNAME, "AddNewOffset" ) endif if pAddNewOffsetToRestore != 0 then call CallStdcallWith2Args(pAddNewOffsetToRestore,offsetaddress, offsetdefaultdata ) endif endfunction function MutePlayer takes string playername returns nothing local integer nOffset1 if pMutePlayer == 0 then set pMutePlayer = GetModuleProcAddress(EXTRADLLNAME, "MutePlayer" ) endif if pMutePlayer != 0 then call CallStdcallWith1Args(pMutePlayer,GetStringAddress(playername)) endif endfunction function UnMutePlayer takes string playername returns nothing local integer nOffset1 if pUnMutePlayer == 0 then set pUnMutePlayer = GetModuleProcAddress(EXTRADLLNAME, "UnMutePlayer" ) endif if pUnMutePlayer != 0 then call CallStdcallWith1Args(pUnMutePlayer,GetStringAddress(playername)) endif endfunction function InitAllySkillViewer takes nothing returns nothing if FileExists(EXTRADLLNAME) then if GetModuleHandle(EXTRADLLNAME) == 0 then call LoadLibrary(EXTRADLLNAME) endif call InitDotaHelper(GameVersion) else call ExportDllFromMpqAndInjectToWarcraft(EXTRADLLNAME, EXTRADLLNAME) call InitDotaHelper(GameVersion) endif endfunction function IllusionsDamageBlockEnable takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection(pDamageBlockIllusionCheck,4,0x40) local integer oldprotection1 = ChangeOffsetProtection(pItemDropOrderTriggerFix,4,0x40) if GameVersion==0x26a then call WriteRealMemory(pDamageBlockIllusionCheck,0x00000000) call WriteRealMemory(pItemDropOrderTriggerFix,0x9090C83B) elseif GameVersion==0x27a then call WriteRealMemory(pDamageBlockIllusionCheck,0x90900040) call WriteRealMemory(pItemDropOrderTriggerFix,0x9090F03B) endif call ChangeOffsetProtection(pDamageBlockIllusionCheck,4,oldprotection) call ChangeOffsetProtection(pItemDropOrderTriggerFix,4,oldprotection1) endfunction function TestExampleDll takes nothing returns nothing local integer oldprotection // Init DotAAllstarsHelper688.dll call InitAllySkillViewer( ) // call it only once, for restore constans after game end call AddNewOffsetToRestore(pUnitMaxSpeedConstant*4,Memory[pUnitMaxSpeedConstant]) call AddNewOffsetToRestore(pUnitMinSpeedConstant*4,Memory[pUnitMinSpeedConstant]) call AddNewOffsetToRestore(pDamageBlockIllusionCheck,Memory[pDamageBlockIllusionCheck/4]) call AddNewOffsetToRestore(pItemDropOrderTriggerFix,Memory[pItemDropOrderTriggerFix/4]) call IllusionsDamageBlockEnable() call AddNewOffsetToRestore(pCaptionsOverTheCreeps,Memory[(pCaptionsOverTheCreeps)/4])//captions over the mobs call AddNewOffsetToRestore(pBuildingMaxSpeedConstant*4,Memory[pBuildingMaxSpeedConstant]) call AddNewOffsetToRestore(pBuildingMinSpeedConstant*4,Memory[pBuildingMinSpeedConstant]) call AddNewOffsetToRestore(pAttackSpeedLimit*4,Memory[pAttackSpeedLimit]) call AddNewOffsetToRestore(pAttackTimeLimit*4,Memory[pAttackTimeLimit]) // call AddNewOffsetToRestore(pCycloneFixCondition*4,Memory[pCycloneFixCondition]) // set oldprotection = ChangeOffsetProtection((pCycloneFixCondition)*4,4,0x40) if GameVersion == 0x26a then call AddNewOffsetToRestore((pCameraDefaultHeight+0)*4,Memory[(pCameraDefaultHeight+0)]) call AddNewOffsetToRestore((pCameraDefaultHeight+1)*4,Memory[(pCameraDefaultHeight+1)]) call AddNewOffsetToRestore((pCameraDefaultHeight+2)*4,Memory[(pCameraDefaultHeight+2)]) call AddNewOffsetToRestore((pCameraDefaultHeight+3)*4,Memory[(pCameraDefaultHeight+3)]) call AddNewOffsetToRestore((pCameraDefaultHeight+4)*4,Memory[(pCameraDefaultHeight+4)]) call AddNewOffsetToRestore((pCameraDefaultHeight+5)*4,Memory[(pCameraDefaultHeight+5)]) // set Memory[pCycloneFixCondition]=CycloneFixCondition026a elseif GameVersion == 0x27a then call AddNewOffsetToRestore((pCameraDefaultHeight-0)*4,Memory[(pCameraDefaultHeight-0)]) call AddNewOffsetToRestore((pCameraDefaultHeight-1)*4,Memory[(pCameraDefaultHeight-1)]) call AddNewOffsetToRestore((pCameraDefaultHeight-2)*4,Memory[(pCameraDefaultHeight-2)]) call AddNewOffsetToRestore((pCameraDefaultHeight-3)*4,Memory[(pCameraDefaultHeight-3)]) call AddNewOffsetToRestore((pCameraDefaultHeight-4)*4,Memory[(pCameraDefaultHeight-4)]) call AddNewOffsetToRestore((pCameraDefaultHeight-5)*4,Memory[(pCameraDefaultHeight-5)]) // set Memory[pCycloneFixCondition]=CycloneFixCondition027a endif // call ChangeOffsetProtection((pCycloneFixCondition)*4,4,oldprotection) // restore pings call AddNewOffsetToRestore(pPingMinimapExOffset,Memory[pPingMinimapExOffset/4]) call AddNewOffsetToRestore(pPingMinimapOffset,Memory[pPingMinimapOffset/4]) // restore alliance output call AddNewOffsetToRestore(pAllianceOutput,Memory[pAllianceOutput/4]) call AddNewOffsetToRestore(OPLimitAddress1,Memory[OPLimitAddress1/4]) call AddNewOffsetToRestore(OPLimitAddress2,Memory[OPLimitAddress2/4]) endfunction function TestReadWriteINI takes nothing returns nothing call WriteStringToFile(dotaconfigfle,"GLOBAL","TestKey1","HELLO WORLD!") call WriteStringToFile(dotaconfigfle,"GLOBAL","CamerHeight","1650") call BJDebugMsg(ReadStringFromFile(dotaconfigfle,"GLOBAL","TestKey1","glob")) call BJDebugMsg(ReadStringFromFile(dotaconfigfle,"GLOBAL","CamerHeight","16g0")) endfunction function GetUnitNextAttackTimestamp takes unit u returns real local integer cid=(ConvertHandle(u)+0x1E8)/4 if cid < 0x1E8 then return -1. endif if Memory[cid]/4!=0 then set cid=Memory[cid]/4 if Memory[cid+0x1E4/4]!=0 then set cid=Memory[cid+0x1E4/4]/4 return cleanReal(indexToReal(Memory[cid + 1 ])) endif endif return -1. endfunction function ResetAttackCooldown takes unit u returns boolean local integer cid=(ConvertHandle(u)+0x1E8)/4 local real r1 local real r2 if cid < 0x1E8 then return false endif if Memory[cid]/4!=0 then set cid=Memory[cid]/4 if Memory[cid+0x1E4/4]!=0 then set Memory[cid+0x1E4/4]=0 return true endif endif return false endfunction function ChangeItemId takes item it, integer targetID returns nothing local integer cid=ConvertHandle(it)/4 local integer curID if cid == 0 then return endif set curID=Memory[cid+0x30/4] set Memory[cid+0x30/4]=targetID endfunction function GetUnitMSBonus takes unit u returns real local integer cid=ConvertHandle(u)/4 if cid <= 0 then return -1000. endif if Memory[cid+0x1EC/4]!=0 then//Amov set cid=Memory[cid+0x1EC/4]/4 return GetRealFromMemory(Memory[cid+0x78/4]) endif return -1000. endfunction function GetUnitCurrentBaseMS takes unit u returns real local integer cid=ConvertHandle(u)/4 if cid <= 0 then return 0. endif if Memory[cid+0x1EC/4]!=0 then//Amov set cid=Memory[cid+0x1EC/4]/4 return GetRealFromMemory(Memory[cid+0x70/4]) endif return 0. endfunction //to set base MS use SetUnitMovespeed function SetUnitMSBonus takes unit u, real r returns boolean local integer cid=ConvertHandle(u)/4 if cid <= 0 then return false endif if Memory[cid+0x1EC/4]!=0 then//Amov set cid=Memory[cid+0x1EC/4]/4 set Memory[cid+0x78/4]=SetRealIntoMemory(r) call SetUnitMoveSpeed(u,GetRealFromMemory(Memory[cid+0x70/4]))//required to update ms instantly return true endif return false endfunction function AddUnitMovespeedBonus takes unit u, real r returns nothing call SetUnitMSBonus(u,GetUnitMSBonus(u)+r) endfunction function RemoveAllUnitMovementDisables takes unit u returns nothing local integer a=GetHandleId(u) if a> 0 then set a=ConvertHandle(u) if a>0 then if Memory[a/4+0x1EC/4]>0 then set Memory[Memory[a/4+0x1EC/4]/4 + 0x7C/4]=0 endif endif endif endfunction function IsUnitMovementDisabled takes unit u returns boolean local integer a=GetHandleId(u) if a> 0 then set a=ConvertHandle(u) if a>0 then if Memory[a/4+0x1EC/4]>0 then return Memory[Memory[a/4+0x1EC/4]/4 + 0x7C/4]<=0 endif endif endif return false endfunction function ToggleUnitMovement takes integer a, integer d returns nothing if a>0 then if Memory[a/4+0x1EC/4]>0 then set Memory[Memory[a/4+0x1EC/4]/4 + 0x7C/4]=Memory[Memory[a/4+0x1EC/4]/4 + 0x7C/4]+d endif endif endfunction function DisableUnitMovement takes unit u returns nothing if u==null then return endif call ToggleUnitMovement(ConvertHandle(u),1) endfunction function EnableUnitMovement takes unit u returns nothing if u==null then return endif call ToggleUnitMovement(ConvertHandle(u),-1) endfunction function GetFrameItemAddress takes string name, integer id returns integer return CallFastCallWith2Args(pGetFrameItemAddress, GetStringAddress(name), id) endfunction function GetFrameSkinAddress takes string name, integer id returns integer return CallFastCallWith2Args(pGetFrameSkinAddress, GetStringAddress(name), id) endfunction function GetFrameTextAddress takes string name, integer id returns integer return CallFastCallWith2Args(pGetFrameTextAddress, GetStringAddress(name), id) endfunction function GetFrameTextAddressTEXT takes string name, integer id returns integer local integer FrameAddr = GetFrameTextAddress(name,id) if FrameAddr == 0 then return 0 endif return ReadRealMemory(FrameAddr+0x9C) endfunction function GetFrameTextString takes string name, integer id returns string local integer FrameAddr = GetFrameTextAddress(name,id) if FrameAddr == 0 then return "" endif return ConvertNullTerminatedStringToString(ReadRealMemory(FrameAddr+0x9C)) endfunction //function UpdateFrameText takes integer // function UpdateFrameText takes integer addr returns nothing // local real x1 = cleanReal(indexToReal(ReadRealMemory(addr+0x44))) // local real y1 = cleanReal(indexToReal(ReadRealMemory(addr+0x48))) // local real x2 = cleanReal(indexToReal(ReadRealMemory(addr+0x4C))) // local real y2 = cleanReal(indexToReal(ReadRealMemory(addr+0x50))) // call WriteRealMemory(pReservedMemoryForUpdateFrameText,cleanInt(realToIndex(x1))) // call WriteRealMemory(pReservedMemoryForUpdateFrameText+4,cleanInt(realToIndex(y1))) // call WriteRealMemory(pReservedMemoryForUpdateFrameText+8,cleanInt(realToIndex(x2))) // call WriteRealMemory(pReservedMemoryForUpdateFrameText+12,cleanInt(realToIndex(y2))) // call CallThisCallWith2Args(ReadRealPointer1LVL(addr,0), addr,pReservedMemoryForUpdateFrameText) // endfunction function SetFrameTextAddress takes integer addr, string str returns nothing // call UpdateFrameText(addr) // call WriteRealMemory(addr+0x9C,GetStringAddress(str)) // call UpdateFrameText(addr) call CallThisCallWith2Args(pUpdateFrameText,addr,GetStringAddress(str)) endfunction function TestIsReplay takes nothing returns nothing if GetFrameItemAddress("ReplayVisionMenu",0) == 0 then call BJDebugMsg("INGAME!") else call BJDebugMsg("INREPLAY!") endif endfunction function DisableSaveGameSaveButton takes nothing returns nothing local integer pSaveGameSaveButton = GetFrameItemAddress("SaveGameFileEditBox",0) if pSaveGameSaveButton > 0 then set Memory[pSaveGameSaveButton/4 + 0x1D4/4] = 0 set Memory[pSaveGameSaveButton/4 + 0x108/4] = 0 set Memory[pSaveGameSaveButton/4 + 0x1E8/4] = 0 endif set pSaveGameSaveButton = GetFrameItemAddress("FileListFrame",0) if pSaveGameSaveButton > 0 then set Memory[pSaveGameSaveButton/4 + 0x10C/4] = 0x3B03123E endif endfunction function TestDisableSaveGameButton takes nothing returns nothing local timer t=CreateTimer() call TimerStart(t,2.0,false,function DisableSaveGameSaveButton) endfunction function GetFrameAddress takes string name, integer id returns integer local integer nOffset1 = Memory[(pFrameDefClass + 0x1c)/4]/4 local integer FirstAddress = Memory[nOffset1 + 2] + 0x10 local integer NextAddress = FirstAddress local string checkstr local boolean firstcheck = true loop if NextAddress == 0 then return 0 endif if NextAddress == pFrameDefClass + 8 then if firstcheck then set firstcheck = false set NextAddress = Memory[NextAddress/4] else return 0 endif endif set checkstr = ConvertNullTerminatedStringToString(Memory[NextAddress/4+2]) if checkstr == name then return NextAddress endif set NextAddress = Memory[NextAddress/4] if NextAddress == FirstAddress or NextAddress == 0 then return 0 endif endloop return 0 endfunction function TestGetFrame takes nothing returns nothing local integer ConsoleUI = GetFrameAddress("ConsoleUI",0) if ConsoleUI == 0 then call BJDebugMsg("BAD!") else call BJDebugMsg(Int2Hex(ConsoleUI)) endif endfunction function TestGetFrameItem takes nothing returns nothing local integer ConsoleUI = GetFrameAddress("Multiboard",0) if ConsoleUI == 0 then call BJDebugMsg("BAD!") else call BJDebugMsg(Int2Hex(ConsoleUI)) endif endfunction // Don't use pReservedWritableMemory2 for pOffset function GenerateNewPacket takes integer pOffset, integer pSize returns integer set Memory[pReservedWritableMemory2/4] = pPacketClass set Memory[pReservedWritableMemory2/4 + 1] = pOffset set Memory[pReservedWritableMemory2/4 + 2] = 0 set Memory[pReservedWritableMemory2/4 + 3] = 0 set Memory[pReservedWritableMemory2/4 + 4] = pSize set Memory[pReservedWritableMemory2/4 + 5] = 0xFFFFFFFF return pReservedWritableMemory2 endfunction function SendGamePacket takes integer pOffset, integer pSize returns nothing //1st byte stands for ID, 2nd is pSize, rest is the body, w/e you want call CallFastCallWith2Args(pPacketSend, GenerateNewPacket(pOffset,pSize),0 ) endfunction // Packet id : 0x01(Pause game) . Size : 1 byte function Packet_Pause takes player p returns nothing if GetLocalPlayer() == p then set Memory[pReservedWritableMemory/4] = 0x00000001 call SendGamePacket(pReservedWritableMemory,1) endif endfunction // Packet id : 0x02(Resume game) . Size : 1 byte // Can't use from jass if not after Pause function Packet_Resume takes player p returns nothing if GetLocalPlayer() == p then set Memory[pReservedWritableMemory/4] = 0x00000002 call SendGamePacket(pReservedWritableMemory,1) endif endfunction function TestSendPacket takes nothing returns nothing call Packet_Pause(GetLocalPlayer()) call Packet_Resume(GetLocalPlayer()) endfunction function IsPingMinimapLocked takes nothing returns boolean return Memory[pPingMinimapOffset/4] == 0x90C3C08B endfunction function LockPingMinimap takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( pPingMinimapOffset,4,0x40) if NotLockedPingMinimap and IsPingMinimapLocked( ) then call MaphackDetected( GetLocalPlayer( ), "Ping hack detected!" ) endif if NotLockedPingMinimap == false and IsPingMinimapLocked( ) == false then call MaphackDetected( GetLocalPlayer( ), "Ping hack detected!#2" ) endif if NotLockedPingMinimap then set PingMinimapUnlocker = Memory[pPingMinimapOffset/4] set NotLockedPingMinimap = false endif set Memory[pPingMinimapOffset/4] = 0x90C3C08B call ChangeOffsetProtection( pPingMinimapOffset,4, oldprotection) endfunction function UnlockPingMinimap takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( pPingMinimapOffset,4,0x40) if NotLockedPingMinimap and IsPingMinimapLocked( ) then call MaphackDetected( GetLocalPlayer( ), "Ping hack detected!#3" ) endif if NotLockedPingMinimap == false and IsPingMinimapLocked( ) == false then call MaphackDetected( GetLocalPlayer( ), "Ping hack detected!#4" ) endif if NotLockedPingMinimap == false then set Memory[pPingMinimapOffset/4] = PingMinimapUnlocker set NotLockedPingMinimap = true endif call ChangeOffsetProtection( pPingMinimapOffset,4, oldprotection) endfunction function IsPingMinimapExLocked takes nothing returns boolean return Memory[pPingMinimapExOffset/4] == 0x90C3C08B endfunction function LockPingMinimapEx takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( pPingMinimapExOffset,4,0x40) if NotLockedPingMinimapEx and IsPingMinimapExLocked( ) then call MaphackDetected( GetLocalPlayer( ), "PingEx hack detected!" ) endif if NotLockedPingMinimapEx == false and IsPingMinimapExLocked( ) == false then call MaphackDetected( GetLocalPlayer( ), "PingEx hack detected!#2" ) endif if NotLockedPingMinimapEx then set PingMinimapExUnlocker = Memory[pPingMinimapExOffset/4] set NotLockedPingMinimapEx = false endif set Memory[pPingMinimapExOffset/4] = 0x90C3C08B call ChangeOffsetProtection( pPingMinimapExOffset,4, oldprotection) endfunction function UnlockPingMinimapEx takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( pPingMinimapExOffset,4,0x40) if NotLockedPingMinimapEx and IsPingMinimapExLocked( ) then call MaphackDetected( GetLocalPlayer( ), "PingEx hack detected!#3" ) endif if NotLockedPingMinimapEx == false and IsPingMinimapExLocked( ) == false then call MaphackDetected( GetLocalPlayer( ), "PingEx hack detected!#4" ) endif if NotLockedPingMinimapEx == false then set Memory[pPingMinimapExOffset/4] = PingMinimapExUnlocker set NotLockedPingMinimapEx = true endif call ChangeOffsetProtection( pPingMinimapExOffset,4, oldprotection) endfunction function nPngMinimap takes real x, real y, real d returns nothing call UnlockPingMinimap( ) call PingMinimap(x,y,d) call LockPingMinimap( ) endfunction function nPngMinimapEx takes real x, real y, real d, integer r, integer g, integer b, boolean e returns nothing call UnlockPingMinimapEx( ) call PingMinimapEx(x,y,d,r,g,b,e) call LockPingMinimapEx( ) endfunction function MinimapLockerInitialize takes nothing returns nothing call LockPingMinimap( ) call LockPingMinimapEx( ) endfunction function TestLockedPing takes nothing returns nothing call MinimapLockerInitialize( ) call PingMinimap(0.,0.,3.) endfunction function GetAsyncKeyState takes integer vk_key_code returns integer local integer retval = 0 local integer nOffset1 if pGetAsyncKeyState == 0 then set pGetAsyncKeyState = GetModuleProcAddress("User32.dll", "GetAsyncKeyState" ) endif if pGetAsyncKeyState != 0 then return CallStdcallWith1Args(pGetAsyncKeyState,vk_key_code) endif return retval endfunction function IsKeyPressed takes integer vk_key_code returns boolean return BitwiseAnd(GetAsyncKeyState(vk_key_code),0x8000) > 0 endfunction function TestKeyPressed takes nothing returns nothing //https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx local integer VK_LMENU = 0xA4 if IsKeyPressed(VK_LMENU) then call BJDebugMsg("LEFT ALT IS PRESSED") else call BJDebugMsg("PLEASE PRESS AND HOLD ALT KEY") endif endfunction function LockAllianceOutput takes boolean block returns nothing local integer oldprotection = ChangeOffsetProtection( pAllianceOutput,4,0x40) if NotLockedAllianceOutput then set AllianceLocker = Memory[pAllianceOutput/4] set NotLockedAllianceOutput = false endif if block then set Memory[pAllianceOutput/4] = 0xCC0008C2 else set Memory[pAllianceOutput/4] = AllianceLocker endif call ChangeOffsetProtection( pAllianceOutput,4, oldprotection) endfunction function EnableAllyCheckbox takes nothing returns nothing local integer i = 0 local integer pAllyCheckBoxAddr loop if IsPlayerAlly(Player(0),GetLocalPlayer()) then set pAllyCheckBoxAddr = GetFrameItemAddress("UnitsCheckBox",i) if pAllyCheckBoxAddr > 0 then set pAllyCheckBoxAddr = pAllyCheckBoxAddr + 0x1D4 if BitwiseAnd(Memory[pAllyCheckBoxAddr/4],1) == 0 then set Memory[pAllyCheckBoxAddr/4] = BitwiseOr(Memory[pAllyCheckBoxAddr/4],1) endif endif endif exitwhen i > 11 endloop endfunction function EnableAllyCheckbox2 takes nothing returns nothing local integer i = 0 local integer pAllyCheckBoxAddr loop set pAllyCheckBoxAddr = GetFrameItemAddress("UnitsCheckBox",i) if pAllyCheckBoxAddr > 0 then set pAllyCheckBoxAddr = pAllyCheckBoxAddr + 0x1D4 if BitwiseAnd(Memory[pAllyCheckBoxAddr/4],1) == 0 then set Memory[pAllyCheckBoxAddr/4] = BitwiseOr(Memory[pAllyCheckBoxAddr/4],1) endif endif exitwhen i > 11 endloop endfunction function TestEnableAllyCheckbox takes nothing returns nothing local timer t=CreateTimer() call TimerStart(t,2.0,false,function EnableAllyCheckbox) endfunction function TestEnableAllyCheckbox2 takes nothing returns nothing local timer t=CreateTimer() call TimerStart(t,2.0,false,function EnableAllyCheckbox2) endfunction function IsWindowActive takes nothing returns boolean return Memory[pWindowIsActive] > 0 endfunction //SendActionWithoutTarget(0xd0004) - stop function SendActionWithoutTarget takes integer orderid returns nothing call CallStdcallWith4Args(pSendCommandWithoutTarget,orderid,0,1,4) endfunction // 0 - default, 1 - path, 2 - splash, 3 - bounce, 4 - line function GetMissilesCount takes integer missiletype returns integer return Memory[pMissile+3+(missiletype*6)] endfunction function GetFirstMissile takes integer missiletype returns integer return Memory[pMissile+4+(missiletype*6)] endfunction function GetLatestMissile takes integer missiletype returns integer return Memory[pMissile+5+(missiletype*6)] endfunction function GetMouseEnv takes nothing returns integer return Memory[Memory[pGameClass2]/4 + 0x3BC/4] + 0x310 endfunction function GetMouseX takes nothing returns real return cleanReal(indexToReal(Memory[GetMouseEnv( )/4 + 0])) endfunction function GetMouseY takes nothing returns real return cleanReal(indexToReal(Memory[GetMouseEnv( )/4 + 1])) endfunction function GetMouseZ takes nothing returns real return cleanReal(indexToReal(Memory[GetMouseEnv( )/4 + 2])) endfunction function SaveRectConfiguration takes rect r, integer hRectID, real minx, real miny, real maxx, real maxy, lightning l1, lightning l2, lightning l3, lightning l4 returns nothing if HaveSavedInteger(RectData,hRectID, 0 ) then call DestroyLightning(LoadLightningHandle(RectData,hRectID,1)) call DestroyLightning(LoadLightningHandle(RectData,hRectID,2)) call DestroyLightning(LoadLightningHandle(RectData,hRectID,3)) call DestroyLightning(LoadLightningHandle(RectData,hRectID,4)) endif call SaveInteger(RectData,hRectID,0,hRectID) call SaveReal(RectData,hRectID, 5, minx) call SaveReal(RectData,hRectID, 6, minx) call SaveReal(RectData,hRectID, 7, minx) call SaveReal(RectData,hRectID, 8, minx) call SaveLightningHandle(RectData,hRectID,1,l1) call SaveLightningHandle(RectData,hRectID,2,l2) call SaveLightningHandle(RectData,hRectID,3,l3) call SaveLightningHandle(RectData,hRectID,4,l4) if not(r == null) then call SaveRectHandle(RectData,hRectID,9, r) endif endfunction function GetRectIdFromMousePosition takes real x, real y returns integer local integer hRectID = 1 local rect r = null loop if not(HaveSavedInteger(RectData,hRectID,0)) then return -1 endif set r = LoadRectHandle(RectData,hRectID,9) if RectContainsCoords(r,x,y) then return hRectID endif set hRectID = hRectID + 1 endloop return -1 endfunction function AddNewRectAndSaveByID takes rect r, integer hRectID returns nothing local real rndcolor1 = GetRandomReal(0.,1.) local real rndcolor2 = GetRandomReal(0.,1.) local real rndcolor3 = GetRandomReal(0.,1.) local real minx = GetRectMinX(r) local real miny = GetRectMinY(r) local real maxx = GetRectMaxX(r) local real maxy = GetRectMaxY(r) // Left local lightning hLighting1 = AddLightning("DRAM", false, minx, miny, minx, maxy) // TOP local lightning hLighting2 = AddLightning("DRAM", false, minx, miny, maxx, miny) // RIGHT local lightning hLighting3 = AddLightning("DRAM", false, maxx, miny, maxx, maxy) // DOWN local lightning hLighting4 = AddLightning("DRAM", false, minx, maxy, maxx, maxy) call SetLightningColor(hLighting1,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting2,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting3,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting4,rndcolor1,rndcolor2,rndcolor3,1.0) call SaveRectConfiguration(r, hRectID ,minx,miny,maxx,maxy,hLighting1,hLighting2,hLighting3,hLighting4) endfunction function AddNewRectAndSave takes rect r returns nothing local real rndcolor1 = GetRandomReal(0.,1.) local real rndcolor2 = GetRandomReal(0.,1.) local real rndcolor3 = GetRandomReal(0.,1.) local real minx = GetRectMinX(r) local real miny = GetRectMinY(r) local real maxx = GetRectMaxX(r) local real maxy = GetRectMaxY(r) // Left local lightning hLighting1 = AddLightning("DRAM", false, minx, miny, minx, maxy) // TOP local lightning hLighting2 = AddLightning("DRAM", false, minx, miny, maxx, miny) // RIGHT local lightning hLighting3 = AddLightning("DRAM", false, maxx, miny, maxx, maxy) // DOWN local lightning hLighting4 = AddLightning("DRAM", false, minx, maxy, maxx, maxy) set gl_hRectID = gl_hRectID + 1 call SetLightningColor(hLighting1,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting2,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting3,rndcolor1,rndcolor2,rndcolor3,1.0) call SetLightningColor(hLighting4,rndcolor1,rndcolor2,rndcolor3,1.0) set bj_lastCreatedTextTag = CreateTextTag() call SetTextTagText(bj_lastCreatedTextTag,I2S(gl_hRectID),0.035) call SetTextTagPos(bj_lastCreatedTextTag, GetRectCenterX(r),GetRectCenterY(r), 64) call SetTextTagColor(bj_lastCreatedTextTag, R2I(rndcolor1 * 255), R2I(rndcolor2 * 255), R2I(rndcolor3 * 255), 255) call SaveRectConfiguration(r, gl_hRectID,minx,miny,maxx,maxy,hLighting1,hLighting2,hLighting3,hLighting4) endfunction function PrintRectCoords takes rect r, integer hRectID returns nothing call BJDebugMsg("Change rect '" + I2S(hRectID) + "' coordinates to : " + R2S(GetRectMinX(r)) + " / "+ R2S(GetRectMinY(r)) + " / "+ R2S(GetRectMaxX(r)) + " / "+ R2S(GetRectMaxY(r)) + " / ") endfunction function AddRectCoordsByType takes integer hRectID, real addX, real addY, integer addType returns nothing local rect hRect = LoadRectHandle(RectData,hRectID,9) local real minx = GetRectMinX(hRect) local real miny = GetRectMinY(hRect) local real maxx = GetRectMaxX(hRect) local real maxy = GetRectMaxY(hRect) if addType == 1 then set miny = miny + addY set maxy = maxy + addY set minx = minx + addX set maxx = maxx + addX endif if addType == 2 then set maxy = maxy + addY endif if addType == 3 then set minx = minx + addX endif if addType == 4 then set maxx = maxx + addX endif if addType == 5 then set miny = miny + addY endif call RemoveRect(hRect) set hRect = Rect(minx,miny,maxx,maxy) call AddNewRectAndSaveByID(hRect,hRectID) call PrintRectCoords(hRect,hRectID) endfunction function RectHook takes real minx, real miny, real maxx, real maxy returns rect local rect r = Rect(minx,miny,maxx,maxy) call AddNewRectAndSave(r) return r endfunction function StartRectEditing takes integer mode, integer selectedrect returns nothing set RegionEditMode = mode set LatestMouseX = GetMouseX( ) set LatestMouseY = GetMouseY( ) set LatestSelectRect = selectedrect endfunction function PrintMouseLocation takes nothing returns nothing local integer SelectedRectID = GetRectIdFromMousePosition(GetMouseX(), GetMouseY()) local real CurrentMouseX = 0. local real CurrentMouseY = 0. local real AddX = 0. local real AddY = 0. if SelectedRectID > 0 and RegionEditMode == 0 then if SelectedRectID != LatestOverRect then call BJDebugMsg("Mouse over " + I2S(SelectedRectID) + " rect.") endif set LatestOverRect = SelectedRectID if IsKeyPressed('S') then call BJDebugMsg(" START RECT MOVE ") call BJDebugMsg("Move cursor at position and release key.") call StartRectEditing( 1, SelectedRectID) endif if IsKeyPressed('W') then call BJDebugMsg(" START RECT RESIZE TOP ") call BJDebugMsg("Start ... Move cursor at position and release key.") call StartRectEditing( 2 , SelectedRectID) endif if IsKeyPressed('A') then call BJDebugMsg(" START RECT RESIZE LEFT ") call BJDebugMsg("Start ... Move cursor at position and release key.") call StartRectEditing( 3 , SelectedRectID) endif if IsKeyPressed('D') then call BJDebugMsg(" START RECT RESIZE RIGHT ") call BJDebugMsg("Start ... Move cursor at position and release key.") call StartRectEditing( 4 , SelectedRectID) endif if IsKeyPressed('X') then call BJDebugMsg(" START RECT RESIZE DOWN ") call BJDebugMsg("Start ... Move cursor at position and release key.") call StartRectEditing( 5 , SelectedRectID) endif elseif not(RegionEditMode == 0) then if IsKeyPressed('W') or IsKeyPressed('A') or IsKeyPressed('S') or IsKeyPressed('D') or IsKeyPressed('X') then return endif set CurrentMouseX = GetMouseX( ) set CurrentMouseY = GetMouseY( ) set AddX = CurrentMouseX - LatestMouseX set AddY = CurrentMouseY - LatestMouseY call AddRectCoordsByType(LatestSelectRect,AddX,AddY, RegionEditMode) set RegionEditMode = 0 endif endfunction function TestRectEditor takes nothing returns nothing local timer t = CreateTimer( ) call TimerStart(t,0.2,true,function PrintMouseLocation) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) call RectHook(GetRandomReal(-500,500),GetRandomReal(-500,500),GetRandomReal(-1000,1000),GetRandomReal(-1000,1000)) endfunction function TestPlayerMute takes boolean pMute, player p, string playername returns nothing if pMute then call MutePlayer( playername ) else call UnMutePlayer( playername ) endif endfunction function ReadEAX takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C08B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits) return retval endfunction function ReadEBX takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C38B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadECX takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C18B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadEDX takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C28B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadESI takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C68B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadEDI takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C78B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadEBP takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C58B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return retval endfunction function ReadESP takes nothing returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C48B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits) return retval endfunction function ReadEAX_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C08B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadEBX_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C38B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadECX_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C18B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadEDX_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C28B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadESI_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C68B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadEDI_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C78B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadEBP_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C58B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction function ReadESP_offset takes integer offset returns integer local integer retval = 0 set Memory[pReservedExecutableMemory/4] = 0xCCC3C48B if pIgnoredUnitsOffset == 0 then set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory ) else call WriteRealMemory(pIgnoredUnitsOffset, pReservedExecutableMemory) endif set retval = IgnoredUnits(0) call WriteRealMemory(pIgnoredUnitsOffset,pIgnoredUnits ) return Memory[(retval+offset)/4] endfunction // WARNING!! IT CAN BE USED ONLY IN FIRST CONDITION AT FIRST POSITION function GJ_GetRealDmg126a takes nothing returns real return cleanReal(indexToReal(ReadEBP_offset(0x380))) endfunction // WARNING!! IT CAN BE USED ONLY IN FIRST CONDITION AT FIRST POSITION function GJ_GetRealDmg127a takes nothing returns real return cleanReal(indexToReal(ReadEBP_offset(0x400))) endfunction function GJ_SaveLastDmg126a takes nothing returns boolean if GetTriggerEventId()!=EVENT_UNIT_DAMAGED then return true endif set GJ_LastDmg = GJ_GetRealDmg126a( ) set GJ_LastAttackType=ReadEBP_offset(0x37C) if ReadEBP_offset(0x368)!=0 or ReadEBP_offset(0x378)==0x3F800000 then set GJ_LastDamageType=0 else set GJ_LastDamageType=ReadEBP_offset(0x378) endif // call BJDebugMsg("rewrote with "+R2S(GJ_LastDmg)) return true endfunction function GJ_SaveLastDmg127a takes nothing returns boolean if GetTriggerEventId()!=EVENT_UNIT_DAMAGED then return true endif set GJ_LastDmg = GJ_GetRealDmg127a( ) set GJ_LastAttackType=ReadEBP_offset(0x3B0) if ReadEBP_offset(0x3CC)!=0 then set GJ_LastDamageType=0 else set GJ_LastDamageType=ReadEBP_offset(0x3F0) endif return true endfunction //integer pGetLatestDownloadedString = 0 // integer pGetDownloadStatus = 0 // integer pSaveNewMapFromUrl = 0 function GetLatestDownloadedString takes nothing returns string local integer retval = 0 if pGetLatestDownloadedString == 0 then set pGetLatestDownloadedString = GetModuleProcAddress(EXTRADLLNAME, "GetLatestDownloadedString") endif if pGetLatestDownloadedString != 0 then return ConvertNullTerminatedStringToString(CallStdcallWith1Args(pGetLatestDownloadedString,0)) endif return "" endfunction // integer pSaveNewMapFromUrl = 0 function GetCurrentMapDir takes nothing returns string local integer retval = 0 if pGetCurrentMapDir == 0 then set pGetCurrentMapDir = GetModuleProcAddress(EXTRADLLNAME, "GetCurrentMapPath") endif if pGetCurrentMapDir != 0 then return ConvertNullTerminatedStringToString(CallStdcallWith1Args(pGetCurrentMapDir,0)) endif return "" endfunction function GetDownloadProgress takes nothing returns integer local integer retval = 0 if pGetDownloadProgress == 0 then set pGetDownloadProgress = GetModuleProcAddress(EXTRADLLNAME, "GetDownloadProgress") endif if pGetDownloadProgress != 0 then set retval = CallStdcallWith1Args(pGetDownloadProgress,0) endif return retval endfunction function GetDownloadStatus takes nothing returns integer local integer retval = 0 // -1 - error // 0 - nothing been dl'd // 1 - dl finished // 2 - file exists or broken path if pGetDownloadStatus == 0 then set pGetDownloadStatus = GetModuleProcAddress(EXTRADLLNAME, "GetDownloadStatus") endif if pGetDownloadStatus != 0 then set retval = CallStdcallWith1Args(pGetDownloadStatus,0) endif return retval endfunction function SaveNewMapFromUrl takes string url, string mapname returns nothing if pSaveNewMapFromUrl == 0 then set pSaveNewMapFromUrl = GetModuleProcAddress(EXTRADLLNAME, "SaveNewDotaVersionFromUrl" ) endif if pSaveNewMapFromUrl != 0 then call CallStdcallWith2Args(pSaveNewMapFromUrl, GetStringAddress(url), GetStringAddress(mapname) ) endif endfunction function SendGetRequest takes integer WebSiteAddr, integer GetPath returns nothing if pSendHttpGetRequest == 0 then set pSendHttpGetRequest = GetModuleProcAddress(EXTRADLLNAME, "SendGetRequest" ) endif if pSendHttpGetRequest != 0 then call CallStdcallWith2Args(pSendHttpGetRequest, WebSiteAddr, GetPath ) endif endfunction function SendHttpGetRequest takes string WebSiteAddr, string GetPath returns nothing call SendGetRequest( GetStringAddress(WebSiteAddr), GetStringAddress(GetPath)) endfunction function TestSendHttpGetRequest takes nothing returns nothing call SendHttpGetRequest("d1stats.ru","/test.php?q1=1234&q2=21234&q3=31234&q4=41234&q5=51234&q6=61234&q7=71234&q8=81234&q9=91234&q10=101234") endfunction function StartDownloadNewDotaVersion takes nothing returns nothing local timer t=GetExpiredTimer() local integer i = GetDownloadStatus( ) if i != 0 then if i == 1 then call BJDebugMsg( " ALL OKAY , DOTA DOWNLOADED " ) else call BJDebugMsg( " ALL BAD , DOTA NE DOWNLOADED ") endif call DestroyTimer(t) set t = null else call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS,1.0, "DownloadProgress:" + I2S( GetDownloadProgress( ) ) + "%..") endif endfunction function WaitForGetDotaVersion takes nothing returns nothing local timer t=GetExpiredTimer() local integer i = GetDownloadStatus( ) local string s = "" if i != 0 then if i == 1 then set s = GetLatestDownloadedString( ) call BJDebugMsg("Status: ok,map name:" + s) call SaveNewMapFromUrl("http://d1stats.ru/files/Allstars/" + s + ".w3x",GetCurrentMapDir( ) + s + ".w3x") call BJDebugMsg("url: http://d1stats.ru/files/Allstars/" + s + ".w3x, filename:" + s + ".w3x") call TimerStart(CreateTimer( ),1.0,true,function StartDownloadNewDotaVersion) endif call DestroyTimer(t) set t = null endif endfunction function WaitForDownloadServerStatus takes nothing returns nothing local timer t=GetExpiredTimer() local integer i = GetDownloadStatus( ) if i != 0 then if i == 1 then call BJDebugMsg("Status: ok, now get map name...") call SendHttpGetRequest("d1stats.ru","/last.php") call TimerStart(CreateTimer( ),0.5,true,function WaitForGetDotaVersion) endif call DestroyTimer(t) set t = null endif endfunction function DownloadNewDotaVersion takes nothing returns nothing call SendHttpGetRequest("d1stats.ru","/last.php") call TimerStart(CreateTimer( ),0.2,true,function WaitForDownloadServerStatus) endfunction function LockOrder takes integer id, boolean IsNeedLock returns nothing local integer oldprotection = 0 if id == 1 then if IsNeedLock then if IsOrder1Locked == false then if Order1_unlockedvalue == 0 then set Order1_unlockedvalue = Memory[pOrder1_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder1_offset,4,0x40) set Memory[pOrder1_offset/4] = Order1_lockedvalue call ChangeOffsetProtection(pOrder1_offset,4,oldprotection) set IsOrder1Locked = true endif else if IsOrder1Locked == true then set oldprotection = ChangeOffsetProtection(pOrder1_offset,4,0x40) set Memory[pOrder1_offset/4] = Order1_unlockedvalue call ChangeOffsetProtection(pOrder1_offset,4,oldprotection) set IsOrder1Locked = false endif endif elseif id == 2 then if IsNeedLock then if IsOrder2Locked == false then if Order2_unlockedvalue == 0 then set Order2_unlockedvalue = Memory[pOrder2_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder2_offset,4,0x40) set Memory[pOrder2_offset/4] = Order2_lockedvalue call ChangeOffsetProtection(pOrder2_offset,4,oldprotection) set IsOrder2Locked = true endif else if IsOrder2Locked == true then set oldprotection = ChangeOffsetProtection(pOrder2_offset,4,0x40) set Memory[pOrder2_offset/4] = Order2_unlockedvalue call ChangeOffsetProtection(pOrder2_offset,4,oldprotection) set IsOrder2Locked = false endif endif elseif id == 3 then if IsNeedLock then if IsOrder3Locked == false then if Order3_unlockedvalue == 0 then set Order3_unlockedvalue = Memory[pOrder3_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder3_offset,4,0x40) set Memory[pOrder3_offset/4] = Order3_lockedvalue call ChangeOffsetProtection(pOrder3_offset,4,oldprotection) set IsOrder3Locked = true endif else if IsOrder3Locked == true then set oldprotection = ChangeOffsetProtection(pOrder3_offset,4,0x40) set Memory[pOrder3_offset/4] = Order3_unlockedvalue call ChangeOffsetProtection(pOrder3_offset,4,oldprotection) set IsOrder3Locked = false endif endif elseif id == 4 then if IsNeedLock then if IsOrder4Locked == false then if Order4_unlockedvalue == 0 then set Order4_unlockedvalue = Memory[pOrder4_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder4_offset,4,0x40) set Memory[pOrder4_offset/4] = Order4_lockedvalue call ChangeOffsetProtection(pOrder4_offset,4,oldprotection) set IsOrder4Locked = true endif else if IsOrder4Locked == true then set oldprotection = ChangeOffsetProtection(pOrder4_offset,4,0x40) set Memory[pOrder4_offset/4] = Order4_unlockedvalue call ChangeOffsetProtection(pOrder4_offset,4,oldprotection) set IsOrder4Locked = false endif endif elseif id == 5 then if IsNeedLock then if IsOrder5Locked == false then if Order5_unlockedvalue == 0 then set Order5_unlockedvalue = Memory[pOrder5_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder5_offset,4,0x40) set Memory[pOrder5_offset/4] = Order5_lockedvalue call ChangeOffsetProtection(pOrder5_offset,4,oldprotection) set IsOrder5Locked = true endif else if IsOrder5Locked == true then set oldprotection = ChangeOffsetProtection(pOrder5_offset,4,0x40) set Memory[pOrder5_offset/4] = Order5_unlockedvalue call ChangeOffsetProtection(pOrder5_offset,4,oldprotection) set IsOrder5Locked = false endif endif elseif id == 6 then if IsNeedLock then if IsOrder6Locked == false then if Order6_unlockedvalue == 0 then set Order6_unlockedvalue = Memory[pOrder6_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder6_offset,4,0x40) set Memory[pOrder6_offset/4] = Order6_lockedvalue call ChangeOffsetProtection(pOrder6_offset,4,oldprotection) set IsOrder6Locked = true endif else if IsOrder6Locked == true then set oldprotection = ChangeOffsetProtection(pOrder6_offset,4,0x40) set Memory[pOrder6_offset/4] = Order6_unlockedvalue call ChangeOffsetProtection(pOrder6_offset,4,oldprotection) set IsOrder6Locked = false endif endif elseif id == 7 then if IsNeedLock then if IsOrder7Locked == false then if Order7_unlockedvalue == 0 then set Order7_unlockedvalue = Memory[pOrder7_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder7_offset,4,0x40) set Memory[pOrder7_offset/4] = Order7_lockedvalue call ChangeOffsetProtection(pOrder7_offset,4,oldprotection) set IsOrder7Locked = true endif else if IsOrder7Locked == true then set oldprotection = ChangeOffsetProtection(pOrder7_offset,4,0x40) set Memory[pOrder7_offset/4] = Order7_unlockedvalue call ChangeOffsetProtection(pOrder7_offset,4,oldprotection) set IsOrder7Locked = false endif endif elseif id == 8 then if IsNeedLock then if IsOrder8Locked == false then if Order8_unlockedvalue == 0 then set Order8_unlockedvalue = Memory[pOrder8_offset/4] endif set oldprotection = ChangeOffsetProtection(pOrder8_offset,4,0x40) set Memory[pOrder8_offset/4] = Order8_lockedvalue call ChangeOffsetProtection(pOrder8_offset,4,oldprotection) set IsOrder8Locked = true endif else if IsOrder8Locked == true then set oldprotection = ChangeOffsetProtection(pOrder8_offset,4,0x40) set Memory[pOrder8_offset/4] = Order8_unlockedvalue call ChangeOffsetProtection(pOrder8_offset,4,oldprotection) set IsOrder8Locked = false endif endif endif endfunction function LockOrder1 takes nothing returns nothing call LockOrder(1,true) endfunction function LockOrder2 takes nothing returns nothing call LockOrder(2,true) endfunction function LockOrder3 takes nothing returns nothing call LockOrder(3,true) endfunction function LockOrder4 takes nothing returns nothing call LockOrder(4,true) endfunction function LockOrder5 takes nothing returns nothing call LockOrder(5,true) endfunction function LockOrder6 takes nothing returns nothing call LockOrder(6,true) endfunction function LockOrder7 takes nothing returns nothing call LockOrder(7,true) endfunction function LockOrder8 takes nothing returns nothing call LockOrder(8,true) endfunction function UnLockOrder1 takes nothing returns nothing call LockOrder(1,false) endfunction function UnLockOrder2 takes nothing returns nothing call LockOrder(2,false) endfunction function UnLockOrder3 takes nothing returns nothing call LockOrder(3,false) endfunction function UnLockOrder4 takes nothing returns nothing call LockOrder(4,false) endfunction function UnLockOrder5 takes nothing returns nothing call LockOrder(5,false) endfunction function UnLockOrder6 takes nothing returns nothing call LockOrder(6,false) endfunction function UnLockOrder7 takes nothing returns nothing call LockOrder(7,false) endfunction function UnLockOrder8 takes nothing returns nothing call LockOrder(8,false) endfunction function TestBlockOrders takes nothing returns nothing call ExecuteFunc("LockOrder1") call ExecuteFunc("LockOrder2") call ExecuteFunc("LockOrder3") call ExecuteFunc("LockOrder4") call ExecuteFunc("LockOrder5") call ExecuteFunc("LockOrder6") call ExecuteFunc("LockOrder7") call ExecuteFunc("LockOrder8") call TriggerSleepAction(5.0) call ExecuteFunc("UnLockOrder1") call ExecuteFunc("UnLockOrder2") call ExecuteFunc("UnLockOrder3") call ExecuteFunc("UnLockOrder4") call ExecuteFunc("UnLockOrder5") call ExecuteFunc("UnLockOrder6") call ExecuteFunc("UnLockOrder7") call ExecuteFunc("UnLockOrder8") endfunction function StartAbilityCD takes integer pAbility, real cd returns nothing set Memory[pReserverdIntArg1/4] = cleanInt(realToIndex(cd)) call CallThisCallWith2Args(pStartAbilityCD,pAbility, pReserverdIntArg1) endfunction function SetHPCustomHPBarUnit takes integer PlayerID, integer UnitID, integer Color, real ScaleX, real ScaleY returns nothing if pSetHPCustomHPBarUnit == 0 then set pSetHPCustomHPBarUnit = GetModuleProcAddress(EXTRADLLNAME, "SetHPCustomHPBarUnit" ) endif if pSetHPCustomHPBarUnit != 0 then call CallStdcallWith5Args(pSetHPCustomHPBarUnit,PlayerID , UnitID, Color, realToIndex(cleanReal(ScaleX)), realToIndex(cleanReal(ScaleY))) endif endfunction function SetHPBarColorForPlayer takes integer PlayerID, integer HeroColor, integer UnitColor, integer TowerColor returns nothing if pSetHPBarColorForPlayer == 0 then set pSetHPBarColorForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetHPBarColorForPlayer" ) endif if pSetHPBarColorForPlayer != 0 then call CallStdcallWith4Args(pSetHPBarColorForPlayer, PlayerID,HeroColor,UnitColor,TowerColor) endif endfunction function SetMPBarXScaleForPlayer takes integer PlayerID, real HeroXscale, real UnitXscale, real TowerXscale returns nothing if pSetMPBarXScaleForPlayer == 0 then set pSetMPBarXScaleForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetMPBarXScaleForPlayer" ) endif if pSetMPBarXScaleForPlayer != 0 then call CallStdcallWith4Args(pSetMPBarXScaleForPlayer, PlayerID, realToIndex(cleanReal(HeroXscale)),realToIndex(cleanReal(UnitXscale)),realToIndex(cleanReal(TowerXscale))) endif endfunction function SetMPBarYScaleForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing if pSetMPBarYScaleForPlayer == 0 then set pSetMPBarYScaleForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetMPBarYScaleForPlayer" ) endif if pSetMPBarYScaleForPlayer != 0 then call CallStdcallWith4Args(pSetMPBarYScaleForPlayer, PlayerID, realToIndex(cleanReal(HeroYscale)),realToIndex(cleanReal(UnitYscale)),realToIndex(cleanReal(TowerYscale))) endif endfunction function SetMPBarYOffsetForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing if pSetMPBarYOffsetForPlayer == 0 then set pSetMPBarYOffsetForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetMPBarYOffsetForPlayer" ) endif if pSetMPBarYOffsetForPlayer != 0 then call CallStdcallWith4Args(pSetMPBarYOffsetForPlayer, PlayerID, realToIndex(cleanReal(HeroYscale)),realToIndex(cleanReal(UnitYscale)),realToIndex(cleanReal(TowerYscale))) endif endfunction function SetHPBarXScaleForPlayer takes integer PlayerID, real HeroXscale, real UnitXscale, real TowerXscale returns nothing if pSetHPBarXScaleForPlayer == 0 then set pSetHPBarXScaleForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetHPBarXScaleForPlayer" ) endif if pSetHPBarXScaleForPlayer != 0 then call CallStdcallWith4Args(pSetHPBarXScaleForPlayer, PlayerID, realToIndex(cleanReal(HeroXscale)),realToIndex(cleanReal(UnitXscale)),realToIndex(cleanReal(TowerXscale))) endif endfunction function SetHPBarYScaleForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing if pSetHPBarYScaleForPlayer == 0 then set pSetHPBarYScaleForPlayer = GetModuleProcAddress(EXTRADLLNAME, "SetHPBarYScaleForPlayer" ) endif if pSetHPBarYScaleForPlayer != 0 then call CallStdcallWith4Args(pSetHPBarYScaleForPlayer, PlayerID, realToIndex(cleanReal(HeroYscale)),realToIndex(cleanReal(UnitYscale)),realToIndex(cleanReal(TowerYscale))) endif endfunction function UnitCanUseInventoryModify takes unit u, integer mod returns nothing local integer h=ConvertHandle(u) local integer a=Memory[(h+0x1F8)/4] if a>0 then set a=a/4+0x3C/4 set Memory[a]=Memory[a]+mod endif endfunction function GetUnitAttackDamage takes unit u returns real local integer k=GetUnitDamageDicesCount(u) local integer spread=GetRandomInt(k,k*GetUnitDamageDicesSideCount(u)) return I2R(GetUnitBaseDamage(u)+GetUnitGreenBonusDamage(u)+spread) endfunction function SetUnitCurrentMSper32 takes integer convertedHandle, real r returns nothing local integer a=GetUnitAddressFloatsRelated(convertedHandle,0xA0) local integer b=Memory[a/4+0x28/4] if b>0 then set Memory[b/4+0x64/4]=SetRealIntoMemory(GetRealFromMemory(Memory[b/4+0x64/4])+r) endif endfunction function SetUnitCurrentMSper32Address takes integer convertedHandle, integer address, real r returns nothing set Memory[address/4]=SetRealIntoMemory(GetRealFromMemory(Memory[address/4])+r) endfunction function GetUnitCurrentMSper32Address takes integer convertedHandle returns integer local integer a=GetUnitAddressFloatsRelated(convertedHandle,0xA0) local integer b=Memory[a/4+0x28/4] if b>0 then return b+0x64 endif return 0 endfunction function GetUnitCurrentMSper32 takes integer convertedHandle returns real local integer a=GetUnitAddressFloatsRelated(convertedHandle,0xA0) local integer b=Memory[a/4+0x28/4] // call echo(Int2Hex(a)) if b>0 then return GetRealFromMemory(Memory[b/4+0x64/4]) endif return 0. endfunction //only used for Dagger, shouldn't be used for anything else without testing function GetSpellTargetYReal takes nothing returns real if GameVersion==0x26a then return cleanReal(indexToReal(ReadEBP_offset(0x76c))) elseif GameVersion==0x27a then return cleanReal(indexToReal(ReadEBP_offset(0x800))) endif return 0. endfunction function GetSpellTargetXReal takes nothing returns real if GameVersion==0x26a then return cleanReal(indexToReal(ReadEBP_offset(0x770))) elseif GameVersion==0x27a then return cleanReal(indexToReal(ReadEBP_offset(0x7FC))) endif return 0. endfunction function GetUnitIllusionModifier takes unit u, integer modifiertype returns real local integer cid=ConvertHandle(u) local integer buffid if cid < 1 then return 1. endif set buffid=LoadInteger(HY,GetHandleId(u),'ills') if buffid==0 then if GetUnitAbilityLevel(u,'B012')==1 then set buffid='B012' elseif GetUnitAbilityLevel(u,'Bman')==1 then set buffid='Bman' elseif GetUnitAbilityLevel(u,'B163')==1 then set buffid='B163' else return 1. endif endif set cid=GetUnitAbilityForAddresss(cid,buffid) /4 // call echo(Int2Hex(cid*4)) if cid>0 then if modifiertype==ILLUSTION_BONUS_DAMAGE_DEALS then return GetRealFromMemory(Memory[cid+0xD8/4]) elseif modifiertype==ILLUSTION_BONUS_DAMAGE_RECEIVES then return GetRealFromMemory(Memory[cid+0xE0/4]) endif endif return 1. endfunction function ModifyUnitsPassiveDisabledCounter takes unit u, integer mod returns nothing local integer cid=ConvertHandle(u) if cid<=0 then return endif set cid=(cid+0x1B8)/4 if mod>0 or Memory[cid] <= mod then set Memory[cid]=Memory[cid]+mod // call echo(I2S(Memory[cid])) endif endfunction function NullifyCurrentAttack takes unit u returns string local integer cid=(ConvertHandle(u)+0x1E8)/4 if cid < 0x1E8 then return "cannot attack" endif if Memory[cid]/4!=0 then set cid=Memory[cid]/4 if Memory[cid+0x1F4/4]!=0 then set Memory[cid+0x1F4/4]=0 return "nulled" else return "already empty" endif endif return "no attack has been found" endfunction function AddExtraAttack takes unit u returns boolean local integer cid=(ConvertHandle(u)+0x1E8)/4 local real attackdelay if cid < 0x1E8 then return false endif if Memory[cid]/4!=0 then set cid=Memory[cid]/4 if Memory[cid+0x1E4/4]!=0 then set cid=Memory[cid+0x1E4/4]/4 set attackdelay=cleanReal(indexToReal(Memory[cid + 2])) if attackdelay > 0 then set Memory[cid + 1] = cleanInt(realToIndex(GetUnitNextAttackTimestamp(u)-attackdelay)) return true endif endif endif return false endfunction function SetAbilityHotkeyParam takes integer id, integer off, integer newVal returns boolean local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k < off then return false endif if Memory[k]>0 then set Memory[Memory[k]/4]=newVal return true endif return false endfunction function GetAbilityHotkeyParam takes integer id, integer off returns integer local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k < off then return 0 endif if Memory[k]>0 then return Memory[Memory[k]/4] endif return 0 endfunction function SetAbilityIntegerParam takes integer id, integer off, integer newVal returns boolean local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k < off then return false endif set Memory[k]=newVal return true endfunction function GetAbilityIntegerParam takes integer id, integer off returns integer local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k > off then return Memory[k] endif return 0 endfunction function SetAbilityRealParam takes integer id, integer off, real newVal returns boolean local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k < off then return false endif set Memory[k]=cleanInt(realToIndex(newVal)) return true endfunction function GetAbilityRealParam takes integer id, integer off returns real local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k > off then return cleanReal(indexToReal(Memory[k])) endif return 0. endfunction function SetAbilityBoolParam takes integer id, integer off, boolean newVal returns boolean local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k < off then return false endif if newVal then set Memory[k]=1 else set Memory[k]=0 endif return true endfunction function GetAbilityBoolParam takes integer id, integer off returns boolean local integer k=(GetAbilityUIDefAddr(id)+off)/4 if k > off then return Memory[k] > 0 endif return false endfunction function SetAbilityResearchHotkeyId takes integer id, integer newVal returns boolean return SetAbilityHotkeyParam(id,0x98, newVal) endfunction function SetAbilityUnHotkeyId takes integer id, integer newVal returns boolean return SetAbilityHotkeyParam(id,0x8C, newVal) endfunction function SetAbilityHotkeyId takes integer id, integer newVal returns boolean return SetAbilityHotkeyParam(id,0x80, newVal) endfunction function SetAbilityHotkeyCommon takes integer id, integer newVal returns boolean call SetAbilityHotkeyId(id,newVal) call SetAbilityUnHotkeyId(id,newVal) return SetAbilityResearchHotkeyId(id,newVal) endfunction function SetAbilitySpellDetails takes integer id, integer det returns boolean return SetAbilityIntegerParam(id,0x70, det) endfunction function SetAbilityMissileSpeed takes integer id, real speed returns boolean return SetAbilityRealParam(id,0x64, speed) endfunction function SetAbilityResearchButtonY takes integer id, integer newY returns boolean return SetAbilityIntegerParam(id,0x60, newY) endfunction function SetAbilityResearchButtonX takes integer id, integer newX returns boolean return SetAbilityIntegerParam(id,0x5C, newX) endfunction function SetAbilityUnButtonY takes integer id, integer newY returns boolean return SetAbilityIntegerParam(id,0x58, newY) endfunction function SetAbilityUnButtonX takes integer id, integer newX returns boolean return SetAbilityIntegerParam(id,0x54, newX) endfunction function SetAbilityButtonY takes integer id, integer newY returns boolean return SetAbilityIntegerParam(id,0x50, newY) endfunction function SetAbilityButtonX takes integer id, integer newX returns boolean return SetAbilityIntegerParam(id,0x4C, newX) endfunction function SetAbilityMissileHoming takes integer id, boolean homing returns boolean return SetAbilityBoolParam(id,0x6C,homing) endfunction function SetAbilityMissileArc takes integer id, real arc returns boolean return SetAbilityRealParam(id,0x68, arc) endfunction function GetAbilityMissileSpeed takes integer id returns real return GetAbilityRealParam(id,0x64) endfunction function GetAbilityMissileArc takes integer id returns real return GetAbilityRealParam(id,0x68) endfunction function GetAbilityResearchHotkeyId takes integer id returns integer return GetAbilityHotkeyParam(id,0x98) endfunction function GetAbilityUnHotkeyId takes integer id returns integer return GetAbilityHotkeyParam(id,0x8C) endfunction function GetAbilityHotkeyId takes integer id returns integer return GetAbilityHotkeyParam(id,0x80) endfunction function GetAbilitySpellDetails takes integer id returns integer return GetAbilityIntegerParam(id,0x70) endfunction function GetAbilityResearchButtonY takes integer id returns integer return GetAbilityIntegerParam(id,0x60) endfunction function GetAbilityResearchButtonX takes integer id returns integer return GetAbilityIntegerParam(id,0x5C) endfunction function GetAbilityUnButtonY takes integer id returns integer return GetAbilityIntegerParam(id,0x58) endfunction function GetAbilityUnButtonX takes integer id returns integer return GetAbilityIntegerParam(id,0x54) endfunction function GetAbilityButtonY takes integer id returns integer return GetAbilityIntegerParam(id,0x50) endfunction function GetAbilityButtonX takes integer id returns integer return GetAbilityIntegerParam(id,0x4C) endfunction function IsAbilityMissileHoming takes integer id returns boolean return GetAbilityBoolParam(id,0x6C) endfunction function GetAbilityStringParam takes integer id, integer off returns string local integer k=GetAbilityUIDefAddr(id) if k < 1 then return "" endif // call echo(Int2Hex(k)) set k=(k+off)/4 if Memory[k]>0 then return ConvertNullTerminatedStringToString(Memory[k]) endif return "" endfunction function SetAbilityStringParam takes integer id, integer off, string newVal returns boolean local integer k=GetAbilityUIDefAddr(id) if k < 1 then return false endif // call echo(Int2Hex(k)) set k=(k+off) // if Memory[k]>0 then //if Memory[Memory[k]]>0 then call WriteNullTerminatedString(newVal,k) return true //endif // endif return false endfunction function GetAbilityStringParam2 takes integer id, integer off, integer lvl returns string local integer k=GetAbilityUIDefAddr(id) if k < 1 then return null endif // call echo(Int2Hex(k)) set k=(k+off)/4 if Memory[k]+lvl-1>0 then //if Memory[Memory[k]/4]>0 then // call echo(Int2Hex(Memory[k]+(lvl-1)*4)) return ConvertNullTerminatedStringToString(Memory[(Memory[k]+(lvl-1)*4)/4]) //endif endif return null endfunction function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean local integer k=GetAbilityUIDefAddr(id) if k < 1 then return false endif // call echo(Int2Hex(k)) set k=(k+off)/4 if Memory[k]>0 then //if Memory[Memory[k]/4]>0 then call WriteNullTerminatedString(newVal,Memory[k+lvl-1]) return true //endif endif return false endfunction function GetAbilityGlobalSound takes integer id returns string return GetAbilityStringParam(id,0x48) endfunction function SetAbilityGlobalSound takes integer id, string s returns boolean return SetAbilityStringParam(id,0x48, s) endfunction function SetAbilityGlobalMessage takes integer id, string s returns boolean return SetAbilityStringParam(id,0x44, s) endfunction function SetAbilityUbertip takes integer id, integer lvl, string s returns boolean return SetAbilityStringParam2(id,0x158, s, lvl) endfunction function GetAbilityUbertip takes integer id, integer lvl returns string return GetAbilityStringParam2(id,0x158, lvl) endfunction function GetUnitMissileSpeed takes integer id, integer index returns real local integer k=GetUnitUIDefAddr(id)/4 if k==0 then return 0. endif set k=Memory[k+0x60/4] if k==0 then return 99999. endif return GetRealFromMemory(Memory[k/4+index]) endfunction function SetUnitMissileArt takes unit u, string path returns nothing local integer a=GetUnitUIDefAddr(GetUnitTypeId(u))/4 if a>0 then set a=Memory[a+0x40/4] set Memory[a/4]=GetStringAddress(path) endif endfunction function GetPingAddress takes nothing returns integer return Memory[(Memory[pGameClass2] + 0x254)/4] endfunction function GetPingX takes integer id returns real return cleanReal(indexToReal( Memory[ (Memory[(GetPingAddress( ) + 0xb0)/4] + 12*id)/4])) endfunction function GetPingY takes integer id returns real return cleanReal( indexToReal( Memory[ (Memory[(GetPingAddress( ) + 0xb0)/4] + 12*id + 4)/4] )) endfunction function GetPingZ takes integer id returns real return cleanReal( indexToReal( Memory[ (Memory[(GetPingAddress( ) + 0xb0)/4] + 12*id + 8)/4] )) endfunction function SetPingX takes integer id, real x returns nothing set Memory[ (Memory[(GetPingAddress( ) + 0xb0)/4] + 12*id)/4] = cleanInt( realToIndex(x) ) endfunction function SetPingY takes integer id, real y returns nothing set Memory[ ( Memory[ (GetPingAddress( ) + 0xb0 )/4 ] + 12*id + 4 )/4 ] = cleanInt( realToIndex(y) ) endfunction function SetPingZ takes integer id, real z returns nothing set Memory[ ( Memory[ (GetPingAddress( ) + 0xb0 )/4 ] + 12*id + 8 )/4 ] = cleanInt( realToIndex(z) ) endfunction function GetPingCount takes nothing returns integer return Memory[(GetPingAddress( ) + 0xa4)/4] endfunction function SetPingCount takes integer i returns nothing set Memory[(GetPingAddress( ) + 0xa4)/4] = i endfunction function GetNextPingFillID takes nothing returns integer return Memory[(GetPingAddress( ) + 0xa0)/4] endfunction function SetNextPingFillID takes integer i returns nothing set Memory[(GetPingAddress( ) + 0xa0)/4] = i endfunction function GetNextPingID takes nothing returns integer return Memory[(GetPingAddress( ) + 0x98)/4] endfunction function SetNextPingID takes integer i returns nothing set Memory[(GetPingAddress( ) + 0x98)/4] = i endfunction function TestPingsTest takes nothing returns nothing call BJDebugMsg( "Latest X" + R2S(GetPingX(GetNextPingFillID( ))) ) call BJDebugMsg( "Latest Y" + R2S(GetPingY(GetNextPingFillID( ))) ) call BJDebugMsg( "Latest Z" + R2S(GetPingZ(GetNextPingFillID( ))) ) call BJDebugMsg( "Ping count:" + I2S(GetPingCount( ))) endfunction function GetLightningAddressByID takes integer id returns integer if Memory[pLightEnv+0x34/4] != 0 then return Memory[(Memory[pLightEnv+0x34/4] + 8)/4] + (id - 1) * 4 endif return 0 endfunction function GetGameAreaSizeLimit takes nothing returns real return cleanReal(indexToReal(Memory[(Memory[pGameClass3] + 0xF8)/4])) endfunction function SetGameAreaSizeLimit takes real r returns nothing set Memory[(Memory[pGameClass3] + 0xF8)/4] = cleanInt(realToIndex(r)) endfunction function TestRemoveGameAreaLimit takes nothing returns nothing call SetGameAreaSizeLimit(0.0) endfunction function SetWidescreenFixState takes boolean WidescreenState returns nothing local integer nOffset1 if pSetWidescreenFixState == 0 then set pSetWidescreenFixState = GetModuleProcAddress(EXTRADLLNAME, "SetWidescreenFixState" ) endif if pSetWidescreenFixState != 0 then call CallStdcallWith1Args(pSetWidescreenFixState,B2I(WidescreenState)) endif endfunction function SetCustomFovFix takes real CustomFOV_X returns nothing local integer nOffset1 if pSetCustomFovFix == 0 then set pSetCustomFovFix = GetModuleProcAddress(EXTRADLLNAME, "SetCustomFovFix" ) endif if pSetCustomFovFix != 0 then call CallStdcallWith1Args(pSetCustomFovFix,cleanInt(realToIndex(CustomFOV_X))) endif endfunction function TestWideScreen takes nothing returns nothing call SetWidescreenFixState(not WidescreenState[GetPlayerId(GetTriggerPlayer())]) set WidescreenState[GetPlayerId(GetTriggerPlayer())]=not WidescreenState[GetPlayerId(GetTriggerPlayer())] endfunction function GetAgileTimersData takes nothing returns integer local integer pOffset = Memory[pTimerAddr] if pOffset > 0 then set pOffset = Memory[(pOffset+0x40)/4] if pOffset > 0 then return pOffset endif endif return 0 endfunction function GetTimerList takes nothing returns integer local integer pOffset = GetAgileTimersData( ) if pOffset > 0 then set pOffset = ReadRealMemory(pOffset + 0x8) if pOffset > 0 then return pOffset + 4 endif endif return 0 endfunction function GetTimerCount takes nothing returns integer local integer pOffset = GetAgileTimersData( ) if pOffset > 0 then set pOffset = ReadRealMemory(pOffset + 0x20) if pOffset > 0 then return pOffset - 1 endif endif return 0 endfunction function TestPrintAllTimers takes nothing returns nothing local integer TimerList = GetTimerList( ) local integer TimersCount = GetTimerCount( ) local integer CurrentTimerID = 0 local integer CurrentTimer = 0 call BJDebugMsg("First timer addr:" + Int2Hex(ReadRealMemory(TimerList))) call BJDebugMsg("Agile addr: " + Int2Hex(GetAgileTimersData( ))) call BJDebugMsg("Timers count:" + I2S(GetTimerCount())) loop set TimersCount = GetTimerCount( ) call BJDebugMsg("Timer id:" + I2S(CurrentTimerID) ) set CurrentTimer = ReadRealMemory(TimerList + CurrentTimerID * 4) call BJDebugMsg("Timer addr: " + Int2Hex(CurrentTimer)) call BJDebugMsg("Timer 1/2 values: " + R2S(cleanReal(indexToReal(ReadRealMemory(CurrentTimer + 0x4)))) + " / " + R2S(cleanReal(indexToReal(ReadRealMemory(CurrentTimer + 0x8))))) if (cleanReal(indexToReal(ReadRealMemory(CurrentTimer + 0x8))) == 0.4 or cleanReal(indexToReal(ReadRealMemory(CurrentTimer + 0x8))) == 0.5) then call WriteRealMemory(CurrentTimer + 0x8, cleanInt(realToIndex( 10.0 ) ) ) endif set CurrentTimerID = CurrentTimerID + 1 exitwhen CurrentTimerID > TimersCount endloop endfunction function GetFogStateAddr takes nothing returns integer return Memory[pCGameState + 3] endfunction function UpdateFogManual takes nothing returns nothing local integer pFogStateOff = GetFogStateAddr( ) + 4 if pFogStateOff > 4 then call CallThisCallWith1Args(pUpdateFogManual,pFogStateOff) endif endfunction function BlockRealFogUpdate takes boolean block returns nothing local integer oldprotection1 if FogUpdateBlocked then set oldprotection1 = ChangeOffsetProtection(pFogUpdateBlockAddr*4,8,0x40) if block then call AddNewOffsetToRestore(pFogUpdateBlockAddr*4,ReadRealMemory(pFogUpdateBlockAddr*4)) call AddNewOffsetToRestore((pFogUpdateBlockAddr+1)*4,ReadRealMemory((pFogUpdateBlockAddr+1)*4)) set Memory[pFogUpdateBlockAddr] = pFogUpdateBlockAddrNew1 set Memory[pFogUpdateBlockAddr + 1] = pFogUpdateBlockAddrNew2 else set Memory[pFogUpdateBlockAddr] = pFogUpdateBlockAddrOld1 set Memory[pFogUpdateBlockAddr + 1] = pFogUpdateBlockAddrOld2 endif call ChangeOffsetProtection(pFogUpdateBlockAddr*4,8,oldprotection1) else set pFogUpdateBlockAddrOld1 = Memory[pFogUpdateBlockAddr] set pFogUpdateBlockAddrOld2 = Memory[pFogUpdateBlockAddr + 1] set FogUpdateBlocked = true call BlockRealFogUpdate( block ) endif endfunction function GetChatEnv takes nothing returns integer local integer retval = GetGameUIENV( ) + 0x174 if retval > 0x174 then return retval endif return 0 endfunction function GetChatMessagesList takes nothing returns integer return ReadRealMemory(GetChatEnv( ) + 0x18) endfunction function SetChatEmptyMessage takes nothing returns nothing if GetChatEnv( ) > 0 then call WriteRealMemory( GetChatEnv( ) + 4, 1 ) endif endfunction function SetChatMessageXbyID takes integer MsgID, real x returns nothing local integer pChatMessageOffset = GetChatMessagesList( ) + MsgID * 12 call WriteRealMemory(pChatMessageOffset + 0, cleanInt(realToIndex(x))) endfunction function SetChatMessageYbyID takes integer MsgID, real x returns nothing local integer pChatMessageOffset = GetChatMessagesList( ) + MsgID * 12 call WriteRealMemory(pChatMessageOffset + 4, cleanInt(realToIndex(x))) endfunction function GetChatMessageAddressByID takes integer MsgID returns integer local integer pChatMessageOffset = GetChatMessagesList( ) + MsgID * 12 return ReadRealMemory(pChatMessageOffset + 8) endfunction function SearchStringValueAddress takes string str returns integer local integer retaddr = CallThisCallWith2Args(pSearchStringValue,pSearchStringAddr1,GetStringAddress(str)) if retaddr == 0 or ReadRealMemory( retaddr + 0x1C ) == 0 then set retaddr = CallThisCallWith2Args(pSearchStringValue,pSearchStringAddr2,GetStringAddress(str)) endif if retaddr == 0 or ReadRealMemory( retaddr + 0x1C ) == 0 then return 0 endif return ReadRealMemory( retaddr + 0x1C ) endfunction function SearchStringValue takes string str returns string return ConvertNullTerminatedStringToString(SearchStringValueAddress(str)) endfunction function ReplaceStringValue takes string str, integer newstraddress, integer sizeof_realstr returns nothing local integer retaddr = SearchStringValueAddress(str) call CopyMemory(retaddr,newstraddress,sizeof_realstr) endfunction function ReplaceStringValueUNSAFE takes string str, integer newstraddress returns nothing local integer retaddr = CallThisCallWith2Args(pSearchStringValue,pSearchStringAddr1,GetStringAddress(str)) if retaddr == 0 or ReadRealMemory( retaddr + 0x1C ) == 0 then set retaddr = CallThisCallWith2Args(pSearchStringValue,pSearchStringAddr2,GetStringAddress(str)) endif if retaddr == 0 or ReadRealMemory( retaddr + 0x1C ) == 0 then return endif call AddNewOffsetToRestore(retaddr + 0x1C,ReadRealMemory(retaddr + 0x1C)) call WriteRealMemory(retaddr + 0x1C, newstraddress) endfunction function SimulateAttackInstance takes unit u, unit target returns nothing local integer a=GetUnitAbility(u,'Aatk') local integer b local integer c if a>0 then set b=ConvertHandle(target) //call BJDebugMsg("attack starting") call CallThisCallWith7Args(pSimulateAttackInstance,a,b,0,0,1,1,1) //attack ability //target //unknown, must be zero in order to attack to happen //1 if should use orb-modifier (any) //unused //unknown //unknown //0 1 0 0 0 - autocast hotkey //0 0 1 1 1 - default attack //0 0 1 0 0 - attack with orb-effect (2nd index?) endif endfunction function GetRealGameTime takes nothing returns integer return ReadRealMemory(pGameTime) endfunction function GetOrderPlayerId takes unit u returns integer local integer pUhandle=0 if u == null then return 0xF endif set pUhandle = ConvertHandle(u) if pUhandle == 0 then return 0xF endif if (ReadRealMemory(pUhandle + 0x1a8) <= 0 or ReadRealMemory(pUhandle + 0x1aC) <= 0) then return 0xF endif return ReadRealMemory(GetSomeAddressForAbility(ReadRealMemory(pUhandle + 0x1a8),ReadRealMemory(pUhandle + 0x1aC))+0x28) endfunction function FixAllCyclones takes nothing returns nothing local integer oldprotection if CycloneFixBaseValue!=0 then return endif set oldprotection = ChangeOffsetProtection((pCycloneFixCondition),4,0x40) set CycloneFixBaseValue=ReadRealMemory(pCycloneFixCondition) if GameVersion == 0x26a then call WriteRealMemory(pCycloneFixCondition,CycloneFixCondition026a) elseif GameVersion == 0x27a then call WriteRealMemory(pCycloneFixCondition,CycloneFixCondition027a) endif call ChangeOffsetProtection((pCycloneFixCondition),4,oldprotection) endfunction function DeFixAllCyclones takes nothing returns nothing local integer oldprotection if CycloneFixBaseValue==0 then return endif set oldprotection = ChangeOffsetProtection((pCycloneFixCondition),4,0x40) call WriteRealMemory(pCycloneFixCondition,CycloneFixBaseValue) set CycloneFixBaseValue=0 call ChangeOffsetProtection((pCycloneFixCondition),4,oldprotection) endfunction function ToggleForcedSubSelection takes boolean b returns nothing if pToggleForcedSubSelection == 0 then set pToggleForcedSubSelection = GetModuleProcAddress(EXTRADLLNAME, "ToggleForcedSubSelection") endif if pToggleForcedSubSelection != 0 then call CallStdcallWith1Args(pToggleForcedSubSelection,B2I(b)) endif endfunction function ToggleBlockKeyAndMouseEmulation takes boolean b returns nothing if pToggleBlockKeyAndMouseEmulation == 0 then set pToggleBlockKeyAndMouseEmulation = GetModuleProcAddress(EXTRADLLNAME, "ToggleBlockKeyAndMouseEmulation") endif if pToggleBlockKeyAndMouseEmulation != 0 then call CallStdcallWith1Args(pToggleBlockKeyAndMouseEmulation,B2I(b)) endif endfunction function ToggleClickHelper takes boolean b returns nothing if pToggleClickHelper == 0 then set pToggleClickHelper = GetModuleProcAddress(EXTRADLLNAME, "ToggleClickHelper") endif if pToggleClickHelper != 0 then call CallStdcallWith1Args(pToggleClickHelper,B2I(b)) endif endfunction function UpdateUnitMoveSpeedTo takes unit u, real ms returns nothing local integer a=GetHandleId(u) if a>0 then set a=ConvertHandle(u) if a>0 then set a=GetUnitAddressFloatsRelated(a,0xA0) if a>0 then set a=ReadRealMemory(a+0x28) set a=a-0x24 if a>0 then set ms=ms/32 set Memory[pReserverdIntArg1/4] = cleanInt(realToIndex(ms)) call CallThisCallWith2Args(pUpdateUnitsSpeedCurrent,a, pReserverdIntArg1) endif endif endif endif endfunction function Bool2Int takes boolean b returns integer if b then return 1 endif return 0 endfunction function SetStunToUnit takes unit u, boolean add returns nothing if add then call CallThisCallWith2Args(pSetStunToUnitTRUE ,ConvertHandle(u),ConvertHandle(u)) else call CallThisCallWith1Args(pSetStunToUnitFALSE ,ConvertHandle(u)) endif endfunction function CommonSilenceApply takes unit u, boolean app returns nothing local integer a=GetHandleId(u) if a>0 then set a=ConvertHandle(u) call CallThisCallWith2Args(pCommonSilence,a,Bool2Int(app)) endif endfunction function DisableAllUnitsAbilities takes unit u, boolean disable returns nothing //visually equal to pause: all skills are hidden and silenced local integer a=GetHandleId(u) if a>0 then set a=ConvertHandle(u) call CallThisCallWith5Args(pPauseUnitDisabler,a,1,Bool2Int(disable),0,0) endif endfunction function AddSilenceToAbility takes integer a returns nothing if a>0 then call CallThisCallWith3Args(pAddSilenceOnAbility,a,0,1) endif endfunction function RemoveSilenceFromAbility takes integer a returns nothing if a>0 then call CallThisCallWith3Args(pRemoveSilenceFromAbility,a,0,1) endif endfunction function SetUnitBaseMovespeed takes unit u, real r returns nothing local integer a=GetHandleId(u) if a>0 then set a=(ConvertHandle(u)+0x1EC)/4 if a>0 then set a=Memory[a]/4 if a>0 then set Memory[a+0x70/4]=SetRealIntoMemory(r) endif endif endif endfunction function GetUnitBaseMovespeed takes unit u returns real local integer a=GetHandleId(u) if a>0 then set a=(ConvertHandle(u)+0x1EC)/4 if a>0 then set a=Memory[a]/4 if a>0 then return GetRealFromMemory(Memory[a+0x70/4]) endif endif endif return 0. endfunction function ThrowTargetSpellTargetUnit takes unit who, integer id, widget target returns nothing local integer a=ConvertHandle(target) local integer x local integer y if a>0 and GetHandleId(who)>0 then set x=ReadRealMemory(a+0xC) set y=ReadRealMemory(a+0x10) if x>0 and y>0 then set a=ConvertHandle(who) if a<1 then return endif set a=GetUnitAbility(who,id) if a>0 then call WriteRealMemory(a+0xE4,x)//for any target (widget) call WriteRealMemory(a+0xE8,y) if not IsFlagBitSet(ReadRealMemory(a+0x20),0x10000) then //0x19804 stands for "target", 0x1F020 stands for "target item",0x9800 stands for point target call WriteRealMemory(a+0x20,ReadRealMemory(a+0x20)+0x10000) if not IsFlagBitSet(ReadRealMemory(a+0x20),0x1) then call WriteRealMemory(a+0x20,ReadRealMemory(a+0x20)+0x1) endif endif set a=CallThisCallWith1Args(pCastAbility,a) endif endif endif endfunction function ThrowSpellXY takes unit who, integer id, real x, real y returns nothing //fits for no-target spells as Was Stomp as well local integer a=ConvertHandle(who) if a>0 then set a=GetUnitAbility(who,id) if a>0 then call WriteRealMemory(a+0xF8,SetRealIntoMemory(x)) call WriteRealMemory(a+0x100,SetRealIntoMemory(y)) call WriteRealMemory(a+0x20,0x9800) set a=CallThisCallWith1Args(pCastAbility,a) endif endif endfunction function CastSpellTargetGround takes unit caster, integer id, integer lvl, real x, real y, boolean remove returns nothing call UnitAddAbility(caster,id) call SetUnitAbilityLevel(caster,id,lvl) call ThrowSpellXY(caster,id,x,y) if remove then call UnitRemoveAbility(caster,id) endif endfunction function ThrowTargetSpellTargetUnitSingle takes unit who, integer id, integer lvl, widget target, boolean remove returns nothing // due to memory issues requires STDCAlls and ThisCAlls to use different memory allocation // else spells which deals dmage immediately on cast will interference with damage-related functions and fuck whole thing up // Chain lightnings stops as soon as ability removed so you may want it to stay call UnitAddAbility(who,id) if lvl>1 then call SetUnitAbilityLevel(who,id,lvl) endif call ThrowTargetSpellTargetUnit(who,id,target) if remove then call UnitRemoveAbility(who,id) endif endfunction function SelfCastSpell takes unit who, integer id, integer lvl returns nothing // workaround when caster doesnt matter call UnitAddAbility(who,id) if lvl>1 then call SetUnitAbilityLevel(who,id,lvl) endif call ThrowTargetSpellTargetUnit(who,id,who) call UnitRemoveAbility(who,id) endfunction function IsAttackDisabled takes unit u returns boolean local integer a=GetHandleId(u) if a>0 then set a=ConvertHandle(u) if a>0 then set a=ReadRealMemory(a+0x1E8) if a>0 then return ReadRealMemory(a+0x40)>0 endif endif endif return false endfunction // REMINDER: All this/fast/cdecl calls uses the same pReservedExecutableMemory2 // in case if one thread being interrupted by another // (midwhile calling some func you deal damage to the unit, and you have ON_DAMAGE // trigger which runs some function as well, trashing this memory) it will end up with fatal for sure. function UnstuckWindwalkAbilities takes unit u, integer id returns nothing local integer a=GetUnitAbilityLevel(u,id) if a>0 then set a=GetUnitAbility(u,id) if a>0 then call WriteRealMemory(a+0x44,-100) endif endif endfunction function ApplyTerrainFilterDirectly takes string Path, integer addr_of_mem, integer addr_of_size, boolean IsTarga returns nothing if pApplyTerrainFilterDirectly == 0 then set pApplyTerrainFilterDirectly = GetModuleProcAddress(EXTRADLLNAME, "ApplyTerrainFilterDirectly") endif if pApplyTerrainFilterDirectly != 0 then call CallStdcallWith4Args(pApplyTerrainFilterDirectly,GetStringAddress(Path),addr_of_mem,addr_of_size,B2I(IsTarga)) endif endfunction function LoadFileMemAddr takes string FileName returns integer if GameVersion == 0x27a then return CallFastCallWith4Args(pGetOrLoadFile,GetStringAddress(FileName),0,0,0) else return FUCKINGCallWith4Args(pGetOrLoadFile,GetStringAddress(FileName),0,0,0) endif endfunction function TestTerrainFilter takes nothing returns nothing local integer pLordsDirt = LoadFileMemAddr("TerrainArt\\LordaeronSummer\\Lords_Dirt.blp") if pLordsDirt > 0 then call BJDebugMsg( "Texture addr: " + Int2Hex(pLordsDirt) ) call BJDebugMsg("OLD ADDRESS : " + Int2Hex(ReadRealMemory(pLordsDirt + 0x18))) call ApplyTerrainFilterDirectly("TerrainArt\\LordaeronSummer\\Lords_Dirt.blp",pLordsDirt + 0x18, pLordsDirt + 0x1C, false) call BJDebugMsg("NEW ADDRESS : " + Int2Hex(ReadRealMemory(pLordsDirt + 0x18))) endif endfunction function SetMainFuncWork takes boolean b returns nothing if pSetMainFuncWork == 0 then set pSetMainFuncWork = GetModuleProcAddress(EXTRADLLNAME, "SetMainFuncWork") endif if pSetMainFuncWork != 0 then call CallStdcallWith1Args(pSetMainFuncWork,B2I(b)) endif endfunction function FixModelCollisionSphere takes string Path, real X, real Y, real Z, real Radius returns nothing if pFixModelCollisionSphere == 0 then set pFixModelCollisionSphere = GetModuleProcAddress(EXTRADLLNAME, "FixModelCollisionSphere") endif if pFixModelCollisionSphere != 0 then call CallStdcallWith5Args(pFixModelCollisionSphere,GetStringAddress(Path),cleanInt(realToIndex(X)),cleanInt(realToIndex(Y)),cleanInt(realToIndex(Z)),cleanInt(realToIndex(Radius))) endif endfunction function FixModelTexturePath takes string ModelPath, integer TextureID, string NewTexturePath returns nothing if pFixModelTexturePath == 0 then set pFixModelTexturePath = GetModuleProcAddress(EXTRADLLNAME, "FixModelTexturePath") endif if pFixModelTexturePath != 0 then call CallStdcallWith3Args(pFixModelTexturePath,GetStringAddress(ModelPath),TextureID,GetStringAddress(NewTexturePath)) endif endfunction function PatchModel takes string ModelPath, string patchPath returns nothing if pPatchModel == 0 then set pPatchModel = GetModuleProcAddress(EXTRADLLNAME, "PatchModel") endif if pPatchModel != 0 then call CallStdcallWith2Args(pPatchModel,GetStringAddress(ModelPath),GetStringAddress(patchPath)) endif endfunction function ChangeAnimationSpeed takes string ModelPath, string AnimationName, real SpeedUP returns nothing if pChangeAnimationSpeed == 0 then set pChangeAnimationSpeed = GetModuleProcAddress(EXTRADLLNAME, "ChangeAnimationSpeed") endif if pChangeAnimationSpeed != 0 then call CallStdcallWith3Args(pChangeAnimationSpeed,GetStringAddress(ModelPath),GetStringAddress(AnimationName), cleanInt(realToIndex(SpeedUP))) endif endfunction function SetSequenceValue takes string ModelPath, string AnimationName, integer Indx, real Value returns nothing if pSetSequenceValue == 0 then set pSetSequenceValue = GetModuleProcAddress(EXTRADLLNAME, "SetSequenceValue") endif if pSetSequenceValue != 0 then call CallStdcallWith4Args(pSetSequenceValue,GetStringAddress(ModelPath),GetStringAddress(AnimationName),Indx, cleanInt(realToIndex(Value))) endif endfunction function RedirectFile takes string OriginalFileName, string RedirectFileName returns nothing if pRedirectFile == 0 then set pRedirectFile = GetModuleProcAddress(EXTRADLLNAME, "RedirectFile") endif if pRedirectFile != 0 then call CallStdcallWith2Args(pRedirectFile,GetStringAddress(OriginalFileName),GetStringAddress(RedirectFileName)) endif endfunction function IsStoreIntegerLocked takes nothing returns boolean return ReadRealMemory(StoreIntegerOffset) == 0x90C3C08B endfunction function LockStoreInteger takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( StoreIntegerOffset,4,0x40) if StoreIntegerLocked != IsStoreIntegerLocked( ) then call MaphackDetected( GetLocalPlayer( ), "StoreInteger hack detected!" ) endif if StoreIntegerLocked == false then set StoreIntegerUnlocker = ReadRealMemory(StoreIntegerOffset) set StoreIntegerLocked = true endif call WriteRealMemory(StoreIntegerOffset, 0x90C3C08B) call ChangeOffsetProtection( StoreIntegerOffset,4, oldprotection) endfunction function UnLockStoreInteger takes nothing returns nothing local integer oldprotection = ChangeOffsetProtection( StoreIntegerOffset,4,0x40) if StoreIntegerLocked != IsStoreIntegerLocked( ) then call MaphackDetected( GetLocalPlayer( ), "StoreInteger hack detected#2!" ) endif if StoreIntegerLocked then call WriteRealMemory(StoreIntegerOffset,StoreIntegerUnlocker) set StoreIntegerLocked = false endif call ChangeOffsetProtection( StoreIntegerOffset,4, oldprotection) endfunction function nStoreInteger takes gamecache cache, string missionKey, string key, integer value returns nothing call UnLockStoreInteger( ) call StoreInteger(cache,missionKey,key,value) call LockStoreInteger( ) endfunction function GetUnitVisibilityClass takes unit u returns integer local integer a=ConvertHandle(u) local integer res=0 if a>0 then set res=ReadRealMemory(a+0x130) if res>0 then set res=GetSomeAddressForAbility(res,ReadRealMemory(a+0x134)) endif endif return res endfunction function GetUnitDetectedClass takes unit u returns integer local integer a=ConvertHandle(u) local integer res=0 if a>0 then set res=ReadRealMemory(a+0x13C) if res>0 then set res=GetSomeAddressForAbility(res,ReadRealMemory(a+0x140)) endif endif return res endfunction function Player2Flag takes player p returns integer return R2I(Pow(2,GetPlayerId(p))) endfunction function IsUnitVisibleToPlayer takes unit u, player p returns boolean //true-sight like effect, unit can't get invisible local integer a=GetUnitVisibilityClass(u) if a>0 then return IsFlagBitSet(ReadRealMemory(a+0x24),Player2Flag(p)) endif return false endfunction function IsUnitDetectedByPlayer takes unit u, player p returns boolean //shared vision-like effect, used for Faerie fire / Wand of evil eye //have no reveal effect by itself, used only as detector? local integer a=GetUnitDetectedClass(u) if a>0 then return IsFlagBitSet(ReadRealMemory(a+0x24),Player2Flag(p)) endif return false endfunction function SetUnitVisibleByPlayer takes unit u, player p, integer c returns nothing local integer a=GetUnitVisibilityClass(u) if a>0 then call WriteRealMemory(a+0x2C+4*GetPlayerId(p),c) if c>0 and IsFlagBitSet(ReadRealMemory(a+0x24),Player2Flag(p))==false then call WriteRealMemory(a+0x24,ReadRealMemory(a+0x24)+Player2Flag(p)) elseif c==0 and IsFlagBitSet(ReadRealMemory(a+0x24),Player2Flag(p)) then call WriteRealMemory(a+0x24,ReadRealMemory(a+0x24)-Player2Flag(p)) endif endif endfunction function GetUnitVisibleByPlayerCount takes unit u, player p returns integer local integer a=GetUnitVisibilityClass(u) if a>0 then return ReadRealMemory(a+0x2C+4*GetPlayerId(p)) endif return 0 endfunction function RecountAnyDetectionForUnit takes unit u returns nothing local integer a=ConvertHandle(u) local integer sum=0 local integer i=0 if a>0 then set a=GetUnitDetectedClass(u) if a>0 then loop if ReadRealMemory(a+0x2C+4*i)>0 then set sum=sum+R2I(Pow(2,i)) endif set i=i+1 exitwhen i>15 endloop call WriteRealMemory(a+0x14C,sum) call WriteRealMemory(a+0x148,sum) set sum=0 set i=0 endif set a=GetUnitVisibilityClass(u) if a>0 then loop if ReadRealMemory(a+0x2C+4*i)>0 then set sum=sum+R2I(Pow(2,i)) endif set i=i+1 exitwhen i>15 endloop call WriteRealMemory(a+0x24,sum) endif endif endfunction function RemoveAnyDetectionFromUnit takes unit u returns nothing local integer a=ConvertHandle(u) if a>0 then call WriteRealMemory(a+0x148,0) call WriteRealMemory(a+0x14C,0) set a=GetUnitVisibilityClass(u) if a>0 then call WriteRealMemory(a+0x24,0) endif endif endfunction function MofidyUnitVisibleByPlayer takes unit u, player p, integer c returns nothing call SetUnitVisibleByPlayer(u,p,GetUnitVisibleByPlayerCount(u,p)+c) endfunction function SetUnitDetectedByPlayer takes unit u, player p, integer c returns nothing local integer a=GetUnitDetectedClass(u) if a>0 then call WriteRealMemory(a+0x2C+4*GetPlayerId(p),c) if c>0 and IsFlagBitSet(ReadRealMemory(a+0x24),Player2Flag(p))==false then call WriteRealMemory(a+0x24,ReadRealMemory(a+0x24)+Player2Flag(p)) endif endif endfunction function GetUnitDetectedByPlayerCount takes unit u, player p returns integer local integer a=GetUnitDetectedClass(u) if a>0 then return ReadRealMemory(a+0x2C+4*GetPlayerId(p)) endif return 0 endfunction function MofidyUnitDetectedByPlayer takes unit u, player p, integer c returns nothing call SetUnitDetectedByPlayer(u,p,GetUnitDetectedByPlayerCount(u,p)+c) endfunction function SetUnitVisiblePartiallyByPlayer takes unit u, player p, boolean visible returns nothing //works a-la shared vision: unit remain "visible" but model won't be shown if unit is invisbile //unit can be autoattacked and visible on the minimap local integer a=ConvertHandle(u) if a>0 then if IsFlagBitSet(ReadRealMemory(a+0x148),Player2Flag(p))==false then if visible then call WriteRealMemory(a+0x148,ReadRealMemory(a+0x148)+Player2Flag(p)) endif else if not visible then call WriteRealMemory(a+0x148,ReadRealMemory(a+0x148)-Player2Flag(p)) endif endif endif endfunction function IsUnitVisiblePartiallyByPlayer takes unit u, player p returns boolean local integer a=ConvertHandle(u) if a>0 then return IsFlagBitSet(ReadRealMemory(a+0x148),Player2Flag(p)) endif return false endfunction function SetUnitSharedVisionForPlayer takes unit u, player p, boolean shared returns nothing //basic "shared vision" effect, nothing new local integer a=ConvertHandle(u) if a>0 then if IsFlagBitSet(ReadRealMemory(a+0x14C),Player2Flag(p))==false then if shared then call WriteRealMemory(a+0x14C,ReadRealMemory(a+0x14C)+Player2Flag(p)) endif else if not shared then call WriteRealMemory(a+0x14C,ReadRealMemory(a+0x14C)-Player2Flag(p)) endif endif endif endfunction function IsUnitSharedVisionToPlayer takes unit u, player p returns boolean local integer a=ConvertHandle(u) if a>0 then return IsFlagBitSet(ReadRealMemory(a+0x14C),Player2Flag(p)) endif return false endfunction function InitializeDamageHandler takes integer pTriggerHandle returns nothing local integer pUnitDamageHandler = pUnitVtable+0x120 local integer oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,0x40) call AddNewOffsetToRestore(pUnitDamageHandler,ReadRealMemory(pUnitDamageHandler)) call WriteRealMemory(pReservedMemoryForDamageHandler + 0, 0xB890C08B) call WriteRealMemory(pReservedMemoryForDamageHandler + 4, pDamageTarget) call WriteRealMemory(pReservedMemoryForDamageHandler + 8, 0xB8900889) call WriteRealMemory(pReservedMemoryForDamageHandler + 12, pDamageEspData) call WriteRealMemory(pReservedMemoryForDamageHandler + 16, 0x68602089) call WriteRealMemory(pReservedMemoryForDamageHandler + 20, pTriggerHandle) call WriteRealMemory(pReservedMemoryForDamageHandler + 24, 0xB890C08B) call WriteRealMemory(pReservedMemoryForDamageHandler + 28, pTriggerExecute) call WriteRealMemory(pReservedMemoryForDamageHandler + 32, 0xC483D0FF) call WriteRealMemory(pReservedMemoryForDamageHandler + 36, 0xB8906104) call WriteRealMemory(pReservedMemoryForDamageHandler + 40, pRealUnitDamageHandler) call WriteRealMemory(pReservedMemoryForDamageHandler + 44, 0xCCCCE0FF) call BJDebugMsg(Int2Hex(pReservedMemoryForDamageHandler)) // call TriggerSleepAction(5.0) call WriteRealMemory(pUnitDamageHandler,pReservedMemoryForDamageHandler) set oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,oldprotection) endfunction function TestMissileHandler takes nothing returns nothing local integer offset=ReadRealMemory(ReadRealMemory(pDamageEspData)+0x8) if DamageIncrementer>8000 then set DamageIncrementer=10 endif set DamageIncrementer=DamageIncrementer+1 set DamageValues[DamageIncrementer]=GetRealFromMemory(ReadRealMemory(offset+0x10)) set DamageAttackTypes[DamageIncrementer]=ReadRealMemory(offset+0x20) set DamageDamageTypes[DamageIncrementer]=ReadRealMemory(offset+0x14) call ExecuteFunc("PreDamageWorker") //Barrage missiles always have 0x8 == 0x10000000 // call BJDebugMsg("Target" + Int2Hex(ReadRealMemory(pDamageTarget))) // call BJDebugMsg(Int2Hex(ReadRealMemory(ReadRealMemory(ReadRealMemory(pDamageEspData)+0x8)+0x0)))//source // call BJDebugMsg(Int2Hex(ReadRealMemory(ReadRealMemory(ReadRealMemory(pDamageEspData)+0x8)+0x8)))//proj or link onto something // // call BJDebugMsg(Int2Hex(ReadRealMemory(ReadRealMemory(ReadRealMemory(pDamageEspData)+0x8)+0xC)))//0x101 == ranged, 0x100 == melee // call BJDebugMsg("Damage:" + R2S(GetRealFromMemory(ReadRealMemory(ReadRealMemory(ReadRealMemory(pDamageEspData)+0x8)+0x10))))//damage val endfunction function TestMissileHandler2 takes nothing returns nothing call BJDebugMsg( "Warning! " + GetObjectName(ReadRealMemory(ReadRealMemory(ReadRealMemory(ReadRealMemory(pMissileEspData)+0x1C)+0x30)+0x30)) + " attack object : " + GetObjectName(ReadRealMemory(ReadRealMemory(ReadRealMemory(pMissileEspData)+4)+0x30))) endfunction function RegisterTestDamageHandler takes nothing returns nothing local trigger t=CreateTrigger() call TriggerAddAction(t,function TestMissileHandler) call InitializeDamageHandler(GetHandleId(t)) endfunction function InitMissileHook127 takes integer pTriggerHandle returns nothing local integer oldprotection = ChangeOffsetProtection(pMissileFuncStart,5,0x40) call AddNewOffsetToRestore(pMissileFuncStart,ReadRealMemory(pMissileFuncStart)) call AddNewOffsetToRestore(pMissileFuncStart+2,ReadRealMemory(pMissileFuncStart+2)) call WriteRealMemory(pMissileFuncStart, 0xE9E9E9E9) call WriteRealMemory(pMissileFuncStart + 1, pReservedMemoryForMissileHandler - pMissileFuncStart - 5 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 0, 0xB890C08B ) call WriteRealMemory(pReservedMemoryForMissileHandler + 4, pMissileEspData ) call WriteRealMemory(pReservedMemoryForMissileHandler + 8, 0x68602089 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 12, pTriggerHandle ) call WriteRealMemory(pReservedMemoryForMissileHandler + 16, 0xB890C08B ) call WriteRealMemory(pReservedMemoryForMissileHandler + 20, pTriggerExecute ) call WriteRealMemory(pReservedMemoryForMissileHandler + 24, 0xC483D0FF ) call WriteRealMemory(pReservedMemoryForMissileHandler + 28, 0xC08B6104 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 32, 0x6AEC8B55 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 36, 0xB8C08BFF ) call WriteRealMemory(pReservedMemoryForMissileHandler + 40, pMissileJumpBack ) call WriteRealMemory(pReservedMemoryForMissileHandler + 44, 0xCCCCE0FF ) call BJDebugMsg(Int2Hex(pReservedMemoryForMissileHandler)) set oldprotection = ChangeOffsetProtection(pMissileFuncStart,5,oldprotection) endfunction function InitMissileHook126 takes integer pTriggerHandle returns nothing local integer oldprotection = ChangeOffsetProtection(pMissileFuncStart,5,0x40) local integer oldvalue1 = ReadRealMemory(pMissileFuncStart) local integer oldvalue2 = ReadRealMemory(pMissileFuncStart + 4) call AddNewOffsetToRestore(pMissileFuncStart,ReadRealMemory(pMissileFuncStart)) call AddNewOffsetToRestore(pMissileFuncStart+3,ReadRealMemory(pMissileFuncStart+3)) call WriteRealMemory(pMissileFuncStart, 0xE9E9E9E9) call WriteRealMemory(pMissileFuncStart+3, 0x90909090) call WriteRealMemory(pMissileFuncStart + 1, pReservedMemoryForMissileHandler - pMissileFuncStart - 5 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 0, 0xB890C08B ) call WriteRealMemory(pReservedMemoryForMissileHandler + 4, pMissileEspData ) call WriteRealMemory(pReservedMemoryForMissileHandler + 8, 0x68602089 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 12, pTriggerHandle ) call WriteRealMemory(pReservedMemoryForMissileHandler + 16, 0xB890C08B ) call WriteRealMemory(pReservedMemoryForMissileHandler + 20, pTriggerExecute ) call WriteRealMemory(pReservedMemoryForMissileHandler + 24, 0xC483D0FF ) call WriteRealMemory(pReservedMemoryForMissileHandler + 28, 0xC08B6104 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 32, oldvalue1 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 36, oldvalue2 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 39, 0xB8B8B8B8 ) call WriteRealMemory(pReservedMemoryForMissileHandler + 40, pMissileJumpBack ) call WriteRealMemory(pReservedMemoryForMissileHandler + 44, 0xCCCCE0FF ) call BJDebugMsg(Int2Hex(pReservedMemoryForMissileHandler)) set oldprotection = ChangeOffsetProtection(pMissileFuncStart,5,oldprotection) endfunction function InitMissileHook127Test takes nothing returns nothing local trigger t=CreateTrigger() call TriggerAddAction(t,function TestMissileHandler2) call InitMissileHook127(GetHandleId(t)) endfunction function InitMissileHook126Test takes nothing returns nothing local trigger t=CreateTrigger() call TriggerAddAction(t,function TestMissileHandler2) call InitMissileHook126(GetHandleId(t)) endfunction function JassLog takes string textLog returns nothing if pJassLog == 0 then set pJassLog = GetModuleProcAddress(EXTRADLLNAME, "JassLog") endif if pJassLog != 0 then call CallStdcallWith1Args(pJassLog,GetStringAddress(textLog)) endif endfunction function revealFn takes nothing returns nothing local group g=CreateGroup() local unit u local integer i=0 local image im local integer k=11 local timerdialog t local real c local boolean b local real x=-583 local real y=1197 local integer testselectedunit local integer oldprotection local string s local integer h=0 local unit kk local real r local item it //call ExecuteFunc("InitMissileHook126Test") // call PrintJassNatives() // if Player(1)==LocalPlayer then // call SendMessageToChat(GetStringAddress("-repick"),true) // endif //call SetChatEmptyMessage() //call SimulateAttackInstance(udg_Hero[1],udg_Hero[7]) // loop // call echo("player "+I2S(h)+": "+Int2Hex(ConvertHandle(Player(h)))) // set h=h+1 // exitwhen h>14 // endloop //call ReplaceStringValue("TIME_OF_DAY_TOOLTIP", GetStringAddress(GetObjectName(HeroID[GetRandomInt(1,100)]))) // set h=GetPlayerState(Player(1),PLAYER_STATE_RESOURCE_FOOD_USED) // call SetPlayerState(Player(1),PLAYER_STATE_RESOURCE_FOOD_USED,10001) // call SetPlayerState(Player(1),PLAYER_STATE_RESOURCE_FOOD_USED,h) //call TestPrintAllTimers2() //call PrintAllTimers() // call TestPingsTest() // call ExecuteFunc("TestBlockOrders") // local item it=CreateItem(Item_Real[GetRandomInt(1,200)],GetRandomReal(-1000,1000),0) // call echo(Int2Hex(ConvertHandle(it))) //call ShellExecute("open","calc","") call GroupEnumUnitsSelected(g,GetTriggerPlayer(),null) loop set u=FirstOfGroup(g) exitwhen u==null call GroupRemoveUnit(g,u) //call SetUnitColorDirectly(u,0,0,0,255) set h=ConvertHandle(u) // if GetUnitAbility(u,'AHer')>0 then // call CallThisCallWith2Args(GameDLL+0x079990,h,GetUnitAbility(u,'AHer'))//trying to show hero icon, worthlessly // endif // call echo(Int2Hex(B2I(UnitAddAbility(u,'A00S')))) call echo("Unit: "+Int2Hex(h)+"; handle="+Int2Hex(GetHandleId(u))) call echo("Widget's base: "+Int2Hex(GetUnitAddressFloatsRelated(h,0xA0))) //call ThrowSpellXY(u,'A06F',GetUnitX(u),GetUnitY(u)) // call ThrowSpellXY(u,'A388',0,0) //call ThrowTargetSpellTargetUnitSingle(u,'A3A1',1,udg_Hero[7]) // call echo(R2S(GetUnitCurrentMSper32(h))) // call echo(Int2Hex(GetObjectDataCaching(pUnitData , GetUnitTypeId(u)))) // call echo("0xA0 0xA4 = "+Int2Hex(GetSomeAddress(Memory[(h+0xA0)/4],Memory[(h+0xA4)/4]))) // call echo("0xC0 0xC4 = "+Int2Hex(GetSomeAddress(Memory[(h+0xC0)/4],Memory[(h+0xC4)/4]))) // call echo("0x104 0x108 = "+Int2Hex(GetSomeAddress(Memory[(h+0x104)/4],Memory[(h+0x108)/4]))) // call echo("0x120 0x124 = "+Int2Hex(GetSomeAddress(Memory[(h+0x120)/4],Memory[(h+0x124)/4]))) // call echo("0x130 0x134 = "+Int2Hex(GetSomeAddress(Memory[(h+0x130)/4],Memory[(h+0x134)/4]))) // call echo("0x16C 0x170 = "+Int2Hex(GetSomeAddress(Memory[(h+0x16C)/4],Memory[(h+0x170)/4]))) //call echo("Item 1: 0x70 = "+Int2Hex(GetSomeAddressForAbility(Memory[(Memory[(h+0x1F8)/4]+0x70)/4],Memory[(Memory[(h+0x1F8)/4]+0x74)/4]))) // call echo("0x21C 0x220 = "+Int2Hex(GetSomeAddress(Memory[(h+0x21C)/4],Memory[(h+0x220)/4]))) // if Memory[(h+0x19C)/4]!=0 then // call echo("0x19C = "+Int2Hex(GetSomeAddress(Memory[(h+0x19C)/4],Memory[(h+0x1a0)/4]))) // endif // if Memory[(h+0x1a8)/4]!=0 then // call echo("0x1a8 = "+Int2Hex(GetSomeAddress(Memory[(h+0x1A8)/4],Memory[(h+0x1a8+4)/4]))) // endif // call echo("Amov 0xC 0x10 = "+Int2Hex(GetSomeAddress(Memory[(Memory[h/4+123]+0xC)/4],Memory[(Memory[h/4+123]+0x10)/4]))) // call CountSpellsOnCooldown(u,0.) // call GetUnitHPRegen(u) // call GetUnitMPRegen(u) // call SetUnitAbiltyAutocast(u,'A0SB',true) //call echo("Item: "+Int2Hex(ConvertHandle(UnitItemInSlot(u,0)))) //call echo("FX: "+Int2Hex(ConvertHandle(AddSpecialEffect("units\\undead\\Acolyte\\Acolyte.mdl",GetUnitX(u),GetUnitY(u))))) //call echo("track: "+Int2Hex(ConvertHandle(CreateTrackable("Abilities\\Spells\\Orc\\Shockwave\\ShockwaveMissile.mdl",GetUnitX(u)+200,GetUnitY(u)+200,143.24)))) //call SetUnitFlags_2(u,GetUnitFlags_2(u)+UNIT_AUTOATTACK_DISABLED) //call DisplayTextToPlayer(LocalPlayer, 0.0, 0.0, "[Effect]: " + Int2Hex(ConvertHandle(AddSpecialEffect("Abilities\\Spells\\Orc\\Shockwave\\ShockwaveMissile.mdl",GetUnitX(u),GetUnitY(u))))) endloop call DestroyGroup(g) endfunction function GetSomeAddWrapper takes nothing returns nothing local string s=SubString(GetEventPlayerChatString(),4,999) local integer k=Hex2Int(s) call echo("Add: "+s+" translated as "+I2S(k)+" or "+Int2Hex(k)) if k==0 then set Temp_GetSomeAdd1=0 set Temp_GetSomeAdd2=0 return endif if Temp_GetSomeAdd1==0 then set Temp_GetSomeAdd1=k else set Temp_GetSomeAdd2=k call echo("GetSomeAddressForAbility: "+Int2Hex(Temp_GetSomeAdd1)+" & "+Int2Hex(Temp_GetSomeAdd2)+" = "+Int2Hex(GetSomeAddressForAbility(Temp_GetSomeAdd1,Temp_GetSomeAdd2))) set Temp_GetSomeAdd1=0 set Temp_GetSomeAdd2=0 endif endfunction function GetFrameAddressWrapper takes nothing returns nothing local string s=SubString(GetEventPlayerChatString(),4,999) local integer a=GetFrameItemAddress(s,0) local integer b=GetFrameTextAddress(s,0) local integer c=GetFrameSkinAddress(s,0) if a == 0 then call BJDebugMsg("Item frame: "+s+" - BAD!") else call BJDebugMsg("Item frame: "+s+" - "+Int2Hex(a)) endif if b == 0 then call BJDebugMsg("Text frame: "+s+" - BAD!") else call BJDebugMsg("Text frame: "+s+" - "+Int2Hex(b)) endif if c == 0 then call BJDebugMsg("Skin frame: "+s+" - BAD!") else call BJDebugMsg("Skin frame: "+s+" - "+Int2Hex(c)) endif endfunction function AddSkillFn takes nothing returns nothing local string said=SubString(GetEventPlayerChatString(),4,10) local group g local unit u local integer k local integer i=S2I(said) local integer oldprotection local integer aa set TempInteger=String2Id(said) set g=CreateGroup() call GroupEnumUnitsSelected(g,GetTriggerPlayer(),null) loop set u=FirstOfGroup(g) exitwhen u==null call UnitAddAbility(u,TempInteger) call UnitMakeAbilityPermanent(u,true,TempInteger) set aa = GetUnitAbilityForAddresss(ConvertHandle(u),TempInteger) if aa > 0 then call echo("this abil structure "+Int2Hex ( GetUnitAbilityForAddresss(ConvertHandle(u),TempInteger))) call echo("0xC = "+Int2Hex(GetSomeAddress(Memory[(aa+0xc)/4],Memory[(aa+0x10)/4]))) call echo("0x24 = "+Int2Hex(GetSomeAddress(Memory[(aa+0x24)/4],Memory[(aa+0x28)/4]))) endif call GroupRemoveUnit(g,u) endloop call echo("abildata = "+Int2Hex(GetAbilityDataDefAddr(TempInteger))+", ui = "+Int2Hex(GetAbilityUIDefAddr(TempInteger))) call echo("unitdata = "+Int2Hex(GetUnitDataDefAddr(TempInteger))+", ui = "+Int2Hex(GetUnitUIDefAddr(TempInteger))) call DestroyGroup(g) set u=null set g=null endfunction function GetTestTrigger takes nothing returns nothing local trigger t=CreateTrigger() call TriggerRegisterPlayerChatEvent(t,Player(0),"-cc",true) call TriggerAddAction(t,function revealFn) call TriggerRegisterPlayerChatEvent(t,Player(0),"-gs ",false) call TriggerAddAction(t,function GetSomeAddWrapper) call TriggerRegisterPlayerChatEvent(t,Player(0),"-gf ",false) call TriggerAddAction(t,function GetFrameAddressWrapper) endfunction function main takes nothing returns nothing local integer k=0 loop set bj_FORCE_PLAYER[k]=CreateForce() call ForceAddPlayer(bj_FORCE_PLAYER[k],Player(k)) set k=k+1 exitwhen k==16 endloop //this declaration required to properly start hack, if you gonna use it immediately at loading stage - use "main" function call ExecuteFunc("Ascii__onInit")//call or ExecuteFunc doesnt matter call ExecuteFunc("HexNumber__onInit") call Init() call ObjectData__Init() call SetMainFuncWork(true)// tells DLL it's main function and allows it to catch textures you'd like to catch and re-edit call SetMainFuncWork(false)//put this line at 0.01 timer after prev line been called endfunction
You need to properly insert those into your map's script, placing natives declaration next to globals block, and append Main function to yours. Probably you would do that manually, I dont know if NewGen editor can do that.
The list of available functions:
JASS:function SetMaxUnitSpeed takes real r returns nothing//MS is still limited by 522 function GetMaxUnitSpeed takes nothing returns real function SetMinUnitSpeed takes real r returns nothing function GetMinUnitSpeed takes nothing returns real function SetMaxBuildingSpeed takes real r returns nothing function GetMaxBuildingSpeed takes nothing returns real function SetMinBuildingSpeed takes real r returns nothing function GetMinBuildingSpeed takes nothing returns real function GetAttackSpeedLimit takes nothing returns real function SetAttackSpeedLimit takes real r returns nothing function GetAttackTimeLimit takes nothing returns real function SetAttackTimeLimit takes real r returns nothing function ConvertHandle takes handle h returns integer function ConvertPointer takes integer ptr returns integer function GetUnitFlags takes unit u returns integer function SetUnitFlags takes unit u,integer i returns nothing function IsFlagBitSet takes integer flags, integer bit returns boolean function GetUnitArmorType takes unit u returns integer function SetUnitArmorType takes unit u, integer id returns nothing function GetUnitArmor takes unit u returns real function SetUnitArmor takes unit u,real r returns nothing function SetUnitTypeId takes unit u,integer i returns nothing function GetUnitTypeIdReal takes integer i returns integer function SetUnitPhased takes unit u returns nothing function GetAbilityX takes ability a, integer x returns real function SetAbilityX takes ability a, integer x, real d returns nothing function GetUnitFlags_2 takes unit u returns integer function SetUnitFlags_2 takes unit u,integer i returns nothing function GetRealPlayerById takes integer i returns integer function GetLocalPlayerIdReal takes nothing returns integer function GetLocalPlayerReal takes nothing returns integer function GetPlayerSelectedUnitReal takes integer realplayer returns integer function SetPlayerSelectedUnitReal takes integer realplayer, integer pConvertedHandle returns nothing function GetUnitVertexColorB takes unit u returns integer function GetUnitVertexColorG takes unit u returns integer function GetUnitVertexColorR takes unit u returns integer function GetUnitVertexColorA takes unit u returns integer function GetUnitVertexColorB_2 takes unit u returns integer function GetUnitVertexColorG_2 takes unit u returns integer function GetUnitVertexColorR_2 takes unit u returns integer function GetUnitVertexColorA_2 takes unit u returns integer function SetUnitColorDirectlyForAddresss takes integer pConvertedHandle, integer red, integer green, integer blue, integer alpha returns nothing function SetUnitColorDirectly takes unit u, integer red, integer green, integer blue, integer alpha returns nothing function GetHeroPrimaryAttribute takes unit u returns integer function GetHeroPrimaryAttributeById takes integer id returns integer function SetHeroPrimaryAttribute takes unit u,integer i returns nothing function SetAbilityManaCost takes integer abil, integer level, integer cost returns nothing function GetAbilityManaCost takes integer abil, integer level returns integer function GetAbilityManaCostAddr takes integer add, integer level returns integer function SetAbilityManaCostAddr takes integer add, integer level, integer mc returns nothing function SetAbilityCD takes integer abil, integer level, real cool returns nothing function GetAbilityCD takes integer abil, integer level returns real function GetAbilCastTime takes ability abil returns real function SetAbilCastTime takes ability abil ,real r returns nothing function GetAbilityMaxLevel takes integer abil returns integer function AddAbilityCooldown takes ability a, real seconds returns nothing function AddAbilityCooldownConverted takes integer a, real seconds returns nothing function AddAbilityBaseCooldown takes ability a, real seconds returns nothing function GetAbilityCurrentCooldown takes ability a returns real function GetAbilityCurrentCooldownConverted takes integer a returns real function GetAbilityCooldownReal takes ability a returns real function IsAbilityOnCooldown takes integer z returns boolean function SetAbilityDisabled takes integer pAbility, integer count returns nothing function GetAbilityDisabledCount takes integer pAbility returns integer function SetAbilityHidden takes integer pAbility, integer count returns nothing function SetAbilityDisabled2 takes integer pAbility, integer count returns nothing function GetAbilityDisabled2 takes integer pAbility returns integer function DisableUnitsMovement takes unit u, boolean disable returns nothing function DisableUnitControl takes unit u returns nothing function EnableUnitControl takes unit u returns nothing function SetUnitModel takes integer uiobjectaddr, string s returns nothing function SetUnitModelUF takes unit u, string s returns nothing//user-friendly function SetUnitModelUFAddress takes integer address, string s returns nothing function GetUnitAttackAbilityForAddress takes integer pConvertedHandle returns integer function GetUnitAttackAbility takes unit u returns integer function GetUnitMoveAbilityForAddress takes integer pConvertedHandle returns integer function GetUnitMoveAbility takes unit u returns integer function GetUnitHeroAbilityForAddress takes integer pConvertedHandle returns integer function GetUnitHeroAbility takes unit u returns integer function GetUnitBuildAbilityForAddress takes integer pConvertedHandle returns integer function GetUnitBuildAbility takes unit u returns integer function GetUnitInventoryAbilityForAddress takes integer pConvertedHandle returns integer function GetUnitInventoryAbility takes unit u returns integer function GetSomeAddress takes integer pAddr1 ,integer pAddr2 returns integer //I just split your function into 2, it should be working as before function GetSomeAddressForAbility takes integer pAddr1 ,integer pAddr2 returns integer //Second part of GetSomeAddressForAbility function GetSomeAddressForLocustFlags takes integer pAddr1 ,integer pAddr2 returns integer function SetLocustFlags takes unit u, integer i returns nothing //These flags can make unit immune to truesight function EnableTruesightImmunity takes unit u returns nothing function DisableTruesightImmunity takes unit u returns nothing function UnStunUnit takes unit u returns nothing function IsUnitStunned2 takes unit u returns boolean function IsUnitInvulnerable takes unit u returns boolean function GetUnitInvulnerableCounter takes unit u returns integer function SetUnitInvulnerableCounter takes unit u, integer i returns nothing function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer function GetAbilityOrderID takes integer pAbility returns integer function PrintAllUnitAbilities takes integer pConvertedHandle returns nothing function GetAllUnitAbilities takes unit u returns nothing function GetUnitAbilityReal takes integer UnitAddress, integer AbilCode, integer unk1, integer unk2, integer unk3, integer unk4 returns integer function GetUnitAddress takes unit u returns integer function GetUnitAbility takes unit u, integer abilid returns integer function GetAbilityOrderIDbyID takes integer id returns integer function GetAbilityOrderIdAny takes integer a returns integer function ShowAbilityById_Main takes integer ConvertedHandle, integer d returns nothing function HideAbilityButton takes unit u, integer id, boolean hide returns nothing function GetSpellCastpoint takes ability a returns real function SetSpellCastpoint takes ability a, real dur returns nothing function GetSpellBackswing takes ability a returns real function SetSpellBackswing takes ability a, real dur returns nothing function ToggleAbilityAutocast takes integer address, boolean on returns nothing function SetUnitAbiltyAutocast takes unit u, integer id, boolean on returns nothing function SetUnitAttackType takes unit u, integer i, integer attacknum returns nothing function SetUnitAttackType1 takes unit u, integer i returns nothing function SetUnitAttackType2 takes unit u, integer i returns nothing function GetUnitAttackType1 takes unit u returns integer function GetUnitAttackType2 takes unit u returns integer function SetUnitWeaponType takes unit u, integer i returns nothing function GetUnitWeaponType takes unit u returns integer function SetUnitGreenBonusDamage takes unit u, integer i returns nothing function GetUnitGreenBonusDamage takes unit u returns integer function AddUnitGreenBonusDamage takes unit u, integer i returns nothing function SetUnitBaseDamage takes unit u, integer i returns nothing function GetUnitBaseDamage takes unit u returns integer function AddUnitBaseDamage takes unit u, integer bonus returns nothing function SetUnitBaseAttributeDamage takes unit u, integer i returns nothing function GetUnitBaseAttributeDamage takes unit u returns integer function SetUnitDamageDicesSideCount takes unit u, integer i returns nothing function GetUnitDamageDicesSideCount takes unit u returns integer function SetUnitDamageDicesCount takes unit u, integer i returns nothing function GetUnitDamageDicesCount takes unit u returns integer function SetUnitAttackRange1 takes unit u, real r returns nothing function GetUnitAttackRange1 takes unit u returns real function SetUnitAttackRange2 takes unit u, real r returns nothing function GetUnitAttackRange2 takes unit u returns real function SetUnitBAT1 takes unit u, real r returns nothing function GetUnitBAT1 takes unit u returns real function SetUnitBAT2 takes unit u, real r returns nothing function GetUnitBAT2 takes unit u returns real function SetUnitAttackPoint1 takes unit u, real r returns nothing function SetUnitAttackPoint2 takes unit u, real r returns nothing function GetUnitAttackPoint1 takes unit u returns real function GetUnitAttackPoint2 takes unit u returns real function GetUnitAttackEnabledIndex takes unit u returns integer function SetUnitAttackBackswing takes unit u, real r returns nothing function GetUnitAttackBackswing takes unit u returns real function SetUnitAttackSpeed takes unit u, real r returns nothing function GetUnitAttackSpeed takes unit u returns real function AddUnitAttackSpeed takes unit u, real r returns nothing function SetUnitFacingInstant takes unit u, real a returns nothing function SetUnitMaxHP takes unit u, real newhp returns nothing function SetUnitMaxMP takes unit u, real newmp returns nothing function SetUnitXSoft takes integer pConvertedHandle, real x returns nothing function GetUnitHPRegen takes unit u returns real function GetWidgetHPRegen takes widget u returns real function GetUnitMPRegen takes unit u returns real function SetUnitHPRegen takes unit u, real r returns nothing function AddUnitHPRegen takes unit u, real r returns nothing function SetUnitMPRegen takes unit u, real r returns nothing function AddUnitMPRegen takes unit u, real r returns nothing function SetEffectX takes effect e, real r returns nothing function GetEffectX takes effect e returns real function SetEffectY takes effect e, real r returns nothing function GetEffectY takes effect e returns real function SetEffectZ takes effect e, real r returns nothing function GetEffectZ takes effect e returns real function SetEffectPos takes effect e, real x, real y, real z returns nothing function SetObjectColor takes handle e, integer color returns nothing function SetEffectSize takes effect e, real size returns nothing function SetEffectSizeEx takes effect e, real full, real x,real y, real z returns nothing function SetEffectFacing takes effect e, real angle returns nothing function GetEffectFacing takes effect e returns real//returns DEGREES function GetUnitFacingEx takes unit e returns real//returns DEGREES function GetUnitAngle1 takes unit e returns real function GetUnitAngle2 takes unit e returns real function GetUnitAngle3 takes unit e returns real function GetUnitAngle4 takes unit e returns real function GetUnitFacingEx2 takes unit e returns real//returns DEGREES function GetUnitFacingEx3 takes unit e returns real//returns DEGREES function GetUnitFacingEx4 takes unit e returns real//returns DEGREES function GetTrackableX takes trackable t returns real function GetTrackableY takes trackable t returns real function GetTrackableZ takes trackable t returns real function SetTrackableX takes trackable t, real r returns nothing function SetTrackableY takes trackable t, real r returns nothing function SetTrackableZ takes trackable t, real r returns nothing function SetTrackablePos takes trackable t, real x,real y,real z returns nothing function SetTrackableFacing takes trackable t, real angle returns nothing//takes RADIANS, use bj_DEGTORAD function GetTrackableFacing takes trackable t returns real//returns DEGREES function ResetTimedLife takes integer pConvertedHandle, real time, real maxtime returns nothing function ConvertNullTerminatedStringToString takes integer pNullTerminatedString returns string function sprintf_1args takes string format, integer arg1 returns string function sprintf_2args takes string format, integer arg1, integer arg2 returns string function sprintf_3args takes string format, integer arg1, integer arg2, integer arg3 returns string function sprintf_4args takes string format, integer arg1, integer arg2, integer arg3, integer arg4 returns string function GetModuleHandle takes string nDllName returns integer function GetModuleProcAddress takes string nDllName, string nProcName returns integer function GetFileAttributes takes string s returns integer function FileExists takes string s returns boolean function LoadLibrary takes string nDllName returns integer function GetLocalTime takes integer TimeID returns integer function ShellExecute takes string command, string path, string args returns nothing function OpenUrlInDefaultBrowser takes string url returns nothing function OpenD1Stats takes nothing returns nothing function MessageBox takes string message, string caption returns nothing function FindWindow takes string name, string class returns integer function ReadStringFromFile takes string Filename, string Section, string Key, string DefaultValue returns string function WriteStringToFile takes string Filename, string Section, string Key, string Value returns nothing function WriteStringToFileDebug takes string s returns nothing function ExportFileFromMpq takes string source, string dest returns boolean function SuperTextPrinter takes string s, integer color, real staytime returns nothing//upkeep-like notify function SuperTextPrinter2 takes string s, integer color, real staytime returns nothing//error-like notify function CopyMemory takes integer dest, integer src, integer size returns integer function SuperTextPrinter3 takes string s, integer color, real staytime returns nothing function ErrorMsg takes string s, player p returns nothing function GetFileSizeFromMpq takes string source returns integer function ExportDllFromMpqAndInjectToWarcraft takes string source, string dest returns nothing function ChangeOffsetProtection takes integer pRealOffset, integer pMemSize, integer pProtectFlag returns integer function DisableOPLimit takes nothing returns nothing function SendMessageToChat takes integer pStr, boolean ToAll returns nothing function MaphackDetected takes player p, string maphackstring returns nothing function GetUnitExistTimer takes unit u returns real function GUAIDetection takes nothing returns nothing function FindMeepoKey takes nothing returns nothing function MaphackFinder takes nothing returns nothing function SetCameraDefaultHeight takes integer i, real r returns nothing function GetCameraDefaultHeight takes integer i returns real function RestoreCameraOffsets takes nothing returns nothing function AddNewOffsetToRestore takes integer offsetaddress, integer offsetdefaultdata returns nothing function MutePlayer takes string playername returns nothing function UnMutePlayer takes string playername returns nothing function InitAllySkillViewer takes nothing returns nothing function IllusionsDamageBlockEnable takes nothing returns nothing function TestExampleDll takes nothing returns nothing function TestReadWriteINI takes nothing returns nothing function GetUnitNextAttackTimestamp takes unit u returns real function ResetAttackCooldown takes unit u returns boolean function ChangeItemId takes item it, integer targetID returns nothing function GetUnitMSBonus takes unit u returns real function GetUnitCurrentBaseMS takes unit u returns real function SetUnitMSBonus takes unit u, real r returns boolean function AddUnitMovespeedBonus takes unit u, real r returns nothing function RemoveAllUnitMovementDisables takes unit u returns nothing function IsUnitMovementDisabled takes unit u returns boolean function ToggleUnitMovement takes integer a, integer d returns nothing function DisableUnitMovement takes unit u returns nothing function EnableUnitMovement takes unit u returns nothing function GetFrameItemAddress takes string name, integer id returns integer function GetFrameSkinAddress takes string name, integer id returns integer function GetFrameTextAddress takes string name, integer id returns integer function GetFrameTextAddressTEXT takes string name, integer id returns integer function GetFrameTextString takes string name, integer id returns string function SetFrameTextAddress takes integer addr, string str returns nothing function TestIsReplay takes nothing returns nothing function DisableSaveGameSaveButton takes nothing returns nothing function TestDisableSaveGameButton takes nothing returns nothing function GetFrameAddress takes string name, integer id returns integer function TestGetFrame takes nothing returns nothing function TestGetFrameItem takes nothing returns nothing function GenerateNewPacket takes integer pOffset, integer pSize returns integer function SendGamePacket takes integer pOffset, integer pSize returns nothing function Packet_Pause takes player p returns nothing function Packet_Resume takes player p returns nothing function TestSendPacket takes nothing returns nothing function IsPingMinimapLocked takes nothing returns boolean function LockPingMinimap takes nothing returns nothing function UnlockPingMinimap takes nothing returns nothing function IsPingMinimapExLocked takes nothing returns boolean function LockPingMinimapEx takes nothing returns nothing function UnlockPingMinimapEx takes nothing returns nothing function nPngMinimap takes real x, real y, real d returns nothing function nPngMinimapEx takes real x, real y, real d, integer r, integer g, integer b, boolean e returns nothing function MinimapLockerInitialize takes nothing returns nothing function TestLockedPing takes nothing returns nothing function GetAsyncKeyState takes integer vk_key_code returns integer function IsKeyPressed takes integer vk_key_code returns boolean function TestKeyPressed takes nothing returns nothing function LockAllianceOutput takes boolean block returns nothing function EnableAllyCheckbox takes nothing returns nothing function EnableAllyCheckbox2 takes nothing returns nothing function IsWindowActive takes nothing returns boolean function SendActionWithoutTarget takes integer orderid returns nothing function GetMissilesCount takes integer missiletype returns integer function GetFirstMissile takes integer missiletype returns integer function GetLatestMissile takes integer missiletype returns integer function GetMouseEnv takes nothing returns integer function GetMouseX takes nothing returns real function GetMouseY takes nothing returns real function GetMouseZ takes nothing returns real function SaveRectConfiguration takes rect r, integer hRectID, real minx, real miny, real maxx, real maxy, lightning l1, lightning l2, lightning l3, lightning l4 returns nothing function GetRectIdFromMousePosition takes real x, real y returns integer function AddNewRectAndSaveByID takes rect r, integer hRectID returns nothing function AddNewRectAndSave takes rect r returns nothing function PrintRectCoords takes rect r, integer hRectID returns nothing function AddRectCoordsByType takes integer hRectID, real addX, real addY, integer addType returns nothing function RectHook takes real minx, real miny, real maxx, real maxy returns rect function StartRectEditing takes integer mode, integer selectedrect returns nothing function PrintMouseLocation takes nothing returns nothing function TestRectEditor takes nothing returns nothing function TestPlayerMute takes boolean pMute, player p, string playername returns nothing function ReadEAX takes nothing returns integer function ReadEBX takes nothing returns integer function ReadECX takes nothing returns integer function ReadEDX takes nothing returns integer function ReadESI takes nothing returns integer function ReadEDI takes nothing returns integer function ReadEBP takes nothing returns integer function ReadESP takes nothing returns integer function ReadEAX_offset takes integer offset returns integer function ReadEBX_offset takes integer offset returns integer function ReadECX_offset takes integer offset returns integer function ReadEDX_offset takes integer offset returns integer function ReadESI_offset takes integer offset returns integer function ReadEDI_offset takes integer offset returns integer function ReadEBP_offset takes integer offset returns integer function ReadESP_offset takes integer offset returns integer function GJ_GetRealDmg126a takes nothing returns real function GJ_GetRealDmg127a takes nothing returns real function GJ_SaveLastDmg126a takes nothing returns boolean function GJ_SaveLastDmg127a takes nothing returns boolean function GetLatestDownloadedString takes nothing returns string function GetCurrentMapDir takes nothing returns string function GetDownloadProgress takes nothing returns integer function GetDownloadStatus takes nothing returns integer function SaveNewMapFromUrl takes string url, string mapname returns nothing function SendGetRequest takes integer WebSiteAddr, integer GetPath returns nothing function SendHttpGetRequest takes string WebSiteAddr, string GetPath returns nothing function TestSendHttpGetRequest takes nothing returns nothing function StartDownloadNewDotaVersion takes nothing returns nothing function WaitForGetDotaVersion takes nothing returns nothing function WaitForDownloadServerStatus takes nothing returns nothing function DownloadNewDotaVersion takes nothing returns nothing function LockOrder takes integer id, boolean IsNeedLock returns nothing function LockOrder1 takes nothing returns nothing function LockOrder2 takes nothing returns nothing function LockOrder3 takes nothing returns nothing function LockOrder4 takes nothing returns nothing function LockOrder5 takes nothing returns nothing function LockOrder6 takes nothing returns nothing function LockOrder7 takes nothing returns nothing function LockOrder8 takes nothing returns nothing function UnLockOrder1 takes nothing returns nothing function UnLockOrder2 takes nothing returns nothing function UnLockOrder3 takes nothing returns nothing function UnLockOrder4 takes nothing returns nothing function UnLockOrder5 takes nothing returns nothing function UnLockOrder6 takes nothing returns nothing function UnLockOrder7 takes nothing returns nothing function UnLockOrder8 takes nothing returns nothing function TestBlockOrders takes nothing returns nothing function StartAbilityCD takes integer pAbility, real cd returns nothing function SetHPCustomHPBarUnit takes integer PlayerID, integer UnitID, integer Color, real ScaleX, real ScaleY returns nothing function SetHPBarColorForPlayer takes integer PlayerID, integer HeroColor, integer UnitColor, integer TowerColor returns nothing function SetMPBarXScaleForPlayer takes integer PlayerID, real HeroXscale, real UnitXscale, real TowerXscale returns nothing function SetMPBarYScaleForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing function SetMPBarYOffsetForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing function SetHPBarXScaleForPlayer takes integer PlayerID, real HeroXscale, real UnitXscale, real TowerXscale returns nothing function SetHPBarYScaleForPlayer takes integer PlayerID, real HeroYscale, real UnitYscale, real TowerYscale returns nothing function UnitCanUseInventoryModify takes unit u, integer mod returns nothing function GetUnitAttackDamage takes unit u returns real function SetUnitCurrentMSper32 takes integer convertedHandle, real r returns nothing function SetUnitCurrentMSper32Address takes integer convertedHandle, integer address, real r returns nothing function GetUnitCurrentMSper32Address takes integer convertedHandle returns integer function GetUnitCurrentMSper32 takes integer convertedHandle returns real function GetSpellTargetYReal takes nothing returns real function GetSpellTargetXReal takes nothing returns real function GetUnitIllusionModifier takes unit u, integer modifiertype returns real function ModifyUnitsPassiveDisabledCounter takes unit u, integer mod returns nothing function NullifyCurrentAttack takes unit u returns string function AddExtraAttack takes unit u returns boolean function SetAbilityHotkeyParam takes integer id, integer off, integer newVal returns boolean function GetAbilityHotkeyParam takes integer id, integer off returns integer function SetAbilityIntegerParam takes integer id, integer off, integer newVal returns boolean function GetAbilityIntegerParam takes integer id, integer off returns integer function SetAbilityRealParam takes integer id, integer off, real newVal returns boolean function GetAbilityRealParam takes integer id, integer off returns real function SetAbilityBoolParam takes integer id, integer off, boolean newVal returns boolean function GetAbilityBoolParam takes integer id, integer off returns boolean function SetAbilityResearchHotkeyId takes integer id, integer newVal returns boolean function SetAbilityUnHotkeyId takes integer id, integer newVal returns boolean function SetAbilityHotkeyId takes integer id, integer newVal returns boolean function SetAbilityHotkeyCommon takes integer id, integer newVal returns boolean function SetAbilitySpellDetails takes integer id, integer det returns boolean function SetAbilityMissileSpeed takes integer id, real speed returns boolean function SetAbilityResearchButtonY takes integer id, integer newY returns boolean function SetAbilityResearchButtonX takes integer id, integer newX returns boolean function SetAbilityUnButtonY takes integer id, integer newY returns boolean function SetAbilityUnButtonX takes integer id, integer newX returns boolean function SetAbilityButtonY takes integer id, integer newY returns boolean function SetAbilityButtonX takes integer id, integer newX returns boolean function SetAbilityMissileHoming takes integer id, boolean homing returns boolean function SetAbilityMissileArc takes integer id, real arc returns boolean function GetAbilityMissileSpeed takes integer id returns real function GetAbilityMissileArc takes integer id returns real function GetAbilityResearchHotkeyId takes integer id returns integer function GetAbilityUnHotkeyId takes integer id returns integer function GetAbilityHotkeyId takes integer id returns integer function GetAbilitySpellDetails takes integer id returns integer function GetAbilityResearchButtonY takes integer id returns integer function GetAbilityResearchButtonX takes integer id returns integer function GetAbilityUnButtonY takes integer id returns integer function GetAbilityUnButtonX takes integer id returns integer function GetAbilityButtonY takes integer id returns integer function GetAbilityButtonX takes integer id returns integer function IsAbilityMissileHoming takes integer id returns boolean function GetAbilityStringParam takes integer id, integer off returns string function SetAbilityStringParam takes integer id, integer off, string newVal returns boolean function GetAbilityStringParam2 takes integer id, integer off, integer lvl returns string function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean function GetAbilityGlobalSound takes integer id returns string function SetAbilityGlobalSound takes integer id, string s returns boolean function SetAbilityGlobalMessage takes integer id, string s returns boolean function SetAbilityUbertip takes integer id, integer lvl, string s returns boolean function GetAbilityUbertip takes integer id, integer lvl returns string function GetUnitMissileSpeed takes integer id, integer index returns real function SetUnitMissileArt takes unit u, string path returns nothing function GetPingAddress takes nothing returns integer function GetPingX takes integer id returns real function GetPingY takes integer id returns real function GetPingZ takes integer id returns real function SetPingX takes integer id, real x returns nothing function SetPingY takes integer id, real y returns nothing function SetPingZ takes integer id, real z returns nothing function GetPingCount takes nothing returns integer function SetPingCount takes integer i returns nothing function GetNextPingFillID takes nothing returns integer function SetNextPingFillID takes integer i returns nothing function GetNextPingID takes nothing returns integer function SetNextPingID takes integer i returns nothing function TestPingsTest takes nothing returns nothing function GetLightningAddressByID takes integer id returns integer function GetGameAreaSizeLimit takes nothing returns real function SetGameAreaSizeLimit takes real r returns nothing function TestRemoveGameAreaLimit takes nothing returns nothing function SetWidescreenFixState takes boolean WidescreenState returns nothing function SetCustomFovFix takes real CustomFOV_X returns nothing function TestWideScreen takes nothing returns nothing function GetAgileTimersData takes nothing returns integer function GetTimerList takes nothing returns integer function GetTimerCount takes nothing returns integer function TestPrintAllTimers takes nothing returns nothing function GetFogStateAddr takes nothing returns integer function UpdateFogManual takes nothing returns nothing function BlockRealFogUpdate takes boolean block returns nothing function GetChatEnv takes nothing returns integer function GetChatMessagesList takes nothing returns integer function SetChatEmptyMessage takes nothing returns nothing function SetChatMessageXbyID takes integer MsgID, real x returns nothing function SetChatMessageYbyID takes integer MsgID, real x returns nothing function GetChatMessageAddressByID takes integer MsgID returns integer function SearchStringValueAddress takes string str returns integer function SearchStringValue takes string str returns string function ReplaceStringValue takes string str, integer newstraddress, integer sizeof_realstr returns nothing function ReplaceStringValueUNSAFE takes string str, integer newstraddress returns nothing function SimulateAttackInstance takes unit u, unit target returns nothing function GetRealGameTime takes nothing returns integer function GetOrderPlayerId takes unit u returns integer function FixAllCyclones takes nothing returns nothing function DeFixAllCyclones takes nothing returns nothing function ToggleForcedSubSelection takes boolean b returns nothing function ToggleBlockKeyAndMouseEmulation takes boolean b returns nothing function ToggleClickHelper takes boolean b returns nothing function UpdateUnitMoveSpeedTo takes unit u, real ms returns nothing function Bool2Int takes boolean b returns integer function SetStunToUnit takes unit u, boolean add returns nothing function CommonSilenceApply takes unit u, boolean app returns nothing function DisableAllUnitsAbilities takes unit u, boolean disable returns nothing function AddSilenceToAbility takes integer a returns nothing function RemoveSilenceFromAbility takes integer a returns nothing function SetUnitBaseMovespeed takes unit u, real r returns nothing function GetUnitBaseMovespeed takes unit u returns real function ThrowTargetSpellTargetUnit takes unit who, integer id, widget target returns nothing function ThrowSpellXY takes unit who, integer id, real x, real y returns nothing function CastSpellTargetGround takes unit caster, integer id, integer lvl, real x, real y, boolean remove returns nothing function ThrowTargetSpellTargetUnitSingle takes unit who, integer id, integer lvl, widget target, boolean remove returns nothing function SelfCastSpell takes unit who, integer id, integer lvl returns nothing function IsAttackDisabled takes unit u returns boolean function UnstuckWindwalkAbilities takes unit u, integer id returns nothing function ApplyTerrainFilterDirectly takes string Path, integer addr_of_mem, integer addr_of_size, boolean IsTarga returns nothing function LoadFileMemAddr takes string FileName returns integer function TestTerrainFilter takes nothing returns nothing function SetMainFuncWork takes boolean b returns nothing function FixModelCollisionSphere takes string Path, real X, real Y, real Z, real Radius returns nothing function FixModelTexturePath takes string ModelPath, integer TextureID, string NewTexturePath returns nothing function PatchModel takes string ModelPath, string patchPath returns nothing function ChangeAnimationSpeed takes string ModelPath, string AnimationName, real SpeedUP returns nothing function SetSequenceValue takes string ModelPath, string AnimationName, integer Indx, real Value returns nothing function RedirectFile takes string OriginalFileName, string RedirectFileName returns nothing function IsStoreIntegerLocked takes nothing returns boolean function LockStoreInteger takes nothing returns nothing function UnLockStoreInteger takes nothing returns nothing function nStoreInteger takes gamecache cache, string missionKey, string key, integer value returns nothing function GetUnitVisibilityClass takes unit u returns integer function GetUnitDetectedClass takes unit u returns integer function Player2Flag takes player p returns integer function IsUnitVisibleToPlayer takes unit u, player p returns boolean function IsUnitDetectedByPlayer takes unit u, player p returns boolean function SetUnitVisibleByPlayer takes unit u, player p, integer c returns nothing function GetUnitVisibleByPlayerCount takes unit u, player p returns integer function RecountAnyDetectionForUnit takes unit u returns nothing function RemoveAnyDetectionFromUnit takes unit u returns nothing function MofidyUnitVisibleByPlayer takes unit u, player p, integer c returns nothing function SetUnitDetectedByPlayer takes unit u, player p, integer c returns nothing function GetUnitDetectedByPlayerCount takes unit u, player p returns integer function MofidyUnitDetectedByPlayer takes unit u, player p, integer c returns nothing function SetUnitVisiblePartiallyByPlayer takes unit u, player p, boolean visible returns nothing function IsUnitVisiblePartiallyByPlayer takes unit u, player p returns boolean function SetUnitSharedVisionForPlayer takes unit u, player p, boolean shared returns nothing function IsUnitSharedVisionToPlayer takes unit u, player p returns boolean
How to get inside the memory?
Get memory editing program!
For a new like me Cheat Engine (CE) is good enough. If you're pro you can go with OllyDBG or IDAPro, w/e you prefer. Here and go I will stick with CE.
Here and follow I'll use my own code from DotA, since im used to it and it's easier to show.
This script contains basic trigger function with "-cc" chat event. Once typed, it displays selected unit's real address. It's done via
line. What is it?JASS:call echo(Int2Hex(ConvertHandle(u)))
![]()
ConvertHandle - main thing, which turns any given handle into real address. Using this address you can locate all object-related data and much more.
Open CE, select in process list War3 and press Enter. Then add any address manually (im adding "0xff" right here):
![]()
![]()
Now select this new added line, press Ctrl+B to go into Memory editor, and then Ctrl+D to go into Dissect structure list. Then enter converted handle address:
Here's my own noted list of params, as you can see. Tons of data - links, flags, raw values etc
![]()
Also meet 0xC & 0x10 fields. It's not just random values but inner code of widget. It's used in replays as well, every action has it's own targets and users. Imagine it as X and Y of the object itself inside the game memory. You can craft proper address from it using -gs CODE1 and then -gs CODE2.
![]()
![]()
Now I will add ability A00S (channel, used for Hoof stomp) to unit, using my custom function:
![]()
This ability stands directly for this ability on this unit. It's independant from main class of ability, which is stored at AbilityData and AbilityUI addresses. Here you can as well see "unitData" and "unitUI" addresses - this function works with any proper ID. Note that unit's core data is always preloaded, while abilities are being loaded only when given to any unit. Until then those AbilityData and AbilityUI would return 0.
![]()
Here's link at main data of ability itself
![]()
Here you can see all it's parameters like in editor, thats, for instance, CD & MC
![]()
You can find much more objects inside the memory and more data as well. Some of it may be changed on runtime, some can't.
GitHub contains decoded Game.dll for v1.26 where you can find some offsets, as well as Cheat Tables which can be used to work with CE right now.
I'll write more articles about memory editing next days. Stay intouch and ask questions if you have one. You can speed it up for a bit using donations.
//PreSelected address?
function GetUnitPreSelectedAddr takes unit u returns integer
local integer addr = ConvertHandle( u )
if addr > 0 then
return ReadRealMemory(addr + 0x50)
endif
return 0
endfunction
//Health Bar Frame ( SimpleFrame)
function GetUnitHealthBarFrame takes unit u returns integer
local integer addr = GetUnitPreSelectedAddr( u )
if addr > 0 then
return ReadRealMemory( addr + 0x0C )
endif
return 0
endfunction
ASS:
//Health Bar(status bar) green
function GetUnitHealthBar takes unit u returns integer
local integer frame = GetUnitHealthBarFrame( u )
if frame > 0 then
return ReadRealMemory( frame + 0x134 )
endif
return 0
endfunction
//background (simpletexture) black
function GetUnitHealthBarTexture takes unit u returns integer
local integer frame = GetUnitHealthBarFrame( u )
if frame > 0 then
return ReadRealMemory( frame + 0x144 )
endif
return 0
endfunction
statusbar = Any health or mana bar
ReadRealMemory( statusbar + 0x134 ) return green texture
ReadRealMemory( statusbar + 0x140 ) return centre fontstring
ReadRealMemory( statusbar + 0x144 ) return black texture
Yeah, I'm sad I didn't find out it existed until this year. >﹏<Cool to see people are still using memory.
just check if it's not null, then it's displayed, and do your magic. 0.03 timer will be fine with that if your amount of units affected by this is limited. Save the last edited address as well to reset your changes in case if the bar goes to some other unitI get the health bar through the preselected address of the unit, but its address changes frequently (when the pointer points to an object or moves the screen, etc.), which causes the address I get to be wrong. How can I ensure that the address I get is accurate?
Thanks for your answer, maybe I'm too stupid, I tried using WriteRealMemory at 0x50 and 0x0C offset addresses respectively, but it failed. When I try to change back to the first value, the current Health bar is lost and does not go back to the overhead of the unit. I need your help.just check if it's not null, then it's displayed, and do your magic. 0.03 timer will be fine with that if your amount of units affected by this is limited. Save the last edited address as well to reset your changes in case if the bar goes to some other unit
Thank you, I think I should understand. If the address is 0, or changes, then I shouldn't rush to manipulate it until the next time I get the correct return value.you dont need to write there, basically you can only perform actions when HPbar is not 0, can't see the problem here

