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; } }
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 } }); } } }
/// <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); } } }
/// <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); } } }
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(); } }
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); }
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); } } }
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); }
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); }
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); }); } }
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); }
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); }
/// <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); } } }
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); }
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)); }
public void ServerPerformInteraction(InventoryApply interaction) { playerInteracted = interaction.Performer; TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open); }
public void ServerCloseTabFor(ConnectedPlayer player) { TabUpdateMessage.Send(player.GameObject, Provider, Type, TabAction.Close); }
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); }); } }
//Ai interaction public override void AiInteraction(AiActivate interaction) { TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType.Mixer, TabAction.Open); }
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 } }); } } }
protected override void ServerPerformInteraction(HandActivate interaction) { //show the paper to the client TabUpdateMessage.Send(interaction.Performer, gameObject, NetTabType, TabAction.Open); paper.UpdatePlayer(interaction.Performer); }