Skip to content

Commit

Permalink
Merge pull request #79 from bayaraa/dev
Browse files Browse the repository at this point in the history
Dev to master
  • Loading branch information
bayaraa authored Jul 13, 2023
2 parents be60a3d + 742644f commit e5a1c97
Show file tree
Hide file tree
Showing 25 changed files with 271 additions and 163 deletions.
2 changes: 1 addition & 1 deletion d2gl/src/app.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ struct D2GLApp {
bool ready = false;

std::string menu_title = "D2GL";
std::string version_str = "D2GL v1.2.0 by Bayaraa.";
std::string version_str = "D2GL v1.2.1 by Bayaraa.";
std::string ini_file = "d2gl.ini";
std::string mpq_file = "d2gl.mpq";
std::string log_file = "d2gl.log";
Expand Down
26 changes: 14 additions & 12 deletions d2gl/src/d2/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ int* video_mode = (int*)getProc((DLL_D2GFX), (0x1D208), (0x1D264), (0x1A220), (0
bool* perspective = (bool*)getProc((DLL_D2GFX), (0xE188), (0xE198), (0x10C94), (0x10C30), (0x10C8C), (0x10BE0), (0x10BE4), (0x32DA48));
bool* esc_menu_open = (bool*)getProc((DLL_D2CLIENT), (0x1248D8), (0x11A6CC), (0xFB094), (0x1040E4), (0x102B7C), (0xFADA4), (0x11C8B4), (0x3A27E4));
bool* is_alt_clicked = (bool*)getProc((DLL_D2CLIENT), (0x1248E8), (0x11A6DC), (0xFB0A4), (0x1040F4), (0x102B8C), (0xFADB4), (0x11C8C4), (0x3A27F4));
int is_unit_hovered = 0;

uint32_t* is_in_game = (uint32_t*)getProc((DLL_D2CLIENT), (0x1109FC), (0x1077C4), (0xE48EC), (0xF18C0), (0x11BCC4), (0xF8C9C), (0xF79E0), (0x3A27C0));
UnitAny* player_unit = (UnitAny*)getProc((DLL_D2CLIENT), (0x1263F8), (0x11C200), (0x11C4F0), (0x11C1E0), (0x11C3D0), (0x11BBFC), (0x11D050), (0x3A6A70));
Expand Down Expand Up @@ -113,9 +114,6 @@ getUnitRoom_t getUnitRoom = (getUnitRoom_t)getProc((DLL_D2COMMON), (), (), (), (
getLevelNoByRoom_t getLevelNoByRoom = (getLevelNoByRoom_t)getProc((DLL_D2COMMON), (), (), (), (), (), (), (-10691), ());
uintptr_t getLevelName_Fn = getProc((DLL_D2CLIENT), (0x88420), (0x839F0), (0x9DC10), (0x61AA0), (0x8B1A0), (0xBE240), (0x18250), (0x53E70));

// Offset D2WinUnitHover = getOffset((DLL_D2WIN), (), (-10124, 0xF7E9C1FA, 0x1F3), (-10175, 0x03C2572B, 0x1A3), (-10037, 0x03C2572B, 0x1A3), (-10201, 0x03C2572B, 0x1A3), (-10110, 0x03C2572B, 0x1A3), (-10124, 0x03C2572B, 0x1A3), (0x10318B, 0x03C22BF0));
// DWORD D2WinUnitHoverRet = helpers::GetProcOffset(D2WinUnitHover) + (isVer(V_110) ? 5 : 6);

// d2client + 0x291F8 : 1 2 3 4 (potion keys)
// d2client + 0x27708 : life XX/XX
// d2client + 0x277C7 : Mana XX/XX
Expand All @@ -136,17 +134,15 @@ void initHooks()
*is_in_game = 0;

Patch no_intro = Patch();
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F0C), (0x27A58), (0x1E210), (0x1E11C), (0x1E240), (0x1E0FC), (0x1E2F4), (0x2D4C84)), 4, 0x00000000);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F34), (0x27A80), (0x1E238), (0x1E144), (0x1E268), (0x1E124), (0x1E31C), (0x2D4CAC)), 4, 0x00000000);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F5C), (0x27AA8), (0x1E260), (0x1E16C), (0x1E290), (0x1E14C), (0x1E344), (0x2D4CD4)), 4, 0x00000000);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F84), (0x27AD0), (0x1E288), (0x1E194), (0x1E2B8), (0x1E174), (0x1E36C), (0x2D4CFC)), 4, 0x00000000);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F0C), (0x27A58), (0x1E210), (0x1E11C), (0x1E240), (0x1E0FC), (0x1E2F4), (0x2D4C84)), 1, 0x00);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F34), (0x27A80), (0x1E238), (0x1E144), (0x1E268), (0x1E124), (0x1E31C), (0x2D4CAC)), 1, 0x00);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F5C), (0x27AA8), (0x1E260), (0x1E16C), (0x1E290), (0x1E14C), (0x1E344), (0x2D4CD4)), 1, 0x00);
no_intro.add(PatchType::Swap, getOffset((DLL_D2LAUNCH), (0x24F84), (0x27AD0), (0x1E288), (0x1E194), (0x1E2B8), (0x1E174), (0x1E36C), (0x2D4CFC)), 1, 0x00);
no_intro.toggle(App.skip_intro);

