public void ServerPerformInteraction(HandApply interaction)
        {
            if (apcPoweredDevice.State == PowerState.Off)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer, $"{gameObject.ExpensiveName()} has no power");
                return;
            }

            //Cycle through AIs
            if (interaction.HandObject == null)
            {
                var aiPlayers = PlayerList.Instance.GetAllByPlayersOfState(PlayerScript.PlayerStates.Ai).Where(
                    a => a.GameObject.TryGetComponent <AiPlayer>(out var aiPlayer) && aiPlayer.HasDied == false).ToList();

                if (lastIndex >= aiPlayers.Count)
                {
                    lastIndex = 0;
                }

                if (aiPlayers.Count == 0)
                {
                    Chat.AddExamineMsgFromServer(interaction.Performer, "There are no Ai's");
                    return;
                }

                selectedAiPlayer = aiPlayers[lastIndex].GameObject.GetComponent <AiPlayer>();

                Chat.AddExamineMsgFromServer(interaction.Performer, $"{selectedAiPlayer.gameObject.ExpensiveName()} selected");

                lastIndex++;
                return;
            }

            //Make sure Ai selected
            if (selectedAiPlayer == null)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer, "Select an Ai to upload laws to first");
                return;
            }

            //Check Ai isn't dead
            if (selectedAiPlayer.HasDied)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer, $"Unable to connect to {selectedAiPlayer.gameObject.ExpensiveName()}");
                return;
            }

            //Must have used module, but do check in case
            if (interaction.HandObject.TryGetComponent <AiLawModule>(out var module) == false)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer, "Can only use a module on this console");
                return;
            }

            var lawFromModule = module.GetLawsFromModule(interaction.PerformerPlayerScript);

            if (module.AiModuleType == AiModuleType.Purge || module.AiModuleType == AiModuleType.Reset)
            {
                var isPurge = module.AiModuleType == AiModuleType.Purge;
                selectedAiPlayer.ResetLaws(isPurge);
                Chat.AddActionMsgToChat(interaction.Performer, $"You {(isPurge ? "purge" : "reset")} all of {selectedAiPlayer.gameObject.ExpensiveName()}'s laws",
                                        $"{interaction.Performer.ExpensiveName()} {(isPurge ? "purges" : "resets")} all of {selectedAiPlayer.gameObject.ExpensiveName()}'s laws");
                return;
            }

            if (lawFromModule.Count == 0)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer, "No laws to upload");
                return;
            }

            //If we are only adding core laws then we must mean to remove old core laws
            //This means we are assuming that the law set must only have core laws if it is to replace the old laws fully
            var notOnlyCoreLaws = false;

            foreach (var law in lawFromModule)
            {
                if (law.Key != AiPlayer.LawOrder.Core)
                {
                    notOnlyCoreLaws = true;
                    break;
                }
            }

            selectedAiPlayer.SetLaws(lawFromModule, true, notOnlyCoreLaws);

            Chat.AddActionMsgToChat(interaction.Performer, $"You change {selectedAiPlayer.gameObject.ExpensiveName()} laws",
                                    $"{interaction.Performer.ExpensiveName()} changes {selectedAiPlayer.gameObject.ExpensiveName()} laws");
        }