示例#1
0
    public void GetInteractions()
    {
        //find all possible interactable objects in range
        Collider2D[] possibleInteractions;
        possibleInteractions = Physics2D.OverlapCircleAll(myTransform.position, interactionDistance, LayerMaskHandler.instance.interactableLayer);
        if (possibleInteractions.Length == 0)
        {
            myInteractionObject = null; return;
        }

        //find closest interactable object in range
        float distance          = 1000f;//start at an impossiblity
        int   interactionObject = 0;

        for (int i = 0; i < possibleInteractions.Length; i++)
        {
            float newDistance = (possibleInteractions[i].transform.position - myTransform.position).magnitude;
            if (newDistance < distance)
            {
                distance = newDistance; interactionObject = i;
            }
        }
        myInteractionObject = possibleInteractions[interactionObject].gameObject;
        InteractionBase myInteraction = myInteractionObject.GetComponent("InteractionBase") as InteractionBase;

        myInteraction.Use();
    }
示例#2
0
 public static void SetupTree()
 {
     if (displayTree == null)
     {
         return;
     }
     displayTree.Nodes.Clear();
     currentObject = null;
     nodeBase.Clear();
     text.Visible = false;
     save.Visible = false;
     foreach (InteractionBase b in interactedObject.InterItems)
     {
         if (b is InteractionChoice c)
         {
             TreeNode tn = new TreeNode(c.ToString(), GetTreeArray(c));
             displayTree.Nodes.Add(tn);
             nodeBase.Add(tn, c);
         }
         else
         {
             TreeNode tn = new TreeNode(b.ToString());
             displayTree.Nodes.Add(tn);
             nodeBase.Add(tn, b);
         }
     }
 }
示例#3
0
        // Utility
        static private void SwapBasicAndHoldInteractions(InteractionActivator activator, ref IInteraction vanillaBasic, ref IInteraction vanillaHold)
        {
            InteractionBase basic = vanillaBasic as InteractionBase;
            InteractionBase hold  = vanillaHold as InteractionBase;

            if (_swapWaterInteractions && basic.Is <GatherWaterInteraction>() && hold.Is <DrinkWaterInteraction>() ||
                _singleHoldsToPresses && activator.CanDoHold && !activator.CanDoBasic && hold.IsNot <InteractionDisassemble>())
            {
                if (basic != null)
                {
                    basic.SetOverrideHoldLocKey(basic.DefaultPressLocKey);
                }
                if (hold != null)
                {
                    hold.SetOverridePressLocKey(hold.DefaultHoldLocKey);
                }
                Utility.Swap(ref vanillaBasic, ref vanillaHold);

                InteractionTriggerBase triggerBase = activator.GetComponent <InteractionTriggerBase>();
                if (triggerBase != null)
                {
                    Utility.Swap(ref triggerBase.m_basicConditions, ref triggerBase.m_holdConditions);
                }
            }
        }
示例#4
0
 public void NextNode()
 {
     elementNum++;
     if (elementNum < interactionElements.Count)
     {
         currentInteraction          = interactionElements[elementNum];
         currentInteraction.nextNode = NextNode;
         currentInteraction.Setup();
     }
     else
     {
         Screen.CloseWindow("interaction");
     }
 }
示例#5
0
 public void PreviousNode()
 {
     elementNum--;
     if (elementNum >= 0)
     {
         currentInteraction          = interactionElements[elementNum];
         currentInteraction.nextNode = NextNode;
         currentInteraction.Setup();
     }
     else
     {
         Screen.CloseWindow("interaction");
         elementNum = 0;
     }
 }
