Hello,
I’d like to open a discussion here regarding gwau3, with the goal of sharing observations and gathering feedback.
To be clear from the start: I currently have no intention of switching the hub to gwau3. That said, I’m very open to suggestions, ideas, and counter-arguments. If you think I’m missing something or disagree with my conclusions, please don’t hesitate to share your perspective here — this is meant to be a discussion.
While applying the fixes that Greg and Kleutschi made in gwau3 for Reforged to the hub, I noticed several patterns and ideas that could potentially be brought over, as well as others that I’d prefer not to adopt. I’ll try to outline both below.
My broader goal would be to move closer to gwau3 where it makes sense, especially for compatibility, easier fixes, and reusing good work, while still preserving the design choices of the hub.
Areas where I’m hesitant to follow gwau3’s approach
- AutoIt naming style (Hungarian notation)
gwau3 uses a Hungarian-style naming convention, for example:
$a_i_MaxRegions
The hub, on the other hand, follows a more Java-style, descriptive (semantic) naming convention, which I personally find much easier to read, understand, and reason about.
In my experience, Hungarian notation adds visual noise without providing much additional value, especially given modern screen resolutions and tooling. In most cases, a name like maximumRegions (or maxRegions) already conveys enough information, including the expected type.
This is ultimately a stylistic preference, but it’s one where I strongly favor the hub’s current approach.
- Direct memory access per field vs. structured reads
gwau3 frequently accesses structure fields directly by offset, for example:
Func Agent_GetAgentInfo($a_i_AgentID = -2, $a_s_Info = "")
Local $l_p_AgentPtr = Agent_GetAgentPtr($a_i_AgentID)
If $l_p_AgentPtr = 0 Or $a_s_Info = "" Then Return 0
Switch $a_s_Info
Case "vtable"
Return Memory_Read($l_p_AgentPtr, "ptr")
Case "h0004"
Return Memory_Read($l_p_AgentPtr + 0x4, "dword")
...
Compared to the hub’s approach:
Func GetAgentInfo($agentID, $field = "")
Local $agentStruct = DllStructCreate($agentStructTemplate)
Local $agentPtr = GetAgentPtr($agentID)
DllCall($kernelHandle, 'int', 'ReadProcessMemory', 'int', GetProcessHandle(), 'int', $agentPtr, 'ptr', DllStructGetPtr($agentStruct), 'int', DllStructGetSize($agentStruct), 'int', 0)
Return DllStructGetData($agentStruct, $field)
EndFunc
ReadProcessMemory is relatively expensive. If only a single field is needed, the per-field approach makes sense. However, as soon as multiple fields are accessed, reading the full structure once tends to perform significantly better.
From a maintenance standpoint, defining structures also centralizes offsets and makes updates easier when a structure layout changes. For these reasons, I personally disagree with the overall direction taken by gwau3 on this topic, even though there are valid use cases for both approaches.
- Interface split across many files and folders
I generally agree with the idea of splitting code into specialized files to keep things clear and focused. However, in my opinion, gwau3 takes this quite far, resulting in a structure that feels overly fragmented and harder to navigate.
This is again subjective, but I prefer a slightly more consolidated layout.
Things I would like to bring over
-
Analyzing the existing direct field accesses and using them to define proper structures
-
Porting certain functions that are present in gwau3 but missing from gwa2 / the hub
I’m very interested in hearing other opinions on this — especially from people who have worked extensively with this the hub or gwau3. My goal here isn’t to dismiss that work, but to figure out where alignment makes sense and where different design choices are preferable.
Hello,
I’d like to open a discussion here regarding gwau3, with the goal of sharing observations and gathering feedback.
To be clear from the start: I currently have no intention of switching the hub to gwau3. That said, I’m very open to suggestions, ideas, and counter-arguments. If you think I’m missing something or disagree with my conclusions, please don’t hesitate to share your perspective here — this is meant to be a discussion.
While applying the fixes that Greg and Kleutschi made in gwau3 for Reforged to the hub, I noticed several patterns and ideas that could potentially be brought over, as well as others that I’d prefer not to adopt. I’ll try to outline both below.
My broader goal would be to move closer to gwau3 where it makes sense, especially for compatibility, easier fixes, and reusing good work, while still preserving the design choices of the hub.
Areas where I’m hesitant to follow gwau3’s approach
gwau3 uses a Hungarian-style naming convention, for example:
$a_i_MaxRegionsThe hub, on the other hand, follows a more Java-style, descriptive (semantic) naming convention, which I personally find much easier to read, understand, and reason about.
In my experience, Hungarian notation adds visual noise without providing much additional value, especially given modern screen resolutions and tooling. In most cases, a name like maximumRegions (or maxRegions) already conveys enough information, including the expected type.
This is ultimately a stylistic preference, but it’s one where I strongly favor the hub’s current approach.
gwau3 frequently accesses structure fields directly by offset, for example:
Compared to the hub’s approach:
ReadProcessMemory is relatively expensive. If only a single field is needed, the per-field approach makes sense. However, as soon as multiple fields are accessed, reading the full structure once tends to perform significantly better.
From a maintenance standpoint, defining structures also centralizes offsets and makes updates easier when a structure layout changes. For these reasons, I personally disagree with the overall direction taken by gwau3 on this topic, even though there are valid use cases for both approaches.
I generally agree with the idea of splitting code into specialized files to keep things clear and focused. However, in my opinion, gwau3 takes this quite far, resulting in a structure that feels overly fragmented and harder to navigate.
This is again subjective, but I prefer a slightly more consolidated layout.
Things I would like to bring over
Analyzing the existing direct field accesses and using them to define proper structures
Porting certain functions that are present in gwau3 but missing from gwa2 / the hub
I’m very interested in hearing other opinions on this — especially from people who have worked extensively with this the hub or gwau3. My goal here isn’t to dismiss that work, but to figure out where alignment makes sense and where different design choices are preferable.