if (isVer(V_113d)) {
Patch multiple_instance = Patch();
multiple_instance.add(PatchType::Swap, getOffset((DLL_D2GFX), (), (), (), (), (), (), (0xB6B0), ()), 2, 0xEB450000);
multiple_instance.toggle(true);
}
Patch multiple_instance = Patch();
multiple_instance.add(PatchType::Swap, getOffset((DLL_D2GFX), (0x447C), (0x446A), (0x84CF), (0x84AF), (0x894F), (0x85BF), (0xB6B0), (0xF562B)), 2, isVer(V_109d) ? 0xEB47 : (isVer(V_110) ? 0xEB49 : 0xEB45));
multiple_instance.toggle(true);

Patch game_loop = Patch();
game_loop.add(PatchType::Call, getOffset((DLL_D2CLIENT), (0x9B3D, 0xE87A5F0B), (0xA2A2, 0xE8B51B0C), (0x89A2F, 0xE84A37F8), (0x3356F, 0xE85E9CFD), (0x7D1BF, 0xE84801F9), (0x44E2F, 0xE81A85FC), (0x45E7F, 0xE8E473FC), (0x4F256, 0xE8E5550C)), 5, (uintptr_t)gameDrawBeginStub);
Expand Down Expand Up @@ -185,6 +181,12 @@ void initHooks()
App.mini_map.active = false;
}

Patch common_patches = Patch();
common_patches.add(PatchType::Auto, getOffset((DLL_D2WIN, 0x85F60F9E, 0xC7), (-10124, 0, 0x150), (-10124, 0, 0x127), (-10175), (-10037), (-10201), (-10110), (-10124), (0x1030B4, 0x85DB0F9E, -1)), 5, (uintptr_t)unitHoverBeginPatch);
common_patches.add(PatchType::Auto, getOffset((DLL_D2WIN, 0x8D140152, 0x162), (-10124, 0x03C55650, 0x1CC), (-10124, 0x03C55650, 0x1A3), (-10175), (-10037), (-10201), (-10110), (-10124), (0x10314B, 0, -1)), 5, (uintptr_t)unitHoverMidPatch);
common_patches.add(PatchType::Auto, getOffset((DLL_D2WIN, 0xC1E81F03, 0x1A0), (-10124, 0, 0x228), (-10124, 0, 0x1FF), (-10175), (-10037), (-10201), (-10110), (-10124), (0x103188, 0, -1)), 5, (uintptr_t)unitHoverEndPatch);
common_patches.toggle(true);

