Esempio n. 1
0
    public void PhysikHit(List <MobileAgent> hit)
    {
        if (dead)
        {
            return;
        }

        /*
         * POSSIBLE TARGETS
         * */
        switch (effectType)
        {
        case EffectType.Damage:
        case EffectType.Poison:
        case EffectType.Hook:
        case EffectType.Stun:
        {
            if (session.teamsize > 0)
            {                                                                    // If the session is deathmatch, hits all, else remove teammates
                List <MobileAgent> ma = hit.FindAll(x => x.team == caster.team); // remove my teammates
                int mCount            = ma.Count;
                for (int i = 0; i < mCount; i++)
                {
                    hit.Remove(ma[i]);
                }
            }

            hit.Remove(caster);         // remove also the caster
        }
        break;

        case EffectType.Heal:
        case EffectType.DamageShield:
        case EffectType.DamagerObject:
        case EffectType.Speed:
        {         // Only to my teammates, if the game has multiple teams
            if (session.teamsize > 0)
            {
                hit = hit.FindAll(x => x.team == caster.team);
            }
            else
            {
                hit = hit.FindAll(x => x == caster);
            }
        }
        break;
        }

        /*
         * */

        int c = hit.Count;

        for (int i = 0; i < c; i++)
        {
            hit [i].lastHitter      = (caster.user == null) ? caster.customId : (short)caster.user.connectionId;
            hit [i].lastHitterSkill = clientPrefab;

            switch (effectType) // Effect TYPES
            {
            case EffectType.Damage:
                hit[i].health -= effect;
                break;

            case EffectType.Heal:
                hit[i].health += effect;
                break;

            case EffectType.Stun:
                // This is a buff (actually debuff)
                Buffing.Buff currentStun = hit[i].agentBuff.buff.buffs.Find(x => x.buffType == Buffing.buffTypes.Stun);
                if (currentStun == null)
                {
                    currentStun          = new Buffing.Buff();
                    currentStun.buffType = Buffing.buffTypes.Stun;
                    hit[i].agentBuff.buff.buffs.Add(currentStun);
                }

                currentStun.buffEffect += (short)effect;
                if (currentStun.buffEffect > 100)
                {
                    currentStun.buffEffect = 100;
                }

                currentStun.buffTime += effectTime;

                caster.agentBuff.nextUpdate = 0;
                hit[i].AgentInfo();
                break;

            case EffectType.Poison:
                // This is a buff (actually debuff)
                Buffing.Buff currentPoison = hit[i].agentBuff.buff.buffs.Find(x => x.buffType == Buffing.buffTypes.Poison);

                if (currentPoison == null)
                {
                    currentPoison          = new Buffing.Buff();
                    currentPoison.buffType = Buffing.buffTypes.Poison;
                    hit[i].agentBuff.buff.buffs.Add(currentPoison);
                }

                currentPoison.buffEffect += (short)effect;
                currentPoison.buffTime   += effectTime;

                caster.agentBuff.nextUpdate = 0;
                break;

            case EffectType.Hook:
                MObjects.Hook hook = new MObjects.Hook();
                hook.from = (hit[i].user == null) ? hit[i].customId : hit[i].user.connectionId;
                hook.to   = (caster.user == null) ? caster.customId : caster.user.connectionId;

                ushort e = (ushort)session.users.Count;
                for (ushort a = 0; a < e; a++)
                {
                    if (NetworkServer.connections.Contains(session.users[a]))
                    {
                        NetworkServer.SendToClient(session.users[a].connectionId, MTypes.Hook, hook);
                    }
                }

                hit[i].transform.position = caster.transform.position + transform.forward;
                hit[i].nextSync           = Time.time + 1;
                break;

            case EffectType.DamageShield:
                // This is a buff
                Buffing.Buff currentShield = hit[i].agentBuff.buff.buffs.Find(x => x.buffType == Buffing.buffTypes.DamageShield);

                if (currentShield == null)
                {
                    currentShield          = new Buffing.Buff();
                    currentShield.buffType = Buffing.buffTypes.DamageShield;
                    hit[i].agentBuff.buff.buffs.Add(currentShield);
                }

                currentShield.buffEffect += (short)effect;
                currentShield.buffTime   += effectTime;

                caster.agentBuff.nextUpdate = 0;
                break;

            case EffectType.DamagerObject:
                // This is a buff
                Buffing.Buff currentDamager = hit[i].agentBuff.buff.buffs.Find(x => x.buffType == Buffing.buffTypes.DamagerObject);

                if (currentDamager == null)
                {
                    currentDamager          = new Buffing.Buff();
                    currentDamager.buffType = Buffing.buffTypes.DamagerObject;
                    hit[i].agentBuff.buff.buffs.Add(currentDamager);
                }

                currentDamager.buffEffect += (short)effect;
                currentDamager.buffTime   += effectTime;

                caster.agentBuff.nextUpdate = 0;
                break;

            case EffectType.Speed:
                Buffing.Buff currentSpeed = hit[i].agentBuff.buff.buffs.Find(x => x.buffType == Buffing.buffTypes.Speed);

                if (currentSpeed == null)
                {
                    currentSpeed          = new Buffing.Buff();
                    currentSpeed.buffType = Buffing.buffTypes.Speed;
                    hit[i].agentBuff.buff.buffs.Add(currentSpeed);
                }

                currentSpeed.buffEffect += (short)effect;
                currentSpeed.buffTime   += effectTime;

                caster.agentBuff.nextUpdate = 0;
                hit[i].AgentInfo();
                break;
            }

            MObjects.SkillEffect mObject = new MObjects.SkillEffect();
            mObject.id           = (hit[i].user != null) ? hit[i].user.connectionId : hit[i].customId;
            mObject.clientPrefab = clientPrefab;

            int _c = session.agents.Count;
            for (int e = 0; e < _c; e++)
            {
                if (session.agents[e].user != null && NetworkServer.connections.Contains(session.agents[e].user))
                {
                    // send the mobject
                    NetworkServer.SendToClient(session.agents[e].user.connectionId, MTypes.SkillEffect, mObject);
                }
            }
        }

        if (hitAndDestroy && hit.Count > 0)
        {
            Kill();
        }
    }
