public void Execute([ReadOnly] ref Translation translation, [ReadOnly] ref MeleeFindTargetSettingsComponentData findingSettings, ref MeleeTargetComponentData meleeData) { var faction = new FactionComponentData() { value = FactionComponentData.Faction.NEUTRAL }; FindTarget(ref translation, ref findingSettings, ref meleeData, ref faction, quadrantMap); }
private static MeleeTargetComponentData FindClosest(MeleeFindTargetSettingsComponentData findingSettings, FactionComponentData faction, NativeMultiHashMap <int, QuadrantSystem.QuadrandEntityData> quadrantMap, float3 pos, int key, MeleeTargetComponentData closest) { NativeMultiHashMapIterator <int> iterator; QuadrantSystem.QuadrandEntityData qdata; if (quadrantMap.TryGetFirstValue(key, out qdata, out iterator)) { do { if (qdata.faction != faction.value && qdata.corps == QuadrantSystem.QuadrandEntityData.Corps.SWORDSMAN && qdata.position.EqualsEpsilon(pos, findingSettings.findingRadius) && (closest.target == Entity.Null || pos.CompareToAnother(qdata.position, closest.targetPosition) < 0) ) { closest.targetPosition = qdata.position; closest.target = qdata.entity; } }while (quadrantMap.TryGetNextValue(out qdata, ref iterator)); } return(closest); }
private static void FindTarget(ref Translation translation, ref MeleeFindTargetSettingsComponentData findingSettings, ref MeleeTargetComponentData meleeData, ref FactionComponentData faction, NativeMultiHashMap <int, QuadrantSystem.QuadrandEntityData> quadrantMap) { var pos = translation.Value; var quadrant = QuadrantSystem.GetQuadrant(pos); var closest = new MeleeTargetComponentData() { target = Entity.Null, targetPosition = translation.Value }; closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.CURRENT), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.DOWN), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.LEFT), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.LEFT_DOWN), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.LEFT_UP), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.RIGHT), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.RIGHT_DOWN), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.RIGHT_UP), closest); closest = FindClosest(findingSettings, faction, quadrantMap, pos, QuadrantSystem.GetNearestQuadrantKey(quadrant, QuadrantSystem.NearestQuadrant.UP), closest); meleeData.target = closest.target; meleeData.targetPosition = closest.targetPosition; }