// Use this for initialization
 private void Awake()
 {
     // 이 객체의 정보들을 담는다.
     UIMAudio        = UIM.GetComponent <AudioSource>();
     ThisAudio       = GetComponent <AudioSource>();
     HitMsg          = HitMessage.GetComponent <SpriteRenderer>();
     Health          = UIM.enemyMaxHP;
     ThisBody        = GetComponent <Rigidbody2D>();
     ThisTransform   = GetComponent <Transform>();
     ThisName        = ThisTransform.tag;
     targetTransform = target.GetComponent <Transform>();
     Bullets         = new B_DestroyInTime[bullet.Length];
     LastBullets1    = new B_DestroyInTime[LastBullet1.Length];
     bulletAnimator  = new Animator[bulletObject.Length];
     for (int i = 0; i < bullet.Length; i++)
     {
         bullet[i].gameObject.SetActive(false);
         Bullets[i] = bullet[i].GetComponent <B_DestroyInTime>();
     }
     for (int i = 0; i < LastBullet1.Length; i++)
     {
         LastBullet1[i].gameObject.SetActive(false);
         LastBullets1[i] = LastBullet1[i].GetComponent <B_DestroyInTime>();
     }
     for (int i = 0; i < bulletAnimator.Length; i++)
     {
         bulletAnimator[i] = bulletObject[i].GetComponent <Animator>();
     }
     waterball.SetActive(false);
     ClearEnemy.SetActive(false);
     HitMessage.SetActive(false);
 }
Beispiel #2
0
 protected override void OnNpcHit(NPC npc, HitMessage hitmessage)
 {
     if (!npc.IsHostile && hitmessage.IsPlayer)
     {
         EndStage(CurrentStage, StageEndReason.CivilianDied);
     }
 }
Beispiel #3
0
 /// <summary>
 /// Event triggered on the death of an NPC
 /// </summary>
 /// <param name="npc">NPC that died</param>
 /// <param name="hitmessage">info about the hit that killed the NPC</param>
 private void OnNpcDeath(NPC npc, HitMessage hitmessage)
 {
     if (hitmessage.IsPlayer)
     {
         StartCoroutine("gameoverWait", false);
     }
 }
 // 공격 당했을 시
 private void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.tag.Equals("waterbullet") && Health > 0)
     {
         Health--;
         headAnimator.SetTrigger("hit");
         wingsAnimator.SetTrigger("hit");
         bodyAnimator.SetTrigger("hit");
         flag = false;
         if (ThisName.Equals("enemy1"))
         {
             UIM.HitEnemy1();
         }
         else if (ThisName.Equals("enemy2"))
         {
             UIM.HitEnemy2();
         }
         waterball.SetActive(true);
         HitMessage.SetActive(true);
         if (Health > 0)
         {
             Invoke("SetFlagAndBall", 2f);
         }
         else
         {
             Invoke("SetFlagAndBall", 1.5f);
         }
     }
 }
Beispiel #5
0
        /// <summary>
        /// Detects limb that was hit and set the scale to 0 to create illusion arm is gone
        /// </summary>
        /// <param name="hitMessage"></param>
        private void LoseLimb(HitMessage hitMessage)
        {
            this.hitMessage = hitMessage;

            if (hitMessage.HitObject != null)
            {
                if (_armLeft.Any(obj => obj.name == hitMessage.HitObject.name))
                {
                    _armLeft [0].transform.localScale = Vector3.zero;
                    leftArm = true;
                }
                else if (_armRight.Any(obj => obj.name == hitMessage.HitObject.name))
                {
                    _armRight [0].transform.localScale = Vector3.zero;
                    rightArm = true;
                }
                else if (_legLeft.Any(obj => obj.name == hitMessage.HitObject.name))
                {
                    _legLeft [0].transform.localScale = Vector3.zero;
                    leftLeg = true;
                }
                else if (_legRight.Any(obj => obj.name == hitMessage.HitObject.name))
                {
                    _legRight [0].transform.localScale = Vector3.zero;
                    rightLeg = true;
                }
                else if (_head.Any(obj => obj.name == hitMessage.HitObject.name))
                {
                    _head [0].transform.localScale = Vector3.zero;
                    head = true;
                }

                InstantiateObj(); // tijdelijk booleans moeten uitgezet worden na instantiate
            }
        }
