//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(); }
/** 执行攻击动作 */ 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; } }