示例#6
0
 public static void UpdateNodeData(object sender, TreeNodeMouseClickEventArgs e)
 {
     if (e.Button != MouseButtons.Left || !nodeBase.ContainsKey(e.Node))
     {
         return;
     }
     if (currentObject != null && nodeBase.ContainsValue(currentObject))
     {
         SaveInteractionData();
     }
     currentObject            = nodeBase[e.Node];
     displayTree.SelectedNode = e.Node;
     DeleteOnce = false;
     del.Text   = "Delete Item";
     SetupInteractionData();
 }
        public void ProcessInteraction(ServerGameState fullState, InteractionBase interaction)
        {
            switch (interaction.Type)
            {
            case InteractionType.Attack:
                attackProcessor.ProcessAttack(fullState, interaction as InteractionAttack);
                return;

            case InteractionType.PlayCard:
                playCardProcessor.ProcessPlayCard(fullState, interaction as InteractionPlayCard);
                return;

            case InteractionType.EndTurn:
                endTurnProcessor.ProcessEndTurn(fullState, interaction as InteractionEndTurn);
                return;
            }

            throw new ArgumentOutOfRangeException("interaction.Type", interaction.Type, "Unsupported interaction type");
        }
示例#8
0
 public HashSet <UIBase> LoadObjects()
 {
     blob.ClickAction = (x, y) => {
         if (currentInteraction is InteractionChoice c)
         {
             return(c.CheckClick(x, y));
         }
         else
         {
             NextNode();
             return(true);
         }
     };
     elementNum = 0;
     foreach (InteractionBase b in interactionElements)
     {
         b.nextNode = NextNode;
     }
     currentInteraction = interactionElements[elementNum];
     currentInteraction.Setup();
     return(UIObjects);
 }
        public ValidationResult ValidateInteraction(ClientGameState currentState, InteractionBase interaction)
        {
            switch (interaction.Type)
            {
            case InteractionType.Attack:
                return(attackProcessor.ValidateAttack(currentState, interaction as InteractionAttack));

            case InteractionType.PlayCard:
                return(playCardProcessor.ValidatePlayCard(currentState, interaction as InteractionPlayCard));

            case InteractionType.EndTurn:
                return(endTurnProcessor.ValidateEndTurn(currentState));
            }

            return(new ValidationResult()
            {
                IsOk = false,
                Messages = new List <string>()
                {
                    $"Unknown Interaction of type {interaction.GetType()} encountered"
                }
            });
        }
示例#10
0
        // setup the entire interactor object and merton NPC (no gameplay)
        private void SetupInteractor(Vector3 pos)
        {
            // base gameobject
            InteractorObj = new GameObject("Horde_Interactor");
            InteractorObj.transform.position = pos;

            // fire sigil visuals
            StartCoroutine(AddItemToInteractor(8000010, Vector3.down * 0.35f, Vector3.zero, false, InteractorObj.transform));

            // setup Merton NPC
            var merton = SetupBasicNPC(pos, true);

            merton.transform.parent = InteractorObj.transform;
            // setup auto look
            merton.AddComponent <NPCLookFollow>();
            // setup character visuals
            try { SetupNpcArmor(merton, new List <int> {
                    3200030, 3200031, 3200032
                }); }
            catch { }
            // animation fix
            merton.SetActive(false);
            merton.SetActive(true);
            // make big
            merton.transform.localScale *= 1.6f;

            // setup components
            InteractionTriggerBase triggerBase = InteractorObj.AddComponent <InteractionTriggerBase>();
            InteractionActivator   activator   = InteractorObj.AddComponent <InteractionActivator>();
            //InteractionBase interactBase = InteractorObj.AddComponent(new InteractionBase { OnActivationEvent = new UnityAction(InteractorBeginEvent) });
            InteractionBase interactBase = InteractorObj.AddComponent <InteractionBase>();

            interactBase.OnActivationEvent = new UnityAction(InteractorBeginEvent);
            triggerBase.SetActivator(activator);
            At.SetValue("Begin <color=#FF0000>Merton's Challenge</color>", typeof(InteractionActivator), activator, "m_overrideBasicText");
            At.SetValue(interactBase, typeof(InteractionActivator), activator, "m_sceneBasicInteraction");
        }