Beispiel #6
0
 /// <summary>
 /// Even triggerd when an npc gets hit
 /// </summary>
 /// <param name="npc"></param>
 /// <param name="hitmessage"></param>
 protected virtual void OnNpcHit(NPC npc, HitMessage hitmessage)
 {
     if (!npc.IsHostile && hitmessage.IsPlayer)
     {
         GameOver();
         ShowGameOverReason(StageEndReason.CivilianDied);
     }
 }
Beispiel #7
0
        /// <summary>
        /// Checks tags of hit object to play environment effects or to send hit message to a game object.
        /// </summary>
        /// <param name="hit"></param>
        private void HandleHit(RaycastHit hit)
        {
            HitMessage message = new HitMessage(
                hit.point,
                hit.transform.gameObject,
                RaycastObject.transform,
                RNG.NextFloat(_minDamage, _maxDamage),
                ImpactForce,
                true
                );

            bool hitNPC = (hit.transform.gameObject.GetComponentInParent <NPC>() != null) ? true : false;

            if (hitNPC)
            {
                if (ScenarioBase.Instance != null)
                {
                    if (ScenarioBase.Instance.Started)
                    {
                        Statistics.ShotsHit++;
                    }
                }
            }

            // Check tags to see if it hit the environment or something else
            switch (hit.transform.tag)
            {
            case "Stone":
                Instantiate(BulletHitStone, hit.point, Quaternion.LookRotation(hit.normal));
                AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitStone,
                                                 AudioController.GunVolume);
                break;

            case "Metal":
                Instantiate(BulletHitMetal, hit.point, Quaternion.Euler(hit.normal));
                AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitMetal,
                                                 AudioController.GunVolume);
                break;

            case "Wood":
                Instantiate(BulletHitWood, hit.point, Quaternion.Euler(hit.normal));
                AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitWood,
                                                 AudioController.GunVolume);
                break;

            case "Civilian":
                break;

            case "Bird":
                hit.transform.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver);
                break;
            }

            // It is up to the receiver to implement a OnHit function.
            SendHitMessage(hit.transform.gameObject, message);
        }
Beispiel #8
0
 /// <summary>
 /// Event triggered when a npc dies
 /// </summary>
 /// <param name="npc">the npc that died</param>
 /// <param name="hitmessage">the info about the hit</param>
 private void OnNPCDeath(NPC npc, HitMessage hitmessage)
 {
     timer = 0;
     // Check if the npc was killed by a player and was a neutral npc
     if (!npc.IsHostile && hitmessage.IsPlayer)
     {
         // End the current stage
         EndStage(CurrentStage, StageEndReason.CivilianDied);
     }
 }
        public void EnergyLow(Asteroid asteroid)
        {
            Energy -= asteroid.Power;
            if (Energy < 0)
            {
                Energy = 0;
            }

            HitMessage?.Invoke();
        }
Beispiel #10
0
        private void HitPlayer(HitMessage message)
        {
            WriteLine($"{_playerName} received HitMessage");
            WriteLine($"{_playerName} persisting HitMessage");

            Persist(message, hitMessage =>
            {
                WriteLine($"{_playerName} persisted HitMessage ok, updating actor state");
                _health -= message.Damage;
            });
        }
Beispiel #11
0
        /// <summary>
        /// Drop the weapon NPC is holding
        /// </summary>
        /// <param name="hitmessage"></param>
        /// <returns></returns>
        IEnumerator DropWeapon(HitMessage hitmessage)
        {
            yield return(new WaitForSeconds(0.25f));

            Item.Instance.transform.parent = null;

            Rigidbody rbody = Item.Instance.GetComponent <Rigidbody>();

            rbody.isKinematic = false;
            Item.Instance.GetComponent <BoxCollider>().enabled = true;
            rbody.AddForceAtPosition(hitmessage.Source.TransformDirection(Vector3.up) * 300, hitmessage.PointOfImpact);
        }
