Ejemplo n.º 1
0
 public void AfterTakedInitialize(IEnemy target, DamageMessage damage)
 {
     this.Target        = target;
     this.DamageMessage = damage;
     SetLinePosition(this.DamageMessage.Damager.position, this.Target.Transform.position);
     this.StartMagicBall.position = this.DamageMessage.Damager.position;
 }
Ejemplo n.º 2
0
    public void FillLifeLostEventData(Damageable damageable, DamageMessage enemyData)
    {
        LayerMask playerMask = LayerMask.NameToLayer("Player");

        if (damageable.gameObject.layer == playerMask)
        {
            LifeLostEvent newLifeLostEvent = new LifeLostEvent();
            newLifeLostEvent.pdata    = playerData;
            newLifeLostEvent.eventID  = ++evendIdCount;
            newLifeLostEvent.position = damageable.gameObject.GetComponent <Transform>().position;
            if (enemyData.damager.gameObject.name == "Spitter")
            {
                newLifeLostEvent.enemyType = "Spitter";
            }
            else if (enemyData.damager.GetComponent <GrenadierGrenade>())
            {
                newLifeLostEvent.enemyType = "Spitter";
            }
            else if (enemyData.damager.gameObject.transform.parent.gameObject.name == "Chomper")
            {
                newLifeLostEvent.enemyType = "Chomper";
            }
            newLifeLostEvent.timeStamp = Time.time;
            lifeLostEvents.events.Add(newLifeLostEvent);
        }
    }
Ejemplo n.º 3
0
    public void CheckToUpdateHealthMeter(DamageMessage damageData)
    {
        Debug.Log("Checking player's health meter, " + damageData.amount);
        if (damageData.victim == player.health)
        {
            healthCounter.text = player.health.values.current.ToString();
            FillMeter(healthBar, player.health.values.current, player.health.values.max);
            if (player.health.values.IsCritical)
            {
                healthCounter.color = resourceCriticalColour;
                // Do other stuff for critical health e.g. greyscale screen, warnings
            }
            else
            {
                healthCounter.color = resourceNormalColour;
            }

            /*
             * if (damageData.amount > 0)
             * {
             *
             * }
             */
        }
    }
Ejemplo n.º 4
0
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.name == "Ground")
        {
            Enemylist = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject Enemy in Enemylist)
            {
                var target = Enemy.GetComponent <LivingEntity>();
                if (Enemy.GetComponent <Transform>().position.y > 1)
                {
                    continue;
                }

                distance = (Enemy.GetComponent <Transform>().position - transform.position).magnitude;
                if (distance < range)
                {
                    Debug.Log(Enemy.name);
                    // ContactPoint contact = col.contacts[0];
                    var message = new DamageMessage();
                    message.amount    = damage;
                    message.damager   = gameObject;
                    message.hitPoint  = target.transform.position;
                    message.hitNormal = transform.position - target.transform.position;
                    // Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.norm);
                    target.ApplyDamage(message);
                }
            }
            Instantiate(effect, transform.position, Quaternion.identity);
            Destroy(this.gameObject);
        }
    }
Ejemplo n.º 5
0
    public void ApplyDamage(DamageMessage data)
    {
        // Ignore any damage. It is already dead
        if (currentHitPoints <= 0)
        {
            return;
        }

        // Decrease the hit points
        currentHitPoints -= data.amount;

        // If hitpoints <= 0, then dead
        // otherwise object receives damage

        // Get the message type
        var messageType = currentHitPoints <= 0 ? MessageType.DEAD : MessageType.DAMAGED;

        // Notify the object with a message
        for (int i = 0; i < onDamageMessageReceivers.Count; i++)
        {
            var receiver = onDamageMessageReceivers[i] as IMessageReceiver;
            // Apply the message type and data (damage) to this object...
            receiver.OnReceiveMessage(messageType, this, data);
        }
    }