patch_motion_prediction = std::make_unique<Patch>();
patch_motion_prediction->add(PatchType::Auto, getOffset((DLL_D2CLIENT, 0x83EC1053), (0x7FCF0, 0x83EC5053), (0x7B4F0, 0x83EC4C53), (0x941F0), (0x15C80), (0x71990), (0x7CA40), (0x76170), (0xA0A01, 0x8BEC83EC)), 5, (uintptr_t)(isVer(V_109d) ? rectangledTextBeginStub109d : (isVer(V_110) ? rectangledTextBeginStub110f : rectangledTextBeginStub)));
patch_motion_prediction->add(PatchType::Auto, getOffset((DLL_D2CLIENT, 0x5D5B83C4), (0x7FE50), (0x7B650), (0x9431A), (0x15DAA), (0x71ABA), (0x7CB6A), (0x7629A), (0xA0B1B, 0x5E5B8BE5)), 5, (uintptr_t)rectangledTextEndStub);
Expand Down
1 change: 1 addition & 0 deletions d2gl/src/d2/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ extern int* video_mode;
extern bool* perspective;
extern bool* esc_menu_open;
extern bool* is_alt_clicked;
extern int is_unit_hovered;

extern uint32_t* is_in_game;
extern UnitAny* player_unit;
Expand Down
9 changes: 7 additions & 2 deletions d2gl/src/d2/funcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ bool isUnitDead(UnitAny* unit)
return unit && (d2::getUnitFlag(unit) & 0x10000);
}

wchar_t* getPlayerName(UnitAny* unit)
char* getPlayerName(UnitAny* unit)
{
return (wchar_t*)(isVer(V_109d) ? unit->v109.pPlayerData->szName : unit->v110.pPlayerData->szName);
return (char*)(isVer(V_109d) ? unit->v109.pPlayerData->szName : unit->v110.pPlayerData->szName);
}

MonsterType getMonsterType(UnitAny* unit)
Expand Down Expand Up @@ -413,6 +413,11 @@ void drawRectFrame()
modules::HDText::Instance().drawRectFrame();
}

void drawUnitHealthBar()
{
modules::HDText::Instance().drawUnitHealthBar();
}

void loadUIImage()
{
modules::HDText::Instance().loadUIImage();
Expand Down
3 changes: 2 additions & 1 deletion d2gl/src/d2/funcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ uint32_t getUnitStat(UnitAny* unit, uint32_t stat);
UnitAny* getSelectedItem();

bool isUnitDead(UnitAny* unit);
wchar_t* getPlayerName(UnitAny* unit);
char* getPlayerName(UnitAny* unit);
MonsterType getMonsterType(UnitAny* unit);
wchar_t* getMonsterName(UnitAny* unit);

Expand Down Expand Up @@ -86,6 +86,7 @@ void rectangledTextEnd();
void unitHoverText();
void altItemsText();
void drawRectFrame();
void drawUnitHealthBar();

void loadUIImage();
void drawSubTextA();
Expand Down
29 changes: 29 additions & 0 deletions d2gl/src/d2/stubs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,35 @@ __declspec(naked) void altItemsTextStub109d()
}
}

__declspec(naked) void unitHoverBeginPatch()
{
__asm
{
mov is_unit_hovered, 0x1
ret
}
}

__declspec(naked) void unitHoverMidPatch()
{
__asm
{
mov is_unit_hovered, 0x2
ret
}
}

__declspec(naked) void unitHoverEndPatch()
{
__asm
{
pushad
call drawUnitHealthBar
popad
ret
}
}

