// Execute build bridge private void executeBuildBridge(int entityId, ExecuteBuildBridgeSkill executeBuildBridgeSkill) { PerformingSkillsComponent performSkillsComponent = EntityManager.getPerformingSkillsComponent(entityId); IsProxyComponent isProxyComponent = EntityManager.getIsProxyComponent(entityId); GroupComponent groupComponent; // Handle proxies if (isProxyComponent != null) { groupComponent = SystemManager.groupSystem.getGroupComponentContaining(isProxyComponent.proxyForId); } else { groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId); } EntityFactory.createBridge(executeBuildBridgeSkill.anchorA, executeBuildBridgeSkill.anchorB); EntityManager.removeComponent(entityId, ComponentType.PositionTarget); if (groupComponent != null) { // Update the default formation position to the limited range formation's position, then remove the limited range formation. float currentPosition = groupComponent.getFormation(FormationType.LimitedRange).position; groupComponent.removeFormation(executeBuildBridgeSkill.formationToRemove); groupComponent.getFormation(FormationType.Default).position = currentPosition; } removeExecutedSkill(entityId, executeBuildBridgeSkill); }
// Perform build bridge skill public void performBuildBridgeSkill(int entityId, BuildBridgeSkill buildBridgeSkill, Vector2 anchorA, Vector2 anchorB) { PerformingSkillsComponent performingSkillsComponent = EntityManager.getPerformingSkillsComponent(entityId); HasProxyComponent hasProxyComponent = EntityManager.getHasProxyComponent(entityId); IsProxyComponent isProxyComponent = EntityManager.getIsProxyComponent(entityId); ExecuteBuildBridgeSkill executeSkill; GroupComponent groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId); PositionComponent positionComponent = EntityManager.getPositionComponent(entityId); float distanceA = Math.Abs(anchorA.X - positionComponent.position.X); float distanceB = Math.Abs(anchorB.X - positionComponent.position.X); Vector2 closestAnchor = distanceA > distanceB ? anchorB : anchorA; // Find group if (isProxyComponent != null) { groupComponent = SystemManager.groupSystem.getGroupComponentContaining(isProxyComponent.proxyForId); } else { groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId); } // Handle proxy if (hasProxyComponent != null) { EntityManager.removeComponent(hasProxyComponent.proxyId, ComponentType.PositionTarget); performBuildBridgeSkill(hasProxyComponent.proxyId, buildBridgeSkill, anchorA, anchorB); return; } // Create execute skill object executeSkill = new ExecuteBuildBridgeSkill( buildBridgeSkill, anchorA, anchorB, () => { PositionComponent futurePositionComponent = EntityManager.getPositionComponent(entityId); PositionTargetComponent positionTargetComponent = EntityManager.getPositionTargetComponent(entityId); float distance = Math.Abs(positionTargetComponent.position - futurePositionComponent.position.X); return distance <= positionTargetComponent.tolerance + SKILL_RANGE_TOLERANCE; }); if (groupComponent != null) { LimitedRangeFormation formation = new LimitedRangeFormation(groupComponent.entities, groupComponent.activeFormation.position, groupComponent.activeFormation.speed, float.MinValue, closestAnchor.X - 2f); executeSkill.formationToRemove = formation; groupComponent.addFormation(formation); } EntityManager.addComponent(entityId, new PositionTargetComponent(entityId, closestAnchor.X, buildBridgeSkill.range)); performingSkillsComponent.executingSkills.Add(executeSkill); }