public override void ServerPerformInteraction(HandApply interaction)
    {
        //Do specific things when the wires are exposed.
        if (WiresExposed)
        {
            if (interaction.HandObject == null && interaction.Performer != null)
            {
                TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
                IntDoor.StartInputCoolDown();
                return;
            }
        }

        if (Validations.HasItemTrait(interaction.HandObject, CommonTraits.Instance.Screwdriver))
        {
            var screwdriver = interaction.HandObject.GetComponent <Screwdriver>();
            if (interaction.Intent != Intent.Help)
            {
                if (Controller != null)
                {
                    Chat.AddExamineMsgFromServer(interaction.Performer,
                                                 "You " + (WiresExposed ? "close" : "open") + " the " + doorName + "'s maintenance panel");
                    ServerTryTogglePanel();
                }

                IntDoor.StartInputCoolDown();
                return;
            }
        }
    }
    public override void ServerPerformInteraction(HandApply interaction)
    {
        //Do specific things when the wires are exposed.
        if (WiresExposed)
        {
            if (interaction.HandObject == null && interaction.Performer != null)
            {
                TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
                IntDoor.StartInputCoolDown();
                return;
            }
        }

        if (Validations.HasItemTrait(interaction.HandObject, CommonTraits.Instance.Screwdriver))
        {
            if (Controller != null)
            {
                Chat.AddActionMsgToChat(interaction.Performer, "You " + (WiresExposed ? "close" : "open") + " the " + doorName + "'s maintenance panel.",
                                        $"{interaction.Performer.ExpensiveName()} " + (WiresExposed ? "closes" : "opens") + " the " + doorName + "'s maintenance panel.");
                ServerTryTogglePanel();
            }

            IntDoor.StartInputCoolDown();
            return;
        }
    }
Beispiel #3
0
 public void ServerPerformInteraction(HandApply interaction)
 {
     if (interaction.HandObject == null)
     {
         if (printer.TrayOpen)
         {
             Chat.AddExamineMsgFromServer(interaction.Performer, "You close the tray.");
             ToggleTray();
         }
         else if (scanner.ScannerOpen)
         {
             Chat.AddExamineMsgFromServer(interaction.Performer, "You close the scanner lid.");
             ToggleScannerLid();
         }
         else
         {
             OnGuiRenderRequired();
             TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
         }
     }
     else if (printer.CanAddPageToTray(interaction.HandObject))
     {
         printer = printer.AddPageToTray(interaction.HandObject);
         Chat.AddExamineMsgFromServer(interaction.Performer, "You place the sheet in the tray.");
     }
     else if (scanner.CanPlaceDocument(interaction.HandObject))
     {
         scanner = scanner.PlaceDocument(interaction.HandObject);
         Chat.AddExamineMsgFromServer(interaction.Performer, "You place the document in the scanner.");
     }
 }
    private void ProcessFurther(ConnectedPlayer player, GameObject tabProvider)
    {
        var  playerScript = player.Script;
        bool validate     = !playerScript.canNotInteract() && playerScript.IsInReach(tabProvider, true);

        if (!validate)
        {
            FailValidation(player, tabProvider, "Can't interact/reach");
            return;
        }
        var tabInfo = NetworkTabManager.Instance.Get(tabProvider, NetTabType);

        if (!tabInfo /* == NetworkTabInfo.Invalid*/)
        {
            //No such tab exists on server!
            FailValidation(player, tabProvider, $"No such tab: {tabProvider}/{NetTabType}");
            return;
        }
        var updatedElement = tabInfo[ElementId];

        if (updatedElement == null)
        {
            //No such element exists on server!
            FailValidation(player, tabProvider, $"No such element: {tabInfo}[{ElementId}]");
            return;
        }
        if (updatedElement.InteractionMode == ElementMode.ServerWrite)
        {
            //Don't change labels and other non-interactable elements. If this is triggered, someone's tampering with client
            FailValidation(player, tabProvider, $"Non-interactable {updatedElement}");
            return;
        }

        var valueBeforeUpdate = updatedElement.Value;

        updatedElement.Value = ElementValue;
        updatedElement.ExecuteServer();

        if (updatedElement.InteractionMode == ElementMode.ClientWrite)
        {
            //Don't rememeber value provided by client and restore to the initial one
            updatedElement.Value = valueBeforeUpdate;
        }

        //Notify all peeping players of the change
        List <ConnectedPlayer> list = NetworkTabManager.Instance.GetPeepers(tabProvider, NetTabType);

        for (var i = 0; i < list.Count; i++)
        {
            var connectedPlayer = list[i];
//Not sending that update to the same player
            if (connectedPlayer.GameObject != player.GameObject)
            {
                TabUpdateMessage.Send(connectedPlayer.GameObject, tabProvider, NetTabType, TabAction.Update, player.GameObject,
                                      new[] { new ElementValue {
                                                  Id = ElementId, Value = updatedElement.Value
                                              } });
            }
        }
    }
