Add quick interactions locally

This commit is contained in:
2025-03-31 04:02:39 +02:00
parent 5bb7a207f2
commit b7d4531ec8
134 changed files with 15494 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Barotrauma;
using HarmonyLib;
using Microsoft.Xna.Framework;
using QIDependencyInjection;
namespace QuickInteractions
{
public struct InteractPackage
{
public Character.InputNetFlags ForsedKeys;
public ushort EntityID;
public InteractPackage(ushort id, Character.InputNetFlags keys) => (EntityID, ForsedKeys) = (id, keys);
}
[PatchClass]
public class FakeInput
{
[Singleton] public static FakeInput Instance { get; set; }
[Dependency] public static Logger Logger { get; set; }
[Dependency] public static Debugger Debugger { get; set; }
public Queue<InteractPackage> ScheduledPackages = new();
public void SendInteractPackage(Character character)
{
ScheduledPackages.Enqueue(new InteractPackage(character.ID, Character.InputNetFlags.Use));
}
public void SendInteractPackage(Item item)
{
ScheduledPackages.Enqueue(new InteractPackage(item.ID, Character.InputNetFlags.Select));
}
public static void Initialize()
{
// Mod.Harmony.Patch(
// original: typeof(Character).GetMethod("IsKeyDown", AccessTools.all),
// postfix: new HarmonyMethod(typeof(FakeInput).GetMethod("Character_IsKeyDown_Postfix"))
// );
Mod.Harmony.Patch(
original: typeof(Character).GetMethod("UpdateNetInput", AccessTools.all),
postfix: new HarmonyMethod(typeof(FakeInput).GetMethod("Character_UpdateNetInput_Postfix"))
);
}
public static void Character_UpdateNetInput_Postfix(Character __instance)
{
if (GhostDetector.AmIDead(Mod.Instance)) return;
if (Instance == null) return;
if (__instance != Character.Controlled) return;
if (Instance.ScheduledPackages.Count > 0)
{
InteractPackage fakePackage = Instance.ScheduledPackages.Dequeue();
Debugger.Log($"sending a fake package {fakePackage.EntityID} {fakePackage.ForsedKeys}", DebugLevel.Networking);
__instance.memInput[0] = new Character.NetInputMem()
{
states = __instance.memInput[0].states | fakePackage.ForsedKeys,
intAim = __instance.memInput[0].intAim,
interact = fakePackage.EntityID,
};
}
}
}
}