__declspec(naked) void loadUIImageStub()
{
__asm
Expand Down
4 changes: 4 additions & 0 deletions d2gl/src/d2/stubs.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ void altItemsTextStub();
void altItemsTextStub110f();
void altItemsTextStub109d();

void unitHoverBeginPatch();
void unitHoverMidPatch();
void unitHoverEndPatch();

void loadUIImageStub();
void loadUIImageStubECX();
void drawSubTextAStub();
Expand Down
13 changes: 9 additions & 4 deletions d2gl/src/graphic/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ Context::Context()
LARGE_INTEGER qpf;
QueryPerformanceFrequency(&qpf);
m_frame.frequency = double(qpf.QuadPart) / 1000.0;
m_frame.frame_times.assign(FRAMETIME_SAMPLE_COUNT, m_frame.frame_time);
m_frame.frame_times.assign(MAX_FRAMETIME_SAMPLE_COUNT, m_frame.frame_time);

m_limiter.timer = CreateWaitableTimer(NULL, TRUE, NULL);
setFpsLimit(!App.vsync && App.foreground_fps.active, App.foreground_fps.range.value);
Expand Down Expand Up @@ -641,7 +641,7 @@ void Context::onResize(glm::uvec2 w_size, glm::uvec2 g_size, uint32_t bpp)
m_upscale_ubo->updateDataVec2f("out_size", { (float)App.game.tex_size.x * App.viewport.scale.x, (float)App.game.tex_size.y * App.viewport.scale.y });
m_postfx_ubo->updateDataVec2f("rel_size", { 1.0f / App.viewport.size.x, 1.0f / App.viewport.size.y });
m_mod_pipeline->setUniformVec2f("u_Scale", App.viewport.scale);
m_mod_pipeline->setUniformVec2f("u_ViewportSize", { (float)App.viewport.size.x, (float)App.viewport.size.y });
m_mod_pipeline->setUniformVec4f("u_Viewport", { (float)App.viewport.offset.x, (float)App.viewport.offset.y, (float)App.viewport.size.x, (float)App.viewport.size.y });

modules::MiniMap::Instance().resize();
toggleVsync();
Expand Down Expand Up @@ -707,15 +707,17 @@ void Context::onStageChange()

modules::MiniMap::Instance().draw();
}
modules::HDText::Instance().drawEntryText();
modules::HDText::drawFpsCounter();
break;
case DrawStage::CursorItem:
flushVertices();
setVertexFlagW(10);
break;
case DrawStage::Cursor:
flushVertices();
setVertexFlagW(10);
appendDelayedObjects();
modules::HDText::Instance().drawEntryText();
#ifdef _HDTEXT
modules::HDText::showSampleText();
#endif
Expand Down Expand Up @@ -791,7 +793,9 @@ void Context::presentFrame()

m_frame.frame_times.pop_front();
m_frame.frame_times.push_back(m_frame.frame_time);
m_frame.average_frame_time = std::reduce(m_frame.frame_times.begin(), m_frame.frame_times.end()) / FRAMETIME_SAMPLE_COUNT;
std::deque<double>::iterator iter = m_frame.frame_times.begin() + (MAX_FRAMETIME_SAMPLE_COUNT - m_frame.frame_sample_count);
m_frame.average_frame_time = std::reduce(iter, m_frame.frame_times.end()) / m_frame.frame_sample_count;
m_frame.frame_sample_count += m_frame.frame_sample_count == MAX_FRAMETIME_SAMPLE_COUNT ? 0 : 1;
m_frame.frame_count++;
}

Expand Down Expand Up @@ -902,6 +906,7 @@ void Context::setFpsLimit(bool active, int max_fps)
m_limiter.active = active;
m_limiter.frame_len_ms = 1000.0f / max_fps;
m_limiter.frame_len_ns = (uint64_t)(m_limiter.frame_len_ms * 10000);
m_frame.frame_sample_count = 1;

resetFileTime();
}
Expand Down
3 changes: 2 additions & 1 deletion d2gl/src/graphic/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace d2gl {
#define MAX_VERTICES 4 * 50000
#define MAX_VERTICES_MOD 4 * 20000
#define PIXEL_BUFFER_SIZE 12 * 1024 * 1024
#define FRAMETIME_SAMPLE_COUNT 120
#define MAX_FRAMETIME_SAMPLE_COUNT 120

#define TEXTURE_SLOT_DEFAULT 0
#define TEXTURE_SLOT_GAME 1
Expand Down Expand Up @@ -91,6 +91,7 @@ struct FrameMetrics {
uint32_t vertex_count = 0;
uint32_t drawcall_count = 0;
uint32_t frame_count = 0;
uint32_t frame_sample_count = 0;
};

struct LimiterMetrics {
Expand Down
8 changes: 4 additions & 4 deletions d2gl/src/graphic/shaders/mod.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ in vec2 v_Extra;
uniform vec2 u_Scale;
uniform vec4 u_TextMask;
uniform bool u_IsMasking = false;
uniform vec2 u_ViewportSize;
uniform vec4 u_Viewport;

float msdf(vec3 rgb, float smoothess, float weight)
{
Expand Down Expand Up @@ -119,7 +119,7 @@ void main()
FragColor = texture(u_MapTexture, v_TexCoord);
FragColor.rgb = greyscale(FragColor.rgb, 0.2);
if (v_Flags.z > 0u)
FragColor.a *= v_Flags.z / 100.0;
FragColor.a *= (float(v_Flags.z) * 0.01);
break;
case 6u:
FragColor = v_Color1;
Expand Down Expand Up @@ -160,10 +160,10 @@ void main()
break;
}
if (v_Flags.z > 0u)
FragColor.a *= v_Flags.z / 100.0;
FragColor.a *= (float(v_Flags.z) * 0.01);
}

if (texture(u_MaskTexture, gl_FragCoord.xy / u_ViewportSize).r > 0.1)
if (texture(u_MaskTexture, (gl_FragCoord.xy - u_Viewport.xy) / u_Viewport.zw).r > 0.1)
FragColor.a = 0.0;
}