Ejemplo n.º 6
0
    void combo1()
    {
        gizmoColor = Color.black;
        float timerCombo = timerAttack1 + timerAttack2;
        bool  attacked1  = attacked;

        if (seconds < timerCombo)
        {
            seconds += Time.deltaTime;

            if (seconds <= 0.3 * timerCombo)
            {
                //Attack1
                Debug.Log("Combo 1");
                DamageMessage m = new DamageMessage(transform, player, typeof(life), 10);
                MessageManager.get().SendMessage(m);
                attacked1 = true;
            }
            else if (seconds >= 0.5f * timerCombo || attacked1)
            {
                Debug.Log("Combo 2");
                DamageMessage m = new DamageMessage(transform, player, typeof(life), 20);
                MessageManager.get().SendMessage(m);
                attacked = true;
                //Attack2
            }
        }
        else if (seconds >= timerCombo || attacked)
        {
            Debug.Log("Going idle battle combo");
            setState(getState("battle"));
        }
    }
Ejemplo n.º 7
0
    private void FixedUpdate()
    {
        if (dead)
        {
            return;
        }

        // 공격이 아직 안들어감            공격이 들어가는중(애니메이션에 의해 통제됨
        if (state == State.AttackBegin || state == State.Attacking)
        {
            //공격시작이거나 공격중이라면 적이 바라보는 방향은 플레이어가 되어야함
            var lookRotation = Quaternion.LookRotation(targetEntity.transform.position - transform.position);
            var targetAngleY = lookRotation.eulerAngles.y;


            //타켓을 바라보게 할때 부드럽게 턴하기 위함
            targetAngleY          = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngleY, ref turnSmoothVelocity, turnSmoothTime);
            transform.eulerAngles = Vector3.up * targetAngleY;
        }

        if (state == State.Attacking)
        {
            var direction     = transform.forward;
            var deltaDistance = agent.velocity.magnitude * Time.deltaTime;//Time.deltaTime동안 움직이게될 거리를 계산


            //Sphere의 시작 지점부터 어떤 거리만큼 이동한다 했을때 그 사이에 있는 콜라이더를 반환함(SphereCast,SphereCastAll)
            //NonAlloc은 콜라이더의 개수가 몇개인지를 반환
            var size = Physics.SphereCastNonAlloc(attackRoot.position, attackRadius,
                                                  direction, hits, deltaDistance, whatIsTarget);

            for (var i = 0; i < size; i++)
            {
                var attackTargetEntity = hits[i].collider.GetComponent <LivingEntity>();


                if (attackTargetEntity != null && !lastAttackedTargets.Contains(attackTargetEntity))//공격 중에 중복공격을 막기위함
                {
                    var message = new DamageMessage();
                    message.amount   = damage;
                    message.damager  = gameObject;
                    message.hitPoint = hits[i].point;

                    if (hits[i].distance <= 0f)
                    {
                        message.hitPoint = attackRoot.position;
                    }
                    else
                    {
                        message.hitPoint = hits[i].point;
                    }
                    message.hitNormal = hits[i].normal;

                    attackTargetEntity.ApplyDamage(message);
                    lastAttackedTargets.Add(attackTargetEntity);
                    break;
                }
            }
        }
    }
 public static void Transmit(DamageMessage message)
 {
     if (OnDamage != null)
     {
         OnDamage.Invoke(message);
     }
 }
Ejemplo n.º 9
0
    public void HandleMessage(DamageMessage m)
    {
        dmg = m;
        receviedDMG = true;

        Debug.Log ("get msg");
    }
        public void ApplyDamage(DamageMessage data)
        {
            if (currentHitPoints <= 0)
            {
                return;
            }

            if (isInvulnerable)
            {
                return;
            }



            isInvulnerable    = true;
            currentHitPoints -= data.amount;

            if (currentHitPoints <= 0)
            {
                myEvent += OnDeath.Invoke;
            }
            else
            {
                OnHit.Invoke();
            }

            var messageType = currentHitPoints <= 0 ? MessageType.DEAD : MessageType.DAMAGED;

            for (var i = 0; i < onDamageMessageReceivers.Count; ++i)
            {
                var receiver = onDamageMessageReceivers[i] as IMessageReceiver;
                receiver.OnReceiveMessage(messageType, this, data);
            }
        }
