public override IEnumerator Process()
    {
        yield return(WaitFor(ProcessorObject));

        var processorObj = NetworkObject;
        var performerObj = SentByPlayer.GameObject;
        //look up item in active hand slot
        var clientPNA       = SentByPlayer.Script.playerNetworkActions;
        var handSlot        = HandSlot.ForName(clientPNA.activeHand);
        var activatedObject = clientPNA.Inventory[handSlot.equipSlot].Item;

        ProcessActivate(activatedObject, processorObj, performerObj, handSlot);
    }
    public override IEnumerator Process()
    {
        //look up item in active hand slot
        var clientPNA  = SentByPlayer.Script.playerNetworkActions;
        var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
        var usedObject = clientPNA.Inventory[usedSlot.equipSlot].Item;

        yield return(WaitFor(ProcessorObject));

        var processorObj = NetworkObject;
        var performerObj = SentByPlayer.GameObject;

        ProcessAimApply(usedObject, TargetVector, processorObj, performerObj, usedSlot, MouseButtonState);
    }
    public override IEnumerator Process()
    {
        //look up item in active hand slot
        var clientPNA  = SentByPlayer.Script.playerNetworkActions;
        var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
        var usedObject = clientPNA.Inventory[usedSlot.SlotName].Item;

        yield return(WaitFor(TargetObject, ProcessorObject));

        var targetObj    = NetworkObjects[0];
        var processorObj = NetworkObjects[1];
        var performerObj = SentByPlayer.GameObject;

        ProcessHandApply(usedObject, targetObj, processorObj, performerObj, usedSlot);
    }
    public override IEnumerator Process()
    {
        yield return(WaitFor(ProcessorObject));

        var processorObj = NetworkObject;
        var performerObj = SentByPlayer.GameObject;
        //look up item in active hand slot
        var clientPNA  = SentByPlayer.Script.playerNetworkActions;
        var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
        var usedObject = clientPNA.Inventory[usedSlot.SlotName].Item;
        var targetSlot = InventoryManager.GetSlotFromUUID(TargetSlotUUID, true);

        //can only combine in their own slots
        if (targetSlot.Owner.gameObject != performerObj)
        {
            Logger.LogWarningFormat("Player {0} attempted to InventoryApply to a slot that isn't theirs! Possible" +
                                    " hacking attempt. targetSlot {1} (owner {2})", Category.Security,
                                    SentByPlayer.Name, targetSlot.SlotName, targetSlot.Owner.playerName);
        }
        else
        {
            ProcessCombine(usedSlot, usedObject, targetSlot, processorObj, performerObj);
        }
    }
    public override IEnumerator Process()
    {
        var performer = SentByPlayer.GameObject;

        if (InteractionType == typeof(PositionalHandApply))
        {
            //look up item in active hand slot
            var clientPNA  = SentByPlayer.Script.playerNetworkActions;
            var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
            var usedObject = clientPNA.Inventory[usedSlot.equipSlot].Item;
            yield return(WaitFor(TargetObject, ProcessorObject));

            var targetObj    = NetworkObjects[0];
            var processorObj = NetworkObjects[1];
            var interaction  = PositionalHandApply.ByClient(performer, usedObject, targetObj, TargetVector, usedSlot);
            ProcessInteraction(interaction, processorObj);
        }
        else if (InteractionType == typeof(HandApply))
        {
            var clientPNA  = SentByPlayer.Script.playerNetworkActions;
            var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
            var usedObject = clientPNA.Inventory[usedSlot.equipSlot].Item;
            yield return(WaitFor(TargetObject, ProcessorObject));

            var targetObj    = NetworkObjects[0];
            var processorObj = NetworkObjects[1];
            var performerObj = SentByPlayer.GameObject;
            var interaction  = HandApply.ByClient(performer, usedObject, targetObj, TargetBodyPart, usedSlot);
            ProcessInteraction(interaction, processorObj);
        }
        else if (InteractionType == typeof(AimApply))
        {
            var clientPNA  = SentByPlayer.Script.playerNetworkActions;
            var usedSlot   = HandSlot.ForName(clientPNA.activeHand);
            var usedObject = clientPNA.Inventory[usedSlot.equipSlot].Item;
            yield return(WaitFor(ProcessorObject));

            var processorObj = NetworkObject;
            var performerObj = SentByPlayer.GameObject;
            var interaction  = AimApply.ByClient(performer, TargetVector, usedObject, usedSlot, MouseButtonState);
            ProcessInteraction(interaction, processorObj);
        }
        else if (InteractionType == typeof(MouseDrop))
        {
            yield return(WaitFor(UsedObject, TargetObject, ProcessorObject));

            var usedObj      = NetworkObjects[0];
            var targetObj    = NetworkObjects[1];
            var processorObj = NetworkObjects[2];
            var performerObj = SentByPlayer.GameObject;
            var interaction  = MouseDrop.ByClient(performer, usedObj, targetObj);
            ProcessInteraction(interaction, processorObj);
        }
        else if (InteractionType == typeof(HandActivate))
        {
            yield return(WaitFor(ProcessorObject));

            var processorObj = NetworkObject;
            var performerObj = SentByPlayer.GameObject;
            //look up item in active hand slot
            var clientPNA       = SentByPlayer.Script.playerNetworkActions;
            var handSlot        = HandSlot.ForName(clientPNA.activeHand);
            var activatedObject = clientPNA.Inventory[handSlot.equipSlot].Item;
            var interaction     = HandActivate.ByClient(performer, activatedObject, handSlot);
            ProcessInteraction(interaction, processorObj);
        }
        else if (InteractionType == typeof(InventoryApply))
        {
            yield return(WaitFor(ProcessorObject));

            var processorObj = NetworkObject;
            var performerObj = SentByPlayer.GameObject;
            var pna          = SentByPlayer.Script.playerNetworkActions;
            var handSlot     = HandSlot.ForName(pna.activeHand);
            var handObject   = pna.Inventory[handSlot.equipSlot].Item;
            var interaction  = InventoryApply.ByClient(performer, pna.GetInventorySlot(processorObj), handObject, handSlot);
            ProcessInteraction(interaction, processorObj);
        }
    }