Skip to content

Commit

Permalink
GH-145 Add method to get region center and use it for knockback in re…
Browse files Browse the repository at this point in the history
…gion. (#145)
  • Loading branch information
vLuckyyy authored Jan 15, 2024
1 parent 20d342d commit 42ae17b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ public boolean isInRegion(Location location) {
return this.contains(min, max, location.getX(), location.getZ());
}

@Override
public Location getRegionCenter(Location location) {
Location spawnLocation = location.getWorld().getSpawnLocation();
double x = spawnLocation.getX();
double z = spawnLocation.getZ();

return new Location(location.getWorld(), x, location.getY(), z);
}

public boolean contains(Point min, Point max, double x, double z) {
return x >= min.x() && x < max.x()
&& z >= min.z() && z < max.z();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ void onPlayerMove(PlayerMoveEvent event) {
return;
}

Location playerLocation = player.getLocation().subtract(player.getWorld().getSpawnLocation());
double distance = playerLocation.distance(player.getWorld().getSpawnLocation());
Location spawnLocation = this.regionProvider.getRegionCenter(locationTo);
Location playerLocation = player.getLocation().subtract(spawnLocation);
double distance = playerLocation.distance(spawnLocation);
Vector knockback = new Vector(0, 3, 0).multiply(this.pluginConfig.settings.blockedRegionKnockMultiplier / distance);
Vector vector = playerLocation.toVector().add(knockback);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

import org.bukkit.Location;

@FunctionalInterface
public interface RegionProvider {

boolean isInRegion(Location location);

Location getRegionCenter(Location location);

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.eternalcode.combat.region;

import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import com.sk89q.worldguard.protection.regions.RegionQuery;
import org.bukkit.Location;
Expand All @@ -22,6 +24,41 @@ public boolean isInRegion(Location location) {
return this.regions.stream().anyMatch(region -> this.isInCombatRegion(location, region));
}

@Override
public Location getRegionCenter(Location location) {
RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery regionQuery = regionContainer.createQuery();
ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location));

double minX = 0;
double maxX = 0;
double minZ = 0;
double maxZ = 0;

for (ProtectedRegion region : applicableRegions.getRegions()) {
BlockVector3 min = region.getMinimumPoint();
BlockVector3 max = region.getMaximumPoint();

if (min.getX() < minX) {
minX = min.getX();
}
if (max.getX() > maxX) {
maxX = max.getX();
}
if (min.getZ() < minZ) {
minZ = min.getZ();
}
if (max.getZ() > maxZ) {
maxZ = max.getZ();
}
}

double x = (maxX - minX) / 2 + minX;
double z = (maxZ - minZ) / 2 + minZ;

return new Location(location.getWorld(), x, location.getY(), z);
}

private boolean isInCombatRegion(Location location, String regionName) {
RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery regionQuery = regionContainer.createQuery();
Expand Down

0 comments on commit 42ae17b

Please sign in to comment.