Ejemplo n.º 11
0
    void OnDamaged(DamageMessage msg)
    {
        float   receivedDamage = msg.damage;
        Vector2 repelForce     = msg.repelForce;

        if (!isInvincible)
        {
            // take damage
            gm.playerStatus.currentHp -= receivedDamage;
            isInvincible         = true;
            isTransparent        = true;
            invincibleCountdown  = gm.playerStatus.invincibleDuration;
            spriteBlinkCountdown = spriteBlinkDuration;

            // repel from enemy
            rb2d.velocity = new Vector2(0f, 0f);
            rb2d.AddForce(repelForce, ForceMode2D.Impulse);
        }

        if (gm.playerStatus.currentHp <= 0)
        {
            Instantiate(pm.explosionType, transform.position, transform.rotation);
            LevelManager lm = GameObject.Find("LevelManager").GetComponent <LevelManager>();
            lm.EnableRestartBtn();
            transform.position = new Vector2(0, 0);
            transform.rotation = new Quaternion(0, 0, 0, 0);
            lm.DevpKillEnemy();
            lm.SetBtnIsActive(false);
        }
    }
Ejemplo n.º 12
0
    public void FillDeathEventData(Damageable damageable, DamageMessage enemyData)
    {
        LayerMask enemyMask       = LayerMask.NameToLayer("Enemy");
        LayerMask environmentMask = LayerMask.NameToLayer("Environment");

        if (enemyData.damager.gameObject.layer == enemyMask || enemyData.damager.gameObject.layer == environmentMask || enemyData.damager.GetComponent <GrenadierGrenade>() || enemyData.damager.transform.parent.gameObject.layer == enemyMask)
        {
            DeathEvent newDeathEvent = new DeathEvent();
            newDeathEvent.pdata    = playerData;
            newDeathEvent.eventID  = ++evendIdCount;
            newDeathEvent.position = damageable.gameObject.GetComponent <Transform>().position;
            newDeathEvent.rotation = damageable.gameObject.GetComponent <Transform>().rotation;
            if (enemyData.damager.gameObject.name == "Spitter")
            {
                newDeathEvent.enemyType = "Spitter";
            }
            else if (enemyData.damager.gameObject.name == "Acid")
            {
                newDeathEvent.enemyType = "Acid";
            }
            else if (enemyData.damager.GetComponent <GrenadierGrenade>())
            {
                newDeathEvent.enemyType = "Spitter";
            }
            else
            {
                newDeathEvent.enemyType = "Chomper";
            }
            newDeathEvent.timeStamp = Time.time;
            deathEvents.events.Add(newDeathEvent);
        }
    }
Ejemplo n.º 13
0
 public void OnNetworkDamageMessage(DamageMessage m)
 {
     if (this.myPlayerNumber == m.targetPlayer)
     {
         this.health = m.health;
     }
 }
