Ejemplo n.º 1
0
        private void Update()
        {
            if (!runner || !runner.stateMachine || !runner.stateMachine.attacker || runner.stateMachine.isStop)
            {
                return;
            }

            var me = runner.stateMachine.attacker;

            Collider[] hitColliders;
            hitColliders = Physics.OverlapSphere(me.transform.position, radius,
                                                 SkillDamageCaculate.GetDamageLayer());

            for (int i = 0; i < hitColliders.Length; i++)
            {
                var enemy = NetworkUtil.GetAttr(hitColliders[i].gameObject);
                if (enemy != null && SkillLogic.IsEnemy(me, enemy.gameObject))
                {
                    if (!hurtEnemy.Contains(enemy.gameObject))
                    {
                        var dir = enemy.transform.position - me.transform.position;
                        dir.y = 0;
                        var cos = Vector3.Dot(dir.normalized, transform.forward);
                        Log.AI("DamageHit " + runner.stateMachine.name + " " + enemy.name + " cos " + cos + " a " + cosAngle);
                        if (cos > cosAngle)
                        {
                            DoDamage(enemy.gameObject);
                            hurtEnemy.Add(enemy.gameObject);
                        }
                    }
                }
            }
            Log.AI("Check Damage Shape " + runner.stateMachine.name);
        }