Beispiel #5
0
 /// <summary>
 /// Not sending updates and closing tab for players that don't pass the validation anymore
 /// </summary>
 public void ValidatePeepers()
 {
     foreach (var peeper in Peepers.ToArray())
     {
         bool validate = peeper.Script && Validations.CanApply(peeper.Script, Provider, NetworkSide.Server);
         if (!validate)
         {
             TabUpdateMessage.Send(peeper.GameObject, Provider, Type, TabAction.Close);
         }
     }
 }
Beispiel #6
0
 /// <summary>
 /// Not sending updates and closing tab for players that don't pass the validation anymore
 /// </summary>
 public void ValidatePeepers()
 {
     foreach (var peeper in Peepers.ToArray())
     {
         bool validate = peeper.Script && !peeper.Script.canNotInteract() && peeper.Script.IsInReach(Provider, true);
         if (!validate)
         {
             TabUpdateMessage.Send(peeper.GameObject, Provider, Type, TabAction.Close);
         }
     }
 }
Beispiel #7
0
 public void ServerPerformInteraction(HandActivate interaction)
 {
     //UIManager.Instance.TextInputDialog.ShowDialog("Set label text", OnInputReceived);
     if (transformTimes > 0)
     {
         //Open null rod select screen if there are some transformation charges left.
         TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.NullRod, TabAction.Open);
     }
     else
     {
         Chat.AddExamineMsgFromServer(interaction.Performer, "The item pulses once and fades. You're out of transformations!");
     }
 }
        public override void AiInteraction(AiActivate interaction)
        {
            if (interaction.ClickType == AiActivate.ClickTypes.NormalClick)
            {
                TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.ThermoMachine, TabAction.Open);
                return;
            }

            if (interaction.ClickType == AiActivate.ClickTypes.AltClick)
            {
                targetTemperature = type == HeaterFreezerType.Heater ? maxTemperature : minTemperature;
                UpdateGui();
            }
        }
Beispiel #9
0
    public override bool Interact(GameObject originator, Vector3 position, string hand)
    {
        var playerScript = originator.GetComponent <PlayerScript>();

        if (playerScript.canNotInteract() || !playerScript.IsInReach(gameObject, false))
        {     //check for both client and server
            return(true);
        }

        if (!isServer)
        {
            //Client wants this code to be run on server
            InteractMessage.Send(gameObject, hand);
        }
        else
        {
            //Server actions
            TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
            if (State == TabState.None)
            {
                State = TabState.Normal;
            }
            switch (State)
            {
            case TabState.Normal:
                if (UsedEmag(originator, hand))
                {
                    //todo sparks
                    State = TabState.Emagged;
                }
                break;

            case TabState.Emagged:
                if (UsedEmag(originator, hand))
                {
                    State = TabState.Off;
                }
                break;

            case TabState.Off:
                if (UsedEmag(originator, hand))
                {
                    State = TabState.Normal;
                }
                break;
            }
        }
        return(true);
    }
Beispiel #10
0
    public override void UI_Interact(GameObject originator, string hand)
    {
        var playerScript = originator.GetComponent <PlayerScript>();

        if (!isServer)
        {
            //Client wants this code to be run on server
            InteractMessage.Send(gameObject, hand, true);
        }
        else
        {
            //Server actions
            TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
            paper.UpdatePlayer(originator);
        }
    }
    private void ServerElectrocute(GameObject obj)
    {
        float r = UnityEngine.Random.value;

        if (r < 0.45)
        {
            PlayerScript ply = obj.GetComponent <PlayerScript>();
            if (ply != null)
            {
                hackingProcess.HackingGUI.RemovePlayer(ply.gameObject);
                TabUpdateMessage.Send(ply.gameObject, hackingProcess.HackingGUI.Provider, NetTabType.HackingPanel, TabAction.Close);
                Electrocution elec = new Electrocution();
                elec.ElectrocutePlayer(ply.gameObject, (Vector2Int)registerTile.WorldPositionServer, "wire", 9080);
            }
        }
    }
