Try to fix #513 #567 …

Try to fix  ConcurrentModificationException in LightningWeb
This commit is contained in:
SettingDust
2020-12-21 22:38:15 +08:00
parent 378e19a614
commit 094ce5a427
@@ -58,41 +58,51 @@ public class LightningWeb extends SpellRay {
electrocute(world, caster, origin, target, getProperty(PRIMARY_DAMAGE).floatValue()
* modifiers.get(SpellModifiers.POTENCY), ticksInUse);
// Secondary chaining effect
// Secondary chaining effect
List<EntityLivingBase> secondaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(SECONDARY_RANGE).floatValue(), target.posX, target.posY + target.height / 2,
target.posZ, world);
List<EntityLivingBase> secondaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(SECONDARY_RANGE).floatValue(), target.posX, target.posY + target.height / 2,
target.posZ, world);
secondaryTargets.remove(target);
secondaryTargets.removeIf(e -> !EntityUtils.isLiving(e));
secondaryTargets.removeIf(e -> !AllyDesignationSystem.isValidTarget(caster, e));
if(secondaryTargets.size() > getProperty(SECONDARY_MAX_TARGETS).intValue())
secondaryTargets = secondaryTargets.subList(0, getProperty(SECONDARY_MAX_TARGETS).intValue());
secondaryTargets.stream()
.filter(entity -> !entity.equals(target))
.filter(EntityUtils::isLiving)
.filter(e -> AllyDesignationSystem.isValidTarget(caster, e))
.limit(getProperty(SECONDARY_MAX_TARGETS).intValue())
.forEach(secondaryTarget -> {
electrocute(world, caster,
target.getPositionVector().add(0, target.height / 2, 0),
secondaryTarget,
getProperty(SECONDARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY),
ticksInUse
);
for(EntityLivingBase secondaryTarget : secondaryTargets){
// Tertiary chaining effect
electrocute(world, caster, target.getPositionVector().add(0, target.height/2, 0), secondaryTarget,
getProperty(SECONDARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY), ticksInUse);
List<EntityLivingBase> tertiaryTargets =
EntityUtils.getLivingWithinRadius(
getProperty(TERTIARY_RANGE).floatValue(),
secondaryTarget.posX,
secondaryTarget.posY + secondaryTarget.height / 2,
secondaryTarget.posZ,
world
);
// Tertiary chaining effect
List<EntityLivingBase> tertiaryTargets = EntityUtils.getLivingWithinRadius(
getProperty(TERTIARY_RANGE).floatValue(), secondaryTarget.posX,
secondaryTarget.posY + secondaryTarget.height / 2, secondaryTarget.posZ, world);
tertiaryTargets.remove(target);
tertiaryTargets.removeAll(secondaryTargets);
tertiaryTargets.removeIf(e -> !EntityUtils.isLiving(e));
tertiaryTargets.removeIf(e -> !AllyDesignationSystem.isValidTarget(caster, e));
if(tertiaryTargets.size() > getProperty(TERTIARY_MAX_TARGETS).intValue())
tertiaryTargets = tertiaryTargets.subList(0, getProperty(TERTIARY_MAX_TARGETS).intValue());
for(EntityLivingBase tertiaryTarget : tertiaryTargets){
electrocute(world, caster, secondaryTarget.getPositionVector().add(0, secondaryTarget.height/2, 0),
tertiaryTarget, getProperty(TERTIARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY), ticksInUse);
}
}
tertiaryTargets.stream()
.filter(entity -> !secondaryTargets.contains(entity))
.filter(entity -> !entity.equals(target))
.filter(EntityUtils::isLiving)
.filter(e -> AllyDesignationSystem.isValidTarget(caster, e))
.limit(getProperty(TERTIARY_MAX_TARGETS).intValue())
.forEach(tertiaryTarget ->
electrocute(world, caster,
secondaryTarget.getPositionVector().add(0, secondaryTarget.height / 2, 0),
tertiaryTarget,
getProperty(TERTIARY_DAMAGE).floatValue() * modifiers.get(SpellModifiers.POTENCY),
ticksInUse
)
);
});
}
return true;