Ejemplo n.º 14
0
    private void FixedUpdate()
    {
        if (dead)
        {
            return;
        }

        //대상을 바라보게 하는 코드
        if (state == State.AttackBegin || state == State.Attacking)
        {
            var lookRotation = Quaternion.LookRotation(targetEntity.transform.position - transform.position);
            //y축회전만 고려
            //스르륵 바라보기
            var targetAngleY = lookRotation.eulerAngles.y;
            targetAngleY = Mathf.SmoothDampAngle(transform.eulerAngles.y,
                                                 targetAngleY, ref turnSmoothVelocity, turnSmoothTime);
            transform.eulerAngles = Vector3.up * targetAngleY;
        }

        //공격궤적. 타임안에 들어오면 감지
        if (state == State.Attacking)
        {
            var direction     = transform.forward;
            var deltaDistance = agent.velocity.magnitude * Time.deltaTime;

            //감지 정확도 높이기
            var size = Physics.SphereCastNonAlloc(attackRoot.position,
                                                  attackRadius, direction, hits, deltaDistance, whatIsTarget);

            //Debug.Log("Stone size: "+size);
            //실제 damage주는 코드
            for (var i = 0; i < size; i++)
            {
                var attackTargetEntity = hits[i].collider.GetComponent <LivingEntity>();
                //Debug.Log("Stone's attackTargetEntity: " + attackTargetEntity);
                if (attackTargetEntity != null && !lastAttackedTargets.Contains(attackTargetEntity))
                {
                    var message = new DamageMessage();
                    message.amount  = damage;
                    message.damager = gameObject;

                    if (hits[i].distance <= 0f)
                    {
                        message.hitPoint = attackRoot.position;
                    }
                    else
                    {
                        message.hitPoint = hits[i].point;
                    }

                    message.hitNormal = hits[i].normal;

                    attackTargetEntity.ApplyDamage(message);
                    lastAttackedTargets.Add(attackTargetEntity);
                    break;
                }
            }
        }
    }
    public void DamageRecieve(DamageMessage message)
    {
        rigidbody.AddForce(message.damageForce * message.damageDirection);
        missileHealth -= message.damage;

        if (missileHealth <= 0)
            Abort();
    }
Ejemplo n.º 16
0
 void OnTriggerEnter2D(Collider2D other)
 {
     if (!other.isTrigger && other.CompareTag("Enemy"))
     {
         DamageMessage msg = new DamageMessage(damage);
         other.SendMessageUpwards("OnDamaged", msg);
     }
 }
Ejemplo n.º 17
0
    public void OnMessage(DamageMessage damageMsg)
    {
        HP -= damageMsg.PhysicalDamage + damageMsg.MagicalDamage;
        Debug.Log("Damaged");
        var dir = Vector3.Scale(transform.position - damageMsg.Sender.transform.position, new Vector3(1, 0, 1));

        GetComponent <SkillController>().MovementSkill.KnockBack(dir.normalized * damageMsg.KnockBack);
    }
Ejemplo n.º 18
0
 public void CheckForHitMarker(DamageMessage message)
 {
     if (message.attacker == player && message.victim != player)
     {
         Debug.Log("Damaged enemy on frame " + Time.frameCount);
         damageEffect.Invoke();
     }
 }
Ejemplo n.º 19
0
    public override void Dispatch(Message m)
    {
        DamageMessage mD = ((DamageMessage)m);

        life -= mD.damage;

        mD.sender.gameObject.SetActive(false);
    }
Ejemplo n.º 20
0
 void OnTriggerEnter2D(Collider2D other)
 {
     if (!other.isTrigger && other.CompareTag("Enemy"))
     {
         Debug.Log("Sword wind hits enemy!");
         DamageMessage msg = new DamageMessage(gm.weaponStatus.chargeSwordDamage);
         other.SendMessageUpwards("OnDamaged", msg, SendMessageOptions.DontRequireReceiver);
     }
 }
Ejemplo n.º 21
0
 public override bool ApplyDamage(DamageMessage damageMessage)
 {
     if (!base.ApplyDamage(damageMessage))
     {
         return(false);
     }
     healthSlider.value = health;
     return(true);
 }
Ejemplo n.º 22
0
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            DamageMessage m = new DamageMessage(transform, transform, typeof(life), 10);

            MessageManager.get().SendMessage(m);
        }
    }
        protected override void FireRound(Vector3 _, Transform __)
        {
            var shot = Instantiate(ProjectilePrefab, Muzzle.transform.position, transform.rotation);

            shot.Launch(DamageMessage.Create(Stats.Damage, Stats.DamageTypes));
            Animator.SetTrigger("Fire");
            Muzzle.Play();
            FireSfx.Play();
        }
Ejemplo n.º 24
0
    public override bool ApplyDamage(DamageMessage damageMessage)
    {
        if (!base.ApplyDamage(damageMessage))
        {
            return(false);
        }

        return(true);
    }
