Compare commits

..

2 Commits
master ... v1

@ -35,15 +35,18 @@
<Reference Include="LogicWorld.BuildingManagement">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.BuildingManagement.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.Players">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.Players.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.Physics">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.Physics.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.Interfaces">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.Interfaces.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.Modding">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.Modding.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.GameStates">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.GameStates.dll</HintPath>
</Reference>
<Reference Include="LogicWorld.SharedCode">
<HintPath>$(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.SharedCode.dll</HintPath>
</Reference>

@ -1,6 +1,6 @@
MHG.SettingsMenu.Pages.Controls.Headings.DLatchPoke: "Mod: DLatch Poke"
FancyInput.Trigger.DLatchPoke.Poke: "Toggle DLatch State"
FancyInput.Trigger.DLatchPoke.Poke: "Poke a DLatch"
FancyInput.Trigger.DLatchPoke.Poke.Description: """
Toggles the internal state of the DLatch (or multiple) the player is looking at or has selected.
Toggles the internal state of the DLatch the player is looking at.
"""

@ -1,7 +1,7 @@
ID: D4VID_DLatchPoke
Name: DLatch Poke
Author: D4VID
Version: 2.0.0
Version: 1.0.2
Priority: 0
Dependencies:
- EccsLogicWorldAPI

@ -1,14 +1,18 @@
using DLatchPoke.Client.Keybindings;
using DLatchPoke.Client.Network;
using EccsLogicWorldAPI.Client.Injectors;
using DLatchPoke.Shared.Packets.C2S;
using EccsLogicWorldAPI.Client.PacketIndexOrdering;
using FancyInput;
using LogicAPI.Client;
using LogicAPI.Data;
using LogicLog;
using LogicWorld;
using LogicWorld.Interfaces;
using LogicWorld.Physics;
using LogicWorld.Players;
namespace DLatchPoke.Client {
public class DLatchPokeClient : ClientMod {
public new static ILogicLogger Logger;
public static bool ServerSupportsMod = false;
protected override void Initialize() {
Logger = base.Logger;
@ -17,10 +21,42 @@ namespace DLatchPoke.Client {
// Register keybindings in the settings menu
CustomInput.Register<DLatchPokeContext, DLatchPokeTrigger>("DLatchPoke");
// Inject packet handlers
RawPacketHandlerInjector.addPacketHandler(new AnnounceModPacketHandler(Manifest.Version));
// Register the keybinding to enter the path analyzer game state
FirstPersonInteraction.RegisterBuildingKeybinding(DLatchPokeTrigger.Poke, () => {
if (!PacketIndexOrdering.doesServerSupportPacket(typeof(DLatchPokeRequest))) {
Logger.Error("Server does not support this mod");
return false;
}
return PokeDLatch();
}
);
// Mark it as optional so that the game works even if the mod is not present on one end
PacketIndexOrdering.markModAsOptional(GetType().Assembly);
Logger.Info("DLatchPoke mod loaded");
}
private bool PokeDLatch() {
HitInfo hitInfo = PlayerCaster.CameraCast(Masks.Environment | Masks.Structure | Masks.Peg);
if (!hitInfo.HitSomething) {
return false;
}
ComponentAddress componentAddress;
if (hitInfo.HitComponent) {
componentAddress = hitInfo.cAddress;
} else if (hitInfo.HitPeg) {
componentAddress = hitInfo.pAddress.ComponentAddress;
} else {
return false;
}
Instances.SendData.Send(new DLatchPokeRequest() {
ComponentAddress = componentAddress,
});
return true;
}
}
}

@ -1,36 +0,0 @@
using DLatchPoke.Client.Keybindings;
using DLatchPoke.Shared.Packets.C2S;
using FancyInput;
using LogicAPI.Data;
using LogicWorld.Building.Overhaul;
using LogicWorld.GameStates;
using LogicWorld.Interfaces;
namespace DLatchPoke.Client {
public class DLatchPokeOperation : BuildingOperation {
public override string IconHexCode => "f363";
public override bool CanOperateOn(ComponentSelection selection) {
if (!DLatchPokeClient.ServerSupportsMod) {
DLatchPokeClient.Logger.Error("Server does not support this mod");
return false;
}
ComponentType dLatchType = Instances.MainWorld.ComponentTypes.GetComponentType("MHG.DLatch");
foreach (ComponentAddress componentAddress in selection) {
if (Instances.MainWorld.Data.Lookup(componentAddress).Data.Type != dLatchType) {
return false;
}
}
return true;
}
public override void BeginOperationOn(ComponentSelection selection) {
Instances.SendData.Send(new DLatchPokeRequest() {
ComponentAddresses = selection.ComponentsInSelection,
});
GameStateManager.TransitionBackToBuildingState();
}
public override InputTrigger OperationStarter => DLatchPokeTrigger.Poke;
}
}

@ -1,6 +1,6 @@
namespace DLatchPoke.Client.Keybindings {
public enum DLatchPokeContext {
None = 0,
None,
DLatchPoke,
}
}

@ -1,7 +1,7 @@
namespace DLatchPoke.Client.Keybindings {
// Define all available keybindings of the mod
public enum DLatchPokeTrigger {
None = 0,
None,
Poke,
}
}

@ -1,22 +0,0 @@
using System;
using DLatchPoke.Shared.Packets.S2C;
using LogicWorld.SharedCode.Networking;
namespace DLatchPoke.Client.Network {
public class AnnounceModPacketHandler : PacketHandler<AnnounceModPresence> {
private readonly Version _version;
public AnnounceModPacketHandler(Version version) {
_version = version;
}
public override void Handle(AnnounceModPresence packet, HandlerContext context) {
if (packet.Version == _version) {
DLatchPokeClient.Logger.Info($"Mod is supported on the server: version={packet.Version}");
DLatchPokeClient.ServerSupportsMod = true;
} else {
DLatchPokeClient.Logger.Error($"Mod version mismatch: client={_version}, server={packet.Version}");
}
}
}
}

@ -1,68 +1,34 @@
using System.Collections.Generic;
using System.Linq;
using DLatchPoke.Server.Network;
using DLatchPoke.Shared.Packets.S2C;
using EccsLogicWorldAPI.Server;
using EccsLogicWorldAPI.Server.Injectors;
using EccsLogicWorldAPI.Shared.PacketWrapper;
using EccsLogicWorldAPI.Server.PacketIndexOrdering;
using LogicAPI.Data;
using LogicAPI.Networking.Packets.Initialization;
using LogicAPI.Server;
using LogicAPI.Server.Components;
using LogicAPI.Server.Networking;
using LogicAPI.Server.Networking.ClientVerification;
using LogicLog;
using LogicWorld.LogicCode;
using LogicWorld.Server.Circuitry;
using LogicWorld.SharedCode.Networking;
namespace DLatchPoke.Server {
// ReSharper disable once ClassNeverInstantiated.Global
public class DLatchPokeServer : ServerMod, IClientVerifier {
public class DLatchPokeServer : ServerMod {
public new static ILogicLogger Logger;
private NetworkServer _networkServer;
private readonly Dictionary<string, bool> _playerHasMod = new Dictionary<string, bool>();
private static ICircuitryManager _circuits;
protected override void Initialize() {
Logger = base.Logger;
Logger.Info("DLatchPoke server mod loading");
_networkServer = ServiceGetter.getService<NetworkServer>();
// Inject client verifier:
RawJoinVerifierInjector.addVerifier(this);
PacketHandlerManager.getCustomPacketHandler<ClientLoadedWorldPacket>()
.addHandlerToEnd(new ClientJoinedPacketHandler(this));
// Register handler for client request packet
RawPacketHandlerInjector.addPacketHandler(new DLatchPokeRequestHandler(this));
// Mark it as optional so that the game works even if the mod is not present on one end
PacketIndexOrdering.markModAsOptional(GetType().Assembly);
_circuits = ServiceGetter.getService<ICircuitryManager>();
Logger.Info("DLatchPoke server mod loaded");
}
/// <summary>
/// Gets called before a player (client) joins the server.
/// Used to check if the player has this mod installed
/// </summary>
public void Verify(VerificationContext ctx) {
bool hasMod = ctx.ApprovalPacket.ClientMods.Contains(Manifest.ID);
string playerName = ctx.PlayerID.Name;
_playerHasMod[playerName] = hasMod;
}
/// <summary>
/// Gets called after verifying a connecting player.
/// If the player has this mod installed, send a packet informing about the mod's presence on the server.
/// </summary>
public void PlayerJoined(PlayerData playerData, HandlerContext context) {
_playerHasMod.TryGetValue(playerData.Name, out bool hasWireTracer);
if (hasWireTracer) {
_networkServer.Send(context.Sender, new AnnounceModPresence() {
Version = Manifest.Version
});
}
}
/// <summary>
/// Gets called from the DLatchPokeRequestHandler.
/// Toggle the internal state of the DLatch

@ -1,16 +0,0 @@
using EccsLogicWorldAPI.Shared.PacketWrapper;
using LogicAPI.Networking.Packets.Initialization;
using LogicWorld.SharedCode.Networking;
namespace DLatchPoke.Server.Network {
public class ClientJoinedPacketHandler : CustomPacketHandler<ClientLoadedWorldPacket> {
private readonly DLatchPokeServer _dLatchPokeServer;
public ClientJoinedPacketHandler(DLatchPokeServer dLatchPokeServer) {
_dLatchPokeServer = dLatchPokeServer;
}
public override void handle(ref bool isCancelled, ref ClientLoadedWorldPacket packet, HandlerContext context) {
_dLatchPokeServer.PlayerJoined(packet.PlayerData, context);
}
}
}

@ -1,19 +1,15 @@
using DLatchPoke.Shared.Packets.C2S;
using LogicAPI.Data;
using LogicWorld.SharedCode.Networking;
namespace DLatchPoke.Server.Network {
public class DLatchPokeRequestHandler : PacketHandler<DLatchPokeRequest> {
private readonly DLatchPokeServer _dLatchPokeServer;
public DLatchPokeRequestHandler(DLatchPokeServer dLatchPokeServer) {
_dLatchPokeServer = dLatchPokeServer;
}
public override void Handle(DLatchPokeRequest packet, HandlerContext context) {
foreach (ComponentAddress componentAddress in packet.ComponentAddresses) {
_dLatchPokeServer.PokeDLatch(componentAddress);
}
_dLatchPokeServer.PokeDLatch(packet.ComponentAddress);
}
}
}

@ -1,4 +1,3 @@
using System.Collections.Generic;
using LogicAPI.Data;
using LogicAPI.Networking.Packets;
using MessagePack;
@ -6,6 +5,6 @@ using MessagePack;
namespace DLatchPoke.Shared.Packets.C2S {
[MessagePackObject]
public class DLatchPokeRequest : Packet {
[Key(0)] public IEnumerable<ComponentAddress> ComponentAddresses;
[Key(0)] public ComponentAddress ComponentAddress;
}
}

@ -1,10 +0,0 @@
using System;
using LogicAPI.Networking.Packets;
using MessagePack;
namespace DLatchPoke.Shared.Packets.S2C {
[MessagePackObject]
public class AnnounceModPresence : Packet {
[Key(0)] public Version Version;
}
}
Loading…
Cancel
Save