Ejemplo n.º 2
0
        /*
         * 1自己   自己的宠物
         * 2其它玩家  其它玩家的宠物
         * 3怪物
         * 4墙体
         * 5: 事件类型碰撞体不参与技能 例如入口和出口的碰撞体? (忽略这种 假设所有都会碰撞)
         *
         *
         * 对于子弹的发射者来讲
         * 按照角色分成三种:
         * 1:友方
         * 2:敌方
         * 3:中立(墙体)
         */

        private void FixedUpdate()
        {
            if (isDie)
            {
                return;
            }
            Collider[] col = Physics.OverlapSphere(transform.position, missileData.Radius,
                                                   SkillDamageCaculate.GetDamageLayer());
            foreach (Collider c in col)
            {
                //和多个不同的敌人目标碰撞
                if (c != lastColobj)
                {
                    lastColobj = c;
                    var hitT = NetworkUtil.GetAttr(c.gameObject);
                    if (hitT != null)
                    {
                        if (hitT.gameObject != this.attacker)
                        {
                            HitSomething(c);
                            break;
                        }
                    }
                    else
                    {
                        HitSomething(c);
                        break;
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 子弹在网络模式下面
        /// 只伤害 敌方玩家
        /// 不伤害 建筑物 和 我方玩家
        /// </summary>
        /// <returns><c>true</c> if is enemy for bullet the specified a b; otherwise, <c>false</c>.</returns>
        /// <param name="a">The alpha component.</param>
        /// <param name="b">The blue component.</param>
        public static bool IsEnemyForBullet(GameObject a, GameObject b)
        {
            var scene = WorldManager.worldManager.GetActive();

            if (scene.IsNet)
            {
                var aview = a.GetComponent <KBEngine.KBNetworkView>();
                var batt  = NetworkUtil.GetAttr(b);
                if (batt != null)
                {
                    var bview = batt.GetComponent <KBEngine.KBNetworkView>();
                    if (bview != null && bview.IsPlayer)
                    {
                        var battr = bview.GetComponent <NpcAttribute>();
                        var aattr = aview.GetComponent <NpcAttribute>();
                        if (aattr.TeamColor != battr.TeamColor)
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            }
            else
            {
                return(IsEnemy(a, b));
            }
        }
Ejemplo n.º 4
0
        //找到最近的敌人 不考虑朝向方向
        public static GameObject FindNearestEnemy(GameObject attacker)
        {
            LayerMask mask    = SkillDamageCaculate.GetDamageLayer();
            var       enemies = Physics.OverlapSphere(attacker.transform.position, attacker.GetComponent <NpcAttribute>().AttackRange, mask);
            float     minDist = 999999;

            GameObject enemy     = null;
            var        transform = attacker.transform;

            foreach (var ene in enemies)
            {
                var npcAttr = NetworkUtil.GetAttr(ene.gameObject);
                if (npcAttr != null && !npcAttr.IsDead && IsEnemy(attacker, npcAttr.gameObject))
                {
                    var d = (ene.transform.position - transform.position).sqrMagnitude;
                    if (d < minDist)
                    {
                        minDist = d;
                        enemy   = npcAttr.gameObject;
                    }
                }
            }

            return(enemy);
        }
Ejemplo n.º 5
0
        private void DoDamage(GameObject target)
        {
            var oattr = NetworkUtil.GetAttr(target);

            if (oattr != null)
            {
                this.runner.DoDamage(oattr.gameObject);
            }
        }
Ejemplo n.º 6
0
 void OnTriggerEnter(Collider other)
 {
     if (other.tag == GameTag.Player)
     {
         var attr = NetworkUtil.GetAttr(other.gameObject);
         if (attr != null)
         {
             AddHP(attr.gameObject);
         }
     }
 }
Ejemplo n.º 7
0
        public override bool IsEnemy(GameObject a, GameObject b)
        {
            var aattr = NetworkUtil.GetAttr(a);
            var battr = NetworkUtil.GetAttr(b);

            if (aattr != null && battr != null)
            {
                return(a != b && b.tag == GameTag.Player && aattr.TeamColor != battr.TeamColor);
            }
            return(false);
        }
Ejemplo n.º 8
0
 void OnTriggerExit(Collider other)
 {
     if (other.tag == GameTag.Player)
     {
         var attr = NetworkUtil.GetAttr(other.gameObject);
         if (attr != null)
         {
             RemoveBuff(attr.gameObject);
         }
     }
 }
Ejemplo n.º 9
0
        public void PickCol(GameObject other)
        {
            var me   = ObjectManager.objectManager.GetMyPlayer();
            var attr = NetworkUtil.GetAttr(other.gameObject);

            Log.Sys("OnTriggerEnter: " + attr + " oth " + other.gameObject);
            if (attr != null && attr.gameObject == me && !pickYet)
            {
                pickYet = true;
                PickByMe();
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        ///子弹伤害计算也交给skillLayoutRunner执行
        /// </summary>
        /// <param name="other">Other.</param>
        private void DoDamage(Collider other)
        {
            var oattr = NetworkUtil.GetAttr(other.gameObject);

            if (oattr != null && SkillLogic.IsEnemyForBullet(attacker, oattr.gameObject) && !missileData.DontHurtObject)
            {
                //MakeSound();
                if (runner != null)
                {
                    runner.DoDamage(oattr.gameObject);
                }
            }
        }
Ejemplo n.º 11
0
        private void OnTriggerExit(Collider other)
        {
            var attr = NetworkUtil.GetAttr(other.gameObject);

            if (attr != null)
            {
                if (attr.IsMine())
                {
                    GameInterface_Skill.RemoveSkillBuff(attr.gameObject, (int)GameBuff.LaserDamageHP);
                    GameInterface_Skill.RemoveSkillBuff(attr.gameObject, Affix.EffectType.SlowDown2);
                    me = null;
                }
            }
        }
Ejemplo n.º 12
0
        private void OnTriggerEnter(Collider other)
        {
            var attr = NetworkUtil.GetAttr(other.gameObject);

            if (attr != null)
            {
                if (attr.IsMine())
                {
                    Util.ShowMsg("警告:进入核弹区域");
                    me = attr;
                    GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.NuclearDamageHP, Vector3.zero, PlayerId);
                }
            }
        }
Ejemplo n.º 13
0
        private void OnTriggerExit(Collider other)
        {
            var attr = NetworkUtil.GetAttr(other.gameObject);

            if (attr != null)
            {
                if (attr == me)
                {
                    Util.ShowMsg("退出核弹区域");
                    me = null;
                    GameInterface_Skill.RemoveSkillBuff(attr.gameObject, (int)GameBuff.NuclearDamageHP);
                }
            }
        }
Ejemplo n.º 14
0
        private void Awake()
        {
            var attr   = NetworkUtil.GetAttr(this.gameObject);
            var parBox = Util.FindChildRecursive(transform.parent, "boxCollider");

            col = Util.FindChildRecursive(transform, "box");
            Physics.IgnoreCollision(col.GetComponent <Collider>(), parBox.GetComponent <Collider>());
            initPos   = transform.localPosition * transform.parent.localScale.x;
            par       = transform.parent;
            initScale = transform.lossyScale;

            attr.GetComponent <TankPhysicComponent>().tower = this.gameObject;
            attr.tower = this.gameObject;
        }
Ejemplo n.º 15
0
        private void OnTriggerEnter(Collider other)
        {
            //Debug.LogError("OnTriggerEnter: "+other);
            var attr = NetworkUtil.GetAttr(other.gameObject);

            if (attr != null)
            {
                if (attr.IsMine())
                {
                    Util.ShowMsg("警告:进入辐射区域");
                    me = attr;
                    GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.DamageHP, Vector3.zero);
                }
            }
        }
Ejemplo n.º 16
0
        public void DoDamage(GameObject g)
        {
            Log.AI("SkillLayout DoDamage " + Event.affix.effectType);
            var attr = NetworkUtil.GetAttr(g);

            if (Event.affix.effectType != Affix.EffectType.None && Event.affix.target == Affix.TargetType.Enemy)
            {
                //Buff目标是本地控制
                //通过ID来控制复制信息 实体都要有ID才便于复制
                //if(stateMachine.attacker.GetComponent<NpcAttribute>().IsMine()) {
                if (attr.IsMine())
                {
                    //attr.GetComponent<BuffComponent>().AddBuff(Event.affix, stateMachine.attacker.transform.position);
                    NetDateInterface.FastMoveAndPos();
                    NetDateInterface.FastAddBuff(Event.affix, stateMachine.attacker, attr.gameObject, stateMachine.skillFullData.skillId, Event.EvtId);
                }
            }
            stateMachine.DoDamage(attr.gameObject);
        }
Ejemplo n.º 17
0
 private bool CheckHit()
 {
     Collider[] col = Physics.OverlapSphere(head.transform.position, missileData.Radius,
                                            SkillDamageCaculate.GetDamageLayer());
     foreach (Collider c in col)
     {
         //和多个不同的敌人目标碰撞
         var hitT = NetworkUtil.GetAttr(c.gameObject);
         if (hitT != null)
         {
             if (hitT.gameObject != this.attacker)
             {
                 HitSomething(hitT);
                 return(true);
             }
         }
     }
     return(false);
 }
Ejemplo n.º 18
0
        private void Start()
        {
            //StartCoroutine(AutoEnemy());
            var attr = NetworkUtil.GetAttr(gameObject);

            if (attr.IsMine())
            {
                var shootManager = new GameObject("ShootManager");
                shootManager.transform.parent = transform;
                Util.InitGameObject(shootManager);
                var sm = shootManager.AddComponent <ShootManager>();
                sm.autoCheck = this;
            }
            else
            {
                StartCoroutine(SynDir());
            }

            InitTowerTrace();
        }
Ejemplo n.º 19
0
        //自适应炮塔调整
        IEnumerator AutoEnemy()
        {
            var attr  = NetworkUtil.GetAttr(gameObject);
            var phy   = attr.GetComponent <GeneraPhysic>();
            var trans = attr.transform;

            while (true)
            {
                var enemy = SkillLogic.FindNearestEnemy(trans.gameObject);
                if (enemy != null)
                {
                    yield return(StartCoroutine(AutoTarget(trans, enemy)));
                }
                else
                {
                    yield return(StartCoroutine(AdjustTower(attr)));
                }
                yield return(new WaitForSeconds(0.3f));
            }
        }
Ejemplo n.º 20
0
        //0.1s 开启关闭
        private void OnTriggerEnter(Collider other)
        {
            var meId = ObjectManager.objectManager.GetMyServerID();

            if (meId == PlayerId)
            {
                return;
            }
            var attr = NetworkUtil.GetAttr(other.gameObject);

            if (attr != null)
            {
                Log.Sys("LaserEnter: " + other.gameObject);
                if (attr.IsMine())
                {
                    me = attr;
                    GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.LaserDamageHP, Vector3.zero, PlayerId);
                    GameInterface_Skill.AddSkillBuff(me.gameObject, "SlowDown2", Vector3.zero, PlayerId);
                }
            }
        }
Ejemplo n.º 21
0
        /*
         *客户端表现粒子和服务器计算伤害的数值分离开来
         */

        private void HitSomething(Collider other)
        {
            Log.AI("Bullet collider enemy " + other.name + " " + other.tag);
            var otherAttr = NetworkUtil.GetAttr(other.gameObject);

            if (otherAttr != null && otherAttr.gameObject == attacker)
            {
                return;
            }

            if (SkillLogic.IsEnemyForBullet(attacker, other.gameObject))
            {
                var oattr = NetworkUtil.GetAttr(other.gameObject);
                if (oattr != null)
                {
                    var buff   = oattr.GetComponent <BuffComponent>();
                    var fanTan = buff.CheckHasSuchBuff(Affix.EffectType.FanTanBullet);
                    Log.Sys("CheckHasSuchBuff: " + fanTan);
                    if (fanTan && fanTanNum == 0)
                    {
                        fanTanNum++;
                        var dirY = transform.localRotation.eulerAngles.y;
                        transform.localRotation           = Quaternion.Euler(new Vector3(0, dirY + 180, 0));
                        this.runner.stateMachine.attacker = oattr.gameObject;
                        var l2 = Util.FindChildRecursive(this.transform, "blue");
                        if (l2 != null)
                        {
                            l2.gameObject.SetActive(false);
                            var l3 = Util.FindChildRecursive(this.transform, "red");
                            l3.gameObject.SetActive(true);
                        }
                        return;
                    }
                }

                //攻击多个目标只释放一次 DieParticle
                CreateHitParticle();
                //计算随机的弹射 反射方向
                if (LeftRicochets > 0)
                {
                    Log.AI("Generate new bullet " + LeftRicochets);
                    LeftRicochets--;
                    initPos = transform.position;
                    //子弹应该冲入怪物群中
                    transform.localRotation =
                        Quaternion.Euler(new Vector3(0,
                                                     transform.localRotation.eulerAngles.y +
                                                     Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0));
                }
                else
                {
                    //地震是穿透的因此只会等待粒子自然死亡
                    //非穿透性子弹
                    if (!missileData.piercing)
                    {
                        GameObject.Destroy(gameObject);
                    }
                }

                //伤害多个目标
                if (missileData.IsAOE)
                {
                    AOEDamage();
                }
                else
                {
                    DoDamage(other);
                }

                //非穿透性子弹
                if (!missileData.piercing)
                {
                    var evt = new MyEvent(MyEvent.EventType.EventMissileDie);
                    evt.missile = transform;
                    MyEventSystem.myEventSystem.PushLocalEvent(
                        attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt);
                }
                //TODO::撞击其它玩家如何处理
            }
            else
            {
//装到墙体 或者建筑物 等对象身上 则 反射  Not used
                Log.AI("Bullet colldier with Wall " + other.name);
                CreateHitParticle();


                if (LeftRicochets > 0)
                {
                    Log.AI("Generate new bullet " + LeftRicochets);
                    LeftRicochets--;
                    initPos = transform.position;
                    transform.localRotation =
                        Quaternion.Euler(new Vector3(0,
                                                     transform.localRotation.eulerAngles.y + 180 +
                                                     Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0));
                    //sleepTime = IgnoreTime;
                }
                else
                {
                    if (!missileData.piercing)
                    {
                        GameObject.Destroy(gameObject);
                    }
                }
                if (!missileData.piercing)
                {
                    var evt = new MyEvent(MyEvent.EventType.EventMissileDie);
                    evt.missile = transform;
                    if (attacker != null)
                    {
                        MyEventSystem.myEventSystem.PushLocalEvent(
                            attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt);
                    }
                }
            }
        }
Ejemplo n.º 22
0
        public void PickItemFromNetwork(GameObject who)
        {
            pickYet = true;
            var whoAttr = NetworkUtil.GetAttr(who);

            BackgroundSound.Instance.PlayEffect("pickup");
            GameObject.Destroy(gameObject);
            var me = ObjectManager.objectManager.GetMyPlayer();

            Log.Sys("PickItemFromNetwork: " + whoAttr + " itemType: " + itemData.UnitType);

            var gen = Resources.Load <GameObject>("particles/drops/generic_item");
            var par = ParticlePool.Instance.GetGameObject(gen, ParticlePool.InitParticle);

            //var par = Instantiate() as GameObject;

            //par.transform.parent = g.transform;
            par.transform.position = gameObject.transform.position;
            var rm = par.AddMissingComponent <RemoveSelf>();

            rm.StartCoroutine(rm.WaitReturn(3));

            if (whoAttr != null && whoAttr.gameObject == me)
            {
                if (itemData.UnitType == ItemData.UnitTypeEnum.POWER_DRUG)
                {
                    WindowMng.windowMng.ShowNotifyLog("炸弹威力上升");
                    GameInterface_Backpack.LearnSkill((int)SkillData.SkillConstId.Bomb);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.QIPAO_DRUG)
                {
                    var attr = ObjectManager.objectManager.GetMyAttr();
                    attr.AddMpMax(20);
                    attr.AddThrowSpeed(0.1f);
                    WindowMng.windowMng.ShowNotifyLog("MP上限增加");
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.XieZi_DRUG)
                {
                    ObjectManager.objectManager.GetMyAttr().AddNetSpeed(0.1f);
                    WindowMng.windowMng.ShowNotifyLog("速度提升");
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.LIAN_FA)
                {
                    GameInterface_Skill.AddSkillBuff(me, (int)GameBuff.LianFa, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("连发弹");
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.POTION)
                {
                    GameInterface_Skill.AddSkillBuff(me, (int)GameBuff.AddHP, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("恢复生命");
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.FASHI)
                {
                    var attr = ObjectManager.objectManager.GetMyAttr();
                    attr.SetNetSpeed(0);
                    attr.SetJob(Job.ALCHEMIST);
                    WindowMng.windowMng.ShowNotifyLog("攻击提升", 2, null, true);
                    WindowMng.windowMng.ShowNotifyLog("生命值变化", 2, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.CIKE)
                {
                    var attr = ObjectManager.objectManager.GetMyAttr();
                    attr.SetJob(Job.ARMOURER);
                    attr.SetNetSpeed(0.5f);
                    WindowMng.windowMng.ShowNotifyLog("移动速度加快", 2, null, true);
                    WindowMng.windowMng.ShowNotifyLog("生命值变化", 2, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.SUPER)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.SuperShoot, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("拾获超能子弹", 2, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.HIDE)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.Hide, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("拾获隐身药水", 2, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.NUCLEAR)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.NuclearBuff, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("拾获核弹,使用后立即逃离区域", 4, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.KNOCK)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.KnockBuff, Vector3.zero);
                    WindowMng.windowMng.ShowNotifyLog("获得击退能力", 4, null, true);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.WUDI)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.WuDi, Vector3.zero);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.DaoDan)
                {
                    GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.DaoDan, Vector3.zero);
                }
                else if (itemData.UnitType == ItemData.UnitTypeEnum.DefaultSkill)
                {
                    GameInterface_Skill.AddBuffWithNet(me, itemData.triggerBuffId, Vector3.zero);
                    Util.ShowMsg("获得" + itemData.ItemName);
                }
                else
                {
                    GameInterface_Backpack.PickItem(itemData, num);
                }
            }
        }