Beispiel #12
0
        public void ServerPerformInteraction(AiActivate interaction)
        {
            foreach (var validateNetTab in GetComponents <ICanOpenNetTab>())
            {
                if (validateNetTab.CanOpenNetTab(interaction.Performer, NetTabType))
                {
                    continue;
                }

                //If false block net tab opening
                return;
            }

            playerInteracted = interaction.Performer;
            TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
        }
Beispiel #13
0
    public override bool Interact(GameObject originator, Vector3 position, string hand)
    {
        ofthis = this.gameObject;
        var playerScript = originator.GetComponent <PlayerScript>();

        if (playerScript.canNotInteract() || !playerScript.IsInReach(gameObject))
        {         //check for both client and server
            return(true);
        }

        if (!isServer)
        {
            //Client wants this code to be run on server
            InteractMessage.Send(gameObject, hand);
        }
        else
        {
            //Server actions
            if (Container == null)
            {
                PlayerScript ps = originator.GetComponent <PlayerScript>();
                if (ps.canNotInteract() || !ps.IsInReach(position))
                {
                    return(false);
                }
                var slot        = InventoryManager.GetSlotFromOriginatorHand(originator, hand);
                var stContainer = slot.Item?.GetComponentInChildren <ReagentContainer>();
                if (stContainer != null)
                {
                    Container = stContainer;
                    //Logger.Log ("set!!");
                    GameObject item = ps.playerNetworkActions.Inventory[hand].Item;
                    objectse = item.GetComponentInChildren <ObjectBehaviour> ();
                    InventoryManager.UpdateInvSlot(true, "", slot.Item, slot.UUID);
                    UpdateGUI();
                    return(true);
                }
                TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
            }
            else
            {
                TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
            }
        }
        return(true);
    }
Beispiel #14
0
        public void ServerPerformInteraction(HandApply interaction)
        {
            if (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Screwdriver))
            {
                AudioSourceParameters audioSourceParameters = new AudioSourceParameters(pitch: UnityEngine.Random.Range(0.8f, 1.2f));
                SoundManager.PlayNetworkedAtPos(CommonSounds.Instance.screwdriver, interaction.Performer.AssumedWorldPosServer(), audioSourceParameters, sourceObj: gameObject);
                //Unscrew panel
                panelopen = !panelopen;
                if (panelopen)
                {
                    Chat.AddActionMsgToChat(interaction.Performer,
                                            $"You unscrews the {gameObject.ExpensiveName()}'s cable panel.",
                                            $"{interaction.Performer.ExpensiveName()} unscrews {gameObject.ExpensiveName()}'s cable panel.");
                    return;
                }
                else
                {
                    Chat.AddActionMsgToChat(interaction.Performer,
                                            $"You screw in the {gameObject.ExpensiveName()}'s cable panel.",
                                            $"{interaction.Performer.ExpensiveName()} screws in {gameObject.ExpensiveName()}'s cable panel.");
                    return;
                }
            }

            if (HackingProcessBase != null)
            {
                if (panelopen && (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Cable) ||
                                  Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Wirecutter)))
                {
                    TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.HackingPanel, TabAction.Open);
                }
            }

            //unsecure
            if (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Crowbar) && panelopen)
            {
                ToolUtils.ServerUseToolWithActionMessages(interaction, secondsToScrewdrive,
                                                          "You start to disconnect the monitor...",
                                                          $"{interaction.Performer.ExpensiveName()} starts to disconnect the monitor...",
                                                          "You disconnect the monitor.",
                                                          $"{interaction.Performer.ExpensiveName()} disconnects the monitor.",
                                                          () => { WhenDestroyed(null); });
            }
        }
