示例#1
0
    //hit

    /** 打击每帧 */
    protected void bulletHitFrame()
    {
        if (_config.attackID <= 0)
        {
            return;
        }

        //自己不能控制伤害
        if (!_unit.isSelfDriveAttackHapen())
        {
            return;
        }

        //不该走到这里
        if (BaseC.constlist.bulletCast_isSimpleBullet(_levelConfig.castType))
        {
            return;
        }

        SList <Unit> tempUnitList;

        getFrameHittedUnits(tempUnitList = _tempUnitList);

        if (tempUnitList.isEmpty())
        {
            return;
        }

        //是否可吸收
        bool canAbsorb = !_config.cantAbsorb;

        int eachHitMax      = _levelConfig.eachHitNum;
        int maxInfluenceNum = _levelConfig.maxInfluenceNum;

        IntIntMap hitTargetNums = _hitTargetNums;

        foreach (Unit unit in tempUnitList)
        {
            int instanceID = unit.instanceID;

            //打击次数内
            if (eachHitMax == 0 || hitTargetNums.get(instanceID) < eachHitMax)
            {
                //吸收子弹
                if (canAbsorb && unit.fight.getStatusLogic().getStatus(StatusType.AbsorbBullet))
                {
                    bulletOverInitiative();
                    return;
                }

                if (_hitEnabled)
                {
                    AttackData aData = _unit.fight.createAttackData(_config.attackID, _data.level, SkillTargetData.createByTargetUnit(instanceID));

                    aData.isBulletFirstHit = hitTargetNums.isEmpty();

                    hitTargetNums.addValue(instanceID, 1);

                    _scene.fight.executeAndReleaseAttack(aData);

                    //到达上限了
                    if (maxInfluenceNum > 0 && hitTargetNums.size() >= maxInfluenceNum)
                    {
                        _hitEnabled = false;

                        if (!_config.keepAtMaxHit)
                        {
                            bulletOverInitiative();
                        }

                        return;
                    }
                }
            }
        }

        _tempUnitList.clear();
    }
示例#2
0
    /** 执行攻击动作 */
    protected void doOneAttackAction(int[] args, int off, Unit from, Unit attacker, Unit target, AttackData lastData)
    {
        switch (args[off])
        {
        case AttackActionType.Attack:
        {
            SkillTargetData tData = SkillTargetData.createByTargetUnit(target != null ? target.instanceID : -1);
            from.fight.createAndExecuteAttack(args[off + 1], args[off + 2], tData);
        }
        break;

        case AttackActionType.Bullet:
        {
            SkillTargetData tData = SkillTargetData.createByTargetUnit(target != null ? target.instanceID : -1);
            from.fight.createAndExecuteBullet(args[off + 1], args[off + 2], tData);
        }
        break;

        case AttackActionType.SelfAddAttribute:
        {
            attacker.fight.getAttributeLogic().addOneAttribute(args[off + 1], args[off + 2]);
        }
        break;

        case AttackActionType.TargetAddAttribute:
        {
            if (target != null)
            {
                target.fight.getAttributeLogic().addOneAttribute(args[off + 1], args[off + 2]);
            }
        }
        break;

        case AttackActionType.SelfAddAttributeVar:
        {
            attacker.fight.getAttributeLogic().addOneAttribute(args[off + 1], calculateSkillVar(args[off + 2], attacker, target));
        }
        break;

        case AttackActionType.TargetAddAttributeVar:
        {
            if (target != null)
            {
                target.fight.getAttributeLogic().addOneAttribute(args[off + 1], calculateSkillVar(args[off + 2], target, attacker));
            }
        }
        break;

        case AttackActionType.SelfSpecialMove:
        {
            // attacker.pos.specialMoveTarget(args[off+1],target);
            //TODO:暂未实现
        }
        break;

        case AttackActionType.TargetSpecialMove:
        {
            // target.pos.specialMoveTarget(args[off+1],attacker);
            //TODO:暂未实现
        }
        break;

        case AttackActionType.SelfAddBuff:
        {
            attacker.fight.getBuffLogic().addBuff(args[off + 1], args[off + 2]);
        }
        break;

        case AttackActionType.TargetAddBuff:
        {
            if (target != null)
            {
                target.fight.getBuffLogic().addBuff(args[off + 1], args[off + 2], attacker.instanceID);
            }
        }
        break;

        case AttackActionType.AddGroupTimePass:
        {
            attacker.fight.getCDDataLogic().addGroupTimePass(args[off + 1], args[off + 2]);
        }
        break;

        case AttackActionType.RemoveGroupCD:
        {
            attacker.fight.getCDDataLogic().removeGroupCD(args[off + 1]);
        }
        break;

        case AttackActionType.AddPuppetAtTarget:
        {
            SkillTargetData tData = SkillTargetData.createByTargetUnit(target != null ? target.instanceID : -1);

            getSkillTargetPos(_tempPos, tData);

            _scene.unitFactory.createAddPuppet(args[1], args[2], _tempPos, attacker, args.Length > 3 ? args[3] : 0);
        }
        break;

        case AttackActionType.KillSelf:
        {
            attacker.fight.doDead(attacker, UnitDeadType.Skill);
        }
        break;

        case AttackActionType.KillTarget:
        {
            target.fight.doDead(attacker, UnitDeadType.Skill);
        }
        break;

        case AttackActionType.SelfRemoveGroupBuff:
        {
            attacker.fight.getBuffLogic().removeBuffByGroup(args[1]);
        }
        break;

        case AttackActionType.TargetRemoveGroupBuff:
        {
            target.fight.getBuffLogic().removeBuffByGroup(args[1]);
        }
        break;
        }
    }