Ejemplo n.º 25
0
        /// <summary>
        /// Called when the effect is meant to be deactivated
        /// </summary>
        public override void Deactivate()
        {
            if (mMessage != null)
            {
                mMessage.Release();
                mMessage = null;
            }

            base.Deactivate();
        }
Ejemplo n.º 26
0
 public override bool ApplyDamage(DamageMessage damageMessage)
 {
     Debug.Log("TowerHealth: " + health);
     if (!base.ApplyDamage(damageMessage))
     {
         return(false);
     }
     healthSlider.value = health;
     return(true);
 }
Ejemplo n.º 27
0
    private void Shot(Vector3 startPoint, Vector3 direction)
    {
        // 레이캐스트에 의한 충돌 정보를 저장하는 컨테이너
        RaycastHit hit;
        // 총알이 맞은 곳을 저장할 변수
        var hitPosition = Vector3.zero;

        // 레이캐스트(시작지점, 방향, 충돌 정보 컨테이너, 사정거리)
        if (Physics.Raycast(startPoint, direction, out hit, fireDistance, ~excludeTarget))
        {
            // 레이가 어떤 물체와 충돌한 경우

            // 충돌한 상대방으로부터 IDamageable 오브젝트를 가져오기 시도
            var target =
                hit.collider.GetComponent <IDamageable>();

            // 상대방으로 부터 IDamageable 오브젝트를 가져오는데 성공했다면
            if (target != null)
            {
                DamageMessage damageMessage = null;

                damageMessage.damager   = gunHolder.gameObject;
                damageMessage.amount    = damage;
                damageMessage.hitPoint  = hit.point;
                damageMessage.hitNormal = hit.normal;

                // 상대방의 OnDamage 함수를 실행시켜서 상대방에게 데미지 주기
                target.ApplyDamage(damageMessage);
            }
            else
            {
                //EffectManager.Instance.PlayHitEffect(hit.point, hit.normal, hit.transform);
            }
            // 레이가 충돌한 위치 저장
            hitPosition = hit.point;
        }
        else
        {
            // 레이가 다른 물체와 충돌하지 않았다면
            // 총알이 최대 사정거리까지 날아갔을때의 위치를 충돌 위치로 사용
            hitPosition = startPoint + direction * fireDistance;
        }

        // 발사 이펙트 재생 시작
        StartCoroutine(ShotEffect(hitPosition));

        // 남은 탄환의 수를 -1
        magAmmo--;
        if (magAmmo <= 0)
        {
            // 탄창에 남은 탄약이 없다면, 총의 현재 상태를 Empty으로 갱신
            state = State.Empty;
        }
    }
Ejemplo n.º 28
0
 public int Damage(DamageMessage damage)
 {
     if (damage.buffadd != null)
     {
         for (int i = 0; i < damage.buffadd.Count; i++)
         {
             BuffManager(damage.buffadd[i], damage.buff[i]);
         }
     }
     return(Hit(damage.hit));
 }
Ejemplo n.º 29
0
 public void Damage(DamageMessage damage)
 {
     if (damage.Types.Contains(DamageType.Fragmentation))
     {
         AttachedHealth.ReceiveDamage(DamageMessage.Create(damage, DamageMultiplier * FgramentationDamageMultiplier));
     }
     else
     {
         AttachedHealth.ReceiveDamage(damage);
     }
 }