示例#11
0
 public static bool Activate(InteractionBase __instance, Character _character)
 {
     // Activate > OnActivate > ActivationDone
     try
     {
         //WorkInProgress.Instance.MyLogger.LogDebug("Activate=" + __instance.GetType().Name);
         if (__instance.GetType() != typeof(InteractionSleep))
         {
             return(true);
         }
         var ds = (__instance as InteractionSleep).Item.GetComponent <CustomDurable>();
         if (ds == null)
         {
             return(true);
         }
         //WorkInProgress.Instance.MyLogger.LogDebug($"RestrictUsageOfTents[{(__instance as InteractionSleep).Item.name}]={ds.CurrentDurability}");
         //var list = Resources.FindObjectsOfTypeAll<GameObject>().Where(g => g.name.StartsWith("5000021_Bedroll_")
         //    && g.GetComponent<Item>() != null
         //    && g.GetComponent<Item>().CurrentDurability == 100
         //    ).ToList();
         //foreach (var go in list)
         //{
         //    AccessTools.Field(typeof(Item), "m_currentDurability").SetValue(go.GetComponent<Item>(), 42);
         //    WorkInProgress.Instance.MyLogger.LogDebug($" > {go.name} ({go.GetComponent<Item>().CurrentDurability})");
         //}
         if (_character.Inventory.HasABag)
         {
             _character.CharacterUI.ShowInfoNotification("You must remove your bagpack before sleep!");
             return(false);
         }
     }
     catch (Exception ex)
     {
         WorkInProgress.Instance.MyLogger.LogError("Activate: " + ex.Message);
     }
     return(true);
 }
示例#12
0
        public override void OnInspectorGUI()
        {
            InteractionBase interaction = (InteractionBase)target;

            GUILayout.Label(interaction.Storage == null ? "Unlinked" : "Linked to " + interaction.Storage.name);

            if (GUILayout.Button("Link to closest Storage"))
            {
                Storage[] s = FindObjectsOfType <Storage>();

                int   closest = -1;
                float dist    = float.MaxValue;

                for (int i = 0; i < s.Length; i++)
                {
                    float localDist = Vector3.Distance(interaction.transform.position, s[i].transform.position);
                    if (localDist < dist)
                    {
                        closest = i;
                        dist    = localDist;
                    }
                }

                if (closest > -1)
                {
                    interaction.Storage = s[closest];
                    UnityEditor.PrefabUtility.RecordPrefabInstancePropertyModifications(interaction);
                }
                else
                {
                    Debug.Log("No Storage found.");
                }
            }

            DrawDefaultInspector();
        }
示例#13
0
        private IEnumerator FixReviveInteraction(InteractionBase _base, UnityEngine.Events.UnityAction action)
        {
            yield return(new WaitForSeconds(0.1f));

            _base.OnActivationEvent = action;
        }
