Set BGM via function

This commit is contained in:
goat 2019-11-23 14:12:30 +09:00
parent 92f8ad0fd8
commit 4bcdf6caef
5 changed files with 41 additions and 32 deletions

View file

@ -440,7 +440,7 @@ namespace Dalamud {
private void OnBgmSetCommand(string command, string arguments)
{
Framework.Network.InjectBgmTest(int.Parse(arguments));
Framework.Gui.SetBgm(ushort.Parse(arguments));
}
private void OnItemLinkCommand(string command, string arguments) {
@ -474,26 +474,5 @@ namespace Dalamud {
});
}
public static byte[] StringToByteArray(String value)
{
byte[] bytes = new byte[value.Length * sizeof(char)];
Buffer.BlockCopy(value.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public static String ByteArrayToString(byte[] value)
{
var chars = new char[value.Length / sizeof(char)];
var atValue = 0;
for (var i = 0; i < chars.Length; i++) {
chars[i] = BitConverter.ToChar(value, atValue);
atValue += 2;
}
return new string(chars);
}
}
}

View file

@ -1,27 +1,55 @@
using System;
using System.Runtime.InteropServices;
using Dalamud.Game.Chat;
using Dalamud.Hooking;
using Serilog;
namespace Dalamud.Game.Internal.Gui {
public sealed class GameGui : IDisposable {
private GameGuiAddressResolver Address { get; }
public ChatGui Chat { get; private set; }
public ChatGui Chat { get; private set; }
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
private delegate IntPtr SetGlobalBgmDelegate(UInt16 bgmKey, byte a2, UInt32 a3, UInt32 a4, UInt32 a5, byte a6);
private readonly Hook<SetGlobalBgmDelegate> setGlobalBgmHook;
public GameGui(IntPtr baseAddress, SigScanner scanner, Dalamud dalamud) {
Address = new GameGuiAddressResolver(baseAddress);
Address.Setup(scanner);
Log.Verbose("===== G A M E G U I =====");
Log.Verbose("GameGuiManager address {Address}", Address.BaseAddress);
Log.Verbose("SetGlobalBgm address {Address}", Address.SetGlobalBgm);
Chat = new ChatGui(Address.ChatManager, scanner, dalamud);
this.setGlobalBgmHook =
new Hook<SetGlobalBgmDelegate>(Address.SetGlobalBgm,
new SetGlobalBgmDelegate(HandleSetGlobalBgmDetour),
this);
}
private IntPtr HandleSetGlobalBgmDetour(UInt16 bgmKey, byte a2, UInt32 a3, UInt32 a4, UInt32 a5, byte a6) {
var retVal = this.setGlobalBgmHook.Original(bgmKey, a2, a3, a4, a5, a6);
Log.Verbose("SetGlobalBgm: {0} {1} {2} {3} {4} {5} -> {6}", bgmKey, a2, a3, a4, a5, a6, retVal);
return retVal;
}
public void SetBgm(ushort bgmKey) => this.setGlobalBgmHook.Original(bgmKey, 0, 0, 0, 0, 0);
public void Enable() {
Chat.Enable();
this.setGlobalBgmHook.Enable();
}
public void Dispose() {
Chat.Dispose();
this.setGlobalBgmHook.Dispose();
}
}
}

View file

@ -1,11 +1,14 @@
using System;
using System;
using System.Runtime.InteropServices;
using Serilog;
namespace Dalamud.Game.Internal.Gui {
public sealed class GameGuiAddressResolver : BaseAddressResolver {
public IntPtr BaseAddress { get; private set; }
public IntPtr ChatManager { get; private set; }
public IntPtr SetGlobalBgm { get; private set; }
public GameGuiAddressResolver(IntPtr baseAddress) {
BaseAddress = baseAddress;
@ -21,7 +24,8 @@ namespace Dalamud.Game.Internal.Gui {
}
protected override void Setup64Bit(SigScanner sig) {
// Do nothing, still required.
//SetGlobalBgm = sig.ScanText("4C 8B 15 ?? ?? ?? ?? 4D 85 D2 74 58 41 83 7A ?? ?? 76 51 4D 8B 92 ?? ?? ?? ?? 0F B6 44 24 ?? 49 81 C2 ?? ?? ?? ?? 66 41 89 4A ?? 33 C9 41 88 52 30 41 89 4A 14 66 41 89 4A ?? 41 88 42 12 49 89 4A 38 41 89 4A 40 49 89 4A 48 41 38 4A 30 74 14 8B 44 24 28 41 89 42 40 45 89 42 38");
SetGlobalBgm = sig.ScanText("4C 8B 15 ?? ?? ?? ?? 4D 85 D2 74 58");
}
}
}

View file

@ -63,6 +63,7 @@ namespace Dalamud.Game.Internal.Gui {
public void Dispose() {
this.iconHook.Dispose();
this.checkerHook.Dispose();
Log.Verbose("IconReplacer unhooked");
}
// I hate this function. This is the dumbest function to exist in the game. Just return 1.

View file

@ -28,6 +28,7 @@ namespace Dalamud.Game.Internal.Network {
Address = new GameNetworkAddressResolver();
Address.Setup(scanner);
Log.Verbose("===== G A M E N E T W O R K =====");
Log.Verbose("ProcessZonePacket address {ProcessZonePacket}", Address.ProcessZonePacket);
this.processZonePacketHook =
@ -86,10 +87,6 @@ namespace Dalamud.Game.Internal.Network {
InjectZoneProtoPacket(packetData);
}
public void InjectBgmTest(int key) {
InjectActorControl(0xa1, key);
}
/// <summary>
/// Process a chat queue.
/// </summary>