Code:
public class danger_data
{
public danger_data(string name, float range, float min_hp_pct_to_avoid, bool only_when_dead, float move_cost_mult)
{
this.name = name;
this.range = range;
this.min_hp_pct_to_avoid = min_hp_pct_to_avoid;
this.only_when_dead = only_when_dead;
this.move_cost_mult = move_cost_mult;
}
public string name;
public float range;
public float min_hp_pct_to_avoid;
public bool only_when_dead;
public float move_cost_mult;
}
private static readonly List<danger_data> DANGERS = new List<danger_data>() { new danger_data("sporeCloud_emitter", 15, 80, false, 4),
new danger_data("ChargedBolt_Projectile", 10, 80, false, 4),
new danger_data("monsterAffix_Desecrator_damage_AOE", 10, 90, false, 4),
new danger_data("monsterAffix_Plagued", 15, 80, false, 4),
new danger_data("monsterAffix_Molten_trail", 10, 70, false, 4),
new danger_data("monsterAffix_Molten_death", 22, 100, false, 4),
new danger_data("arcaneEnchantedDummy_spawn", 35, 100, false, 4),
new danger_data("MonsterAffix_ArcaneEnchanted_PetSweep", 35, 100, false, 4),
new danger_data("monsterAffix_frozen_iceClusters", 20, 100, false, 4),
new danger_data("MonsterAffix_Orbiter", 10, 90, false, 4),
new danger_data("MonsterAffix_frozenPulse", 15, 90, false, 4),
new danger_data("MonsterAffix_CorpseBomber", 15, 100, false, 4),
new danger_data("MonsterAffix_Thunderstorm", 35, 80, false, 4),
new danger_data("MorluSpellcaster_Meteor_Pending", 25, 100, false, 4),
new danger_data("_Generic_AOE_", 20, 80, false, 4),
new danger_data("ZoltunKulle_EnergyTwister", 20, 80, false, 4),
new danger_data("Gluttony_gasCloud", 25, 80, false, 4),
new danger_data("UberMaghda_Punish_", 20, 80, false, 4),
new danger_data("Random_FallingRocks", 40, 100, false, 4),
new danger_data("ringofFire_damageArea", 35, 80, false, 4),
new danger_data("BoneCage_Proxy", 20, 100, false, 4),
new danger_data("Brute_leap_telegraph", 20, 100, false, 4),
new danger_data("creepMobArm", 20, 90, false, 4),
new danger_data("Morlu_GroundBomb", 40, 100, false, 4),
new danger_data("grenadier_proj_trail", 40, 80, false, 4),
new danger_data("orbOfAnnihilation", 40, 100, false, 4),
new danger_data("x1_Bog_bloodSpring", 15, 90, false, 4),
//new danger_data("westmarchRanged_projectile", 15, 0, false, 4),
new danger_data("Corpulent_", 22, 100, true, 4) };
public static HashSet<region_data> GetDangers(float hp_pct, ref HashSet<region_data> all)
{
HashSet<region_data> dangers = new HashSet<region_data>();
all.Clear();
try
{
IEnumerable<ActorCommonData> objects = ActorCommonDataHelper.Enumerate(x => (x.x184_ActorType == ActorType.ServerProp ||
x.x184_ActorType == ActorType.Monster ||
x.x184_ActorType == ActorType.Projectile ||
x.x184_ActorType == ActorType.CustomBrain) &&
DANGERS.Exists(d => x.x004_Name.Contains(d.name)));
foreach (ActorCommonData obj in objects)
{
danger_data data = DANGERS.Find(d => obj.x004_Name.Contains(d.name));
if (data == null || (data.only_when_dead && obj.GetAttributeValue(AttributeId.HitpointsCur) > 0.0011))
continue;
Vec3 pos = new Vec3(obj.x0D0_WorldPosX, obj.x0D4_WorldPosY, obj.x0D8_WorldPosZ);
AABB area = new AABB(pos - new Vec3(data.range, data.range, pos.Z + 100), pos + new Vec3(data.range, data.range, pos.Z + 100));
region_data region = new region_data(area, data.move_cost_mult);
all.Add(region);
if (hp_pct <= data.min_hp_pct_to_avoid)
dangers.Add(region);
}
}
catch (Exception)
{
}
return dangers;
}