示例#14
0
        // usually called from LoadScene. Also by the Sync functions when you join a host.
        public IEnumerator SetupBonfireLocal(Vector3 position, string uid)
        {
            Debug.Log("Setting up bonfire at: " + position.ToString() + ", uid: " + uid);

            var bonfire = new GameObject("Bonfire_" + uid);

            bonfire.transform.position = position;

            var activatedCampfire = ResourcesPrefabManager.Instance.GetItemPrefab(5000101).GetComponent <Deployable>().DeployedStateItemPrefab.VisualPrefab;
            var fireVisuals       = Instantiate(activatedCampfire.gameObject);

            fireVisuals.transform.parent   = bonfire.transform;
            fireVisuals.transform.position = bonfire.transform.position;

            var swordVisuals = Instantiate(ResourcesPrefabManager.Instance.GetItemPrefab(2000151).VisualPrefab.gameObject);

            swordVisuals.transform.parent   = bonfire.transform;
            swordVisuals.transform.position = bonfire.transform.position + Vector3.up;
            swordVisuals.transform.rotation = Quaternion.Euler(0, 0, 90);

            var sigilVisuals = Instantiate(ResourcesPrefabManager.Instance.GetItemPrefab(8000010).VisualPrefab.gameObject);

            sigilVisuals.transform.parent   = bonfire.transform;
            sigilVisuals.transform.position = bonfire.transform.position;

            // interaction gameobject base
            GameObject actionHolder = new GameObject("Interaction_Holder");

            actionHolder.transform.parent   = bonfire.transform;
            actionHolder.transform.position = bonfire.transform.position;

            // setup components
            InteractionTriggerBase triggerBase  = actionHolder.AddComponent <InteractionTriggerBase>();
            InteractionActivator   activator    = actionHolder.AddComponent <InteractionActivator>();
            InteractionBase        interactBase = actionHolder.AddComponent <InteractionBase>();

            // setup the trigger base
            triggerBase.SetHolderUID(uid);
            triggerBase.GenerateColliderIfNone = true;
            triggerBase.IsLargeTrigger         = true;
            triggerBase.DetectionPriority      = -9999;
            triggerBase.SetActivator(activator);

            // setup the interaction activator
            activator.SetUID(uid);
            At.SetValue("Rest at <color=#fc4e03>Bonfire</color>", typeof(InteractionActivator), activator, "m_overrideBasicText");
            At.SetValue(interactBase, typeof(InteractionActivator), activator, "m_sceneBasicInteraction");

            // setup the event interaction base
            interactBase.OnActivationEvent = BonfireEvent;

            // =========== finalize =========== //
            bonfire.gameObject.SetActive(true);

            yield return(new WaitForSeconds(0.1f));

            //activator.Reregister();
            foreach (ParticleSystem ps in fireVisuals.GetComponentsInChildren <ParticleSystem>())
            {
                ps.Play();
                var m = ps.main;
                m.prewarm     = true;
                m.playOnAwake = true;
            }
            foreach (Light light in fireVisuals.GetComponentsInChildren <Light>())
            {
                light.gameObject.SetActive(true);
            }
            foreach (SoundPlayer sound in fireVisuals.GetComponentsInChildren <SoundPlayer>())
            {
                sound.Play(false);
            }
        }