Ejemplo n.º 30
0
        /// <summary>
        /// Used to test if the reactor should process
        /// </summary>
        /// <returns></returns>
        public override bool TestActivate(IMessage rMessage)
        {
            if (!base.TestActivate(rMessage))
            {
                return(false);
            }

            if (mActorCore == null || !mActorCore.IsAlive)
            {
                return(false);
            }

            DamageMessage lDamageMessage = rMessage as DamageMessage;

            if (lDamageMessage == null)
            {
                return(false);
            }

            if (lDamageMessage.Damage == 0f)
            {
                return(false);
            }

            if (lDamageMessage.ID != 0)
            {
                if (lDamageMessage.ID == CombatMessage.MSG_DEFENDER_KILLED)
                {
                    return(false);
                }
                if (lDamageMessage.ID != CombatMessage.MSG_DEFENDER_ATTACKED)
                {
                    return(false);
                }
            }

            CombatMessage lCombatMessage = rMessage as CombatMessage;

            if (lCombatMessage != null && lCombatMessage.Defender.transform.root.gameObject != mActorCore.gameObject)
            {
                return(false);
            }

            mDamageHandler = lCombatMessage.Defender.GetComponent <IDamageHandler>();
            if (mDamageHandler == null)
            {
                Debug.LogError(mOwner + " recieved a damage message with a hit on " + lCombatMessage.Defender.transform + " but there is no IDamageHandler attached. Damage is ignored.");
                return(false);
            }

            mMessage = lDamageMessage;

            return(true);
        }
Ejemplo n.º 31
0
    public override void Dispatch(Message m)
    {
        DamageMessage mDmgMessage = ((DamageMessage)m);

        Life -= mDmgMessage.Damage;

        if (Life <= 0)
        {
            gameObject.SetActive(false);
        }
    }
Ejemplo n.º 32
0
        /// <summary>
        /// Tells the actor to die and triggers any effects or animations.
        /// </summary>
        /// <param name="rMessage">Message that defines the damage that is taken.</param>
        public virtual void OnKilled(DamageMessage rMessage)
        {
            IsAlive = false;

            if (AttributeSource != null && HealthID.Length > 0)
            {
                AttributeSource.SetAttributeValue(HealthID, 0f);
            }

            StartCoroutine(InternalDeath(rMessage));
        }
Ejemplo n.º 33
0
    public void DamageRecieve(DamageMessage message)
    {
        // Don't allow player to hit player and AI to hit AI
        if (message.hasShip && message.player != null)
        {
            bool isPlayer = false;
            if (this is PlayerShip)
                isPlayer = true;

            if (isPlayer == message.player)
                return;
        }

        rigidbody.AddForce(message.damageForce * message.damageDirection);
        CalculateDamages(message);
    }
Ejemplo n.º 34
0
    void CalculateDamages(DamageMessage message)
    {
        float damageLeft = message.damage;
        float shieldChange = 0;
        float armorChange = 0;
        float structureChange = 0;

        if (attributes.shieldHealth > 0 && damageLeft > 0)
        {
            shieldChange = DamageModifier(damageLeft, message.bias, Weapon.DamageBias.SHIELD);
            attributes.shieldHealth -= shieldChange;
            damageLeft -= attributes.shieldHealth;
            if (attributes.shieldHealth < 0)
                attributes.shieldHealth = 0;

        }

        if (attributes.armorHealth > 0 && damageLeft > 0)
        {
            armorChange = DamageModifier(damageLeft, message.bias, Weapon.DamageBias.ARMOR);
            attributes.armorHealth -= armorChange;
            damageLeft -= attributes.armorHealth;
            if (attributes.armorHealth < 0)
                attributes.armorHealth = 0;
        }

        if (attributes.structureHealth > 0 && damageLeft > 0)
        {
            ////Debug.Log(attributes.structureHealth + " Ship Before: " + name);
            structureChange = DamageModifier(damageLeft, message.bias, Weapon.DamageBias.HULL);
            attributes.structureHealth -= structureChange;
            damageLeft -= attributes.structureHealth;

            ////Debug.Log(attributes.structureHealth + " Ship After: " + name);
            if (attributes.structureHealth <= 0 && photonView.isMine)
            {
                DestroyShip();
                return;
            }
        }

        CalculateHealth();

        photonView.RPC("DamageSyncRPC", PhotonTargets.Others, message.viewID, shieldChange, armorChange, structureChange, health);
        if (message.owner != null && message.owner.gameObject != null)
            AddAggressors(message.owner.gameObject);
    }
Ejemplo n.º 35
0
 private void OnDamage(DamageMessage damage)
 {
     _state = State.Hurt;
     _hurtTimer = 1f;
 }