Skip to content
This repository has been archived by the owner on Jun 12, 2024. It is now read-only.

Commit

Permalink
feat: Update hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
Pd233 committed Nov 14, 2023
1 parent 25c2b7d commit 270eed2
Show file tree
Hide file tree
Showing 22 changed files with 148 additions and 111 deletions.
14 changes: 12 additions & 2 deletions src/Events/HookEventBase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using Hosihikari.Minecraft.Extension.Events.Implements;
using Hosihikari.NativeInterop.Hook.ObjectOriented;

Expand All @@ -17,7 +16,15 @@ public abstract class HookEventBase<TEventArgs, THookDelegate> : HookBase<THookD
protected HookEventBase(string symbol, [CallerFilePath] string sourceFile = "")
: base(symbol)
{
_className = Path.GetFileNameWithoutExtension(
_className = System.IO.Path.GetFileNameWithoutExtension(
sourceFile.Replace("\\", "/") /*fix if compile in windows*/
);
}

protected HookEventBase(Delegate func, [CallerFilePath] string sourceFile = "")
: base(func)
{
_className = System.IO.Path.GetFileNameWithoutExtension(
sourceFile.Replace("\\", "/") /*fix if compile in windows*/
);
}
Expand Down Expand Up @@ -134,6 +141,9 @@ public abstract class HookCancelableEventBase<TEventArgs, THookDelegate>
protected HookCancelableEventBase(string symbol, [CallerFilePath] string sourceFile = "")
: base(symbol, sourceFile) { }

protected HookCancelableEventBase(Delegate func, [CallerFilePath] string sourceFile = "")
: base(func, sourceFile) { }

protected override void OnEventAfter(TEventArgs e)
{
//if the event canceled in before-event,the will not pass to after-event
Expand Down
61 changes: 33 additions & 28 deletions src/Events/Implements/Player/ChatEvent.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;

public class ChatEventArgs : CancelableEventArgsBase
{
Expand All @@ -9,41 +11,44 @@ public class ChatEventArgs : CancelableEventArgsBase
public class ChatEvent : HookCancelableEventBase<ChatEventArgs, ChatEvent.HookDelegate>
{
public ChatEvent()
: base("_ZN20ServerNetworkHandler6handleERK17NetworkIdentifierRK10TextPacket") { }
: base(ServerNetworkHandler.Original.Handle) { }

public unsafe delegate void HookDelegate(
void* networkHandler,
void* networkIdentifier,
void* textPacket
Pointer<ServerNetworkHandler> networkHandler,
Reference<NetworkIdentifier> networkIdentifier,
Reference<TextPacket> textPacket
);

public override unsafe HookDelegate HookedFunc =>
(networkHandlerPtr, networkIdentifierPtr, textPacketPtr) =>
{
{
try
{
var networkHandler = new ServerNetworkHandler(networkHandlerPtr);
var networkIdentifier = new NetworkIdentifier(networkIdentifierPtr);
var packet = new Packet(textPacketPtr);
if (networkHandler.TryFetchPlayer(networkIdentifier, packet, out var player))
{
var textType = *((byte*)textPacketPtr + OffsetData.Current.TextPacketTextTypeOffsetByte);//44
if (textType != 1)//not a chat packet
{
Original(networkHandlerPtr, networkIdentifierPtr, textPacketPtr);
return;
}
var e = new ChatEventArgs
{
ServerPlayer = player,
Message = NativeInterop.Utils.StringUtils.MarshalStdString((byte*)textPacketPtr + OffsetData.Current.TextPacketMessageOffsetByte)//80
};
OnEventBefore(e);
if (e.IsCanceled)
return; //cancel the original
Original(networkHandlerPtr, networkIdentifierPtr, textPacketPtr);
OnEventAfter(e);
}
var networkHandler = networkHandlerPtr.Target;
var networkIdentifier = networkIdentifierPtr.Target;
var packet = textPacketPtr.Target;
throw new NotImplementedException();
//if (networkHandler.TryFetchPlayer(networkIdentifier, packet, out var player))
//{
// var textType = *((byte*)textPacketPtr + OffsetData.Current.TextPacketTextTypeOffsetByte);//44
// if (textType != 1)//not a chat packet
// {
// Original(networkHandlerPtr, networkIdentifierPtr, textPacketPtr);
// return;
// }
// var e = new ChatEventArgs
// {
// ServerPlayer = player,
// Message = NativeInterop.Utils.StringUtils.MarshalStdString((byte*)textPacketPtr + OffsetData.Current.TextPacketMessageOffsetByte)//80
// };
// OnEventBefore(e);
// if (e.IsCanceled)
// return; //cancel the original
// Original(networkHandlerPtr, networkIdentifierPtr, textPacketPtr);
// OnEventAfter(e);
//}
}
catch (Exception ex)
{
Expand Down
10 changes: 6 additions & 4 deletions src/Events/Implements/Player/DeathEvent.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;

public class DeathEventArgs : EventArgsBase
{
Expand All @@ -10,18 +12,18 @@ public class DeathEventArgs : EventArgsBase
//Actor::getIsExperienceDropEnabled
public class DeathEvent : HookEventBase<DeathEventArgs, DeathEvent.HookDelegate>
{
public unsafe delegate void HookDelegate(void* serverPlayerPtr, void* damageSource);
public unsafe delegate void HookDelegate(Pointer<ServerPlayer> serverPlayerPtr, Reference<ActorDamageSource> damageSource);

public DeathEvent()
: base("?die@ServerPlayer@@UEAAXAEBVActorDamageSource@@@Z") { }
: base(ServerPlayer.Original.Die) { }

public override unsafe HookDelegate HookedFunc =>
(serverPlayerPtr, damageSource) =>
{
var needCallOriginal = true;
try
{
var e = new DeathEventArgs { ServerPlayer = new ServerPlayer(serverPlayerPtr) };
var e = new DeathEventArgs { ServerPlayer = serverPlayerPtr.Target };
OnEventBefore(e);
needCallOriginal = false;
Original(serverPlayerPtr, damageSource);
Expand Down
11 changes: 5 additions & 6 deletions src/Events/Implements/Player/InitializedEvent.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;

public class InitializedEventArgs : EventArgsBase
Expand All @@ -7,20 +9,17 @@ public class InitializedEventArgs : EventArgsBase

public class InitializedEvent : HookEventBase<InitializedEventArgs, InitializedEvent.HookDelegate>
{
public unsafe delegate void HookDelegate(void* serverPlayerPtr);
public unsafe delegate void HookDelegate(Pointer<ServerPlayer> serverPlayerPtr);

public InitializedEvent()
: base("_ZN12ServerPlayer27setLocalPlayerAsInitializedEv") { }
: base(ServerPlayer.Original.SetLocalPlayerAsInitialized) { }

public override unsafe HookDelegate HookedFunc =>
(serverPlayerPtr) =>
{
try
{
var e = new InitializedEventArgs
{
ServerPlayer = new ServerPlayer(serverPlayerPtr)
};
var e = new InitializedEventArgs { ServerPlayer = serverPlayerPtr.Target };
OnEventBefore(e);
Original(serverPlayerPtr);
OnEventAfter(e);
Expand Down
17 changes: 9 additions & 8 deletions src/Events/Implements/Player/JoinEvent.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;

public class JoinEventArgs : EventArgsBase
Expand All @@ -8,23 +10,22 @@ public class JoinEventArgs : EventArgsBase
public class JoinEvent : HookEventBase<JoinEventArgs, JoinEvent.HookDelegate>
{
public unsafe delegate void HookDelegate(
void* serverNetworkHandler,
void* networkIdentifier,
void* connectionRequest,
void* serverPlayerPtr
Pointer<ServerNetworkHandler> serverNetworkHandler,
Reference<NetworkIdentifier> a1,
Reference<ConnectionRequest> a2,
Reference<ServerPlayer> a3
);

public JoinEvent()
: base(
"_ZN20ServerNetworkHandler21sendLoginMessageLocalERK17NetworkIdentifierRK17ConnectionRequestR12ServerPlayer"
) { }
: base(ServerNetworkHandler.Original.SendLoginMessageLocal)
{ }

public override unsafe HookDelegate HookedFunc =>
(handler, identifier, request, serverPlayerPtr) =>
{
try
{
var e = new JoinEventArgs { ServerPlayer = new ServerPlayer(serverPlayerPtr) };
var e = new JoinEventArgs { ServerPlayer = serverPlayerPtr.Target };
OnEventBefore(e);
Original(handler, identifier, request, serverPlayerPtr);
OnEventAfter(e);
Expand Down
8 changes: 5 additions & 3 deletions src/Events/Implements/Player/LeftEvent.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.Events.Implements.Player;

public class LeftEventArgs : EventArgsBase
Expand All @@ -7,17 +9,17 @@ public class LeftEventArgs : EventArgsBase

public class LeftEvent : HookEventBase<LeftEventArgs, LeftEvent.HookDelegate>
{
public unsafe delegate void HookDelegate(void* serverPlayerPtr);
public unsafe delegate void HookDelegate(Pointer<ServerPlayer> serverPlayerPtr);

public LeftEvent()
: base("_ZN12ServerPlayer10disconnectEv") { }
: base(ServerPlayer.Original.Disconnect) { }

public override unsafe HookDelegate HookedFunc =>
serverPlayerPtr =>
{
try
{
var e = new LeftEventArgs { ServerPlayer = new ServerPlayer(serverPlayerPtr) };
var e = new LeftEventArgs { ServerPlayer = serverPlayerPtr.Target };
OnEventBefore(e);
Original(serverPlayerPtr);
OnEventAfter(e);
Expand Down
8 changes: 4 additions & 4 deletions src/Events/Implements/Player/RespawnEvent.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Hosihikari.Minecraft.Extension.Events;
using Hosihikari.Minecraft;
using Hosihikari.NativeInterop.Hook.ObjectOriented;
using Hosihikari.NativeInterop.Unmanaged;

public class RespawnEventArgs : EventArgsBase
{
Expand All @@ -11,17 +11,17 @@ namespace Hosihikari.Minecraft.Extension.Events.Implements.Player
{
public class RespawnEvent : HookEventBase<RespawnEventArgs, RespawnEvent.HookDelegate>
{
public unsafe delegate void HookDelegate(void* serverPlayerPtr);
public unsafe delegate void HookDelegate(Pointer<ServerPlayer> serverPlayerPtr);

public RespawnEvent()
: base("?respawn@ServerPlayer@@UEAAXXZ") { }
: base(ServerPlayer.Original.Respawn) { }

public override unsafe HookDelegate HookedFunc =>
serverPlayerPtr =>
{
try
{ //Actor::getIsExperienceDropEnabled
var e = new RespawnEventArgs { ServerPlayer = new ServerPlayer(serverPlayerPtr) };
var e = new RespawnEventArgs { ServerPlayer = serverPlayerPtr.Target };
OnEventBefore(e);
Original(serverPlayerPtr);
OnEventAfter(e);
Expand Down
2 changes: 1 addition & 1 deletion src/GlobalService/Global.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static class Global
public static GlobalInstance<MinecraftCommands> MinecraftCommands { get; } =

Check failure on line 13 in src/GlobalService/Global.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'MinecraftCommands' could not be found (are you missing a using directive or an assembly reference?)
new(() => new MinecraftCommandsHook());

public static GlobalInstance<DbStorage> DbStorage { get; } = new();
public static GlobalInstance<DBStorage> DbStorage { get; } = new();

Check failure on line 16 in src/GlobalService/Global.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'DBStorage' could not be found (are you missing a using directive or an assembly reference?)
public static GlobalInstance<LevelStorage> LevelStorage { get; } = new();

Check failure on line 17 in src/GlobalService/Global.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'LevelStorage' could not be found (are you missing a using directive or an assembly reference?)

public static GlobalInstance<RakNetServerLocator> RakNetServerLocator { get; } =

Check failure on line 19 in src/GlobalService/Global.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'RakNetServerLocator' could not be found (are you missing a using directive or an assembly reference?)
Expand Down
5 changes: 3 additions & 2 deletions src/GlobalService/Hook/AllowListFileHook.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using Hosihikari.NativeInterop.Hook.ObjectOriented;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.GlobalService.Hook;

internal class AllowListFileHook : HookBase<AllowListFileHook.HookDelegate>
{
internal unsafe delegate void* HookDelegate(void* @this, void* a2);
internal unsafe delegate Pointer<AllowListFile> HookDelegate(Pointer<AllowListFile> @this, void* a2);

public AllowListFileHook()
: base("_ZN13AllowListFileC2ERKN4Core4PathE") { }
: base(AllowListFile.Original.Constructor_AllowListFile) { }

public override unsafe HookDelegate HookedFunc =>
(@this, a2) =>
Expand Down
13 changes: 7 additions & 6 deletions src/GlobalService/Hook/DbStorageHook.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
using Hosihikari.NativeInterop.Hook.ObjectOriented;

using Hosihikari.NativeInterop.Hook.ObjectOriented;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.GlobalService.Hook;

internal class DbStorageHook : HookBase<DbStorageHook.HookDelegate>
{
internal unsafe delegate void* HookDelegate(void* @this, void* a2, void* a3);
internal unsafe delegate Pointer<DBStorage> HookDelegate(Pointer<DBStorage> @this, void* a2, void* a3);

public DbStorageHook()
: base("_ZN9DBStorageC2E15DBStorageConfigN3gsl8not_nullIN7Bedrock15NonOwnerPointerI10LevelDbEnvEEEE") { }
: base(DBStorage.Original.Constructor_DBStorage) { }

public override unsafe HookDelegate HookedFunc =>
(@this, a2, a3) =>
{
Log.Logger.Trace(nameof(DbStorageHook));
var result = Original(@this, a2, a3);
Global.DbStorage.Instance = new DbStorage(@this);
Global.LevelStorage.Instance = new LevelStorage(@this);
Global.DbStorage.Instance = @this.Target;
Global.LevelStorage.Instance = @this.Target.As<LevelStorage>();
TryUninstall();
return result;
};
Expand Down
7 changes: 4 additions & 3 deletions src/GlobalService/Hook/FilePathManagerHook.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
using Hosihikari.NativeInterop.Hook.ObjectOriented;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.GlobalService.Hook;

internal class FilePathManagerHook : HookBase<FilePathManagerHook.HookDelegate>
{
internal unsafe delegate void* HookDelegate(void* @this, void* a2, void* a3);
internal unsafe delegate Pointer<Core.FilePathManager> HookDelegate(Pointer<Core.FilePathManager> @this, Reference<Core.Path> path, bool a3);

public FilePathManagerHook()
: base("_ZN4Core15FilePathManagerC2ERKNS_4PathEb") { }
: base(Core.FilePathManager.Original.Constructor_FilePathManager) { }

public override unsafe HookDelegate HookedFunc =>
(@this, a2, a3) =>
{
Log.Logger.Trace(nameof(FilePathManagerHook));
var result = Original(@this, a2, a3);
Global.FilePathManager.Instance = new Core.FilePathManager(@this);
Global.FilePathManager.Instance = @this.Target;
TryUninstall();
return result;
};
Expand Down
14 changes: 10 additions & 4 deletions src/GlobalService/Hook/MinecraftCommandsHook.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
using Hosihikari.NativeInterop.Hook.ObjectOriented;
using Hosihikari.NativeInterop.Unmanaged;

namespace Hosihikari.Minecraft.Extension.GlobalService.Hook;

internal class MinecraftCommandsHook : HookBase<MinecraftCommandsHook.HookDelegate>
{
internal unsafe delegate void HookDelegate(void* @this, void* a2, void* a3, void* a4, void* a5, void* a6);
internal unsafe delegate void HookDelegate(
Pointer<MinecraftCommands> @this,
Reference<ItemRegistryRef> a1,
Reference<IWorldRegistriesProvider> a2,
Reference<ActorFactory> a3,
Reference<Experiments> a4,
Reference<BaseGameVersion> a5);

public MinecraftCommandsHook()
: base(
"_ZN17MinecraftCommands13initCoreEnumsE15ItemRegistryRefRK24IWorldRegistriesProviderRK12ActorFactoryRK11ExperimentsRK15BaseGameVersion") { }
: base(MinecraftCommands.Original.InitCoreEnums) { }

public override unsafe HookDelegate HookedFunc =>
(@this, a2, a3, a4, a5, a6) =>
{
Log.Logger.Trace(nameof(MinecraftCommandsHook));
Global.MinecraftCommands.Instance = new MinecraftCommands(@this);
Global.MinecraftCommands.Instance = @this.Target;
Original(@this, a2, a3, a4, a5, a6);
TryUninstall();
};
Expand Down
Loading

0 comments on commit 270eed2

Please sign in to comment.