39 Commits

Author SHA1 Message Date
Hash Borgir
c0f1e91e4a latest 2024-05-27 09:17:54 -06:00
Hash Borgir
cce65db976 item pick up not working 2024-05-19 16:59:20 -06:00
Hash Borgir
b4b85425aa close panel button fixed 2024-05-19 06:08:50 -06:00
Hash Borgir
6cc15930ca close window working, but closing stats too 2024-05-19 06:00:42 -06:00
Hash Borgir
106bef4f85 Extractor Panel Close button not working. 2024-05-18 10:32:15 -06:00
Hash Borgir
4d21c90f5a Latest fixes 2024-05-10 00:19:14 -06:00
Hash Borgir
058db50095 Added 250ms delay to sendPacketAndUpdateProperty 2024-05-09 09:13:42 -06:00
Hash Borgir
43defeb6d8 page 99 problem fixed, need to clean code 2024-05-08 18:55:59 -06:00
Hash Borgir
dc76f5627b r01 not extracting. 2024-05-08 17:56:23 -06:00
Hash Borgir
d75e045bc7 custom panel stat display 2024-05-07 17:44:20 -06:00
Hash Borgir
e431b3f7d4 extract item stat fix 2024-05-07 13:58:58 -06:00
Hash Borgir
551f3e44f2 HP/Mana storage working 2024-05-07 08:31:54 -06:00
Hash Borgir
41a4c4d181 Code optimization, reduce repetitive code. 2024-05-07 05:31:18 -06:00
Hash Borgir
9719a540df Clean up 2024-05-06 23:45:45 -06:00
Hash Borgir
408aee62c1 Rejuv potiuons added to extractor 2024-05-06 23:00:55 -06:00
Hash Borgir
a61dce8f03 Extractor GUI done. Working... 2024-05-06 19:50:37 -06:00
Hash Borgir
5f220fa23e Working 2024-05-06 03:01:27 -06:00
Hash Borgir
4e02101d5d broken 2024-05-06 00:57:34 -06:00
Hash Borgir
ee810d5f38 Before gem implementation 2024-05-05 23:27:15 -06:00
Hash Borgir
343fa4253b Rune functions done. 2024-05-05 21:34:17 -06:00
Hash Borgir
331d1d75fe Extraction working 2024-05-05 20:39:25 -06:00
Hash Borgir
95f7d9bed3 Bag crashes upon hover. Need to debug. 2024-05-05 18:08:33 -06:00
Hash Borgir
3a7be104d9 Latest stable. 2024-05-05 10:41:26 -06:00
Hash Borgir
6141cc0a7b added transmorify wrapper 2024-05-04 12:06:59 -06:00
Hash Borgir
9e57031fdd cleanup 2024-05-04 12:05:34 -06:00
Hash Borgir
69965f77d1 Cleanup and fix itemtypes checks 2024-05-04 02:10:56 -06:00
Hash Borgir
aec114d05c Refactor/cleanup, had too many if conditions 2024-05-04 01:57:45 -06:00
Hash Borgir
06c28f4d56 Everything ini configurable 2024-05-03 07:34:36 -06:00
Hash Borgir
7fd617abd7 Stats display refactor using ini file done. 2024-05-02 21:43:43 -06:00
Hash Borgir
f8349e6ba1 close remtoe stash works 2024-05-01 13:42:06 -06:00
Hash Borgir
d33c619372 Cube opening works 2024-04-30 23:24:36 -06:00
Hash Borgir
56a49ff1e0 added more item types and codes to right click to send to cube 2024-04-29 12:23:23 -06:00
Hash Borgir
4d8fe9b2e2 Seems to be working 2024-04-29 04:58:24 -06:00
Hash Borgir
8f5c45d1c5 Gems not going back to inv, runes do. May need to revert 2024-04-29 04:53:56 -06:00
Hash Borgir
b5587695e8 Right click moving gems to cube and back is working. 2024-04-29 04:16:36 -06:00
Hash Borgir
27d93fa91e Latest 2024-04-29 02:48:40 -06:00
Hash Borgir
78fcd692b2 saving added gems to .boh file working 2024-04-28 14:15:06 -06:00
Hash Borgir
87d4758efc key local var? 2024-04-28 12:16:04 -06:00
Hash Borgir
74f1d9de01 Working on right click gem extraction 2024-04-28 12:09:32 -06:00
186 changed files with 7287 additions and 2321 deletions

2
ClassDiagram.cd Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<ClassDiagram />

BIN
D2tweaks.aps Normal file

Binary file not shown.

View File

@@ -47,12 +47,12 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\..\Diablo II\MODS\ironman-dev</OutDir>
<OutDir>..\..\Diablo II\MODS\ironman-dev\</OutDir>
<IntDir>$(SolutionDir)Build\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\..\Diablo II\MODS\ironman-dev</OutDir>
<OutDir>..\..\Diablo II\MODS\ironman-dev\</OutDir>
<IntDir>$(SolutionDir)Build\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -180,6 +180,7 @@
<ClCompile Include="vendor\minhook\src\trampoline.c" />
</ItemGroup>
<ItemGroup>
<None Include="ClassDiagram.cd" />
<None Include="vendor\minhook\dll_resources\MinHook.def" />
</ItemGroup>
<ItemGroup>
@@ -279,6 +280,7 @@
<ClInclude Include="include\diablo2\utils\screen.h" />
<ClInclude Include="include\fw\pool.h" />
<ClInclude Include="include\fw\singleton.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="vendor\D2Template\D2Template.h" />
<ClInclude Include="vendor\D2Template\D2TemplateConstants.h" />
<ClInclude Include="vendor\D2Template\D2TemplateDataTables.h" />

View File

@@ -0,0 +1,77 @@
d:\vscode\d2tweaks-rnd2k\build\debug\src\common\asm_code.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\common\hooking.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2win.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2gfx.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2common.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2lang.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2game.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2net.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\controls\checkbox.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\controls\image.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\controls\label.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\controls\button.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\loot_filter\loot_filter.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\loot_filter\loot_filter_settings_toggle_menu.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\loot_filter\loot_filter_settings_menu.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\common\string_utils.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\common\config.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\common\ini.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vc143.pdb
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\client_module.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\small_patches\small_patches.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\common\common.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\common\asset_manager.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\server_module.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\controls\group.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\menu.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\ui\ui_manager.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2launch.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\fog.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\storm.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\d2cmp.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\utils\mpq_ifstream.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\diablo2\utils\screen.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\main.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\d2template\d2template.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\dllnotify\dllnotify.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\minhook\src\buffer.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\minhook\src\hook.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\minhook\src\trampoline.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\minhook\src\hde\hde32.obj
d:\vscode\d2tweaks-rnd2k\build\debug\vendor\minhook\src\hde\hde64.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\autosort\autosort_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\auto_gold_pickup\auto_gold_pickup_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\auto_item_pickup\auto_item_pickup_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\damage_display\damage_display_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\item_drop_message\item_drop_message_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\item_move\item_move_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\loot_filter\loot_filter_settings.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\test\test.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\trader_update\trader_update_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\client\modules\transmute\transmute_client.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\autosort\autosort_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\auto_gold_pickup\auto_gold_pickup_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\auto_item_pickup\auto_item_pickup_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\damage_display\damage_display_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\identify_on_pickup\identify_on_pickup_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\item_drop_message\item_drop_message_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\item_move\item_move_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\test\test.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\trader_update\trader_update_server.obj
d:\vscode\d2tweaks-rnd2k\build\debug\src\d2tweaks\server\modules\transmute\transmute_server.obj
d:\diablo ii\mods\ironman-dev\d2tweaks.dll
d:\diablo ii\mods\ironman-dev\d2tweaks.pdb
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.ilk
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.pdb
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.vcxproj.filelistabsolute.txt
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\cl.command.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\cl.items.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\cl.read.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\cl.write.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\link.command.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\link.read.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\link.secondary.1.tlog
d:\vscode\d2tweaks-rnd2k\build\debug\d2tweaks.tlog\link.write.1.tlog

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,4 @@
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(517,5): warning MSB8004: Output Directory does not end with a trailing slash. This build instance will add the slash as it is required to allow proper evaluation of the Output Directory.
ui_manager.cpp
 autosort_client.cpp
D:\VSCode\d2tweaks-rnd2k\src\d2tweaks\client\modules\autosort\autosort_client.cpp(197,15): warning C4018: '<': signed/unsigned mismatch
D:\VSCode\d2tweaks-rnd2k\src\d2tweaks\client\modules\autosort\autosort_client.cpp(197,66): warning C4018: '<=': signed/unsigned mismatch
D2tweaks.vcxproj -> D:\Diablo II\MODS\ironman-dev\D2tweaks.dll

Binary file not shown.

View File

@@ -1,2 +1 @@
D:\VSCode\D2tweaks_src_17.04.2024\Build\Debug\D2tweaks.dll
D:\VSCode\d2tweaks-rnd2k\Build\Debug\D2tweaks.dll

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}

View File

