public void acceptWorkStrike(ActorStrikeAction actorStrikeAction) { if (actorStrikeAction.getStrikeType() == ActorStrikeAction.StrikeType.OnBlock) { ActorStrikeBlockAction strikeBlock = (ActorStrikeBlockAction)actorStrikeAction; handleStrikeEffectOnIsland(strikeBlock); jobSiteManager.acceptStrikeAt(strikeBlock.getStrikeTarget(), strikeBlock.getJobType()); } else //NEEDS DISTANCE LIMITTING { ActorStrikeAlongRayAction rayStrike = (ActorStrikeAlongRayAction)actorStrikeAction; Ray ray = new Ray(rayStrike.getStrikeOrigen(), rayStrike.getStrikeDirectionNormal()); JobSite intersectedSite = getJobSiteAlongRay(ray); Vector3?blockClicked = getNearestBlockAlongRayInAndFromWorldSpace(ray); //figuring out what to do if both a block and site are along the ray if (blockClicked != null && intersectedSite != null) { if (Math.Abs(Vector3.Distance((Vector3)blockClicked, rayStrike.getStrikeOrigen()) - (float)intersectedSite.intersects(ray)) < .01) { //block has been clicked handleRayStrikeOnIslandBlocks(rayStrike, ray); } else if (Vector3.Distance((Vector3)blockClicked, rayStrike.getStrikeOrigen()) < (float)intersectedSite.intersects(ray)) { //block has been clicked handleRayStrikeOnIslandBlocks(rayStrike, ray); } else { //siteHasBeenClicked ray = JobSiteWasHitWithJobRay(rayStrike, ray, intersectedSite); } } else if (blockClicked != null) { //block has been clicked handleRayStrikeOnIslandBlocks(rayStrike, ray); } else if (intersectedSite != null) { //site has been clicked ray = JobSiteWasHitWithJobRay(rayStrike, ray, intersectedSite); } } }
private Ray JobSiteWasHitWithJobRay(ActorStrikeAlongRayAction rayStrike, Ray ray, JobSite intersectedSite) { BlockLoc locOfWork = new BlockLoc(rayStrike.getStrikeOrigen() + rayStrike.getStrikeDirectionNormal() * ((float)intersectedSite.intersects(ray) + .001f)); jobSiteManager.acceptStrikeAt(locOfWork, rayStrike.getJobType()); return(ray); }
private void handleStrikeAction(ActorAction action) { ActorStrikeAction strikeAction = (ActorStrikeAction)action; if (strikeAction.getStrikeType() == ActorStrikeAction.StrikeType.OnBlock) { switch (strikeAction.getJobType()) { case JobType.combat: break; case JobType.agriculture: islandManager.acceptWorkStrike((ActorStrikeAction)action); SoundsManager.playSoundType(SoundsManager.SoundType.wheatRustling, ((ActorStrikeAction)action).getStriker().getLocation(), .3f); break; case JobType.building: placeBlock(((ActorStrikeBlockAction)action).getStrikeTarget(), 5); break; case JobType.mining: strikeAction.getStriker().setRotationWithGivenDeltaVec(strikeAction.getLookDeltaVec()); islandManager.acceptWorkStrike((ActorStrikeAction)action); break; case JobType.logging: strikeAction.getStriker().setRotationWithGivenDeltaVec(strikeAction.getLookDeltaVec()); islandManager.acceptWorkStrike((ActorStrikeAction)action); //chopBlockAt(((ActorStrikeBlockAction)action).getStrikeTarget()); break; default: throw new Exception("unhandled job type"); } } else // is strike along ray { ActorStrikeAlongRayAction rayStrike = (ActorStrikeAlongRayAction)strikeAction; switch (strikeAction.getJobType()) { case JobType.combat: actorManager.handleStrike(rayStrike.getStriker(), rayStrike.getStrikeOrigen(), rayStrike.getStrikeDirectionNormal(), rayStrike.getStrikeDistance(), 1); rayStrike.getStriker().StartStrikeAnimation(); break; case JobType.agriculture: islandManager.acceptWorkStrike(rayStrike); break; case JobType.building: islandManager.acceptWorkStrike(rayStrike); break; case JobType.mining: islandManager.acceptWorkStrike(rayStrike); break; case JobType.logging: islandManager.acceptWorkStrike(rayStrike); break; case JobType.CarryingSomething: islandManager.acceptWorkStrike(rayStrike); break; } } }