diff --git a/Client/Domain/Enums/OutgoingMessageTypeEnum.cs b/Client/Domain/Enums/OutgoingMessageTypeEnum.cs index 2692dc9..6832cc9 100644 --- a/Client/Domain/Enums/OutgoingMessageTypeEnum.cs +++ b/Client/Domain/Enums/OutgoingMessageTypeEnum.cs @@ -17,6 +17,7 @@ namespace Client.Domain.Enums UseItem, ToggleSoulshot, Sit, - Stand + Stand, + RestartPoint } } diff --git a/Client/Domain/Enums/RestartPointTypeEnum.cs b/Client/Domain/Enums/RestartPointTypeEnum.cs new file mode 100644 index 0000000..f1ba979 --- /dev/null +++ b/Client/Domain/Enums/RestartPointTypeEnum.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Client.Domain.Enums +{ + public enum RestartPointTypeEnum: short + { + Village = 0, + ClanHall, + Castle, + Siege, + Festival, + Jail = 27 + } +} diff --git a/Client/Domain/Service/WorldHandler.cs b/Client/Domain/Service/WorldHandler.cs index 78caa90..c755e43 100644 --- a/Client/Domain/Service/WorldHandler.cs +++ b/Client/Domain/Service/WorldHandler.cs @@ -177,6 +177,15 @@ namespace Client.Domain.Service SendMessage(OutgoingMessageTypeEnum.Stand); } + public void RequestRestartPoint(RestartPointTypeEnum type) + { + if (hero == null) + { + return; + } + + SendMessage(OutgoingMessageTypeEnum.RestartPoint, type); + } private void SendMessage(OutgoingMessageTypeEnum type, T? content = default) { diff --git a/L2BotCore/Domain/Enums/RestartPointTypeEnum.h b/L2BotCore/Domain/Enums/RestartPointTypeEnum.h new file mode 100644 index 0000000..0973fcf --- /dev/null +++ b/L2BotCore/Domain/Enums/RestartPointTypeEnum.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace L2Bot::Domain::Enums +{ + enum class RestartPointTypeEnum : uint8_t + { + village = 0, + clanhall, + castle, + siege, + festival, + jail = 27 + }; +} \ No newline at end of file diff --git a/L2BotCore/Domain/Serializers/IncomingMessage.h b/L2BotCore/Domain/Serializers/IncomingMessage.h index 4425243..0bf18be 100644 --- a/L2BotCore/Domain/Serializers/IncomingMessage.h +++ b/L2BotCore/Domain/Serializers/IncomingMessage.h @@ -19,7 +19,8 @@ namespace L2Bot::Domain::Serializers useItem, toggleSoulshot, sit, - stand + stand, + restartPoint }; const Type GetType() const diff --git a/L2BotCore/Domain/Services/HeroServiceInterface.h b/L2BotCore/Domain/Services/HeroServiceInterface.h index c4cfd2b..c7ad194 100644 --- a/L2BotCore/Domain/Services/HeroServiceInterface.h +++ b/L2BotCore/Domain/Services/HeroServiceInterface.h @@ -3,6 +3,7 @@ #include #include "../DTO/EntityState.h" #include "../ValueObjects/Vector3.h" +#include "../Enums/RestartPointTypeEnum.h" namespace L2Bot::Domain::Services { @@ -18,5 +19,6 @@ namespace L2Bot::Domain::Services virtual void ToggleAutouseSoulshot(int objectId) const = 0; virtual void Sit() const = 0; virtual void Stand() const = 0; + virtual void RestartPoint(Enums::RestartPointTypeEnum type) const = 0; }; } diff --git a/L2BotCore/Domain/Services/IncomingMessageProcessor.h b/L2BotCore/Domain/Services/IncomingMessageProcessor.h index 0edf915..78c1f49 100644 --- a/L2BotCore/Domain/Services/IncomingMessageProcessor.h +++ b/L2BotCore/Domain/Services/IncomingMessageProcessor.h @@ -3,6 +3,7 @@ #include #include "../Serializers/IncomingMessageFactoryInterface.h" #include "HeroServiceInterface.h" +#include "../Enums/RestartPointTypeEnum.h" namespace L2Bot::Domain::Services { @@ -51,6 +52,9 @@ namespace L2Bot::Domain::Services case Serializers::IncomingMessage::Type::stand: m_HeroService.Stand(); break; + case Serializers::IncomingMessage::Type::restartPoint: + m_HeroService.RestartPoint(message.GetRawContent()); + break; } return message.GetType(); diff --git a/L2BotCore/L2BotCore.vcxproj b/L2BotCore/L2BotCore.vcxproj index 74676c7..60e7c50 100644 --- a/L2BotCore/L2BotCore.vcxproj +++ b/L2BotCore/L2BotCore.vcxproj @@ -176,6 +176,7 @@ + diff --git a/L2BotCore/L2BotCore.vcxproj.filters b/L2BotCore/L2BotCore.vcxproj.filters index 5b681ef..19eb53c 100644 --- a/L2BotCore/L2BotCore.vcxproj.filters +++ b/L2BotCore/L2BotCore.vcxproj.filters @@ -240,6 +240,9 @@ Header Files + + Header Files + diff --git a/L2BotDll/Serializers/JsonIncomingMessageFactory.h b/L2BotDll/Serializers/JsonIncomingMessageFactory.h index cc23b20..a083139 100644 --- a/L2BotDll/Serializers/JsonIncomingMessageFactory.h +++ b/L2BotDll/Serializers/JsonIncomingMessageFactory.h @@ -3,6 +3,7 @@ #include "Domain/Serializers/IncomingMessageFactoryInterface.h" #include "../ThirdParty/json.hpp" #include "Domain/ValueObjects/Vector3.h" +#include "Domain/Enums/RestartPointTypeEnum.h" using namespace L2Bot::Domain; using json = nlohmann::json; @@ -112,6 +113,14 @@ private: Serializers::IncomingMessage::Type::stand }; } + else if (type == "RestartPoint") + { + return Serializers::IncomingMessage + { + Serializers::IncomingMessage::Type::restartPoint, + std::make_shared(jsonObject.get()) + }; + } return Serializers::IncomingMessage(); } diff --git a/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.cpp b/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.cpp index e4e2e74..7086860 100644 --- a/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.cpp +++ b/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.cpp @@ -26,6 +26,7 @@ namespace Interlude int(__thiscall* NetworkHandlerWrapper::__RequestUseItem)(NetworkHandler*, L2ParamStack&) = 0; void(__thiscall* NetworkHandlerWrapper::__RequestAutoSoulShot)(NetworkHandler*, L2ParamStack&) = 0; void(__thiscall* NetworkHandlerWrapper::__ChangeWaitType)(NetworkHandler*, int) = 0; + void(__thiscall* NetworkHandlerWrapper::__RequestRestartPoint)(NetworkHandler*, L2ParamStack&) = 0; Item* NetworkHandlerWrapper::GetNextItem(float_t radius, int prevId) const { @@ -193,6 +194,19 @@ namespace Interlude } } + void NetworkHandlerWrapper::RequestRestartPoint(L2ParamStack& stack) const + { + __try { + if (__RequestRestartPoint && _target) { + (*__RequestRestartPoint)(_target, stack); + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + throw CriticalRuntimeException(L"UNetworkHandler::RequestRestartPoint failed"); + } + } + void NetworkHandlerWrapper::Init(HMODULE hModule) { void* initAddress = GetProcAddress(hModule, "?Tick@UNetworkHandler@@UAEXM@Z"); @@ -210,6 +224,7 @@ namespace Interlude (FARPROC&)__RequestUseItem = GetProcAddress(hModule, "?RequestUseItem@UNetworkHandler@@UAEHAAVL2ParamStack@@@Z"); (FARPROC&)__RequestAutoSoulShot = GetProcAddress(hModule, "?RequestAutoSoulShot@UNetworkHandler@@UAEXAAVL2ParamStack@@@Z"); (FARPROC&)__ChangeWaitType = GetProcAddress(hModule, "?ChangeWaitType@UNetworkHandler@@UAEXH@Z"); + (FARPROC&)__RequestRestartPoint = GetProcAddress(hModule, "?RequestRestartPoint@UNetworkHandler@@UAEXAAVL2ParamStack@@@Z"); (FARPROC&)__AddNetworkQueue = (FARPROC)splice( GetProcAddress(hModule, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z"), __AddNetworkQueue_hook diff --git a/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.h b/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.h index 7a7146e..d219459 100644 --- a/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.h +++ b/L2BotDll/Versions/Interlude/GameStructs/NetworkHandlerWrapper.h @@ -31,6 +31,7 @@ namespace Interlude int RequestUseItem(L2ParamStack& stack) const; void RequestAutoSoulShot(L2ParamStack& stack) const; void ChangeWaitType(int type) const; + void RequestRestartPoint(L2ParamStack& stack) const; private: static void __fastcall __Init_hook(NetworkHandler* This, int /*edx*/, float unk); @@ -52,6 +53,7 @@ namespace Interlude static void(__thiscall* __RequestAutoSoulShot)(NetworkHandler*, L2ParamStack&); //params objectId, unk static void(__thiscall* __ChangeWaitType)(NetworkHandler*, int); + static void(__thiscall* __RequestRestartPoint)(NetworkHandler*, L2ParamStack&); private: static void* originalInitAddress; diff --git a/L2BotDll/Versions/Interlude/Services/HeroService.h b/L2BotDll/Versions/Interlude/Services/HeroService.h index 02e27cb..f9f8d4a 100644 --- a/L2BotDll/Versions/Interlude/Services/HeroService.h +++ b/L2BotDll/Versions/Interlude/Services/HeroService.h @@ -4,6 +4,7 @@ #include "../Repositories/ItemRepository.h" #include "../GameStructs/NetworkHandlerWrapper.h" #include "../GameStructs/L2GameDataWrapper.h" +#include "Domain/Enums/RestartPointTypeEnum.h" using namespace L2Bot::Domain; @@ -123,6 +124,16 @@ namespace Interlude m_NetworkHandler.ChangeWaitType(1); } + void RestartPoint(Enums::RestartPointTypeEnum type) const override + { + L2ParamStack* stack = new L2ParamStack(1); + stack->PushBack((void*)type); + + m_NetworkHandler.RequestRestartPoint(*stack); + + delete stack; + } + private: const NetworkHandlerWrapper& m_NetworkHandler; const ItemRepository& m_ItemRespository;