示例#15
0
        void MoveVertical()
        {
            bool isCurrentlyJumping = startedToListen && state.IsJumping();

            if (grounded && jumpReady && isCurrentlyJumping)
            {
                grounded      = false;
                jumpReady     = false;
                verticalSpeed = jumpSpeed;
            }

            if (canAirJump && !grounded && airJumpReady && isCurrentlyJumping)
            {
                airJumpReady  = false;
                verticalSpeed = jumpSpeed;
            }

            float previousVerticalSpeed = verticalSpeed;

            verticalSpeed -= gravity * Time.fixedDeltaTime;

            float verticalSpeedAirturnMoment = .15f;

            if (!airturned &&
                (previousVerticalSpeed >= verticalSpeedAirturnMoment) &&
                (verticalSpeed <= verticalSpeedAirturnMoment))
            {
                animator.StartAnimation(Animation.AIRTURN, state.GetDirection(), () =>
                {
                    airJumpReady = true;
                    airturned    = true;
                });
            }

            if (verticalSpeed < maximumVerticalDropSpeed)
            {
                verticalSpeed = maximumVerticalDropSpeed;
            }

            Vector2 movementVector = new Vector2(0, verticalSpeed);

            RaycastHit2D hit = Physics2D.BoxCast(collider.bounds.center, collider.bounds.size,
                                                 0, movementVector, Mathf.Abs(movementVector.y), LayerMask.GetMask(collisionLayers));

            bool wasGrounded = grounded;

            if (hit.collider != null)
            {
                bool touchedFloor = false;

                float maximumDistance = movementVector.y < 0 ? -hit.distance + safetyRing : hit.distance - safetyRing;
                if (hit.distance == 0)
                {
                    movementVector = new Vector2(0, 0);
                    touchedFloor   = true;
                }
                else if (Mathf.Abs(maximumDistance) < Mathf.Abs(movementVector.y))
                {
                    movementVector = new Vector2(0, maximumDistance);
                    touchedFloor   = true;
                }

                if (touchedFloor)
                {
                    if (verticalSpeed < 0)
                    {
                        grounded = true;
                    }

                    verticalSpeed = 0f;
                }
                else
                {
                    grounded = false;
                }
            }
            else
            {
                grounded = false;
            }

            if (grounded && !wasGrounded)
            {
                if (airturned)
                {
                    airturned = false;
                    animator.StartAnimation(Animation.LANDING, state.GetDirection());
                }
                else
                {
                    jumpReady = true;
                }

                airJumpReady = false;
            }

            Move(movementVector);

            if (grounded)
            {
                RaycastHit2D[] floorHits = Physics2D.BoxCastAll(collider.bounds.center, collider.bounds.size,
                                                                0, Vector2.down, safetyRing, LayerMask.GetMask(collisionLayers));

                foreach (RaycastHit2D floorHit in floorHits)
                {
                    if (floorHit.collider != null)
                    {
                        if (floorHit.rigidbody != null)
                        {
                            InteractionBase interact = floorHit.rigidbody.GetComponent <InteractionBase>();
                            if (interact != null)
                            {
                                Influence(interact.Do());
                            }
                        }
                    }
                }
            }
        }
    public void ConfigureAudioSetUp()
    {
        CheckSoundBanks();

        if (AmbiantSound != null && RoomAmbiantType)
        {
            PlayerDetectionSphereCollider.enabled = false;
            PlayerDetectionBoxCollider.enabled    = true;

            PlayerDetectionBoxCollider.isTrigger = true;
            PlayerDetectionBoxCollider.size      = new Vector3(maxDistanceToHear + 5f, maxDistanceToHear + 5f, PlayerDetectionBoxCollider.size.z);

            AmbiantAudioInit();
        }
        else if (AmbiantSound != null && ObjectAmbiantType)
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;

            AmbiantAudioInit();
        }
        else if (PonctualSoundsEnabled && InteractionType)
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;
            audio.loop        = false;
            audio.playOnAwake = false;

            if (this.transform.parent.GetComponent <InteractionBase>() != null)
            {
                soundInteractionSource = this.transform.parent.GetComponent <InteractionBase>();
            }

            if (soundInteractionSource.GetComponent <PowerInteraction>() != null)
            {
                powerInteractionSource = soundInteractionSource.GetComponent <PowerInteraction>();
            }

            GetSpecificInteractionType();
        }
        else if (AmbiantSound != null && MixedType)
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;

            AmbiantAudioInit();

            if (this.transform.parent.GetComponent <InteractionBase>() != null)
            {
                soundInteractionSource = this.transform.parent.GetComponent <InteractionBase>();
            }

            GetSpecificInteractionType();
        }
        else if (OtherType)
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;
            audio.loop        = false;
            audio.playOnAwake = false;
        }
        else if (OtherTypeLoop)
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;
            audio.playOnAwake = false;

            if (this.transform.parent.GetComponent <InteractionBase>() != null)
            {
                soundInteractionSource = this.transform.parent.GetComponent <InteractionBase>();
            }
        }
        else
        {
            PlayerDetectionBoxCollider.enabled    = false;
            PlayerDetectionSphereCollider.enabled = true;

            PlayerDetectionSphereCollider.radius = maxDistanceToHear + 5f;
            audio.mute = true;
            audio.Pause();
        }
    }
示例#17
0
 void Start()
 {
     basicAudioEventPlayer.audio.loop = true;
     interactionBase = this.transform.parent.GetComponent <InteractionBase>();
     interactionBase.Event_Interaction_On.AddListener(SelectStateOfSound);
 }