@@ -42,7 +42,7 @@
// If MFC is linked, we will use CStringArray for great convenience
#ifdef __AFXWIN_H__
#include <afxtempl.h>
#include <afxtempl.h>
#endif
// Number bases
@@ -59,7 +59,7 @@
// string, the 2nd parameter is a 32-bit user defined data, this parameter can
// be NULL. The parsing will terminate if this function returns zero. To use
// the callback, function pointer needs to be passed to "CIni::ParseDNTString".
typedef BOOL (CALLBACK *SUBSTRPROC)(LPCTSTR, LPVOID);
typedef BOOL(CALLBACK* SUBSTRPROC)(LPCTSTR, LPVOID);
class CIni
{

View File

@@ -13,20 +13,17 @@
struct StatEntry {
std::wstring stat_display_string;
diablo2::ui_color_t colorStat, colorStatValue;
int x1, y1, x2, y2, is_item_stat, item_type_id, stat = 0; // x1,y1 stat_display_string | x2,y2 statValue
int x1, y1, x2, y2, is_item_stat, item_type_id, stat, op, param = 0; // x1,y1 stat_display_string | x2,y2 statValue
};
extern std::vector<StatEntry> globalStatsVector; // Declaration of the global variable
extern diablo2::structures::gfxdata g_gfxdata; // global gfxdata
extern int randStat;
extern int randStatRangeLow;
extern int randStatRangeHigh;
extern int randStatBool;
extern bool m_stats_enabled;
extern bool m_help_enabled;
extern bool m_cube_enabled;
extern bool m_stash_enabled;
namespace diablo2 {
namespace structures {

View File

@@ -15,9 +15,111 @@ namespace d2_tweaks {
bool show_runes;
bool show_gems;
bool m_show_r01;
bool m_show_r02;
bool m_show_r03;
bool m_show_r04;
bool m_show_r05;
bool m_show_r06;
bool m_show_r07;
bool m_show_r08;
bool m_show_r09;
bool m_show_r10;
bool m_show_r11;
bool m_show_r12;
bool m_show_r13;
bool m_show_r14;
bool m_show_r15;
bool m_show_r16;
bool m_show_r17;
bool m_show_r18;
bool m_show_r19;
bool m_show_r20;
bool m_show_r21;
bool m_show_r22;
bool m_show_r23;
bool m_show_r24;
bool m_show_r25;
bool m_show_r26;
bool m_show_r27;
bool m_show_r28;
bool m_show_r29;
bool m_show_r30;
bool m_show_r31;
bool m_show_r32;
bool m_show_r33;
bool m_show_amethyst;
bool m_show_diamond;
bool m_show_emerald;
bool m_show_ruby;
bool m_show_sapphire;
bool m_show_skull;
bool m_show_topaz;
bool m_show_chipped;
bool m_show_flawed;
bool m_show_normal;
bool m_show_flawless;
bool m_show_perfect;
bool m_show_rough;
bool m_show_faded;
bool m_show_blemished;
bool m_show_cleaned;
bool m_show_triangle;
bool m_show_trangle_cut;
bool m_show_square;
bool m_show_square_cut;
bool m_show_regular;
bool m_show_regular_cut;
bool m_show_star;
bool m_show_star_cut;
bool m_show_imperial;
bool m_show_imperial_cut;
bool m_show_royal;
bool m_show_royal_cut;
bool m_show_spectacular;
bool m_show_legendary;
bool m_show_legendary_cut;
bool m_show_flourite;
bool m_show_jade;
bool m_show_argonite;
bool m_show_azurite;
bool m_show_sulpher;
bool m_show_quartz;
bool m_show_tiger_eye;
bool m_show_rejuv_potion;
bool m_show_full_rejuv_potion;
bool m_show_hp1;
bool m_show_hp2;
bool m_show_hp3;
bool m_show_hp4;
bool m_show_hp5;
bool m_show_mp1;
bool m_show_mp2;
bool m_show_mp3;
bool m_show_mp4;
bool m_show_mp5;
bool m_show_frp;
bool m_show_mrp;
bool m_show_prp;
bool m_show_crp;
bool m_show_lrp;
bool m_show_vps;
bool m_show_yps;
bool m_show_wms;
bool m_show_close;
bool quality_settings[static_cast<size_t>(diablo2::structures::item_quality_t::ITEM_QUALITY_COUNT)];
char reserved[1004];
char reserved[888];
static loot_filter_settings& get();

View File

@@ -4,6 +4,9 @@
#include <d2tweaks/ui/menu.h>
#include <chrono> // Add this line
#include <diablo2/d2common.h>
namespace diablo2 {
namespace structures {
struct unit;
@@ -26,6 +29,108 @@ namespace d2_tweaks {
ui::controls::checkbox* m_show_runes;
ui::controls::checkbox* m_show_gems;
ui::controls::checkbox* m_show_ruby;
ui::controls::checkbox* m_show_sapphire;
ui::controls::checkbox* m_show_emerald;
ui::controls::checkbox* m_show_diamond;
ui::controls::checkbox* m_show_topaz;
ui::controls::checkbox* m_show_amethyst;
ui::controls::checkbox* m_show_skull;
ui::controls::checkbox* m_show_r01;
ui::controls::checkbox* m_show_r02;
ui::controls::checkbox* m_show_r03;
ui::controls::checkbox* m_show_r04;
ui::controls::checkbox* m_show_r05;
ui::controls::checkbox* m_show_r06;
ui::controls::checkbox* m_show_r07;
ui::controls::checkbox* m_show_r08;
ui::controls::checkbox* m_show_r09;
ui::controls::checkbox* m_show_r10;
ui::controls::checkbox* m_show_r11;
ui::controls::checkbox* m_show_r12;
ui::controls::checkbox* m_show_r13;
ui::controls::checkbox* m_show_r14;
ui::controls::checkbox* m_show_r15;
ui::controls::checkbox* m_show_r16;
ui::controls::checkbox* m_show_r17;
ui::controls::checkbox* m_show_r18;
ui::controls::checkbox* m_show_r19;
ui::controls::checkbox* m_show_r20;
ui::controls::checkbox* m_show_r21;
ui::controls::checkbox* m_show_r22;
ui::controls::checkbox* m_show_r23;
ui::controls::checkbox* m_show_r24;
ui::controls::checkbox* m_show_r25;
ui::controls::checkbox* m_show_r26;
ui::controls::checkbox* m_show_r27;
ui::controls::checkbox* m_show_r28;
ui::controls::checkbox* m_show_r29;
ui::controls::checkbox* m_show_r30;
ui::controls::checkbox* m_show_r31;
ui::controls::checkbox* m_show_r32;
ui::controls::checkbox* m_show_r33;
ui::controls::checkbox* m_show_chipped;
ui::controls::checkbox* m_show_flawed;
ui::controls::checkbox* m_show_normal;
ui::controls::checkbox* m_show_flawless;
ui::controls::checkbox* m_show_perfect;
ui::controls::checkbox* m_show_flourite;
ui::controls::checkbox* m_show_jade;
ui::controls::checkbox* m_show_argonite;
ui::controls::checkbox* m_show_azurite;
ui::controls::checkbox* m_show_sulpher;
ui::controls::checkbox* m_show_quartz;
ui::controls::checkbox* m_show_tiger_eye;
ui::controls::checkbox* m_show_rough;
ui::controls::checkbox* m_show_faded;
ui::controls::checkbox* m_show_blemished;
ui::controls::checkbox* m_show_cleaned;
ui::controls::checkbox* m_show_triangle;
ui::controls::checkbox* m_show_trangle_cut;
ui::controls::checkbox* m_show_square;
ui::controls::checkbox* m_show_square_cut;
ui::controls::checkbox* m_show_regular;
ui::controls::checkbox* m_show_regular_cut;
ui::controls::checkbox* m_show_star;
ui::controls::checkbox* m_show_star_cut;
ui::controls::checkbox* m_show_imperial;
ui::controls::checkbox* m_show_imperial_cut;
ui::controls::checkbox* m_show_royal;
ui::controls::checkbox* m_show_royal_cut;
ui::controls::checkbox* m_show_spectacular;
ui::controls::checkbox* m_show_legendary;
ui::controls::checkbox* m_show_legendary_cut;
ui::controls::checkbox* m_show_rejuv_potion;
ui::controls::checkbox* m_show_full_rejuv_potion;
ui::controls::checkbox* m_show_hp1;
ui::controls::checkbox* m_show_hp2;
ui::controls::checkbox* m_show_hp3;
ui::controls::checkbox* m_show_hp4;
ui::controls::checkbox* m_show_hp5;
ui::controls::checkbox* m_show_mp1;
ui::controls::checkbox* m_show_mp2;
ui::controls::checkbox* m_show_mp3;
ui::controls::checkbox* m_show_mp4;
ui::controls::checkbox* m_show_mp5;
ui::controls::checkbox* m_show_frp;
ui::controls::checkbox* m_show_mrp;
ui::controls::checkbox* m_show_prp;
ui::controls::checkbox* m_show_crp;
ui::controls::checkbox* m_show_lrp;
ui::controls::checkbox* m_show_vps;
ui::controls::checkbox* m_show_yps;
ui::controls::checkbox* m_show_wms;
ui::controls::checkbox* m_close;
void(__fastcall* m_draw_dropped_items_names_original)(void*, void*);
void(__fastcall* m_handle_dropped_items_original)(void*, void*);
public:
@@ -34,11 +139,118 @@ namespace d2_tweaks {
void reload_settings();
void draw() override;
private:
std::string m_selected_gem;
std::chrono::steady_clock::time_point m_last_packet_sent;
void gem_checkbox_clicked(const std::string& gem);
void stone_checkbox_clicked(const std::string& gem);
void register_misc_checkboxes();
void register_quality_checkboxes();
void update_alt_only(bool value);
void extract_item(bool value, int prop, uint32_t val, uint32_t rune, diablo2::unit_stats_t stat);
void extract_r01(bool value);
void extract_r02(bool value);
void extract_r03(bool value);
void extract_r04(bool value);
void extract_r05(bool value);
void extract_r06(bool value);
void extract_r07(bool value);
void extract_r08(bool value);
void extract_r09(bool value);
void extract_r10(bool value);
void extract_r11(bool value);
void extract_r12(bool value);
void extract_r13(bool value);
void extract_r14(bool value);
void extract_r15(bool value);
void extract_r16(bool value);
void extract_r17(bool value);
void extract_r18(bool value);
void extract_r19(bool value);
void extract_r20(bool value);
void extract_r21(bool value);
void extract_r22(bool value);
void extract_r23(bool value);
void extract_r24(bool value);
void extract_r25(bool value);
void extract_r26(bool value);
void extract_r27(bool value);
void extract_r28(bool value);
void extract_r29(bool value);
void extract_r30(bool value);
void extract_r31(bool value);
void extract_r32(bool value);
void extract_r33(bool value);
void extract_chipped(bool value);
void extract_flawed(bool value);
void extract_normal(bool value);
void extract_flawless(bool value);
void extract_perfect(bool value);
void extract_rough(bool value);
void extract_faded(bool value);
void extract_blemished(bool value);
void extract_cleaned(bool value);
void extract_triangle(bool value);
void extract_trangle_cut(bool value);
void extract_square(bool value);
void extract_square_cut(bool value);
void extract_regular(bool value);
void extract_regular_cut(bool value);
void extract_star(bool value);
void extract_star_cut(bool value);
void extract_imperial(bool value);
void extract_imperial_cut(bool value);
void extract_royal(bool value);
void extract_royal_cut(bool value);
void extract_spectacular(bool value);
void extract_legendary(bool value);
void extract_legendary_cut(bool value);
void extract_rejuv_potion(bool value);
void extract_full_rejuv_potion(bool value);
void extract_hp1(bool value);
void extract_hp2(bool value);
void extract_hp3(bool value);
void extract_hp4(bool value);
void extract_hp5(bool value);
void extract_mp1(bool value);
void extract_mp2(bool value);
void extract_mp3(bool value);
void extract_mp4(bool value);
void extract_mp5(bool value);
void extract_frp(bool value);
void extract_mrp(bool value);
void extract_prp(bool value);
void extract_crp(bool value);
void extract_lrp(bool value);
void extract_vps(bool value);
void extract_yps(bool value);
void extract_wms(bool value);
void close_window(bool value);
//void extract_flourite(bool value);
//void extract_jade(bool value);
//void extract_argonite(bool value);
//void extract_azurite(bool value);
//void extract_sulpher(bool value);
//void extract_quartz(bool value);
//void extract_tiger_eye(bool value);
void update_show_gold(bool value);
void update_show_runes(bool value);
void update_show_gems(bool value);
@@ -61,7 +273,6 @@ namespace d2_tweaks {
//handle hovering over item and actual click
static void __fastcall handle_dropped_items(diablo2::structures::unit* unit, void* edx);
};
}
}
}

View File

@@ -17,14 +17,34 @@ namespace d2_tweaks {
class loot_filter_settings_toggle_menu final : public ui::menu, singleton<loot_filter_settings_toggle_menu> {
ui::controls::button* m_toggle_filter_settings_btn;
ui::controls::button* m_btn_toggle_stats;
menu* m_filter_settings_menu;
bool m_show;
ui::controls::button* m_btn_toggle_help;
ui::controls::button* m_btn_toggle_cube;
ui::controls::button* m_btn_toggle_stash;
ui::controls::button* m_btn_toggle_bag;
public:
menu* m_filter_settings_menu;
menu* m_menu;
bool m_show;
bool m_show_bag;
explicit loot_filter_settings_toggle_menu(token);
void toggle_show() {
m_show = !m_show;
set_enabled(m_show);
set_visible(m_show);
}
void toggle_filter_settings_click();
void toggle_stats_settings_click();
void toggle_help_click();
void toggle_cube_click();
void toggle_stash_click();
void toggle_bag_click();
void draw() override;
bool key_event(uint32_t key, bool up) override;

View File

@@ -201,6 +201,7 @@ namespace d2_tweaks {
MESSAGE_TYPE_ITEM_DROPPED_INFO,
MESSAGE_TYPE_TRANSMUTE,
MESSAGE_TYPE_TRADER_UPDATE,
MESSAGE_TYPE_INTERACT = 1,
MESSAGE_TYPE_COUNT
};
@@ -235,11 +236,19 @@ namespace d2_tweaks {
struct item_move_cs : packet_header {
uint32_t item_guid;
const char* item_code;
uint8_t target_page;
uint32_t bag_guid = 0;
bool updateBag;
bool removeFromBag;
bool summon;
int prop;
int val;
int tmog;
int x;
int y;
bool extract;
uint32_t iCode;
item_move_cs() : item_guid(0), target_page(0) {
message_type = MESSAGE_TYPE_ITEM_MOVE;
@@ -270,7 +279,6 @@ namespace d2_tweaks {
}
};
struct inventory_sort_sc : packet_header {
uint8_t page;
uint8_t tx;
@@ -296,11 +304,19 @@ namespace d2_tweaks {
damage_type_t damage_type;
uint32_t damage;
uint32_t currentHp; // New field for current hit points
uint32_t maxHp; // New field for maximum hit points
damage_info_sc() : unit_type(0), guid(0), damage_type(DAMAGE_TYPE_UNKNOWN), damage(0), currentHp(0), maxHp(0) {
// You can add these details to the packet if needed
// packet.isChampion = isChampion;
// packet.isUnique = isUnique;
// packet.isSuperUnique = isSuperUnique
bool isChampion;
bool isUnique;
bool isSuperUnique;
damage_info_sc() : unit_type(0), guid(0), damage_type(DAMAGE_TYPE_UNKNOWN), damage(0), currentHp(0), maxHp(0), isChampion(0), isUnique(0), isSuperUnique(0) {
message_type = MESSAGE_TYPE_DAMAGE_INFO;
}
};

View File

@@ -112,6 +112,8 @@ namespace d2_tweaks {
virtual void left_mouse(int32_t offsetX, int32_t offsetY, bool up, bool& block) = 0;
virtual void right_mouse(int32_t offsetX, int32_t offsetY, bool up, bool& block) = 0;
virtual void middle_mouse(int32_t offsetX, int32_t offsetY, bool up, bool& block) {}
virtual void mouse_wheel(int32_t offsetX, int32_t offsetY, bool up, bool& block) {}
virtual void key_event(int32_t offsetX, int32_t offsetY, uint32_t key, bool up, bool& block) = 0;
};

View File

@@ -9,7 +9,6 @@
namespace d2_tweaks {
namespace ui {
namespace controls {
class label : public control {
std::wstring m_text;
bool m_text_owned;
@@ -31,7 +30,6 @@ namespace d2_tweaks {
return m_text;
}
diablo2::ui_color_t get_color() const {
return m_color;
}

View File

@@ -81,6 +81,8 @@ namespace d2_tweaks {
virtual bool left_mouse(bool up);
virtual bool right_mouse(bool up);
virtual bool middle_mouse(bool up);
virtual bool mouse_wheel(bool up);
virtual bool key_event(uint32_t key, bool up);
};

View File

@@ -32,6 +32,8 @@ namespace d2_tweaks {
bool process_left_mouse(bool up);
bool process_right_mouse(bool up);
bool process_middle_mouse(bool up);
bool process_mouse_wheel(bool up);
bool process_key_event(uint32_t key, bool up);
};

View File

@@ -59,7 +59,6 @@ namespace diablo2 {
static bool get_ui_window_state(ui_window_t window);
static void* get_buysellbtn();
static void play_sound(uint32_t soundId, structures::unit* u, uint32_t ticks, BOOL prePick, uint32_t cache);
static structures::unit* get_unit_by_guid(int32_t type, int32_t guid);
@@ -86,5 +85,9 @@ namespace diablo2 {
static bool is_gamble_open();
static uint8_t current_interact_menu();
static void resync_vendor_inventory(structures::unit* ptNPC);
static int32_t send_to_server_9(BYTE type, DWORD num, DWORD unk1);
static void set_ui_toggle(int nToggle, int nUIState, BOOL bToggle);
};
}

View File

@@ -75,13 +75,9 @@
//
//extern DataTables* sgptDataTables;
struct D2PropertyStrc
{
int32_t nProperty; //0x00
int32_t nLayer; //0x04
int32_t nMin; //0x08
int32_t nMax; //0x0C
};
namespace diablo2 {
namespace structures {
@@ -92,6 +88,88 @@ namespace diablo2 {
struct items_line;
struct item_types_line;
struct D2PropertyStrc
{
int32_t nProperty; //0x00
int32_t nLayer; //0x04
int32_t nMin; //0x08
int32_t nMax; //0x0C
};
struct D2RunesTxt
{
char szName[64]; //0x00
char szRuneName[64]; //0x40
uint8_t nComplete; //0x80
uint8_t nServer; //0x81
uint16_t wStringId; //0x82
uint16_t pad0x84; //0x84
uint16_t wIType[6]; //0x86
uint16_t wEType[3]; //0x92
int32_t nRune[6]; //0x98
D2PropertyStrc pProperties[7]; //0xB0
};
struct D2OpStatDataStrc
{
uint16_t nOpBase; //0x00
uint16_t nStat; //0x02
uint8_t nOp; //0x04
uint8_t nOpParam; //0x05
};
struct D2ItemStatCostTxt
{
uint16_t wStatId; //0x00
uint16_t pad0x02; //0x02
uint32_t dwItemStatFlags; //0x04
uint8_t nSendBits; //0x08
uint8_t nSendParamBits; //0x09
uint8_t nCsvBits; //0x0A
uint8_t nCsvParam; //0x0B
uint32_t dwDivide; //0x0C
uint32_t dwMultiply; //0x10
uint32_t dwAdd; //0x14
uint8_t nValShift; //0x18
uint8_t nSaveBits; //0x19
uint8_t n09SaveBits; //0x1A
uint8_t pad0x1B; //0x1B
uint32_t dwSaveAdd; //0x1C
uint32_t dw09SaveAdd; //0x20
uint32_t dwSaveParamBits; //0x24
uint32_t dw09SaveParamBits; //0x28
int32_t dwMinAccr; //0x2C
uint8_t nEncode; //0x30
uint8_t pad0x31; //0x31
uint16_t wMaxStat; //0x32
int16_t nDescPriority; //0x34
uint8_t nDescFunc; //0x36
uint8_t nDescVal; //0x37
uint16_t wDescStrPos; //0x38
uint16_t wDescStrNeg; //0x3A
uint16_t wDescStr2; //0x3C
uint16_t wDescGrp; //0x3E
uint8_t nDescGrpFunc; //0x40
uint8_t nDescGrpVal; //0x41
uint16_t wDescGrpStrPos; //0x42
uint16_t wDescGrpStrNeg; //0x44
uint16_t wDescGrpStr2; //0x46
int16_t wItemEvent[2]; //0x48
uint16_t wItemEventFunc[2]; //0x4C
uint8_t nKeepZero; //0x50
uint8_t bIsBaseOfOtherStatOp; //0x51
uint8_t bHasOpStatData; //0x52
uint8_t bHasOpApplyingToItem; //0x53
uint8_t nOp; //0x54
uint8_t nOpParam; //0x55
uint16_t wOpBase; //0x56
uint16_t wOpStat[3]; //0x58
uint16_t unk0x5E[64]; //0x5E - also related to op stats (see DATATBLS_LoadItemStatCostTxt)
D2OpStatDataStrc pOpStatData[16]; //0xDE
uint16_t pad0x13E; //0x13E
uint32_t dwStuff; //0x140
};
}
enum unit_stats_t {
@@ -297,10 +375,10 @@ namespace diablo2 {
UNIT_STAT_ITEM_SKILLONLEVELUP = 0xC7,
UNIT_STAT_UNUSED200 = 0xC8,
UNIT_STAT_ITEM_SKILLONGETHIT = 0xC9,
UNIT_STAT_UNUSED202 = 0xCA,
UNIT_STAT_UNUSED203 = 0xCB,
UNIT_STAT_ITEM_CHARGED_SKILL = 0xCC,
UNIT_STAT_UNUSED204 = 0xCD,
UNIT_STAT_is_champion = 0xCA, // 202
UNIT_STAT_is_unique = 0xCB, // 203
UNIT_STAT_ITEM_CHARGED_SKILL = 0xCC, // 204
UNIT_STAT_is_super_unique = 0xCD, // 205
UNIT_STAT_UNUSED205 = 0xCE,
UNIT_STAT_UNUSED206 = 0xCF,
UNIT_STAT_UNUSED207 = 0xD0,
@@ -397,7 +475,6 @@ namespace diablo2 {
UNIT_STAT_ITEM_TOHIT_UNDEAD_BYTIME = 0x12B,
UNIT_STAT_ITEM_CRUSHINGBLOW_BYTIME = 0x12C,
// unit_stats_t from Ironman mod
UNIT_STAT_strength = 0,
@@ -884,19 +961,19 @@ namespace diablo2 {
UNIT_STAT_UNUSED_65 = 481,
UNIT_STAT_UNUSED_66 = 482,
UNIT_STAT_UNUSED_67 = 483,
UNIT_STAT_UNUSED_68 = 484,
UNIT_STAT_UNUSED_69 = 485,
UNIT_STAT_UNUSED_70 = 486,
UNIT_STAT_UNUSED_71 = 487,
UNIT_STAT_UNUSED_72 = 488,
UNIT_STAT_UNUSED_73 = 489,
UNIT_STAT_UNUSED_74 = 490,
UNIT_STAT_UNUSED_75 = 491,
UNIT_STAT_UNUSED_76 = 492,
UNIT_STAT_UNUSED_77 = 493,
UNIT_STAT_UNUSED_78 = 494,
UNIT_STAT_UNUSED_79 = 495,
UNIT_STAT_UNUSED_80 = 496,
UNIT_STAT_gembag_PotionsHP = 484,
UNIT_STAT_gembag_PotionsMana = 485,
UNIT_STAT_gembag_Potions = 486,
UNIT_STAT_gembag_Stones_Flourite = 487,
UNIT_STAT_gembag_Stones_Jade = 488,
UNIT_STAT_gembag_Stones_Argonite = 489,
UNIT_STAT_gembag_Stones_Azurite = 490,
UNIT_STAT_gembag_Stones_Sulpher = 491,
UNIT_STAT_gembag_Stones_Quartz = 492,
UNIT_STAT_gembag_Stones_TigerEye = 493,
UNIT_STAT_UNUSED_68 = 494,
UNIT_STAT_runebag_RunesE = 495,
UNIT_STAT_runebag_RunesF = 496,
UNIT_STAT_passive_sum_mastery = 497,
UNIT_STAT_item_socketmultiplier = 498,
UNIT_STAT_gembag_Ruby = 499,
@@ -909,14 +986,10 @@ namespace diablo2 {
UNIT_STAT_runebag_RunesA = 506,
UNIT_STAT_runebag_RunesB = 507,
UNIT_STAT_runebag_RunesC = 508,
UNIT_STAT_UNUSED_83 = 509,
UNIT_STAT_runebag_RunesD = 509,
UNIT_STAT_item_aura_display = 510,
};
class d2_common {
public:
static char* get_base();
@@ -980,8 +1053,29 @@ namespace diablo2 {
static void diablo2::d2_common::update_trade(structures::inventory* inventory, structures::unit* item);
//static void diablo2::d2_common::set_item_flags(structures::unit* item, structures::itemflags_t dwFlag, bool bSet);
static void diablo2::d2_common::add_property(structures::unit* item, D2PropertyStrc* pProperty, int nUnused);
static void diablo2::d2_common::add_property(structures::unit* item, diablo2::structures::D2PropertyStrc* pProperty, int nUnused);
static void diablo2::d2_common::ITEMS_SetItemFlag(structures::unit* item, uint32_t dwFlag, BOOL bSet);
//D2Common.0x6FDA42B0
// D2ItemStatCostTxt* __fastcall ITEMS_GetItemStatCostTxtRecord(int nStatId)
// Write a function signature for this function
static structures::D2ItemStatCostTxt* get_item_stat_cost_record(int nStatId);
//D2Common.0x6FD57720 (#10602)
//int __stdcall DATATBLS_GetItemIdFromItemCode(uint32_t dwCode)
static int get_item_id_from_item_code(uint32_t dwCode);
//D2Common.0x6FD576D0 (#10601)
// D2ItemsTxt* __stdcall DATATBLS_GetItemRecordFromItemCode(uint32_t dwCode, int* pItemId)
static structures::items_line* get_item_record_from_item_code(uint32_t dwCode, int* pItemId);
// //D2Common.0x6FD5EAA0 (#10620)
// D2COMMON_DLL_DECL D2RunesTxt* __stdcall DATATBLS_GetRunesTxtRecord(int nRunewordId);
static structures::D2RunesTxt* get_runes_txt_record(int nRunewordId);
//D2Common.0x6FD57680 (#10600)
//D2ItemsTxt* __stdcall DATATBLS_GetItemsTxtRecord(int nItemId)
static structures::items_line* get_items_txt_record(int nItemId);
};
}

View File

@@ -3,6 +3,7 @@
#include <cstdint>
#include <functional>
#include <diablo2/structures/unit.h>
#include "d2common.h"
namespace diablo2 {
namespace structures {
@@ -10,6 +11,205 @@ namespace diablo2 {
struct net_client;
struct game;
struct unit;
struct D2MonPropTxt
{
uint32_t dwId; //0x00
diablo2::structures::D2PropertyStrc props[3][6]; //0x04
uint8_t nChance[3][6]; //0x124
uint16_t pad0x136; //0x136
};
#pragma pack(1)
enum D2C_AiSpecialState : uint32_t
{
AISPECIALSTATE_NONE = 0,
AISPECIALSTATE_NO_MON_STATS = 1, // Set when classid > nMonStatsRecord
AISPECIALSTATE_2 = 2, // Unused
AISPECIALSTATE_3 = 3, // Unused
AISPECIALSTATE_4 = 4, // Unused
AISPECIALSTATE_ROGUE_HIREABLE_NON_PLAYER_OWNER = 5,
AISPECIALSTATE_HIREABLE_NON_PLAYER_OWNER = 6,
AISPECIALSTATE_REVIVED = 7, // as necromancer pet
AISPECIALSTATE_8 = 8, // Unused
AISPECIALSTATE_9 = 9, // Unused
// Curses
AISPECIALSTATE_DIMVISION = 10,
AISPECIALSTATE_TERROR = 11,
AISPECIALSTATE_TAUNT = 12,
AISPECIALSTATE_COUNTESS = 13,
AISPECIALSTATE_14 = 14, // Unused
AISPECIALSTATE_WHIPPED = 15, // When whipped by overseer, for suicide minions
AISPECIALSTATE_MOUNTING_UNIT = 16, // When a unit is mounting another (tower / siege beast)
AISPECIALSTATE_17 = 17, // Unused
AISPECIALSTATE_TABLE_COUNT = 18,
AISPECIALSTATE_INVALID = 19, // Could be for objects ?
};
struct D2SkillsTxt
{
int16_t nSkillId; //0x00
uint16_t unk0x02; //0x02
uint32_t dwFlags[2]; //0x04 D2C_SkillsTxtFlags
int8_t nCharClass; //0x0C
uint8_t unk0x0D[3]; //0x0D
uint8_t nAnim; //0x10
uint8_t nMonAnim; //0x11
uint8_t nSeqTrans; //0x12
uint8_t nSeqNum; //0x13
uint8_t nRange; //0x14
uint8_t nSelectProc; //0x15
uint8_t nSeqInput; //0x16
uint8_t pad0x17; //0x17
int16_t nITypeA[3]; //0x18
int16_t nITypeB[3]; //0x1E
int16_t nETypeA[2]; //0x24
int16_t nETypeB[2]; //0x28
int16_t wSrvStartFunc; //0x2C
uint16_t wSrvDoFunc; //0x2E
uint16_t wSrvPrgFunc[3]; //0x30
uint16_t pad0x36; //0x36
uint32_t dwPrgCalc[3]; //0x38
uint8_t nPrgDamage; //0x44
uint8_t pad0x45; //0x45
int16_t wSrvMissile; //0x46
int16_t wSrvMissileA; //0x48
int16_t wSrvMissileB; //0x4A
int16_t wSrvMissileC; //0x4C
int16_t wSrvOverlay; //0x4E
uint32_t dwAuraFilter; //0x50
int16_t wAuraStat[6]; //0x54
uint32_t dwAuraLenCalc; //0x60
uint32_t dwAuraRangeCalc; //0x64
int32_t dwAuraStatCalc[6]; //0x68
int16_t nAuraState; //0x80
int16_t wAuraTargetState; //0x82
int16_t wAuraEvent[3]; //0x84
int16_t wAuraEventFunc[3]; //0x8A
uint16_t wAuraTgtEvent; //0x90
uint16_t wAuraTgtEventFunc; //0x92
int16_t nPassiveState; //0x94
int16_t nPassiveIType; //0x96
int16_t nPassiveStat[5]; //0x98
uint16_t pad0xA2; //0xA2
uint32_t dwPassiveCalc[5]; //0xA4
uint16_t wPassiveEvent; //0xB8
uint16_t wPassiveEventFunc; //0xBA
uint16_t wSummon; //0xBC
int8_t nPetType; //0xBE
int8_t nSumMode; //0xBF
uint32_t dwPetMax; //0xC0
uint16_t wSumSkill[5]; //0xC4
uint16_t pad0xCE; //0xCE
uint32_t dwSumSkCalc[5]; //0xD0
int16_t wSumUMod; //0xE4
int16_t wSumOverlay; //0xE6
uint16_t wCltMissile; //0xE8
uint16_t wCltMissileA; //0xEA
uint16_t wCltMissileB; //0xEC
uint16_t wCltMissileC; //0xEE
uint16_t wCltMissileD; //0xF0
uint16_t wCltStFunc; //0xF2
uint16_t wCltDoFunc; //0xF4
uint16_t wCltPrgFunc[3]; //0xF6
uint16_t wStSound; //0xFC
uint16_t nStSoundClass; //0x0FE
uint16_t wDoSound; //0x100
uint16_t wDoSoundA; //0x102
uint16_t wDoSoundB; //0x104
uint16_t wCastOverlay; //0x106
uint16_t wTgtOverlay; //0x108
uint16_t wTgtSound; //0x10A
uint16_t wPrgOverlay; //0x10C
uint16_t wPrgSound; //0x10E
uint16_t wCltOverlayA; //0x110
uint16_t wCltOverlayB; //0x112
int32_t dwCltCalc[3]; //0x114
uint8_t nItemTarget; //0x120 D2C_SkillsTxtItemTarget
uint8_t pad0x121; //0x121
uint16_t wItemCastSound; //0x122
uint16_t wItemCastOverlay; //0x124
uint16_t pad0x126; //0x126
uint32_t dwPerDelay; //0x128
uint16_t wMaxLvl; //0x12C
uint16_t wResultFlags; //0x12E
uint32_t dwHitFlags; //0x130
uint32_t dwHitClass; //0x134
uint32_t dwCalc[4]; //0x138
int32_t dwParam[8]; //0x148
uint8_t nWeapSel; //0x168
uint8_t pad0x169; //0x169
uint16_t wItemEffect; //0x16A
uint16_t wItemCltEffect; //0x16C
uint16_t pad0x16E; //0x16E
uint32_t dwSkPoints; //0x170
uint16_t wReqLevel; //0x174
uint16_t wReqStr; //0x176
uint16_t wReqDex; //0x178
uint16_t wReqInt; //0x17A
uint16_t wReqVit; //0x17C
int16_t nReqSkill[3]; //0x17E
int16_t wStartMana; //0x184
uint16_t wMinMana; //0x186
uint8_t nManaShift; //0x188
uint8_t pad0x189; //0x189
int16_t wMana; //0x18A
int16_t wLevelMana; //0x18C
uint8_t nAttackRank; //0x18E
uint8_t nLineOfSight; //0x18F D2C_SkillsTxtLineOfSight
uint32_t dwDelay; //0x190
uint16_t wSkillDesc; //0x194
uint16_t pad0x196; //0x196
uint32_t dwToHit; //0x198
uint32_t dwLevToHit; //0x19C
uint32_t dwToHitCalc; //0x1A0
uint8_t nToHitShift; //0x1A4
uint8_t nSrcDam; //0x1A5
uint16_t pad0x1A6; //0x1A6
uint32_t dwMinDam; //0x1A8
uint32_t dwMaxDam; //0x1AC
uint32_t dwMinLvlDam[5]; //0x1B0
uint32_t dwMaxLvlDam[5]; //0x1C4
uint32_t dwDmgSymPerCalc; //0x1D8
uint8_t nEType; //0x1DC
uint8_t pad0x1DD[3]; //0x1DD
uint32_t dwEMin; //0x1E0
uint32_t dwEMax; //0x1E4
uint32_t dwEMinLev[5]; //0x1E8
uint32_t dwEMaxLev[5]; //0x1FC
uint32_t dwEDmgSymPerCalc; //0x210
uint32_t dwELen; //0x214
uint32_t dwELevLen[3]; //0x218
uint32_t dwELenSymPerCalc; //0x224
uint8_t nRestrict; //0x228
uint8_t pad0x229; //0x229
int16_t nState[3]; //0x22A
uint8_t nAiType; //0x230
uint8_t pad0x231; //0x231
int16_t wAiBonus; //0x232
int32_t nCostMult; //0x234
int32_t nCostAdd; //0x238
};
#pragma pack()
struct D2SummonArgStrc
{
uint32_t dwFlags; //0x00
diablo2::structures::unit* pOwner; //0x04
int32_t nHcIdx; //0x08
D2C_AiSpecialState nAiSpecialState; //0x0C
int32_t nMonMode; //0x10
D2CoordStrc pPosition; //0x14
int32_t nPetType; //0x1C
int32_t nPetMax; //0x20
};
}
class d2_game {
@@ -47,5 +247,57 @@ namespace diablo2 {
static void update_inventory_items(structures::game* game, structures::unit* player);
static uint32_t __fastcall diablo2::d2_game::transmogrify(diablo2::structures::game* game, diablo2::structures::unit* player);
//D2Game.0x6FC4ED80
static structures::unit* __fastcall D2GAME_CreateItemEx_6FC4ED80(structures::game* pGame, structures::D2ItemDropStrc* pItemDrop, int32_t a3);
//D2Game.0x6FC4A660
static int32_t __fastcall diablo2::d2_game::D2GAME_Transmogrify_6FC4A660(structures::game* pGame, structures::unit* pPlayer, structures::unit* pItem);
static diablo2::structures::unit* __fastcall diablo2::d2_game::QUESTS_CreateItem(diablo2::structures::game* pGame, diablo2::structures::unit* pPlayer, uint32_t dwCode, int32_t nLevel, uint8_t nQuality, int32_t bDroppable);
// Add wrapper for D2Game.0x6FC603D0
// D2MonPropTxt* __fastcall MONSTER_GetMonPropTxtRecord(int32_t nId)
static diablo2::structures::D2MonPropTxt* __fastcall diablo2::d2_game::MONSTER_GetMonPropTxtRecord(int32_t nId);
// add wrapper for //D2Game.0x6FCBC900
// D2UnitStrc* __stdcall SUNIT_GetTargetUnit(D2GameStrc* pGame, D2UnitStrc* pUnit)
static diablo2::structures::unit* __stdcall diablo2::d2_game::SUNIT_GetTargetUnit(structures::game* pGame, structures::unit* pUnit);
//D2Game.0x6FCF5B90
//D2SkillsTxt* __fastcall SKILLS_GetSkillsTxtRecord(int32_t nSkillId)
static diablo2::structures::D2SkillsTxt* __fastcall diablo2::d2_game::SKILLS_GetSkillsTxtRecord(int32_t nSkillId);
//D2Game.0x6FD15580
//int32_t __fastcall D2GAME_GetSummonIdFromSkill_6FD15580(D2UnitStrc* pUnit, int32_t bFromMonster, int32_t nSkillId, int32_t nSkillLevel, int32_t* pSpawnMode, int32_t* pX, int32_t* pY)
static int32_t __fastcall diablo2::d2_game::D2GAME_GetSummonIdFromSkill_6FD15580(structures::unit* pUnit, int32_t bFromMonster, int32_t nSkillId, int32_t nSkillLevel, int32_t* pSpawnMode, int32_t* pX, int32_t* pY);
//D2Game.0x6FD14430
//D2UnitStrc* __fastcall D2GAME_SummonPet_6FD14430(D2GameStrc* pGame, D2SummonArgStrc* pSummonArg)
static diablo2::structures::unit* __fastcall diablo2::d2_game::D2GAME_SummonPet_6FD14430(structures::game* pGame, structures::D2SummonArgStrc* pSummonArg);
//D2Game.0x6FD0CB10
//int32_t __fastcall D2GAME_SKILLS_SetSummonBaseStats_6FD0CB10(D2GameStrc* pGame, D2UnitStrc* pUnit, D2UnitStrc* pPet, int32_t nPetLevelArg, int32_t nSkillLevel)
static int32_t __fastcall diablo2::d2_game::D2GAME_SKILLS_SetSummonBaseStats_6FD0CB10(structures::game* pGame, structures::unit* pUnit, structures::unit* pPet, int32_t nPetLevelArg, int32_t nSkillLevel);
//D2Game.0x6FD0C530
//int32_t __fastcall D2GAME_SetSummonPassiveStats_6FD0C530(D2GameStrc* pGame, D2UnitStrc* pUnit, D2UnitStrc* pPet, int32_t nSkillId, int32_t nSkillLevel, int32_t nItemLevel)
static int32_t __fastcall diablo2::d2_game::D2GAME_SetSummonPassiveStats_6FD0C530(structures::game* pGame, structures::unit* pUnit, structures::unit* pPet, int32_t nSkillId, int32_t nSkillLevel, int32_t nItemLevel);
//D2Game.0x6FD0C2E0
//void __fastcall D2GAME_SetSummonResistance_6FD0C2E0(D2UnitStrc* pUnit, D2UnitStrc* pPet)
static void __fastcall diablo2::d2_game::D2GAME_SetSummonResistance_6FD0C2E0(structures::unit* pUnit, structures::unit* pPet);
//D2Game.0x6FC3E200
//void __fastcall sub_6FC3E200(D2ClientStrc* pClient, D2UnitStrc* pUnit)
static void __fastcall diablo2::d2_game::sub_6FC3E200(structures::net_client* pClient, structures::unit* pUnit);
//D2Game.0x6FC69F10
//D2UnitStrc* __fastcall D2GAME_SpawnMonster_6FC69F10(D2GameStrc* pGame, D2ActiveRoomStrc* pRoom, int32_t nX, int32_t nY, int32_t nMonsterId, int32_t nAnimMode, int32_t a7, int16_t nFlags)
static diablo2::structures::unit* __fastcall diablo2::d2_game::D2GAME_SpawnMonster_6FC69F10(structures::game* pGame, structures::room* pRoom, int32_t nX, int32_t nY, int32_t nMonsterId, int32_t nAnimMode, int32_t a7, int16_t nFlags);
};
}

View File

@@ -18,6 +18,5 @@ namespace diablo2 {
static int32_t get_resolution_mode();
static void draw_image(structures::gfxdata* data, uint32_t x, uint32_t y, int32_t gamma, int32_t drawType, void* palette);
static void draw_filled_rect(int left, int top, int right, int bottom, DWORD color, int transTbl);
};
}

View File

@@ -1,6 +1,8 @@
#pragma once
#include <cstdint>
#include "room.h"
#include <windows.h>
#pragma pack(push, 1)
@@ -23,7 +25,18 @@ namespace diablo2 {
struct quest_record;
struct npc_record;
enum D2C_ItemQualities
{
ITEMQUAL_INFERIOR = 0x01, //0x01 Inferior
ITEMQUAL_NORMAL = 0x02, //0x02 Normal
ITEMQUAL_SUPERIOR = 0x03, //0x03 Superior
ITEMQUAL_MAGIC = 0x04, //0x04 Magic
ITEMQUAL_SET = 0x05, //0x05 Set
ITEMQUAL_RARE = 0x06, //0x06 Rare
ITEMQUAL_UNIQUE = 0x07, //0x07 Unique
ITEMQUAL_CRAFT = 0x08, //0x08 Crafted
ITEMQUAL_TEMPERED = 0x09 //0x09 Tempered
};
enum class unit_type_t : int32_t {
UNIT_TYPE_PLAYER = 0,
@@ -76,7 +89,55 @@ namespace diablo2 {
ITEMFLAG_ITEM = 0x08000000
};
struct D2SeedStrc
{
union
{
struct
{
uint32_t nLowSeed; //0x00
uint32_t nHighSeed; //0x04
};
uint64_t lSeed; //0x00
};
};
struct D2CoordStrc //sizeof 0x08
{
int nX; //0x00
int nY; //0x04
};
struct D2ItemDropStrc
{
diablo2::structures::unit* pUnit; //0x00
D2SeedStrc* pSeed; //0x04
diablo2::structures::game* pGame; //0x08
int32_t nItemLvl; //0x0C
uint32_t unk0x10; //0x10
int32_t nId; //0x14
int32_t nSpawnType; //0x18 [3 for ground spawn, 4 for inv spawn]
int32_t nX; //0x1C
int32_t nY; //0x20
diablo2::structures::room* pRoom; //0x24
uint16_t wUnitInitFlags; //0x28
uint16_t wItemFormat; //0x2A [ptGame0x0x78]
BOOL bForce; //0x2C
int32_t nQuality; //0x30
int32_t nQuantity; //0x34
int32_t nMinDur; //0x38
int32_t nMaxDur; //0x3C
int32_t nItemIndex; //0x40
uint32_t dwFlags1; //0x44 - itemflag override (used when force is true)
uint32_t dwSeed; //0x48 - overrides the seed, used when force is true
uint32_t dwItemSeed; //0x4C - overrides the item seed when force is true
int32_t eEarLvl; //0x50
int32_t nQtyOverride; //0x54
char szName[16]; //0x58
int32_t nPrefix[3]; //0x68
int32_t nSuffix[3]; //0x74
uint32_t dwFlags2; //0x80
};
struct unit {
unit_type_t type;

View File

@@ -23,8 +23,6 @@ namespace diablo2 {
mpq_streambuf m_streambuf;
public:
explicit mpq_ifstream(const std::string& path);
};
}
}

14
resource.h Normal file
View File

@@ -0,0 +1,14 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by D2tweaks.rc
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -74,7 +74,7 @@ CIni::CIni(LPCTSTR lpPathName)
CIni::~CIni()
{
if (m_pszPathName != NULL)
delete [] m_pszPathName;
delete[] m_pszPathName;
}
/////////////////////////////////////////////////////////////////////////////////
@@ -92,7 +92,7 @@ void CIni::SetPathName(LPCTSTR lpPathName)
else
{
if (m_pszPathName != NULL)
delete [] m_pszPathName;
delete[] m_pszPathName;
m_pszPathName = _tcsdup(lpPathName);
}
@@ -143,7 +143,7 @@ DWORD CIni::GetString(LPCTSTR lpSection, LPCTSTR lpKey, LPTSTR lpBuffer, DWORD d
dwLen = min(dwLen, dwBufSize);
}
delete [] psz;
delete[] psz;
return dwLen;
}
@@ -152,7 +152,7 @@ CString CIni::GetString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpDefault) con
{
LPTSTR psz = __GetStringDynamic(lpSection, lpKey, lpDefault);
CString str(psz);
delete [] psz;
delete[] psz;
return str;
}
#endif
@@ -177,8 +177,8 @@ BOOL CIni::AppendString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpString) cons
TCHAR* pNewString = new TCHAR[_tcslen(psz) + _tcslen(lpString) + 1];
_stprintf(pNewString, _T("%s%s"), psz, lpString);
const BOOL RES = WriteString(lpSection, lpKey, pNewString);
delete [] pNewString;
delete [] psz;
delete[] pNewString;
delete[] psz;
return RES;
}
@@ -207,7 +207,7 @@ DWORD CIni::GetArray(LPCTSTR lpSection, LPCTSTR lpKey, LPTSTR lpBuffer, DWORD dw
const DWORD MAX_LEN = _tcslen(psz) + 2;
LPTSTR p = new TCHAR[MAX_LEN + 1];
dwCopied = __StringSplit(psz, p, MAX_LEN, lpDelimiter, bTrimString);
delete [] p;
delete[] p;
}
else
{
@@ -215,12 +215,12 @@ DWORD CIni::GetArray(LPCTSTR lpSection, LPCTSTR lpKey, LPTSTR lpBuffer, DWORD dw
}
}
delete [] psz;
delete[] psz;
return dwCopied;
}
#ifdef __AFXWIN_H__
void CIni::GetArray(LPCTSTR lpSection, LPCTSTR lpKey, CStringArray *pArray, LPCTSTR lpDelimiter, BOOL bTrimString) const
void CIni::GetArray(LPCTSTR lpSection, LPCTSTR lpKey, CStringArray* pArray, LPCTSTR lpDelimiter, BOOL bTrimString) const
{
if (pArray != NULL)
pArray->RemoveAll();
@@ -232,12 +232,12 @@ void CIni::GetArray(LPCTSTR lpSection, LPCTSTR lpKey, CStringArray *pArray, LPCT
LPTSTR psz = new TCHAR[LEN + 3];
GetArray(lpSection, lpKey, psz, LEN + 2, lpDelimiter);
ParseDNTString(psz, __SubStrAdd, (LPVOID)pArray);
delete [] psz;
delete[] psz;
}
#endif
#ifdef __AFXWIN_H__
BOOL CIni::WriteArray(LPCTSTR lpSection, LPCTSTR lpKey, const CStringArray *pArray, int nWriteCount, LPCTSTR lpDelimiter) const
BOOL CIni::WriteArray(LPCTSTR lpSection, LPCTSTR lpKey, const CStringArray* pArray, int nWriteCount, LPCTSTR lpDelimiter) const
{
if (pArray == NULL)
return FALSE;
@@ -385,7 +385,7 @@ DWORD CIni::GetDataBlock(LPCTSTR lpSection, LPCTSTR lpKey, LPVOID lpBuffer, DWOR
DWORD dwLen = _tcslen(psz) / 2;
if (dwLen <= dwOffset)
{
delete [] psz;
delete[] psz;
return 0;
}
@@ -401,7 +401,7 @@ DWORD CIni::GetDataBlock(LPCTSTR lpSection, LPCTSTR lpKey, LPVOID lpBuffer, DWOR
}
else
{
delete [] psz;
delete[] psz;
return 0;
}
}
@@ -425,7 +425,7 @@ DWORD CIni::GetDataBlock(LPCTSTR lpSection, LPCTSTR lpKey, LPVOID lpBuffer, DWOR
{
dwProcLen = dwLen - dwOffset;
}
delete [] psz;
delete[] psz;
return dwProcLen;
}
@@ -441,7 +441,7 @@ BOOL CIni::WriteDataBlock(LPCTSTR lpSection, LPCTSTR lpKey, LPCVOID lpData, DWOR
for (DWORD i = 0, j = 0; i < dwDataSize; i++, j += 2)
_stprintf(&psz[j], _T("%02X"), lpb[i]);
const BOOL RES = WriteString(lpSection, lpKey, psz);
delete [] psz;
delete[] psz;
return RES;
}
@@ -457,7 +457,7 @@ BOOL CIni::AppendDataBlock(LPCTSTR lpSection, LPCTSTR lpKey, LPCVOID lpData, DWO
for (DWORD i = 0, j = 0; i < dwDataSize; i++, j += 2)
_stprintf(&psz[j], _T("%02X"), lpb[i]);
const BOOL RES = AppendString(lpSection, lpKey, psz);
delete [] psz;
delete[] psz;
return RES;
}
@@ -514,12 +514,12 @@ DWORD CIni::GetKeyLines(LPCTSTR lpSection, LPTSTR lpBuffer, DWORD dwBufSize) con
while (dwCopied + 2 >= dwLen)
{
dwLen += DEF_PROFILE_THRESHOLD;
delete [] psz;
delete[] psz;
psz = new TCHAR[dwLen + 1];
dwCopied = ::GetPrivateProfileSection(lpSection, psz, dwLen, m_pszPathName);
}
delete [] psz;
delete[] psz;
return dwCopied + 2;
}
else
@@ -549,7 +549,7 @@ DWORD CIni::GetKeyNames(LPCTSTR lpSection, LPTSTR lpBuffer, DWORD dwBufSize) con
LPTSTR psz = new TCHAR[LEN + 1];
GetKeyLines(lpSection, psz, LEN);
ParseDNTString(psz, __KeyPairProc, (LPVOID)(&sl));
delete [] psz;
delete[] psz;
if (lpBuffer != NULL)
lpBuffer[sl.dwTotalCopied] = _T('\0');
return sl.dwTotalCopied;
@@ -567,12 +567,12 @@ DWORD CIni::GetSectionNames(LPTSTR lpBuffer, DWORD dwBufSize) const
while (dwCopied + 2 >= dwLen)
{
dwLen += DEF_PROFILE_THRESHOLD;
delete [] psz;
delete[] psz;
psz = new TCHAR[dwLen + 1];
dwCopied = ::GetPrivateProfileSectionNames(psz, dwLen, m_pszPathName);
}
delete [] psz;
delete[] psz;
return dwCopied + 2;
}
else
@@ -582,7 +582,7 @@ DWORD CIni::GetSectionNames(LPTSTR lpBuffer, DWORD dwBufSize) const
}
#ifdef __AFXWIN_H__
void CIni::GetSectionNames(CStringArray *pArray) const
void CIni::GetSectionNames(CStringArray* pArray) const
{
if (pArray != NULL)
pArray->RemoveAll();
@@ -594,13 +594,13 @@ void CIni::GetSectionNames(CStringArray *pArray) const
LPTSTR psz = new TCHAR[LEN + 1];
GetSectionNames(psz, LEN);
ParseDNTString(psz, __SubStrAdd, pArray);
delete [] psz;
delete[] psz;
}
#endif
#ifdef __AFXWIN_H__
// Retrieve a list of key-lines(key-pairs) of the specified section
void CIni::GetKeyLines(LPCTSTR lpSection, CStringArray *pArray) const
void CIni::GetKeyLines(LPCTSTR lpSection, CStringArray* pArray) const
{
if (pArray != NULL)
pArray->RemoveAll();
@@ -612,13 +612,13 @@ void CIni::GetKeyLines(LPCTSTR lpSection, CStringArray *pArray) const
LPTSTR psz = new TCHAR[LEN + 1];
GetKeyLines(lpSection, psz, LEN);
ParseDNTString(psz, __SubStrAdd, pArray);
delete [] psz;
delete[] psz;
}
#endif
#ifdef __AFXWIN_H__
// Retrieve a list of key names of the specified section
void CIni::GetKeyNames(LPCTSTR lpSection, CStringArray *pArray) const
void CIni::GetKeyNames(LPCTSTR lpSection, CStringArray* pArray) const
{
if (pArray == NULL)
return;
@@ -628,7 +628,7 @@ void CIni::GetKeyNames(LPCTSTR lpSection, CStringArray *pArray) const
LPTSTR psz = new TCHAR[LEN + 1];
GetKeyNames(lpSection, psz, LEN);
ParseDNTString(psz, __SubStrAdd, (LPVOID)pArray);
delete [] psz;
delete[] psz;
}
#endif
@@ -658,7 +658,7 @@ BOOL CIni::IsSectionExist(LPCTSTR lpSection) const
LPTSTR psz = new TCHAR[LEN + 1];
GetSectionNames(psz, LEN);
BOOL RES = !ParseDNTString(psz, __SubStrCompare, (LPVOID)lpSection);
delete [] psz;
delete[] psz;
return RES;
}
@@ -670,7 +670,7 @@ BOOL CIni::IsKeyExist(LPCTSTR lpSection, LPCTSTR lpKey) const
// Test it with the default unique string
LPTSTR psz = __GetStringDynamic(lpSection, lpKey, DEF_PROFILE_TESTSTRING);
const BOOL RES = (_tcscmp(psz, DEF_PROFILE_TESTSTRING) != 0);
delete [] psz;
delete[] psz;
return RES;
}
@@ -695,7 +695,7 @@ BOOL CIni::CopySection(LPCTSTR lpSrcSection, LPCTSTR lpDestSection, BOOL bFailIf
//memset(psz, 0, sizeof(TCHAR) * (SRC_LEN + 2));
GetKeyLines(lpSrcSection, psz, SRC_LEN);
const BOOL RES = ::WritePrivateProfileSection(lpDestSection, psz, m_pszPathName);
delete [] psz;
delete[] psz;
return RES;
}
@@ -717,7 +717,7 @@ BOOL CIni::CopyKey(LPCTSTR lpSrcSection, LPCTSTR lpSrcKey, LPCTSTR lpDestSection
LPTSTR psz = __GetStringDynamic(lpSrcSection, lpSrcKey);
const BOOL RES = WriteString(lpDestSection, lpDestKey, psz);
delete [] psz;
delete[] psz;
return RES;
}
@@ -770,7 +770,7 @@ LPTSTR CIni::__GetStringDynamic(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpDefa
while (dwCopied + 1 >= dwLen)
{
dwLen += DEF_PROFILE_THRESHOLD;
delete [] psz;
delete[] psz;
psz = new TCHAR[dwLen + 1];
dwCopied = ::GetPrivateProfileString(lpSection, lpKey, lpDefault == NULL ? _T("") : lpDefault, psz, dwLen, m_pszPathName);
}
@@ -828,7 +828,7 @@ DWORD CIni::__StringSplit(LPCTSTR lpString, LPTSTR lpBuffer, DWORD dwBufSize, LP
lpTarget[COPY_LEN] = _T('\0');
lpTarget = &lpTarget[SEG_LEN + 1];
}
delete [] pszSeg;
delete[] pszSeg;
lpPos = &lpEnd[DEL_LEN]; // Advance the pointer for next search
lpEnd = _tcsstr(lpPos, pszDel);
}
@@ -849,9 +849,9 @@ DWORD CIni::__StringSplit(LPCTSTR lpString, LPTSTR lpBuffer, DWORD dwBufSize, LP
lpTarget[COPY_LEN] = _T('\0');
}
delete [] pszSeg;
delete[] pszSeg;
lpBuffer[dwCopied] = _T('\0');
delete [] pszDel;
delete[] pszDel;
return dwCopied;
}
@@ -890,10 +890,10 @@ BOOL CALLBACK CIni::__SubStrCompare(LPCTSTR lpString1, LPVOID lpParam)
// Callback function used to process a key-pair, it extracts the
// key name from the key-pair string
BOOL CALLBACK CIni:: __KeyPairProc(LPCTSTR lpString, LPVOID lpParam)
BOOL CALLBACK CIni::__KeyPairProc(LPCTSTR lpString, LPVOID lpParam)
{
STR_LIMIT* psl = (STR_LIMIT*)lpParam;
if (lpString == NULL || psl== NULL)
if (lpString == NULL || psl == NULL)
return FALSE;
LPCTSTR p = _tcschr(lpString, _T('='));
@@ -926,7 +926,7 @@ BOOL CALLBACK CIni:: __KeyPairProc(LPCTSTR lpString, LPVOID lpParam)
dwCopyLen = dwNameLen;
}
delete [] psz;
delete[] psz;
psl->dwTotalCopied += dwCopyLen + 1;
return TRUE;
}
@@ -1068,7 +1068,7 @@ BOOL CIni::__TrimString(LPTSTR lpString)
{
LPTSTR psz = _tcsdup(p);
_tcscpy(lpString, psz);
delete [] psz;
delete[] psz;
}
return bTrimmed;

View File

@@ -8,7 +8,6 @@
#include <d2tweaks/client/modules/client_module.h>
#include <d2tweaks/ui/ui_manager.h>
#include <diablo2/structures/unit.h>
#include <diablo2/structures/client_unit_list.h>
#include <WinBase.h>
@@ -45,12 +44,6 @@
std::vector<StatEntry> globalStatsVector;
diablo2::structures::gfxdata g_gfxdata; // global gfxdata
int randStat;
int randStatRangeLow;
int randStatRangeHigh;
int randStatBool;
std::wstring ConvertCharToWString(const std::string& charString) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
return converter.from_bytes(charString);
@@ -99,8 +92,6 @@ diablo2::ui_color_t mapColorToEnum(const std::string& colorName) {
return diablo2::ui_color_t::UI_COLOR_WHITE;
}
// Define a struct to hold key-value pairs within a section
struct Section {
std::map<std::string, std::string> assignments;
@@ -166,6 +157,14 @@ void ParseIniFile(const std::string& iniFilePath) {
else if (key == "item_type_id") {
entry.item_type_id = std::stoi(value);
}
// add op and param
else if (key == "op") {
entry.op = std::stoi(value);
}
// add op and param
else if (key == "param") {
entry.param = std::stoi(value);
}
}
}
}
@@ -214,7 +213,7 @@ __declspec (naked) void handle_cs_packet_wrapper() {
__asm {
pushad;
pushfd;
call [d2_tweaks::client::client::handle_cs_packet]
call[d2_tweaks::client::client::handle_cs_packet]
popfd;
popad;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -223,7 +222,6 @@ __declspec (naked) void handle_cs_packet_wrapper() {
RET_TO_RVA(DLLBASE_D2CLIENT, 0xD856);
}
__declspec (naked) void handle_sc_standart_packet_wrapper() {
__asm {
pushad;
@@ -239,7 +237,6 @@ __declspec (naked) void handle_sc_standart_packet_wrapper() {
RET_TO_RVA(DLLBASE_D2CLIENT, 0x150B5);
}
static const DLLPatchStrc gpt_handle_cs_packet[] =
{
{D2DLL_D2CLIENT, 0xD850 + 0, PATCH_JMP, FALSE, 0x1},
@@ -248,7 +245,6 @@ static const DLLPatchStrc gpt_handle_cs_packet[] =
{D2DLL_INVALID}
};
static const DLLPatchStrc gpt_handle_sc_standart_packet[] =
{
{D2DLL_D2CLIENT, 0x150B0 + 0, PATCH_JMP, FALSE, 0x1},
@@ -256,7 +252,6 @@ static const DLLPatchStrc gpt_handle_sc_standart_packet[] =
{D2DLL_INVALID}
};
void d2_tweaks::client::client::init() {
// handle packet <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> GamePacketReceivedIntercept
hooking::hook(diablo2::d2_client::get_base() + 0x11CB0, handle_packet, reinterpret_cast<void**>(&g_handle_packet));
@@ -272,23 +267,10 @@ void d2_tweaks::client::client::init() {
if (m_module == nullptr)
break;
//randStat = GetPrivateProfileIntA("RandStat", "stat", 0, lpIniFilePath);
//randStatRangeLow = GetPrivateProfileIntA("RandStat", "statRangeLow", 0, lpIniFilePath);
//randStatRangeHigh = GetPrivateProfileIntA("RandStat", "statRangeHigh", 0, lpIniFilePath);
//randStatBool = GetPrivateProfileIntA("RandStat", "statBool", 0, lpIniFilePath);
//spdlog::info("randStat = {0}", randStat);
//spdlog::info("randStatRangeLow = {0}", randStatRangeLow);
//spdlog::info("randStatRangeHigh = {0}", randStatRangeHigh);
// Load and parse the INI file
ParseIniFile(iniFilePath);
}
D2TEMPLATE_ApplyPatch(gpt_handle_cs_packet);
//D2TEMPLATE_ApplyPatch(gpt_handle_sc_standart_packet);
@@ -300,13 +282,12 @@ void d2_tweaks::client::client::init() {
}
}
static int32_t g_ebp_send_to_client;
void d2_tweaks::client::client::handle_cs_packet(common::packet_header* packet, size_t size) {
#ifndef NDEBUG
__asm {
push [ebp + 0x2C];
pop [g_ebp_send_to_client];
push[ebp + 0x2C];
pop[g_ebp_send_to_client];
}
spdlog::warn("[d2client SEND] Packet {} Message {} Size {} CallFrom {}", (void*)packet->d2_packet_type, (void*)packet->message_type, size, (void*)g_ebp_send_to_client);
#endif
@@ -325,7 +306,6 @@ void d2_tweaks::client::client::handle_cs_packet(common::packet_header* packet,
handler->handle_cs_packet(packet);
}
void d2_tweaks::client::client::handle_standart_packet(common::packet_header* packet, size_t size) {
if (size == -1)
return;
@@ -337,7 +317,6 @@ void d2_tweaks::client::client::handle_standart_packet(common::packet_header* pa
return;
}
void d2_tweaks::client::client::handle_packet(common::packet_header* packet, size_t size) {
static common::packet_header dummy;
static auto& instance = singleton<client>::instance();
@@ -362,10 +341,8 @@ void d2_tweaks::client::client::handle_packet(common::packet_header* packet, siz
handler->handle_packet(packet);
}
static bool g_is_init = false;
void d2_tweaks::client::client::game_tick() {
static auto& instance = singleton<client>::instance(); /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> d2 gl
if (g_is_init == false) {
@@ -380,7 +357,7 @@ void d2_tweaks::client::client::game_tick() {
g_is_init = true;
}
for (auto & tick_handler : instance.m_tick_handlers) {
for (auto& tick_handler : instance.m_tick_handlers) {
if (tick_handler == nullptr)
break;
@@ -390,7 +367,6 @@ void d2_tweaks::client::client::game_tick() {
return;
}
int32_t d2_tweaks::client::client::draw_game_ui() {
static auto& ui = singleton<ui::ui_manager>::instance();
@@ -401,8 +377,6 @@ int32_t d2_tweaks::client::client::draw_game_ui() {
return result;
}
void d2_tweaks::client::client::register_module(modules::client_module* module) {
m_modules[m_module_id_counter++] = module;
}

View File

@@ -67,12 +67,9 @@ public:
}
};
void d2_tweaks::client::modules::auto_gold_pickup::init_early() {
}
void d2_tweaks::client::modules::auto_gold_pickup::init() {
char acPathToIni[MAX_PATH] = { 0 };
const char* pcIniFile = "\\d2tweaks.ini";
@@ -89,7 +86,6 @@ void d2_tweaks::client::modules::auto_gold_pickup::init() {
}
}
void d2_tweaks::client::modules::auto_gold_pickup::tick() {
const auto unit = diablo2::d2_client::get_local_player();
@@ -133,7 +129,6 @@ void d2_tweaks::client::modules::auto_gold_pickup::tick() {
}
}
void d2_tweaks::client::modules::auto_gold_pickup::handle_packet(common::packet_header* packet) {
const auto info = static_cast<common::gold_pickup_info_sc*>(packet);
m_nLastUpdate = GetTickCount();

View File

@@ -67,7 +67,6 @@ static char m_acPathToIni[MAX_PATH] = { 0 };
static const char* m_pcIniFile = "\\d2tweaks.ini";
void d2_tweaks::client::modules::auto_item_pickup::init_early() {
}
void ReloadFilters(char* szPathToIni) {
@@ -120,7 +119,6 @@ void ReloadFilters(char* szPathToIni) {
}
}
/// Parse ItemCode
dwLenght = lstrlen(m_pcItemListAll);
memcpy(m_pcItemListAllTemp, m_pcItemListAll, dwLenght + 1);
@@ -196,7 +194,6 @@ void ReloadFilters(char* szPathToIni) {
token_string_itemcode = strtok(NULL, " ,|");
}
/// Parse ItemType Code
dwLenght = lstrlen(m_pcItemTypesAll);
memcpy(m_pcItemTypesAllTemp, m_pcItemTypesAll, dwLenght + 1);
@@ -272,7 +269,6 @@ void ReloadFilters(char* szPathToIni) {
}
}
class auto_item_pickup_menu : public d2_tweaks::ui::menu {
d2_tweaks::common::asset* m_buttons_img;
d2_tweaks::ui::controls::button* m_auto_pickup_btn;
@@ -359,7 +355,6 @@ private:
}
};
void d2_tweaks::client::modules::auto_item_pickup::init() {
GetCurrentDirectory(MAX_PATH, m_acPathToIni);
lstrcat(m_acPathToIni, m_pcIniFile);
@@ -375,7 +370,6 @@ void d2_tweaks::client::modules::auto_item_pickup::init() {
}
}
bool find_free_space(diablo2::structures::inventory* inv, diablo2::structures::unit* item, int32_t inventoryIndex, char page, uint32_t& x, uint32_t& y) {
char data[0x18];
@@ -396,7 +390,6 @@ bool find_free_space(diablo2::structures::inventory* inv, diablo2::structures::u
return false;
}
void d2_tweaks::client::modules::auto_item_pickup::tick() {
static common::item_pickup_info_sc packet;
const auto unit = diablo2::d2_client::get_local_player();
@@ -476,7 +469,6 @@ void d2_tweaks::client::modules::auto_item_pickup::tick() {
}
}
if (itemtype_record_equiv2) {
if (*(DWORD*)itemtype_record_equiv2->code != 0x20202020) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> equiv1
@@ -527,7 +519,6 @@ void d2_tweaks::client::modules::auto_item_pickup::tick() {
}
}
for (uint32_t i = 0; i < m_nCountItemListAll; i++)
{
if (record->string_code[0] == m_stItemList[i].code0 &&
@@ -560,7 +551,6 @@ void d2_tweaks::client::modules::auto_item_pickup::tick() {
}
}
void d2_tweaks::client::modules::auto_item_pickup::handle_packet(common::packet_header* packet) {
const auto info = static_cast<common::item_pickup_info_sc*>(packet);

View File

@@ -4,7 +4,6 @@
#include <spdlog/spdlog.h>
#include <d2tweaks/common/common.h>
#include <d2tweaks/common/protocol.h>
#include <d2tweaks/common/asset_manager.h>
@@ -20,7 +19,6 @@
#include <diablo2/d2gfx.h>
#include <diablo2/d2cmp.h>
#include <diablo2/structures/unit.h>
#include <diablo2/structures/inventory.h>
#include <diablo2/structures/item_data.h>
@@ -45,10 +43,19 @@
#include <string>
#include <map>
#include <DllNotify.h>
#include <D2Template.h>
#include <diablo2/d2gfx.h>
#include <string>
#include <vector>
#include <sstream>
#include <string>
#include <locale>
#include <codecvt>
MODULE_INIT(autosort)
enum ColorEnum {
@@ -88,7 +95,6 @@ std::map<int, diablo2::ui_font_t> fontMap = {
{13, diablo2::ui_font_t::UI_FONT_INGAMECHAT}
};
class inventory_sort_menu : public d2_tweaks::ui::menu {
d2_tweaks::common::asset* m_buttons_img;
@@ -115,8 +121,6 @@ public:
m_sort_cube_btn = get_button("m_sort_cube_btn", std::bind(&inventory_sort_menu::sort_cube_click, this));
}
// Function to find the Diablo II window handle
HWND FindDiabloIIWindow() {
return FindWindow(NULL, "Diablo II");
@@ -132,18 +136,85 @@ public:
ReleaseDC(hwnd, hdc);
}
int statsFont = GetPrivateProfileIntA("Options", "statsFont", 0, "./d2tweaks.ini");
ULONGLONG lastSendTime = GetTickCount64();
// Function to split a string into words
std::vector<std::string> split(const std::string& s, char delim) {
std::stringstream ss(s);
std::string item;
std::vector<std::string> tokens;
while (getline(ss, item, delim)) {
tokens.push_back(item);
}
return tokens;
}
std::wstring stringToWstring(const std::string& str) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes(str);
}
// Function to justify a line of text
void justifyLine(const std::vector<std::string>& words, int start, int end, int maxLineLength, int& xPos, int yPos, int padding) {
int lineLength = 0;
for (int i = start; i <= end; i++) {
lineLength += words[i].length() * 8; // Assuming each character has a width of 8 pixels
}
int numSpaces = end - start;
int extraSpaces = maxLineLength - lineLength - padding * 2;
int spaceWidth = 8;
int extraSpacePerGap = numSpaces > 0 ? extraSpaces / numSpaces : 0;
int remainingSpaces = numSpaces > 0 ? extraSpaces % numSpaces : 0;
for (int i = start; i <= end; i++) {
diablo2::d2_win::draw_boxed_text(const_cast<wchar_t*>(stringToWstring(words[i]).c_str()), xPos + padding, yPos, 0, 0, diablo2::UI_COLOR_WHITE); // Assuming paletteIndex, transTbl, and color are 0
xPos += words[i].length() * 8 + spaceWidth + extraSpacePerGap + padding;
if (remainingSpaces > 0) {
xPos += 1; // Add an extra pixel for the remaining spaces
remainingSpaces--;
}
}
}
// Function to draw justified text inside a box with padding
void drawJustifiedTextInBox(const std::string& text, int boxX, int boxY, int boxWidth, int boxHeight, int padding) {
std::vector<std::string> words = split(text, ' ');
int maxLineLength = boxWidth;
int xPos = boxX + padding;
int yPos = boxY + padding;
for (size_t i = 0; i < words.size(); ) {
int start = i;
int end = i;
int lineLength = 0;
// Find the end index for the current line
while (end < words.size() && lineLength + words[end].length() <= maxLineLength) {
lineLength += words[end].length();
if (end > start) {
lineLength++; // Add space width
}
end++;
}
justifyLine(words, start, end - 1, maxLineLength, xPos, yPos, padding);
yPos += 16; // Assuming each line is 16 pixels tall
xPos = boxX + padding;
i = end;
}
}
void draw() override {
auto stats = globalStatsVector;
int textOffset = 40; // Initial offset for the first line
const auto player = diablo2::d2_client::get_local_player();
auto name = player->player_data->name;
// Add all items to vector
std::vector<diablo2::structures::unit*> items;
@@ -157,132 +228,71 @@ public:
// Initialize statValue
int32_t statValue = 0;
if (diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_STASH)) {
diablo2::d2_gfx::draw_filled_rect(130, 48, 640, 155, 5, 50);
}
//if (diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_STASH)) {
// diablo2::d2_gfx::draw_filled_rect(130, 48, 640, 155, 5, 50);
//}
if (m_stats_enabled) {
for (const auto& stat : stats) {
int param = stat.param;
int op = stat.op;
auto statline = diablo2::d2_common::get_item_stat_cost_record(stat.stat);
auto opBase = statline->wOpBase;
auto opStat = statline->wOpStat[0];
auto opBaseValue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(opBase), NULL);
auto opStatValue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(opStat), NULL);
double param = 6;
int32_t spirits = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(185), NULL);
int32_t soulscaptured = statValue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(184), NULL);
switch (stat.stat) {
// 2. (statValue <- this is probably op stat1 ? * baseValue <- this is probably op base ) / 2 ^ param
// (op stat1 value * base stat value) / (2 ^ param)
// let's try this fucking thing
case 190: {
// str/spirits
statValue = static_cast<int32_t>((1 * spirits) / pow(2, param)); // what is the value of opStat_str
break;
}
case 191: {
// dex/spirits
statValue = static_cast<int32_t>((1 * spirits) / pow(2, param)); // what is the value of opStat_str
break;
}
case 192: {
// vit/spirits
statValue = static_cast<int32_t>((1 * spirits) / pow(2, param)); // what is the value of opStat_str
break;
}
case 193: {
// enr/spirits
statValue = static_cast<int32_t>((1 * spirits) / pow(2, param)); // what is the value of opStat_str
break;
}
case 200: {
// skills/souls
param = 8;
statValue = static_cast<int32_t>((1 * soulscaptured) / pow(2, param)); // what is the value of opStat_str
break;
}
case 301: {
for (auto item : items) {
const auto record = diablo2::d2_common::get_item_record(item->data_record_index);
if (record->type == 104) {
statValue = diablo2::d2_common::get_stat(item, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
}
}
break;
}
case 304: {
for (auto item : items) {
const auto record = diablo2::d2_common::get_item_record(item->data_record_index);
if (record->type == 104) {
statValue = diablo2::d2_common::get_stat(item, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
}
}
break;
}
default: {
// By default, get player stats
if (stat.is_item_stat == 0) {
int32_t statvalue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
int basevalue = 1;
switch (op) {
case 0:
statValue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
break;
case 1: // Formula: opstatbasevalue * statvalue / 100
statValue = static_cast<int32_t>(opBaseValue) / 100;
break;
case 2: // Formula: (statvalue * basevalue) / (2 ^ param)
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param));
break;
case 3: // Percentage-based version of op #2
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param)) / 100;
break;
case 4: // Item-based stat increase
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param));
break;
case 5: // Percentage-based item increase
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param)) / 100;
break;
case 11: // Similar to op #1 and #13
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param)) / 100;
break;
case 13:
statValue = static_cast<int32_t>((opBaseValue) / pow(op, param)) / 100;
break;
default:
statValue = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
break;
}
}
/*
int32_t diablo2::d2_common::set_stat(structures::unit* unit, unit_stats_t stat, uint32_t value, int16_t param) {
static wrap_func_std_import<int32_t(structures::unit*, int32_t, int32_t, int32_t)> set_stat(10517, get_base());
return set_stat(unit, stat, value, param);
}
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(randStatRangeLow, randStatRangeHigh);
unsigned int randomNumber = dis(gen);
std::random_device rdb;
std::mt19937 genb(rdb());
std::uniform_int_distribution<> randBool(1, 2);
unsigned int randomBool = randBool(genb) - 1;
if (stat.is_item_stat == 1) {
for (auto item : items) {
const auto record = diablo2::d2_common::get_item_record(item->data_record_index);
int RandStatValue = diablo2::d2_common::get_stat(item, static_cast<diablo2::unit_stats_t>(randStat), NULL);
if (record->type == stat.item_type_id && RandStatValue != 0) {
// set randStat value to random number 1 and 2^(32) = 4294967296
diablo2::d2_common::set_stat(item, static_cast<diablo2::unit_stats_t>(randStat), randomNumber, 0);
diablo2::d2_common::set_stat(item, static_cast<diablo2::unit_stats_t>(randStatBool), randomBool, 0);
}
}
}
else {
// set randStat value to random number 1 and 2^(32) = 4294967296
//diablo2::d2_common::set_stat(player, static_cast<diablo2::unit_stats_t>(randStat), randomNumber, 0);
//diablo2::d2_common::set_stat(player, static_cast<diablo2::unit_stats_t>(randStatBool), randomBool, 0);
int statValue1 = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(randStat), NULL);
int statValue2 = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(randStatBool), NULL);
if (statValue1 > 0 ) {
diablo2::d2_common::set_stat(player, static_cast<diablo2::unit_stats_t>(randStat), 0, 0);
diablo2::d2_common::set_stat(player, static_cast<diablo2::unit_stats_t>(randStatBool), 0, 0);
for (auto item : items) {
const auto record = diablo2::d2_common::get_item_record(item->data_record_index);
if (record->type == stat.item_type_id) {
statValue = diablo2::d2_common::get_stat(item, static_cast<diablo2::unit_stats_t>(stat.stat), NULL);
}
}
}
}
*/
// write code to get player name and display it using MessageBox
const auto player = diablo2::d2_client::get_local_player();
auto name = player->player_data->name;
auto statValueStr = std::to_wstring(statValue);
std::wstring statText = std::wstring(stat.stat_display_string);// .append(L" " + statValueStr);
if (!diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_STASH)
&& !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_CHARACTER)
// && !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_INVENTORY)
// && !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_SKILL)
&& !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_CHAT)
&& !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_NPCMENU)
&& !diablo2::d2_client::get_ui_window_state(diablo2::UI_WINDOW_MAINMENU)
@@ -310,21 +320,121 @@ public:
diablo2::d2_win::draw_text(const_cast<wchar_t*>(statValueStr.c_str()), stat.x2, stat.y2 + textOffset, stat.colorStatValue, 0);
/*
auto runeword = diablo2::d2_common::get_runes_txt_record(169);
// Assuming szName is a null-terminated C-string.
wchar_t wText[1024]; // Ensure this buffer is large enough to hold the converted string.
wchar_t wLine[128]; // Buffer for each line
size_t convertedChars = 0;
// Initialize vertical offset
int yOffset = 200;
// Convert and draw each field
mbstowcs_s(&convertedChars, wText, "szName: ", _TRUNCATE);
mbstowcs_s(&convertedChars, wLine, runeword->szName, _TRUNCATE);
swprintf(wText, L"%s%s", wText, wLine);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "szRuneName: ", _TRUNCATE);
mbstowcs_s(&convertedChars, wLine, runeword->szRuneName, _TRUNCATE);
swprintf(wText, L"%s%s", wText, wLine);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "nComplete: ", _TRUNCATE);
swprintf(wText, L"%s%d", wText, runeword->nComplete);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "nServer: ", _TRUNCATE);
swprintf(wText, L"%s%d", wText, runeword->nServer);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "wStringId: ", _TRUNCATE);
swprintf(wText, L"%s%d", wText, runeword->wStringId);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "pad0x84: ", _TRUNCATE);
swprintf(wText, L"%s%d", wText, runeword->pad0x84);
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "wIType: ", _TRUNCATE);
for (int i = 0; i < 6; ++i) {
swprintf(wLine, L"%d ", runeword->wIType[i]);
wcscat_s(wText, wLine);
}
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "wEType: ", _TRUNCATE);
for (int i = 0; i < 3; ++i) {
swprintf(wLine, L"%d ", runeword->wEType[i]);
wcscat_s(wText, wLine);
}
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
mbstowcs_s(&convertedChars, wText, "nRune: ", _TRUNCATE);
for (int i = 0; i < 6; ++i) {
diablo2::structures::items_line* rItem = diablo2::d2_common::get_items_txt_record(runeword->nRune[i]);
auto code = rItem->string_code;
// Ensure code is not null before attempting to use it
if (code) {
// Format code and add to wLine
//swprintf(wLine, L"%ls ", code);
// Concatenate wLine to wText
wcscat_s(wText, wLine);
}
}
diablo2::d2_win::draw_text(wText, 200, yOffset, diablo2::UI_COLOR_GOLD, 0);
yOffset += 14;
*/
}
//diablo2::d2_win::draw_boxed_text(const_cast<wchar_t*>(statText.c_str()), stat.x1, stat.y1 + textOffset, 1, 0, stat.colorStat);
//diablo2::d2_win::draw_boxed_text(const_cast<wchar_t*>(statValueStr.c_str()), stat.x2, stat.y2 + textOffset, 1, 4, stat.colorStatValue);
// diablo2::d2_win::set_current_font(diablo2::UI_FONT_16); // Set font to FONT16
//diablo2::structures::d2_cmp::init_gfx_data(&g_gfxdata);
//diablo2::d2_gfx::draw_image(&g_gfxdata, 200, 200, 1, 5, 0);
// instead try to load direct jpg with gdi and insetad ofloading jpg file, specify it bb64 encoded and decode it.
}
}
if (m_help_enabled) {
//const int windowWidth = 1280;
//const int windowHeight = 768;
//const int boxWidth = 1000;
//const int boxHeight = 680;
//const int boxX = (windowWidth - boxWidth) / 2;
//const int boxY = (windowHeight - boxHeight) / 2;
//const std::string helpText = "This is a sample help screen! You can put help text in here!?";
//// Draw filled background box
//diablo2::d2_gfx::draw_filled_rect(boxX, boxY, boxX + boxWidth, boxY + boxHeight, 0, 255);
//// Draw justified text inside the box with padding
//drawJustifiedTextInBox(helpText, boxX, boxY, boxWidth, boxHeight, 0);
}
diablo2::ui_color_t::UI_COLOR_WHITE;
// print player health, mana, and stamina bars, lastexp, nextexp, and level
// Get current HP, Mana, and Stamina along with their maximum values
int statHP = diablo2::d2_common::get_stat(player, static_cast<diablo2::unit_stats_t>(6), NULL) / 256;
@@ -349,17 +459,12 @@ public:
float manaPercentage = static_cast<float>(statMana) / static_cast<float>(statMaxMana);
float staminaPercentage = static_cast<float>(statStamina) / static_cast<float>(statMaxStamina);
int sHeight = 768;
int sWidth = 1280;
int sHCenter = sHeight / 2;
int sWCenter = sWidth / 2;
//spdlog::info("healthPercentage: {}", healthPercentage);
// Define default bar color
DWORD barColor = 0;
@@ -374,52 +479,51 @@ public:
barColor = 5;
}
//spdlog::info("barColor: {}", barColor);
// Define the dimensions for the bars
int barWidth = 200; // Width of the bars
int barHeight = 16; // Height of the bars
int pbarWidth = GetPrivateProfileIntA("Options", "pbarWidth", 200, "./d2tweaks.ini");
int pbarHeight = GetPrivateProfileIntA("Options", "pbarHeight", 16, "./d2tweaks.ini");
// Define the coordinates for the bars
int barX = sWCenter - 100; // Left coordinate of the bars
int barY_HP = 654; // Top coordinate of the HP bar
int barY_Mana = barY_HP + barHeight + 4; // Top coordinate of the Mana bar with separator
int barY_Stamina = barY_Mana + barHeight + 4; // Top coordinate of the Stamina bar with separator
std::wstring life = L"L: " + strHP + L" / " + strMaxHP;
std::wstring mana = L"M: " + strMana + L" / " + strMaxMana;
std::wstring stamina = L"" + strStamina + L" / " + strMaxStamina;
int lifeWidth = diablo2::d2_win::get_text_pixel_width(const_cast<wchar_t*>(life.c_str()));
int manaWidth = diablo2::d2_win::get_text_pixel_width(const_cast<wchar_t*>(mana.c_str()));
int staminaWidth = diablo2::d2_win::get_text_pixel_width(const_cast<wchar_t*>(stamina.c_str()));
int barX = 245; // Left coordinate of the bars
int barY_HP = 728; // Top coordinate of the HP bar
int barY_Mana = barY_HP + pbarHeight + 4; // Top coordinate of the Mana bar with separator
int barY_Stamina = barY_Mana + pbarHeight + 4; // Top coordinate of the Stamina bar with separator
std::wstring life = strHP + L" / " + strMaxHP;
std::wstring mana = strMana + L" / " + strMaxMana;
std::wstring stamina = strStamina + L" / " + strMaxStamina;
// Calculate the filled widths of the bars
int filledHPWidth = static_cast<int>(healthPercentage * barWidth);
int filledManaWidth = static_cast<int>(manaPercentage * barWidth);
int filledStaminaWidth = static_cast<int>(staminaPercentage * barWidth);
int filledHPWidth = static_cast<int>(healthPercentage * pbarWidth);
int filledManaWidth = static_cast<int>(manaPercentage * pbarWidth);
int filledStaminaWidth = static_cast<int>(staminaPercentage * pbarWidth);
// at 345 we need to minus the width of the text
sWCenter = barX + 100 - (diablo2::d2_win::get_text_pixel_width(const_cast<wchar_t*>(mana.c_str())) / 2);
HWND diabloIIWnd = FindDiabloIIWindow();
// Get player_bars_enabled from [Options] in d2tweaks.ini
int player_bars_enabled_hp = GetPrivateProfileIntA("Options", "player_bars_hp_enabled", 1, "./d2tweaks.ini");
int player_bars_X_hp = GetPrivateProfileIntA("Options", "player_bars_hp_X", barX, "./d2tweaks.ini");
int player_bars_Y_hp = GetPrivateProfileIntA("Options", "player_bars_hp_Y", barY_HP, "./d2tweaks.ini");
int player_bars_enabled_mana = GetPrivateProfileIntA("Options", "player_bars_mana_enabled", 1, "./d2tweaks.ini");
int player_bars_X_mana = GetPrivateProfileIntA("Options", "player_bars_mana_X", barX, "./d2tweaks.ini");
int player_bars_Y_mana = GetPrivateProfileIntA("Options", "player_bars_mana_Y", barY_Mana, "./d2tweaks.ini");
if (player_bars_enabled_hp == 1) {
// Draw the filled HP bar
diablo2::d2_gfx::draw_filled_rect(barX, barY_HP, barX + filledHPWidth, barY_HP + barHeight, barColor, 255);
diablo2::d2_gfx::draw_filled_rect(player_bars_X_hp, player_bars_Y_hp, barX + filledHPWidth, barY_HP + pbarHeight, barColor, 255);
//DrawFilledRect(diabloIIWnd, barX, barY_HP, barX + filledHPWidth, barY_HP + barHeight, RGB(255, 0, 0)); // Red color for HP
diablo2::d2_win::draw_text(const_cast<wchar_t*>(life.c_str()), sWCenter, barY_HP + 15, stat.colorStatValue, 0);
diablo2::d2_win::draw_text(const_cast<wchar_t*>(life.c_str()), sWCenter, barY_HP + 15, diablo2::UI_COLOR_WHITE, 0);
}
if (player_bars_enabled_mana == 1) {
// Draw the filled Mana bar
diablo2::d2_gfx::draw_filled_rect(barX, barY_Mana, barX + filledManaWidth, barY_Mana + barHeight, 140, 255);
diablo2::d2_gfx::draw_filled_rect(player_bars_X_mana, player_bars_Y_mana, barX + filledManaWidth, barY_Mana + pbarHeight, 140, 255);
//DrawFilledRect(diabloIIWnd, barX, barY_Mana, barX + filledManaWidth, barY_Mana + barHeight, RGB(100, 100, 255)); // Blue color for Mana
diablo2::d2_win::draw_text(const_cast<wchar_t*>(mana.c_str()), sWCenter, barY_Mana + 15, stat.colorStatValue, 0);
diablo2::d2_win::draw_text(const_cast<wchar_t*>(mana.c_str()), sWCenter, barY_Mana + 15, diablo2::UI_COLOR_WHITE, 0);
}
/*
// Define the number of separators
int numColors = 256;
@@ -448,10 +552,6 @@ public:
}
*/
// Draw the filled Stamina bar
// diablo2::d2_gfx::draw_filled_rect(barX, barY_Stamina, barX + filledStaminaWidth, barY_Stamina + barHeight, 12, 255);
//DrawFilledRect(diabloIIWnd, barX, barY_Stamina, barX + filledStaminaWidth, barY_Stamina + barHeight, RGB(255, 255, 0)); // Green color for Stamina
@@ -462,14 +562,6 @@ public:
diablo2::d2_win::set_current_font(diablo2::UI_FONT_16); // Set font to FONT16
}
}
}
if (!should_draw()) {
m_sort_inventory_btn->set_enabled(false);
m_sort_inventory_btn->set_visible(false);
@@ -546,12 +638,9 @@ private:
}
};
void d2_tweaks::client::modules::autosort::init_early() {
}
void d2_tweaks::client::modules::autosort::init() {
char acPathToIni[MAX_PATH] = { 0 };
const char* pcIniFile = "\\d2tweaks.ini";
@@ -584,4 +673,3 @@ void d2_tweaks::client::modules::autosort::handle_packet(common::packet_header*
diablo2::d2_common::inv_add_item(player->inventory, item, inventorySort->tx, inventorySort->ty, inventoryIndex, true, item->item_data->page);
diablo2::d2_common::inv_update_item(player->inventory, item, true);
}

Some files were not shown because too many files have changed in this diff Show More