Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Java CI with Gradle

on:
push:
branches: [ "master", "main" ]
pull_request:
branches: [ "master", "main" ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build with Gradle
run: ./gradlew build

- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: StoneDamager-Build
path: build/libs/*.jar
19 changes: 15 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,40 @@ ext {
}

repositories {
// Maven Defaults
mavenCentral()
mavenLocal()

// SpigotMC Repos
maven {
url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/'

// As of Gradle 5.1, you can limit this to only those
// dependencies you expect from it
content {
includeGroup 'org.bukkit'
includeGroup 'org.spigotmc'
}
}

// Sonatype Repos
maven { url = 'https://oss.sonatype.org/content/repositories/snapshots' }
maven { url = 'https://oss.sonatype.org/content/repositories/central' }
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/groups/public/"
}

// CodeMC Streamline Essentials Repo
maven { url "https://repo.codemc.org/repository/streamline-essentials/" }

// JitPack
maven { url "https://jitpack.io" }

// PlaceholderAPI Repo
maven {
name = "placeholderapi"
url = "https://repo.extendedclip.com/content/repositories/placeholderapi/"
}

// Papermc Repositories
maven { url 'https://repo.papermc.io/repository/maven-snapshots/' }
maven { url 'https://repo.papermc.io/repository/maven-public/' }
}
Expand Down Expand Up @@ -95,4 +106,4 @@ artifacts {
wrapper {
gradleVersion = '8.9'
distributionType = Wrapper.DistributionType.ALL
}
}
37 changes: 19 additions & 18 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,31 @@ ext {
SHADOW = [
]
ANNO = [
'com.github.streamline-essentials:BukkitOfUtils:master-SNAPSHOT',
// Lombok is handled by the plugin, but keeping standard dependencies here if needed
'gg.drak:BukkitOfUtils:1.16.0',

// StreamlineCore Dependencies (API & BAPI)
'gg.drak:StreamlineCore-API:2.5.5.6',
'gg.drak:StreamlineCore-BAPI:2.5.5.6',

// Folia API for Folia compatibility
'dev.folia:folia-api:1.20.4-R0.1-SNAPSHOT',
'net.kyori:adventure-api:4.16.0',
'net.kyori:adventure-text-serializer-gson:4.16.0',
'net.kyori:adventure-text-serializer-legacy:4.16.0',
'net.kyori:adventure-text-serializer-plain:4.16.0',
'net.kyori:adventure-text-minimessage:4.16.0',
'net.kyori:adventure-text-serializer-ansi:4.16.0',
'net.kyori:ansi:1.0.3',
]
COMP_ONLY = [
'com.github.streamline-essentials:BukkitOfUtils:master-SNAPSHOT',
// Lombok is handled by the plugin, but keeping standard dependencies here if needed
'gg.drak:BukkitOfUtils:1.16.0',

// StreamlineCore Dependencies (API & BAPI)
'gg.drak:StreamlineCore-API:2.5.5.6',
'gg.drak:StreamlineCore-BAPI:2.5.5.6',

// Folia API for Folia compatibility
'dev.folia:folia-api:1.20.4-R0.1-SNAPSHOT',
'net.kyori:adventure-api:4.16.0',
'net.kyori:adventure-text-serializer-gson:4.16.0',
'net.kyori:adventure-text-serializer-legacy:4.16.0',
'net.kyori:adventure-text-serializer-plain:4.16.0',
'net.kyori:adventure-text-minimessage:4.16.0',
'net.kyori:adventure-text-serializer-ansi:4.16.0',
'net.kyori:ansi:1.0.3',
]
FILES = [
]
OTHER_PLUGINS = [
'me.clip:placeholderapi:2.11.5',
// PlaceholderAPI for Placeholder support
'me.clip:placeholderapi:2.11.7',
]
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name = StoneDamager
group = host.plas
version = 1.9.0
version = 1.11.0

plugin.main = default
6 changes: 3 additions & 3 deletions src/main/java/host/plas/stonedamager/StoneDamager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
import host.plas.stonedamager.utils.DamageHandler;
import lombok.Getter;
import lombok.Setter;
import host.plas.stonedamager.config.DamagerConfig;
import host.plas.stonedamager.config.MainConfig;
import host.plas.stonedamager.runnables.TickTicker;

@Getter @Setter
public final class StoneDamager extends BetterPlugin {
@Getter @Setter
private static StoneDamager instance;
@Getter @Setter
private static DamagerConfig damagerConfig;
private static MainConfig mainConfig;

@Getter @Setter
private static TickTicker tickTicker;
Expand All @@ -27,7 +27,7 @@ public void onBaseEnabled() {
// Plugin startup logic
instance = this;

damagerConfig = new DamagerConfig();
mainConfig = new MainConfig();

tickTicker = new TickTicker();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public boolean command(CommandContext ctx) {
CompletableFuture.runAsync(() -> {
ctx.sendMessage("&eReloading &cconfigurations&8...");

StoneDamager.getDamagerConfig().onReload();
StoneDamager.getMainConfig().onReload();

ctx.sendMessage("&eReloaded &cconfigurations&8!");
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package host.plas.stonedamager.config;

import gg.drak.thebase.storage.resources.flat.simple.SimpleConfiguration;
import host.plas.bou.configs.bits.ConfigurableWhitelist;
import host.plas.stonedamager.StoneDamager;
import host.plas.stonedamager.data.DamagableSelection;
import host.plas.stonedamager.utils.DamageHandler;
import tv.quaint.storage.resources.flat.simple.SimpleConfiguration;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentSkipListSet;

public class DamagerConfig extends SimpleConfiguration {
public DamagerConfig() {
public class MainConfig extends SimpleConfiguration {
public MainConfig() {
super("config.yml", StoneDamager.getInstance(), true);
}

Expand All @@ -26,7 +26,8 @@ public void onReload() {

StoneDamager.getInstance().logInfo("&fLoaded &a" + getSelections().size() + " &fdamager selections.");

isStoneCutterPatchEnabled();
isTryFindPlayer();
getFindPlayerRadius();

String configVersion = getConfigVersion();
if (! configVersion.equals("1.0")) {
Expand Down Expand Up @@ -101,9 +102,15 @@ public String getConfigVersion() {
return getResource().getOrDefault("config-version", "null");
}

public boolean isStoneCutterPatchEnabled() {
public boolean isTryFindPlayer() {
reloadResource();

return getOrSetDefault("stonecutter-patch", true);
return getOrSetDefault("settings.try-find-player.enabled", true);
}

public double getFindPlayerRadius() {
reloadResource();

return getOrSetDefault("settings.try-find-player.radius", 30d);
}
}
20 changes: 11 additions & 9 deletions src/main/java/host/plas/stonedamager/data/DamagableSelection.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package host.plas.stonedamager.data;

import gg.drak.thebase.objects.Identifiable;
import host.plas.bou.configs.bits.ConfigurableWhitelist;
import host.plas.stonedamager.patch.StoneCutterPatch;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import tv.quaint.objects.Identifiable;

import java.util.concurrent.atomic.AtomicBoolean;

Expand Down Expand Up @@ -45,10 +44,6 @@ public boolean checkMaterial(String material) {
}

public boolean checkMaterial(Block block) {
if (isMaterialsContainsSC()) {
if (StoneCutterPatch.isStoneCutter(block)) return ! materials.isBlacklist();
}

return checkMaterial(block.getType().name());
}

Expand All @@ -63,14 +58,14 @@ public boolean checkEntity(String entity) {
public boolean checkPermissions(Entity player) {
if (! (player instanceof Player)) return true;

if (includePermission.isBlank() || includePermission.isEmpty()) {
if (excludePermission.isBlank() || excludePermission.isEmpty()) {
if (isEmptyPermission(includePermission)) {
if (isEmptyPermission(excludePermission)) {
return true;
} else {
return ! player.hasPermission(excludePermission);
}
} else {
if (excludePermission.isBlank() || excludePermission.isEmpty()) {
if (isEmptyPermission(excludePermission)) {
return player.hasPermission(includePermission);
} else {
return player.hasPermission(includePermission) && ! player.hasPermission(excludePermission);
Expand All @@ -90,4 +85,11 @@ public boolean check(Entity entity) {

return checkAll(entity, block);
}

public static boolean isEmptyPermission(String permission) {
return permission == null || permission.isBlank() ||
permission.equalsIgnoreCase("none") || permission.equalsIgnoreCase("null") ||
permission.equalsIgnoreCase("disable") || permission.equalsIgnoreCase("disabled") ||
permission.equalsIgnoreCase("off");
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,61 @@
package host.plas.stonedamager.events;

import host.plas.stonedamager.StoneDamager;
import host.plas.stonedamager.data.DamagableSelection;
import host.plas.stonedamager.objects.DistanceComparator;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import tv.quaint.events.components.BaseEvent;
import org.bukkit.entity.Player;

import java.util.Optional;

@Setter
@Getter
public class ScheduledDamageEvent extends BaseEvent {
public class ScheduledDamageEvent extends StoneDamagerEvent {
private LivingEntity entity;
private DamagableSelection damagableSelection;

public ScheduledDamageEvent(LivingEntity entity, DamagableSelection damagableSelection) {
this.entity = entity;
this.damagableSelection = damagableSelection;
}

public Optional<Player> getClosestPlayer() {
boolean tryFind = StoneDamager.getMainConfig().isTryFindPlayer();
if (! tryFind) return Optional.empty();

double radius = StoneDamager.getMainConfig().getFindPlayerRadius();
return entity.getNearbyEntities(radius, radius, radius).stream()
.filter(e -> e instanceof Player)
.map(e -> (Player) e)
.min(new DistanceComparator(getEntityLocation()));
}

public Location getEntityLocation() {
return entity.getLocation();
}

/**
* Damages the entity by the specified amount.
*
* Call this method only in synchronous context.
* @param damage the amount of damage to deal
*/
public void damageEntity(double damage) {
getClosestPlayer().ifPresentOrElse(
p -> getEntity().damage(damage, p),
() -> getEntity().damage(damage)
);
}

/**
* Damages the entity by the amount specified in the DamagableSelection.
*
* Call this method only in synchronous context.
*/
public void damageEntity() {
damageEntity(getDamagableSelection().getDamageAmount());
}
}
14 changes: 14 additions & 0 deletions src/main/java/host/plas/stonedamager/events/StoneDamagerEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package host.plas.stonedamager.events;

import gg.drak.thebase.events.components.BaseEvent;
import host.plas.stonedamager.StoneDamager;

public class StoneDamagerEvent extends BaseEvent {
public StoneDamagerEvent() {
super();
}

public StoneDamager getPlugin() {
return StoneDamager.getInstance();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package host.plas.stonedamager.objects;

import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
import org.bukkit.entity.Entity;

import java.util.Comparator;

@Getter @Setter
public class DistanceComparator implements Comparator<Entity> {
private final Location referenceLocation;

public DistanceComparator(Location referenceLocation) {
this.referenceLocation = referenceLocation;
}

@Override
public int compare(Entity o1, Entity o2) {
Location l1 = o1.getLocation();
Location l2 = o2.getLocation();

double d1 = l1.distanceSquared(referenceLocation);
double d2 = l2.distanceSquared(referenceLocation);

return Double.compare(d1, d2);
}
}
Loading
Loading