private void onFlameLifecycle(Room room, Flame flame, Integer flameBathcId) { if (!flame.isStoped()) { updatePosition(flame); } if (!flame.isStoped()) { if (flame.getxStart() <= 0 || flame.getxStart() >= room.getMap().getX() || flame.getyStart() <= 0 || flame.getyStart() >= room.getMap().getY()) { flame.setStoped(true); } } Circle flameCircle = new Circle(flame.getxStart(), flame.getyStart(), PersonWebSocketEndpoint.FIRE_RADIUS); if (!flame.isStoped()) { for (AbstractZone zone : room.getMap().getZones()) { if (!zone.isShootable()) { Point[] point = CircleService.circleBoundsIntersection( flameCircle, new Bounds(zone.getX(), zone.getY(), zone.getWidth(), zone.getHeight())); if (point.length > 0) { flame.setStoped(true); break; } } } } for (Person person : room.getPersons().values()) { if (person.getId() != flame.getPersonId()) { Circle personCircle = new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS); Point[] point = CircleService.circleCircleIntersection(flameCircle, personCircle); if (point.length > 0) { onDamage(room.getPersons().get(flame.getPersonId()), flame.getDamage(), person, room); room.getProjectiles().remove(flameBathcId); } } } }
private void onRocketLifecycle(Room room, Rocket rocket, Integer rocketBatchId) { updatePosition(rocket); Circle rocketCircle = new Circle(rocket.getxStart(), rocket.getyStart(), PersonWebSocketEndpoint.ROCKET_RADIUS); Explosion explosion = null; if (rocket.getxStart() <= 0 || rocket.getxStart() >= room.getMap().getX() || rocket.getyStart() <= 0 || rocket.getyStart() >= room.getMap().getY()) { explosion = new Explosion((int) rocket.getxStart(), (int) rocket.getyStart()); } if (explosion == null) { for (AbstractZone zone : room.getMap().getZones()) { if (!zone.isShootable()) { Point[] point = CircleService.circleBoundsIntersection( rocketCircle, new Bounds(zone.getX(), zone.getY(), zone.getWidth(), zone.getHeight())); if (point.length > 0) { explosion = new Explosion((int) point[0].getX(), (int) point[0].getY()); break; } } } } if (explosion == null) { for (Person person : room.getPersons().values()) { if (person.getId() != rocket.getPersonId()) { Circle personCircle = new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS); Point[] point = CircleService.circleCircleIntersection(rocketCircle, personCircle); if (point.length > 0) { explosion = new Explosion((int) point[0].getX(), (int) point[0].getY()); onDamage(room.getPersons().get(rocket.getPersonId()), rocket.getDamage(), person, room); break; } } } } if (explosion != null) { explosion.setxEnd((int) explosion.getxStart()); explosion.setyEnd((int) explosion.getyStart()); int id = gameContext.getProjectilesIds().getAndIncrement(); room.getProjectiles().put(id, new Projectile[] {explosion}); Circle explosionCircle = new Circle(explosion.getxStart(), explosion.getyStart(), explosion.getRadius()); Person shooter = room.getPersons().get(rocket.getPersonId()); for (Person person : room.getPersons().values()) { double damageFactor = PointService.pointBelongToCircle( new Point(person.getX(), person.getY()), explosionCircle); if (damageFactor > -1) { double damage = explosion.getDamage() + damageFactor * explosion.getDamageFactor(); onDamage(shooter, (int) damage, person, room); } } room.getProjectiles().remove(rocketBatchId); } }
private synchronized void calculateInstantImpacts( Person shooter, Projectile projectile, Room room) { double xStart = projectile.getxStart(); double yStart = projectile.getyStart(); Person closestPerson = null; Point closestPoint = null; for (AbstractZone zone : room.getMap().getZones()) { if (zone.isShootable()) { continue; } Bounds zoneBounds = GeometryService.getRectangle(zone); Point[] zoneIntersection = LineService.lineBoundsIntersections( new Line( new Point(shooter.getX(), shooter.getY()), new Point(projectile.getxEnd(), projectile.getyEnd())), zoneBounds); Point closest = isMoreClose( (int) projectile.getxStart(), (int) projectile.getyStart(), new Point(projectile.getxEnd(), projectile.getyEnd()), zoneIntersection); if (closest != null) { closestPoint = closest; projectile.setxEnd((int) closest.getX()); projectile.setyEnd((int) closest.getY()); } } for (Person person : room.getPersons().values()) { Point linePointB = new Point((double) projectile.getxEnd(), (double) projectile.getyEnd()); Point[] intersectionPoints = LineService.lineIntersectCircle( new Line(new Point(xStart, yStart), linePointB), new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS)); if (shooter == person) { projectile.setxStart((int) intersectionPoints[0].getX()); projectile.setyStart((int) intersectionPoints[0].getY()); continue; } if (intersectionPoints != null && intersectionPoints.length > 0) { Point closest = isMoreClose( (int) shooter.getX(), (int) shooter.getY(), closestPoint, intersectionPoints); if (closest != null) { if (projectile.isPiercing()) { onDamage(shooter, projectile.getDamage(), person, room); } else { closestPoint = closest; closestPerson = person; } } } } if (closestPerson != null) { onDamage(shooter, projectile.getDamage(), closestPerson, room); } if (closestPoint != null) { projectile.setxEnd((int) closestPoint.getX()); projectile.setyEnd((int) closestPoint.getY()); } }