diff --git a/bukkit/build.gradle b/bukkit/build.gradle index 8f05bf79..fbbe8538 100644 --- a/bukkit/build.gradle +++ b/bukkit/build.gradle @@ -1,7 +1,7 @@ dependencies { implementation project(':common') - implementation 'org.bstats:bstats-bukkit:3.0.3' + implementation 'org.bstats:bstats-bukkit:3.1.0' implementation 'io.papermc:paperlib:1.0.8' implementation 'space.arim.morepaperlib:morepaperlib:0.4.4' implementation 'net.kyori:adventure-platform-bukkit:4.3.4' diff --git a/bukkit/src/main/java/net/william278/huskhomes/event/BukkitEventDispatcher.java b/bukkit/src/main/java/net/william278/huskhomes/event/BukkitEventDispatcher.java index 1afc7808..ef87a8b8 100644 --- a/bukkit/src/main/java/net/william278/huskhomes/event/BukkitEventDispatcher.java +++ b/bukkit/src/main/java/net/william278/huskhomes/event/BukkitEventDispatcher.java @@ -46,7 +46,11 @@ default boolean fireIsCancelled(@NotNull T event) { @Override @NotNull default ITeleportEvent getTeleportEvent(@NotNull Teleport teleport) { - return teleport.getType() == Teleport.Type.BACK ? new TeleportBackEvent(teleport) : new TeleportEvent(teleport); + return switch (teleport.getType()) { + case BACK -> new TeleportBackEvent(teleport); + case RANDOM_TELEPORT -> new RandomTeleportEvent(teleport); + default -> new TeleportEvent(teleport); + }; } @Override diff --git a/bukkit/src/main/java/net/william278/huskhomes/event/RandomTeleportEvent.java b/bukkit/src/main/java/net/william278/huskhomes/event/RandomTeleportEvent.java new file mode 100644 index 00000000..861a06a3 --- /dev/null +++ b/bukkit/src/main/java/net/william278/huskhomes/event/RandomTeleportEvent.java @@ -0,0 +1,50 @@ +/* + * This file is part of HuskHomes, licensed under the Apache License 2.0. + * + * Copyright (c) William278 + * Copyright (c) contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.william278.huskhomes.event; + +import net.william278.huskhomes.position.Position; +import net.william278.huskhomes.teleport.Teleport; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class RandomTeleportEvent extends TeleportEvent implements IRandomTeleportEvent, Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + + public RandomTeleportEvent(@NotNull Teleport teleport) { + super(teleport); + } + + @Override + @NotNull + public Position getPosition() { + return (Position) getTeleport().getTarget(); + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + @SuppressWarnings("unused") + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} diff --git a/common/build.gradle b/common/build.gradle index d3406714..25df2298 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -6,7 +6,7 @@ dependencies { api 'net.william278:minedown:1.8.2' api 'net.william278:paginedown:1.1.2' api 'net.william278:DesertWell:2.0.4' - api 'commons-io:commons-io:2.16.1' + api 'commons-io:commons-io:2.17.0' api 'org.apache.commons:commons-text:1.12.0' api 'com.google.code.gson:gson:2.11.0' api 'com.github.Exlll.ConfigLib:configlib-yaml:v4.5.0' diff --git a/common/src/main/java/net/william278/huskhomes/command/RTPCommand.java b/common/src/main/java/net/william278/huskhomes/command/RTPCommand.java index cea3ed74..862f68dd 100644 --- a/common/src/main/java/net/william278/huskhomes/command/RTPCommand.java +++ b/common/src/main/java/net/william278/huskhomes/command/RTPCommand.java @@ -189,6 +189,7 @@ private void performLocalRTP(@NotNull OnlineUser teleporter, @NotNull CommandUse // Build and execute the teleport final TeleportBuilder builder = Teleport.builder(plugin) .teleporter(teleporter) + .type(Teleport.Type.RANDOM_TELEPORT) .actions(TransactionResolver.Action.RANDOM_TELEPORT) .target(position.get()); builder.buildAndComplete(executor.equals(teleporter), args); diff --git a/common/src/main/java/net/william278/huskhomes/event/IRandomTeleportEvent.java b/common/src/main/java/net/william278/huskhomes/event/IRandomTeleportEvent.java new file mode 100644 index 00000000..2ce679a0 --- /dev/null +++ b/common/src/main/java/net/william278/huskhomes/event/IRandomTeleportEvent.java @@ -0,0 +1,30 @@ +/* + * This file is part of HuskHomes, licensed under the Apache License 2.0. + * + * Copyright (c) William278 + * Copyright (c) contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.william278.huskhomes.event; + +import net.william278.huskhomes.position.Position; +import org.jetbrains.annotations.NotNull; + +public interface IRandomTeleportEvent extends ITeleportEvent { + + @NotNull + Position getPosition(); + +} \ No newline at end of file diff --git a/common/src/main/java/net/william278/huskhomes/teleport/Teleport.java b/common/src/main/java/net/william278/huskhomes/teleport/Teleport.java index 9f383baf..bd669e77 100644 --- a/common/src/main/java/net/william278/huskhomes/teleport/Teleport.java +++ b/common/src/main/java/net/william278/huskhomes/teleport/Teleport.java @@ -203,7 +203,8 @@ private void performTransactions() { public enum Type { TELEPORT(0), RESPAWN(1), - BACK(2); + BACK(2), + RANDOM_TELEPORT(3); private final int typeId; diff --git a/fabric/src/main/java/net/william278/huskhomes/event/RandomTeleportCallback.java b/fabric/src/main/java/net/william278/huskhomes/event/RandomTeleportCallback.java new file mode 100644 index 00000000..6c873587 --- /dev/null +++ b/fabric/src/main/java/net/william278/huskhomes/event/RandomTeleportCallback.java @@ -0,0 +1,80 @@ +/* + * This file is part of HuskHomes, licensed under the Apache License 2.0. + * + * Copyright (c) William278 + * Copyright (c) contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.william278.huskhomes.event; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.util.ActionResult; +import net.william278.huskhomes.position.Position; +import net.william278.huskhomes.teleport.Teleport; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; + +public interface RandomTeleportCallback extends FabricEventCallback { + @NotNull + Event EVENT = EventFactory.createArrayBacked(RandomTeleportCallback.class, + (listeners) -> (event) -> { + for (RandomTeleportCallback listener : listeners) { + final ActionResult result = listener.invoke(event); + if (event.isCancelled()) { + return ActionResult.FAIL; + } else if (result == ActionResult.FAIL) { + event.setCancelled(true); + return result; + } + } + + return ActionResult.PASS; + }); + + @NotNull + Function SUPPLIER = (teleport) -> + new IRandomTeleportEvent() { + private boolean cancelled = false; + + @Override + @NotNull + public Position getPosition() { + return (Position) getTeleport().getTarget(); + } + + @Override + @NotNull + public Teleport getTeleport() { + return teleport; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + public @NotNull Event getEvent() { + return EVENT; + } + + }; +} diff --git a/paper/build.gradle b/paper/build.gradle index 5e2738b8..336819fe 100644 --- a/paper/build.gradle +++ b/paper/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly project(':common') compileOnly 'io.papermc.paper:paper-api:1.19.4-R0.1-SNAPSHOT' - compileOnly 'org.bstats:bstats-bukkit:3.0.3' + compileOnly 'org.bstats:bstats-bukkit:3.1.0' compileOnly 'org.jetbrains:annotations:24.1.0' compileOnly 'net.william278:minedown:1.8.2' compileOnly 'net.william278:DesertWell:2.0.4' diff --git a/sponge/build.gradle b/sponge/build.gradle index 533ceb5b..312eaf47 100644 --- a/sponge/build.gradle +++ b/sponge/build.gradle @@ -8,7 +8,7 @@ plugins { dependencies { implementation project(path: ':common') - implementation 'org.bstats:bstats-sponge:3.0.3' + implementation 'org.bstats:bstats-sponge:3.1.0' implementation "redis.clients:jedis:${jedis_version}" implementation "com.mysql:mysql-connector-j:${mysql_driver_version}" implementation "org.mariadb.jdbc:mariadb-java-client:${mariadb_driver_version}" diff --git a/sponge/src/main/java/net/william278/huskhomes/event/SpongeEventDispatcher.java b/sponge/src/main/java/net/william278/huskhomes/event/SpongeEventDispatcher.java index 4e190f64..d3b41708 100644 --- a/sponge/src/main/java/net/william278/huskhomes/event/SpongeEventDispatcher.java +++ b/sponge/src/main/java/net/william278/huskhomes/event/SpongeEventDispatcher.java @@ -46,7 +46,8 @@ default boolean fireIsCancelled @Override @NotNull default ITeleportEvent getTeleportEvent(@NotNull Teleport teleport) { - return new SpongeTeleportEvent(teleport); + return teleport.getType() == Teleport.Type.RANDOM_TELEPORT ? new SpongeRandomTeleportEvent(teleport) : + new SpongeTeleportEvent(teleport); } @Override diff --git a/sponge/src/main/java/net/william278/huskhomes/event/SpongeRandomTeleportEvent.java b/sponge/src/main/java/net/william278/huskhomes/event/SpongeRandomTeleportEvent.java new file mode 100644 index 00000000..7772f55e --- /dev/null +++ b/sponge/src/main/java/net/william278/huskhomes/event/SpongeRandomTeleportEvent.java @@ -0,0 +1,65 @@ +/* + * This file is part of HuskHomes, licensed under the Apache License 2.0. + * + * Copyright (c) William278 + * Copyright (c) contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.william278.huskhomes.event; + +import net.william278.huskhomes.position.Position; +import net.william278.huskhomes.teleport.Teleport; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.api.event.Cancellable; +import org.spongepowered.api.event.Cause; +import org.spongepowered.api.event.Event; + +public class SpongeRandomTeleportEvent implements IRandomTeleportEvent, Event, Cancellable { + + private boolean cancelled = false; + private final Teleport teleport; + + public SpongeRandomTeleportEvent(@NotNull Teleport teleport) { + this.teleport = teleport; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @NotNull + @Override + public Teleport getTeleport() { + return teleport; + } + + @Override + public Cause cause() { + return Cause.builder() + .append(teleport.getTeleporter()) + .build(); + } + + @Override + public @NotNull Position getPosition() { + return (Position) teleport.getTarget(); + } +}