Beispiel #15
0
    public override void _Interact(GameObject originator, Vector3 position, string hand)
    {
        var playerScript = originator.GetComponent <PlayerScript>();

        if (playerScript.canNotInteract() || !playerScript.IsInReach(gameObject))
        {         //check for both client and server
            return;
        }
        if (!isServer)
        {
            //Client wants this code to be run on server
            InteractMessage.Send(gameObject, hand);
        }
        else
        {
            //Server actions
            TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
        }
    }
        public override void ServerPerformInteraction(HandApply interaction)
        {
            if (Validations.HasItemTrait(interaction.UsedObject, CommonTraits.Instance.Wrench))
            {
                //Rotate
                ToolUtils.ServerUseToolWithActionMessages(interaction, 2,
                                                          $"You start to rotate the {gameObject.ExpensiveName()}...",
                                                          $"{interaction.Performer.ExpensiveName()} starts to rotate the {gameObject.ExpensiveName()}...",
                                                          $"You rotates the {gameObject.ExpensiveName()}.",
                                                          $"{interaction.Performer.ExpensiveName()} rotates the {gameObject.ExpensiveName()}.",
                                                          () =>
                {
                    pipeData.OnDisable();

                    directional.RotateBy(1);

                    SetUpPipes();
                });

                return;
            }

            if (interaction.IsAltClick)
            {
                targetTemperature = type == HeaterFreezerType.Heater ? maxTemperature : minTemperature;
                UpdateGui();
                return;
            }

            if (interaction.HandObject != null)
            {
                //Try trigger machine deconstruction interaction as it has been blocked by this script :(
                if (machine.WillInteract(interaction, NetworkSide.Server))
                {
                    machine.ServerPerformInteraction(interaction);
                }

                return;
            }

            TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.ThermoMachine, TabAction.Open);
        }
Beispiel #17
0
        private void ServerElectrocute(GameObject obj)
        {
            float r = UnityEngine.Random.value;

            if (r < 0.45)             //TODO: Magic number, needs to be fixed.
            {
                PlayerScript ply = obj.GetComponent <PlayerScript>();
                if (ply != null)
                {
                    hackingProcess.HackingGUI.RemovePlayer(ply.gameObject);
                    TabUpdateMessage.Send(ply.gameObject, hackingProcess.HackingGUI.Provider, NetTabType.HackingPanel, TabAction.Close);
                    var playerLHB     = obj.GetComponent <LivingHealthBehaviour>();
                    var electrocution = new Electrocution(9080, registerTile.WorldPositionServer, "wire");                     //More magic numbers.
                    if (playerLHB != null)
                    {
                        playerLHB.Electrocute(electrocution);
                    }
                }
            }
        }
    /// <summary>
    /// Completely remove the nettab from existence, removing all players from it.
    /// </summary>
    /// <param name="provider"></param>
    /// <param name="type"></param>
    public void RemoveTab(GameObject provider, NetTabType type)
    {
        var ntd = Tab(provider, type);

        openTabs.TryGetValue(ntd, out var netTab);
        if (netTab != null)
        {
            //remove all peepers
            //safe copy so we can concurrently modify it
            var peepers = netTab.Peepers.Select(cp => cp.GameObject).ToList();
            foreach (var peeper in peepers)
            {
                Remove(provider, type, peeper);
                TabUpdateMessage.Send(peeper, provider, type, TabAction.Close);
            }
            // completely get rid of the tab
            openTabs.Remove(ntd);
            Destroy(netTab.gameObject);
        }
    }
    public override bool Interact(GameObject originator, Vector3 position, string hand)
    {
        if (!CanUse(originator, hand, position, false))
        {
            return(false);
        }
        if (!isServer)
        {
            //ask server to perform the interaction
            InteractMessage.Send(gameObject, position, hand);
            return(true);
        }

        if (Container == null)
        {
            PlayerScript ps = originator.GetComponent <PlayerScript>();
            if (ps.canNotInteract() || !ps.IsInReach(position, true))
            {
                return(false);
            }
            var slot        = InventoryManager.GetSlotFromOriginatorHand(originator, hand);
            var stContainer = slot.Item?.GetComponentInChildren <ReagentContainer>();
            if (stContainer != null)
            {
                Container = stContainer;
                //Logger.Log ("set!!");
                GameObject item = ps.playerNetworkActions.Inventory[hand].Item;
                objectse = item.GetComponentInChildren <ObjectBehaviour> ();
                InventoryManager.UpdateInvSlot(true, "", slot.Item, slot.UUID);
                UpdateGUI();
                return(true);
            }
            TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
        }
        else
        {
            TabUpdateMessage.Send(originator, gameObject, NetTabType, TabAction.Open);
        }
        return(true);
    }