Beispiel #12
0
        /// <summary>
        /// Specifically shoot a target. Gun orientation does not matter. Shot always hits the specified target.
        /// Sends HitMessage to target.
        /// </summary>
        /// <param name="target"></param>
        public void Shoot(GameObject target)
        {
            PlayGunEffects();
            if (target == null)
            {
                return;
            }
            Rigidbody  rb      = target.GetComponentsInChildren <Rigidbody>().ToList().First(x => x.name == "Spine1");
            float      damage  = RNG.NextFloat(_minDamage, _maxDamage);
            HitMessage message = new HitMessage(transform.position, rb.gameObject, RaycastObject.transform, damage,
                                                ImpactForce);

            SendHitMessage(target, message);
        }
 private void SetFlagAndBall()
 {
     waterball.SetActive(false);
     HitMessage.SetActive(false);
     if (Health > 0)
     {
         ThisAudio.clip = enemyHit;
         ThisAudio.Play();
         flag = true;
     }
     else
     {
         Clear();
     }
 }
Beispiel #14
0
        public void RagOn(HitMessage hitmessage)
        {
            HitMessage = hitmessage;
            stateType  = StateType.One;

            //set ragbones position
            _ragBones[0].transform.localPosition = _skinBones[0].transform.localPosition;

            for (int i = 0; i < _ragBones.Count; i++)
            {
                _ragBones[i].transform.localRotation = _skinBones[i].transform.localRotation;
            }

            if (!ragFull)
            {
                BlendBack(); //initiate blend

                //naam geraakte bone overeen komt met naam in deze lijst(object van ragbones)..
                //hoewel de collider op skinbones zit maar zelfde naam heeft werkt dit ook. Bug misschien maar het werkt!
                if (_upperBodyRag.Any(obj => obj.name == HitMessage.HitObject.name))
                {
                    SetKinimatic(_upperBodyRag);
                }
                else if (_legsRag.Any(obj => obj.name == HitMessage.HitObject.name))
                {
                    SetKinimatic(_legsRag);
                }
            }
            else
            {
                if (_ragBones.Any(obj => obj.name == HitMessage.HitObject.name))
                {
                    foreach (GameObject rb in _ragBones)
                    {
                        Rigidbody rbody = rb.GetComponent <Rigidbody>();

                        if (rbody != null)
                        {
                            rbody.isKinematic      = false;
                            rbody.detectCollisions = true;
                        }
                    }
                }
                stateType = StateType.One;
            }
            ApplyForce();
        }
Beispiel #15
0
        /// <summary>
        /// Handles damage from weapons. Is usually called by sending a message.
        /// </summary>
        /// <param name="hitMessage"></param>
        public void OnHit(HitMessage hitMessage)
        {
            if (!IsAlive)
            {
                return;
            }
            //only save hit if it comes from the player

            float damage = hitMessage.Damage;

            if (hitMessage.HitObject.name == "Head" || _oneHit)
            {
                damage *= 4;
            }

            _hp -= damage;


            if (_hp <= 0)
            {
                Die(hitMessage);
            }
            else if (Ragdoll._legsRag.Any(obj => obj.name == hitMessage.HitObject.name))
            {
                // NPC hit in leg, also not dead
                Ragdoll.ragFull      = true;
                NavMeshAgent.enabled = false;
                Ragdoll.RagOn(hitMessage);
                Ragdoll.IsGettingUp = true;
                StartCoroutine(WaitGetUp());

                //wait until activating the oneHit kill boolean
                StartCoroutine(WaitSetBool());
            }
            else
            {
                // NPC not hit in leg, also not dead
                if (!Ragdoll.IsGettingUp) //prevents unwanted blend Bug
                {
                    Ragdoll.ragFull = false;
                    Ragdoll.RagOn(hitMessage);
                }
            }

            OnNPCHitEvent(this, hitMessage);
        }
