diff --git a/L2BotDll/Events/OnEndItemListEvent.h b/L2BotDll/Events/OnEndItemListEvent.h new file mode 100644 index 0000000..8789677 --- /dev/null +++ b/L2BotDll/Events/OnEndItemListEvent.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Event.h" + +class OnEndItemListEvent : public Event +{ +public: + static constexpr const char* name = "onEndItemList"; + + const std::string GetName() const + { + return std::string(name); + } + + OnEndItemListEvent() = default; + virtual ~OnEndItemListEvent() = default; +}; \ No newline at end of file diff --git a/L2BotDll/L2BotDll.vcxproj b/L2BotDll/L2BotDll.vcxproj index 5d831f5..568fdc8 100644 --- a/L2BotDll/L2BotDll.vcxproj +++ b/L2BotDll/L2BotDll.vcxproj @@ -177,6 +177,7 @@ + diff --git a/L2BotDll/L2BotDll.vcxproj.filters b/L2BotDll/L2BotDll.vcxproj.filters index d120f92..07f609f 100644 --- a/L2BotDll/L2BotDll.vcxproj.filters +++ b/L2BotDll/L2BotDll.vcxproj.filters @@ -198,6 +198,9 @@ Header Files + + Header Files + diff --git a/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.cpp b/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.cpp index 65fcb83..8c649ec 100644 --- a/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.cpp +++ b/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.cpp @@ -14,6 +14,7 @@ #include "../../../Events/ItemAutousedEvent.h" #include "../../../Events/GameEngineTickedEvent.h" #include "../../../Events/ChatMessageCreatedEvent.h" +#include "../../../Events/OnEndItemListEvent.h" #include "../../../DTO/ItemData.h" #include "FName.h" @@ -30,6 +31,7 @@ namespace Interlude void(__thiscall* GameEngineWrapper::__OnExAutoSoulShot)(GameEngine*, L2ParamStack&) = 0; void(__thiscall* GameEngineWrapper::__Tick)(GameEngine*, float_t) = 0; void(__thiscall* GameEngineWrapper::__OnSay2)(GameEngine*, L2ParamStack&) = 0; + void(__thiscall* GameEngineWrapper::__OnEndItemList)(GameEngine*) = 0; void GameEngineWrapper::Init(HMODULE hModule) @@ -61,6 +63,9 @@ namespace Interlude (FARPROC&)__OnSay2 = (FARPROC)splice( GetProcAddress(hModule, "?OnSay2@UGameEngine@@UAEXAAVL2ParamStack@@@Z"), __OnSay2_hook ); + (FARPROC&)__OnEndItemList = (FARPROC)splice( + GetProcAddress(hModule, "?OnEndItemList@UGameEngine@@UAEXXZ"), __OnEndItemList_hook + ); } void GameEngineWrapper::Restore() @@ -73,6 +78,7 @@ namespace Interlude restore((void*&)__OnReceiveUpdateItemList); restore((void*&)__OnExAutoSoulShot); restore((void*&)__OnSay2); + restore((void*&)__OnEndItemList); } void __fastcall GameEngineWrapper::__OnSkillListPacket_hook(GameEngine* This, uint32_t, L2ParamStack& stack) @@ -185,4 +191,9 @@ namespace Interlude (*__OnSay2)(This, stack); } + void __fastcall GameEngineWrapper::__OnEndItemList_hook(GameEngine* This, uint32_t) + { + EventDispatcher::GetInstance().Dispatch(OnEndItemListEvent()); + (*__OnEndItemList)(This); + } } \ No newline at end of file diff --git a/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h b/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h index c4dbbd8..578a69d 100644 --- a/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h +++ b/L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h @@ -28,6 +28,7 @@ namespace Interlude static void(__thiscall* __OnExAutoSoulShot)(GameEngine*, L2ParamStack&); static void(__thiscall* __Tick)(GameEngine*, float_t); static void(__thiscall* __OnSay2)(GameEngine*, L2ParamStack&); + static void(__thiscall* __OnEndItemList)(GameEngine*); static void __fastcall __OnSkillListPacket_hook(GameEngine* This, uint32_t /*edx*/, L2ParamStack& stack); static int __fastcall __OnReceiveMagicSkillUse_hook(GameEngine* This, uint32_t /*edx*/, User* u1, User* u2, L2ParamStack& stack); @@ -38,6 +39,7 @@ namespace Interlude static void __fastcall __OnExAutoSoulShot_hook(GameEngine* This, uint32_t /*edx*/, L2ParamStack& stack); static void __fastcall __Tick_hook(GameEngine* This, uint32_t /*edx*/, float_t unk); static void __fastcall __OnSay2_hook(GameEngine* This, uint32_t /*edx*/, L2ParamStack& stack); + static void __fastcall __OnEndItemList_hook(GameEngine* This, uint32_t /*edx*/); private: static GameEngine* _target; diff --git a/L2BotDll/Versions/Interlude/Repositories/ItemRepository.h b/L2BotDll/Versions/Interlude/Repositories/ItemRepository.h index bc4ebf8..571362a 100644 --- a/L2BotDll/Versions/Interlude/Repositories/ItemRepository.h +++ b/L2BotDll/Versions/Interlude/Repositories/ItemRepository.h @@ -12,7 +12,7 @@ #include "../../../Events/ItemDeletedEvent.h" #include "../../../Events/HeroDeletedEvent.h" #include "../../../Events/ItemAutousedEvent.h" -#include "../../../Events/GameEngineTickedEvent.h" +#include "../../../Events/OnEndItemListEvent.h" #include "../../../Events/EventDispatcher.h" using namespace L2Bot::Domain; @@ -66,15 +66,15 @@ namespace Interlude EventDispatcher::GetInstance().Subscribe(ItemAutousedEvent::name, [this](const Event& evt) { OnItemAutoused(evt); }); - EventDispatcher::GetInstance().Subscribe(GameEngineTickedEvent::name, [this](const Event& evt) { - OnGameEngineTicked(evt); + EventDispatcher::GetInstance().Subscribe(OnEndItemListEvent::name, [this](const Event& evt) { + OnEndItemList(evt); }); } - void OnGameEngineTicked(const Event& evt) + void OnEndItemList(const Event& evt) { std::shared_lock(m_Mutex); - if (evt.GetName() == GameEngineTickedEvent::name) + if (evt.GetName() == OnEndItemListEvent::name) { for (auto it = m_Items.begin(); it != m_Items.end();) {