Beispiel #20
0
    /// <summary>
    /// Not sending updates and closing tab for players that don't pass the validation anymore
    /// </summary>
    public void ValidatePeepers()
    {
        foreach (var peeper in Peepers.ToArray())
        {
            bool canApply = Validations.CanApply(peeper.Script, Provider, NetworkSide.Server);

            if (peeper.Script == false || canApply == false)
            {
                //Validate for AI
                if (peeper.Script.PlayerState == PlayerScript.PlayerStates.Ai)
                {
                    if (Validations.CanApply(new AiActivate(peeper.GameObject, null,
                                                            Provider, Intent.Help, AiActivate.ClickTypes.NormalClick), NetworkSide.Server))
                    {
                        continue;
                    }
                }

                TabUpdateMessage.Send(peeper.GameObject, Provider, Type, TabAction.Close);
            }
        }
    }
Beispiel #21
0
 public void ServerPerformInteraction(HandApply interaction)
 {
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
 }
 public void ServerPerformInteraction(InventoryApply interaction)
 {
     //show the paper to the client
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
     paper.UpdatePlayer(interaction.Performer);
 }
Beispiel #23
0
 public override void Interaction(HandApply interaction)
 {
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.Mixer, TabAction.Open);
 }
 private TabUpdateMessage FailValidation(ConnectedPlayer player, GameObject tabProvider, string reason = "")
 {
     Logger.LogWarning($"{player.Name}: Tab interaction w/{tabProvider} denied: {reason}", Category.NetUI);
     return(TabUpdateMessage.Send(player.GameObject, tabProvider, NetTabType, TabAction.Close));
 }
Beispiel #25
0
 public void ServerPerformInteraction(InventoryApply interaction)
 {
     playerInteracted = interaction.Performer;
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
 }
Beispiel #26
0
 public void ServerCloseTabFor(ConnectedPlayer player)
 {
     TabUpdateMessage.Send(player.GameObject, Provider, Type, TabAction.Close);
 }
Beispiel #27
0
        public void ServerPerformInteraction(HandApply interaction)
        {
            if (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Screwdriver))
            {
                AudioSourceParameters audioSourceParameters = new AudioSourceParameters(pitch: UnityEngine.Random.Range(0.8f, 1.2f));
                SoundManager.PlayNetworkedAtPos(CommonSounds.Instance.screwdriver, interaction.Performer.AssumedWorldPosServer(), audioSourceParameters, sourceObj: gameObject);
                //Unscrew panel
                panelopen = !panelopen;
                if (panelopen)
                {
                    Chat.AddActionMsgToChat(interaction.Performer,
                                            $"You unscrews the {gameObject.ExpensiveName()}'s cable panel.",
                                            $"{interaction.Performer.ExpensiveName()} unscrews {gameObject.ExpensiveName()}'s cable panel.");
                    return;
                }
                else
                {
                    Chat.AddActionMsgToChat(interaction.Performer,
                                            $"You screw in the {gameObject.ExpensiveName()}'s cable panel.",
                                            $"{interaction.Performer.ExpensiveName()} screws in {gameObject.ExpensiveName()}'s cable panel.");
                    return;
                }
            }

            if (HackingProcessBase != null)
            {
                if (panelopen && (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Cable) ||
                                  Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Wirecutter)))
                {
                    TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.HackingPanel, TabAction.Open);
                }
            }

            if (MachineParts == null)
            {
                return;
            }

            if (canNotBeDeconstructed)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer,
                                             "This machine is too well built to be deconstructed.");
                return;
            }

            if (mustBeUnanchored && gameObject.GetComponent <PushPull>()?.IsPushable == false)
            {
                Chat.AddExamineMsgFromServer(interaction.Performer,
                                             $"The {gameObject.ExpensiveName()} needs to be unanchored first.");
                return;
            }

            if (Validations.HasUsedItemTrait(interaction, CommonTraits.Instance.Crowbar) && panelopen)
            {
                //unsecure
                ToolUtils.ServerUseToolWithActionMessages(interaction, secondsToScrewdrive,
                                                          $"You start to deconstruct the {gameObject.ExpensiveName()}...",
                                                          $"{interaction.Performer.ExpensiveName()} starts to deconstruct the {gameObject.ExpensiveName()}...",
                                                          $"You deconstruct the {gameObject.ExpensiveName()}.",
                                                          $"{interaction.Performer.ExpensiveName()} deconstructs the {gameObject.ExpensiveName()}.",
                                                          () => { WhenDestroyed(null); });
            }
        }