Beispiel #16
0
        protected override void OnHit(Collider other, HitMessage msg)
        {
            // TODO: Destroy effect
            switch (msg)
            {
            case HitMessage.None:
                break;

            case HitMessage.Damage:
                Destroy(gameObject);
                break;

            case HitMessage.Destroy:
                Destroy(gameObject);
                break;
            }
        }
Beispiel #17
0
        private void OnTriggerEnter(Collider other)
        {
            // damage other
            HitMessage hmsg = GenerateHitMessage(other, out object obj);

            switch (hmsg)
            {
            case HitMessage.None:
                break;

            case HitMessage.Damage:
                ((Stats)obj).Damage(UsedAction.dmg + atk + strIntScl * GetScalledStat());
                OnHitDamage((Stats)obj);
                break;

            case HitMessage.Destroy:
                break;
            }
            OnHit(other, hmsg);
        }
Beispiel #18
0
        /// <summary>
        /// Make the NPC fall down and die
        /// </summary>
        /// <param name="hitMessage"></param>
        private void Die(HitMessage hitMessage)
        {
            IsAlive = false;

            //Activate LoseLimb Function of DetachableLimb.cs if Script is on hitObjects root. for Dummies
            if (hitMessage.HitObject.transform.root.GetComponent <DetachableLimbs>() != null)
            {
                hitMessage.HitObject.transform.root.SendMessage("LoseLimb", hitMessage,
                                                                SendMessageOptions.DontRequireReceiver);
            }
            //Ragdoll on Full
            Ragdoll.ragFull = true;
            Ragdoll.RagOn(hitMessage);
            Ragdoll.blend = false;

            //set item apart from owner
            if (Item != null && Item.Instance != null && Item.Instance.GetComponent <Rigidbody>() != null)
            {
                StartCoroutine(DropWeapon(hitMessage));
            }

            NavMeshAgent.enabled    = false;
            NavMeshObstacle.enabled = true;

            if (IsHostile)
            {
                Statistics.DeadHostilesByPlayer++;
                HostileNpcs.Remove(this);
            }
            else
            {
                Statistics.DeadFriendliesByPlayer++;
            }


            OnNPCDeathEvent(this, hitMessage);
        }
        private static Message Convert(string exchangeCode, HitCommand hitCommand)
        {
            XmlNode ordersNode = hitCommand.Content;
            Order[] orders;

            CommandConvertor.Parse(ordersNode, out orders);
            HitMessage hitMessage = new HitMessage(exchangeCode, orders);
            return hitMessage;
        }
Beispiel #20
0
 /// <summary>
 /// Even that triggers when the npc gets hit
 /// </summary>
 /// <param name="npc"></param>
 /// <param name="hitmessage"></param>
 private void OnHitEvent(NPC npc, HitMessage hitmessage)
 {
 }
Beispiel #21
0
 private void SendHitMessage(GameObject receiver, HitMessage message)
 {
     // Send this message to both root and self to ensure gameobject can receive message
     receiver.transform.root.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver);
     receiver.transform.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver);
 }
Beispiel #22
0
 protected override void OnHit(Collider other, HitMessage msg)
 {
     // TODO: hit effects
 }
Beispiel #23
0
 /// <summary>
 /// react to a hit
 /// </summary>
 /// <param name="hitMessage"></param>
 public void OnHit(HitMessage hitMessage)
 {
     Death();
 }
Beispiel #24
0
 protected abstract void OnHit(Collider other, HitMessage msg);
Beispiel #25
0
 private void HitPlayer(HitMessage message)
 {
     WriteLine($"{this._playerName} received HitMessage");
     this._health -= message.Damage;
 }
Beispiel #26
0
 /// <summary>
 /// Even that is triggered when a NPC dies
 /// </summary>
 /// <param name="npc"></param>
 private void OnDeathEvent(NPC npc, HitMessage hitmessage)
 {
 }
 private void Process(HitMessage hitMessage)
 {
     this._ExchangeDataManager.ProcessHitMessage(hitMessage);
 }