Expand Down
24 changes: 12 additions & 12 deletions d2gl/src/graphic/shaders/mod.glsl.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,16 @@
"uniform vec2 u_Scale;"
"uniform vec4 u_TextMask;"
"uniform bool u_IsMasking=false;"
"uniform vec2 u_ViewportSize;"
"float v(vec3 v,float u,float i)"
"uniform vec4 u_Viewport;"
"float v(vec3 v,float u,float y)"
"{"
"float r=max(min(v.x,v.y),min(max(v.x,v.y),v.z)),n=max(u,1.)*(r-1.+.5*i);"
"float r=max(min(v.x,v.y),min(max(v.x,v.y),v.z)),n=max(u,1.)*(r-1.+.5*y);"
"return clamp(n+.5,0.,1.);"
"}"
"vec3 v(vec3 v,float u)"
"{"
"float r=dot(v,vec3(.299,.587,.114));"
"return mix(v,vec3(r),u);"
"float y=dot(v,vec3(.299,.587,.114));"
"return mix(v,vec3(y),u);"
"}"
"void main()"
"{"
Expand Down Expand Up @@ -78,13 +78,13 @@
"else "
"if(v_Flags.w==1u)"
"{"
"float r=v(d.xyz,v_Extra.x,v_Extra.y+.02),y=v(d.xyz,v_Extra.x,1.01);"
"FragColor=vec4(mix(v_Color2.xyz,v_Color1.xyz,y),v_Color1.w*r);"
"float y=v(d.xyz,v_Extra.x,v_Extra.y+.02),r=v(d.xyz,v_Extra.x,1.01);"
"FragColor=vec4(mix(v_Color2.xyz,v_Color1.xyz,r),v_Color1.w*y);"
"}"
"else "
"{"
"float r=smoothstep(1.5,1.,u_Scale.x),n=v(d.xyz,v_Extra.x/(1.+r),v_Extra.y);"
"FragColor=vec4(v_Color1.xyz,v_Color1.w*n*(1.+.2*r));"
"float y=smoothstep(1.5,1.,u_Scale.x),r=v(d.xyz,v_Extra.x/(1.+y),v_Extra.y);"
"FragColor=vec4(v_Color1.xyz,v_Color1.w*r*(1.+.2*y));"
"}"
"if(u_IsMasking&&v_Flags.z==0u)"
"if(u_TextMask.x<v_Position.x&&u_TextMask.z>v_Position.x&&u_TextMask.y>v_Position.y&&u_TextMask.w<v_Position.y)"
Expand All @@ -100,7 +100,7 @@
"FragColor=texture(u_MapTexture,v_TexCoord);"
"FragColor.xyz=v(FragColor.xyz,.2);"
"if(v_Flags.z>0u)"
"FragColor.w*=v_Flags.z/1e2;"
"FragColor.w*=float(v_Flags.z)*.01;"
"break;"
"case 6u:"
"FragColor=v_Color1;"
Expand Down Expand Up @@ -140,9 +140,9 @@
"break;"
"}"
"if(v_Flags.z>0u)"
"FragColor.w*=v_Flags.z/1e2;"
"FragColor.w*=float(v_Flags.z)*.01;"
"}"
"if(texture(u_MaskTexture,gl_FragCoord.xy/u_ViewportSize).x>.1)"
"if(texture(u_MaskTexture,(gl_FragCoord.xy-u_Viewport.xy)/u_Viewport.zw).x>.1)"
"FragColor.w=0.;"
"}"
"\n#endif"
Loading

0 comments on commit e5a1c97

Please sign in to comment.