Beispiel #28
0
 //Ai interaction
 public override void AiInteraction(AiActivate interaction)
 {
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.Mixer, TabAction.Open);
 }
Beispiel #29
0
        private void ProcessFurther(ConnectedPlayer player, GameObject tabProvider, NetMessage msg)
        {
            if (player == null)
            {
                Logger.LogWarning("[TabInteractMessage.ProcessFurther] - player is null", Category.NetUI);
                return;
            }
            else if (tabProvider == null)
            {
                Logger.LogWarning("[TabInteractMessage.ProcessFurther] - tabProvider is null", Category.NetUI);
                return;
            }

            var playerScript = player.Script;

            //First Validations is for objects in the world (computers, etc), second check is for items in active hand (null rod, PADs).
            bool validate;

            if (playerScript.PlayerState == PlayerScript.PlayerStates.Ai)
            {
                validate = Validations.CanApply(new AiActivate(player.GameObject, null,
                                                               tabProvider, Intent.Help, AiActivate.ClickTypes.NormalClick), NetworkSide.Server);
            }
            else
            {
                validate = Validations.CanApply(playerScript, tabProvider, NetworkSide.Server);

                try
                {
                    if (validate == false)
                    {
                        //Allow if in hand
                        var hand = playerScript.DynamicItemStorage.OrNull()?.GetActiveHandSlot();
                        if (hand != null)
                        {
                            validate = hand.ItemObject == tabProvider;
                        }
                    }
                }
                catch (NullReferenceException exception)
                {
                    Logger.LogError($"Caught NRE in TabInteractMessage.Process: Tab: {tabProvider.OrNull().ExpensiveName()} {exception.Message} \n {exception.StackTrace}", Category.Interaction);
                    return;
                }
            }

            if (validate == false)
            {
                FailValidation(player, tabProvider, msg, "Can't interact/reach");
                return;
            }

            var tabInfo = NetworkTabManager.Instance.Get(tabProvider, msg.NetTabType);

            if (!tabInfo /* == NetworkTabInfo.Invalid*/)
            {
                //No such tab exists on server!
                FailValidation(player, tabProvider, msg, $"No such tab: {tabProvider}/{msg.NetTabType}");
                return;
            }

            var updatedElement = tabInfo[msg.ElementId];

            if (updatedElement == null)
            {
                //No such element exists on server!
                FailValidation(player, tabProvider, msg, $"No such element: {tabInfo}[{msg.ElementId}]");
                return;
            }

            if (updatedElement.InteractionMode == ElementMode.ServerWrite)
            {
                //Don't change labels and other non-interactable elements. If this is triggered, someone's tampering with client
                FailValidation(player, tabProvider, msg, $"Non-interactable {updatedElement}");
                return;
            }

            var valueBeforeUpdate = updatedElement.ValueObject;

            updatedElement.BinaryValue = msg.ElementValue;
            updatedElement.ExecuteServer(player);

            if (updatedElement.InteractionMode == ElementMode.ClientWrite)
            {
                //Don't rememeber value provided by client and restore to the initial one
                updatedElement.ValueObject = valueBeforeUpdate;
            }

            //Notify all peeping players of the change
            List <ConnectedPlayer> list = NetworkTabManager.Instance.GetPeepers(tabProvider, msg.NetTabType);

            for (var i = 0; i < list.Count; i++)
            {
                var connectedPlayer = list[i];
//Not sending that update to the same player
                if (connectedPlayer.GameObject != player.GameObject)
                {
                    TabUpdateMessage.Send(connectedPlayer.GameObject, tabProvider, msg.NetTabType, TabAction.Update,
                                          player.GameObject,
                                          new[] { new ElementValue {
                                                      Id = msg.ElementId, Value = updatedElement.BinaryValue
                                                  } });
                }
            }
        }
Beispiel #30
0
 protected override void ServerPerformInteraction(HandActivate interaction)
 {
     //show the paper to the client
     TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open);
     paper.UpdatePlayer(interaction.Performer);
 }