Nice hack![]()
Nice hack![]()
here is the code i wrote when i encountered the same issue yesterday...
that gives the center of the collision (interaction?) zone, there's also a radius setting that i plan to use to randomize my clicks. i now use the world position coordinates for range finding, and collision coordinates for all interacting, as the Z for larger actors is much more likely to fall within my Z range limit.Code:Public Function readActorPosCollision(theActor As Enigma.D3.Actor) As Array Dim theArray = {theActor.x0B8_CollisionX, theActor.x0BC_CollisionY, theActor.x0C0_CollisionZ} Return theArray End Function
it's a bit late, but i hope this helps..
With .NET code,
c# - get current mouse cursor type - Stack Overflow
I have since changed my code to actually get the cursor icon image.
Then do a quick compare with a "saved" icon to make sure its a "Grabbing hand".
This is a guaranteed success.
C# - Capturing the Mouse cursor image - Stack Overflow
Save a lot of "random" problems when sometimes the random coordinate points to a monster/wreakable, causing the handle to change.
Thanks!
I stumbled upon the same links and quickly tried it a while ago - was getting the same handle all the time. Will try once more. Are you also using an rendering overlay over your game graphics window? Not that this is interfering...
I know exactly what you are talking about. I often had problems with portals (mouse area is given by scene geometry) or "interactables" in town interfering with my pathfinding. :-( Also think it's a good solution for the problem.
Not using any overlays. The cursor handle will change whenever the cursor graphic changes. Set the cursor to your own character (or anywhere as long its not interacting with anything), then get the handle. Now start your random pointing until the cursor handle changes. Like I said, this method is not full proof compared to comparing the cursor icon image.
Hello Enigma,
First I want to thank you for taking the time to make this engine.
I'm using it in my own program called: 'd3stats'.
This program is still work in progress and will be used to track certain stats (total, avg/min, etc) over a nights playtime. I'm starting with experience, gold and leg drops. Also more importantly I'm tracking these stats also on a per rift basis. So now you can finally have a rift run history. I'll post a screenshot of it soon .
Unfortunately the project doesn't work anymore since yestardays patch. Do you have an update or eta when this patch will be supported?
Thanks again!
Hi Enigma,
wow...thanks for the fast update!
<dbl post> Sorry
Last edited by Amadain; 01-17-2015 at 03:46 PM.
Hey Enigma32, Thanks for the fast update!
I promised a screenshot of my work so far, so here it is!
Attachment 19969
And one after 1 hour of playing:
As you can see there is still a lot of work ahead of me.
I'm trying to get the following features working before next season:
- Avg /min of gold, Exp and Count of leg drops.
- Being able to have a history of runned rifts.
- A way of being able to display "Estimated Time till next level" ingame. (No research done yet or ideas on how to achieve this.)
I'm not interested in making this software public, just for myself and maybe some friends.
Today I spent the whole afternoon trying to read ExperienceTable.Gam and ExperiencTableAlt.gam to get the experience needed for each level. (Paragon and normal)
Unfortuantly I cannot make it work..
Tried the following code:
var ExpTable = SnoHelper.LoadFile<GameBalance>(FilePath).Content.x038_ExperienceTable.x08_Exper ienceLevels;
And it seems to be working, I get a array of 91 GameBalance.ExperienceLevel classes which are also filled.
But I cannot find out what Properties contain the information I'm needing. (Level and experience needed for that level)
I don't want to use a Dictionary filled with information of the internet because it will be outdated when changes are made by Blizzard.
Any help in discovering what Properties to use on GameBalance.ExperienceLevel would be very helpfull.
Also If u have the answer please try to explain to me how to discover this myself, What steps did you take to gain this information?
I want to learn it so I can do it myself someday.
Thanks!
Last edited by Amadain; 01-17-2015 at 04:53 PM.
Running the same piece of code gives me 100 items (last 30 seems a bit weird). I create a string with "CodeGeneratorHelper.GetDump" that I can paste into Excel. The first field keeps increasing so I assume this is the exp required. Since you get 91 rows I believe you're not applying all patches when loading the MPQs so you get old data.
A tip is to read it directly from the memory. If you wanna store the values, you can just add it to a hashset or dictionary.
Code:public static IEnumerable<T> GetContainer<T>(Enigma.D3.Enums.SnoGroupId id) where T : Enigma.D3.Sno.SerializeMemoryObject { return Enigma.D3.Sno.SnoHelper.Enumerate<T>(id); } public static void GetExperience() { foreach (GameBalance Container in GetContainer<GameBalance>(SnoGroupId.GameBalance)) foreach (GameBalance.ExperienceLevelAlt Experience in Container.x048_ExperienceTableAlt.x08_ExperienceLevelAlts) // Experience.x00 == Required XP , starts from 0-2000 }
Something to keep in mind, 2 containers have ExperienceTable populated, namely from "ExperienceTable.gam" and "ExperienceTablePvP.gam" (compared SNO ID from header against the files). Additional notes:
- Field x00C is the GameBalanceType
- Field x010 I'm quite sure is some kind of hash on the file name, but couldn't figure out exactly what (but pretty sure I did in the past..)
Yes, You are absolutly right! I had extracted an (unpatched) ExperienceTable.gam (Missed latest patch)! <Slaps forehead 10 times!>Running the same piece of code gives me 100 items (last 30 seems a bit weird). I create a string with "CodeGeneratorHelper.GetDump" that I can paste into Excel. The first field keeps increasing so I assume this is the exp required. Since you get 91 rows I believe you're not applying all patches when loading the MPQs so you get old data.There went 5 hours down the drain.
Luckily I was doing almost the same thing as you to discover the fields to use, so I was on the right track.
I was using .net Reflection to output all the properties on the class and paste them into excel to find values that kept increasing. (But because it was corrupt, I couldn't find any.)
But your GetDump method works better so I'll be using that from now on.
thanks for the help and super fast response!
Nice tip, but I want to read it before starting memory reading. I want to initialize multiple dictionaries on program startup and do some extra preparing / wrapping.A tip is to read it directly from the memory. If you wanna store the values, you can just add it to a hashset or dictionary.
Code:
public static IEnumerable<T> GetContainer<T>(Enigma.D3.Enums.SnoGroupId id) where T : Enigma.D3.Sno.SerializeMemoryObject
{
return Enigma.D3.Sno.SnoHelper.Enumerate<T>(id);
}
public static void GetExperience()
{
foreach (GameBalance Container in GetContainer<GameBalance>(SnoGroupId.GameBalance))
foreach (GameBalance.ExperienceLevelAlt Experience in Container.x048_ExperienceTableAlt.x08_ExperienceLevelAlts)
// Experience.x00 == Required XP , starts from 0-2000
}
But thank you for such a fast response.
<offtopic>
no comments on my program?joking offc.
![]()