private void computeEffects(final Iterator<WakfuEffect> it) { while (it.hasNext()) { final WakfuEffect effect = it.next(); if (this.isMergeable(effect)) { final WakfuEffect wakfuEffect = this.findEffectWithActionId(effect.getActionId()); if (wakfuEffect != null) { final float[] toAddParams = effect.getRawParams(); final float[] sourceParams = wakfuEffect.getRawParams(); for (int i = 0, size = sourceParams.length; i < size; i += 2) { final float[] array = sourceParams; final int n = i; array[n] += toAddParams[i]; } } else { this.m_effects.add(effect.clone()); } } else { this.m_effects.add(effect); } } }
@Override public long getLongValue( final Object criterionUser, final Object criterionTarget, final Object criterionContent, final Object criterionContext) { if (criterionContext == null) { throw new CriteriaExecutionException("Pas de contexte..."); } final AbstractFight<?> fight = CriteriaUtils.getFight(criterionUser, criterionContext); if (fight == null) { throw new CriteriaExecutionException("Impossible de r\u00e9cup\u00e9rer le combat"); } this.hook(criterionUser, criterionTarget, criterionContext, criterionContent); final CriterionUser user = CriteriaUtils.getTargetCriterionUserFromParameters( false, criterionUser, criterionTarget, criterionContext, criterionContent); Point3 center = null; CriterionUser targetCharacter = null; if (!this.m_target) { if (user != null) { center = user.getPosition(); } } else if (criterionTarget instanceof Point3) { center = (Point3) criterionTarget; } else { targetCharacter = CriteriaUtils.getTargetCriterionUserFromParameters( true, criterionUser, criterionTarget, criterionContext, criterionContent); if (targetCharacter != null) { center = targetCharacter.getPosition(); } } if (center == null) { return 0L; } final Collection<? extends EffectUser> fighters = this.getFighters(fight, user); final Iterator<? extends EffectUser> it = fighters.iterator(); while (it.hasNext()) { final EffectUser fighter = (EffectUser) it.next(); if (fighter.isActiveProperty(FightPropertyType.CANNOT_BE_EFFECT_TARGET)) { it.remove(); } } final long maxRange = this.m_maxRange.getLongValue( criterionUser, criterionTarget, criterionContent, criterionContext); if (maxRange <= 0L) { return super.getSign() * fighters.size(); } final long minRange = (this.m_minRange == null) ? 0L : this.m_minRange.getLongValue( criterionUser, criterionTarget, criterionContent, criterionContext); final boolean inLine = this.m_inLine != null && this.m_inLine.isValid( criterionUser, criterionTarget, criterionContent, criterionContext); final boolean testLoS = this.m_testLoS != null && this.m_testLoS.isValid( criterionUser, criterionTarget, criterionContent, criterionContext); long value = 0L; for (final EffectUser fighter2 : fighters) { int distanceBetweenUserAndFighter; if (targetCharacter != null) { distanceBetweenUserAndFighter = DistanceUtils.getIntersectionDistance(fighter2, targetCharacter); } else { distanceBetweenUserAndFighter = DistanceUtils.getIntersectionDistance(fighter2, center); } if (distanceBetweenUserAndFighter <= maxRange && distanceBetweenUserAndFighter >= minRange) { final Point3 fighterPosition = fighter2.getPosition(); if (inLine && center.getX() != fighterPosition.getX() && center.getY() != fighterPosition.getY()) { continue; } if (testLoS) { final FightMap fightMap = fight.getFightMap(); final LineOfSightChecker losChecker = LineOfSightChecker.checkOut(); losChecker.setTopologyMapInstanceSet(fightMap); losChecker.setStartPoint(center.getX(), center.getY(), center.getZ()); losChecker.setEndPoint( fighterPosition.getX(), fighterPosition.getY(), fighterPosition.getZ()); if (!losChecker.checkLOS()) { continue; } } ++value; } } return super.getSign() * value; }