Esempio n. 2
0
    private void Update()
    {
        // Buff controller
        if (nextUpdate > Time.time)
        {
            return;
        }

        nextUpdate = Time.time + 1;

        int bCount = buff.buffs.Count;

        List <Buffing.Buff> willRemove = new List <Buffing.Buff>();

        for (int i = 0; i < bCount; i++)
        {
            Buffing.Buff b = buff.buffs[i];

            if (b.buffTime == 1)
            {
                willRemove.Add(b);
            }
            else if (b.buffTime != 0) // 0 means permanent buff
            {
                b.buffTime--;
            }

            if (myAgent.isDead)
            {
                continue;
            }

            List <MobileAgent> targetAgents = new List <MobileAgent>();
            int fCount = 0;
            switch (b.buffType)
            {
            case Buffing.buffTypes.DamagerObject:     // Damager object
                targetAgents = myAgent.session.agents.FindAll(x => (x != myAgent && (x.team != myAgent.team || myAgent.session.teamsize == 0)) && !x.isDead && PhysikEngine.GetDistance(x.transform.position, myAgent.transform.position) <= 4);

                fCount = targetAgents.Count;
                for (int f = 0; f < fCount; f++)
                {
                    targetAgents[f].lastHitter = (myAgent.user == null) ? myAgent.customId : myAgent.user.connectionId;
                    targetAgents[f].health    -= b.GetBuffEffect(myAgent);
                }
                break;

            case Buffing.buffTypes.Healer:     // Healer objects
                targetAgents = myAgent.session.agents.FindAll(x => (x == myAgent || (x.team == myAgent.team && myAgent.session.teamsize != 0)) && !x.isDead && (x == myAgent || PhysikEngine.GetDistance(x.transform.position, myAgent.transform.position) <= 8));

                fCount = targetAgents.Count;
                for (int f = 0; f < fCount; f++)
                {
                    targetAgents[f].health += b.GetBuffEffect(myAgent);
                }
                break;

            case Buffing.buffTypes.Poison:      // Self poison
                myAgent.health -= b.buffEffect;
                break;
            }
        }

        int wCount = willRemove.Count;

        for (int i = 0; i < wCount; i++)
        {
            buff.buffs.Remove(willRemove[i]);
        }

        if (wCount > 0)
        {
            myAgent.AgentInfo();
        }

        /*
         * UPDATE BUFF
         * */

        mObject.buffs = buff.buffs.ToArray();

        wCount           = mObject.buffs.Length;
        mObject.modified = new short[wCount];

        for (int i = 0; i < wCount; i++)
        {
            mObject.modified [i] = mObject.buffs[i].GetBuffEffect(myAgent);
        }

        /*
         * THIS WILL SEND mObject to ALL CLIENTS
         * */

        wCount = myAgent.session.users.Count;
        for (ushort i = 0; i < wCount; i++)
        {
            if (NetworkServer.connections.Contains(myAgent.session.users[i]))
            {
                NetworkServer.SendToClient(myAgent.session.users[i].connectionId, MTypes.AgentBuff, mObject);
            }
        }
    }