Skip to content

Commit 8dbcfdd

Browse files
author
Meru | m9eenn
authored
Merge pull request #21 from AfnwTeam/feat/tpCommand-and-afk
Feat/tp command and afk
2 parents 91363bd + 6029c05 commit 8dbcfdd

File tree

6 files changed

+138
-2
lines changed

6 files changed

+138
-2
lines changed

build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,15 @@ repositories {
1515
name = 'sonatype'
1616
url = 'https://oss.sonatype.org/content/groups/public/'
1717
}
18+
maven {
19+
name = 'essentialsx'
20+
url = 'https://repo.essentialsx.net/releases/'
21+
}
1822
}
1923

2024
dependencies {
2125
compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT'
26+
compileOnly 'net.essentialsx:EssentialsX:2.19.2'
2227
}
2328

2429
def targetJavaVersion = 17
@@ -35,6 +40,7 @@ tasks.withType(JavaCompile).configureEach {
3540
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
3641
options.release = targetJavaVersion
3742
}
43+
options.encoding = 'UTF-8'
3844
}
3945

4046
processResources {

src/main/java/net/azisaba/afnw/afnwcore2/AfnwCore2.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.azisaba.afnw.afnwcore2;
22

33
import net.azisaba.afnw.afnwcore2.commands.*;
4+
import net.azisaba.afnw.afnwcore2.listeners.player.AFKListener;
45
import net.azisaba.afnw.afnwcore2.listeners.player.DeathListener;
56
import net.azisaba.afnw.afnwcore2.listeners.player.FirstPlayerJoinListener;
67
import net.azisaba.afnw.afnwcore2.listeners.player.JoinListener;
@@ -27,6 +28,7 @@ public void onEnable() {
2728
pluginEvent.registerEvents(new QuitListener(), this);
2829
pluginEvent.registerEvents(new DeathListener(), this);
2930
pluginEvent.registerEvents(new FirstPlayerJoinListener(), this);
31+
pluginEvent.registerEvents(new AFKListener(this), this);
3032
/* listeners - block */
3133
pluginEvent.registerEvents(new CropsBreakCanceller(), this);
3234
pluginEvent.registerEvents(new SaplingBreakCanceller(), this);
@@ -37,6 +39,7 @@ public void onEnable() {
3739
Objects.requireNonNull(getCommand("respawn")).setExecutor(new RespawnCommand());
3840
Objects.requireNonNull(getCommand("config_reload")).setExecutor(new ConfigReloadCommand(this));
3941
Objects.requireNonNull(getCommand("ticket")).setExecutor(new TicketCommand(this));
42+
Objects.requireNonNull(getCommand("lobby")).setExecutor(new LobbyCommand(this));
4043

4144
getLogger().info("[AfnwCore2] Enabled!");
4245
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package net.azisaba.afnw.afnwcore2.commands;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.format.NamedTextColor;
5+
import org.bukkit.Bukkit;
6+
import org.bukkit.World;
7+
import org.bukkit.command.Command;
8+
import org.bukkit.command.CommandExecutor;
9+
import org.bukkit.command.CommandSender;
10+
import org.bukkit.configuration.file.FileConfiguration;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.plugin.java.JavaPlugin;
13+
import org.bukkit.scheduler.BukkitRunnable;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
public record LobbyCommand(JavaPlugin plugin) implements CommandExecutor {
17+
18+
@Override
19+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
20+
if(!(command.getName().equals("lobby"))) {
21+
return false;
22+
}
23+
24+
if (!(sender instanceof Player p)) {
25+
sender.sendMessage(Component.text("/lobbyコマンドはプレイヤーのみ実行可能です。", NamedTextColor.RED));
26+
return false;
27+
}
28+
29+
if(!(sender.hasPermission("afnw.command.lobby"))) {
30+
return false;
31+
}
32+
33+
FileConfiguration config = plugin.getConfig();
34+
World lobby = Bukkit.getWorld(config.getString("tp.lobby_world_name", "lobby"));
35+
int standby = config.getInt("tp.standby", 10);
36+
if(lobby == null) {
37+
throw new NullPointerException("Lobby World could not be found");
38+
}
39+
if(p.getWorld() == lobby) {
40+
sender.sendMessage(Component.text("既にロビーにいるため、テレポートできません。", NamedTextColor.RED));
41+
return false;
42+
}
43+
44+
p.sendMessage(Component.text(standby + "秒後、ロビーへテレポートします....", NamedTextColor.AQUA));
45+
new BukkitRunnable() {
46+
@Override
47+
public void run() {
48+
p.teleport(lobby.getSpawnLocation());
49+
p.sendMessage(Component.text("ロビーへテレポートしました。", NamedTextColor.AQUA));
50+
}
51+
}.runTaskLater(plugin, 20L * standby);
52+
53+
return true;
54+
}
55+
56+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package net.azisaba.afnw.afnwcore2.listeners.player;
2+
3+
import net.ess3.api.events.AfkStatusChangeEvent;
4+
import net.ess3.api.events.AfkStatusChangeEvent.Cause;
5+
import net.kyori.adventure.text.Component;
6+
import net.kyori.adventure.text.format.NamedTextColor;
7+
import org.bukkit.Bukkit;
8+
import org.bukkit.Location;
9+
import org.bukkit.World;
10+
import org.bukkit.configuration.file.FileConfiguration;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.event.EventHandler;
13+
import org.bukkit.event.EventPriority;
14+
import org.bukkit.event.Listener;
15+
import org.bukkit.plugin.java.JavaPlugin;
16+
17+
public record AFKListener(JavaPlugin plugin) implements Listener {
18+
19+
@EventHandler(priority = EventPriority.HIGHEST)
20+
public void onAFK(AfkStatusChangeEvent e) {
21+
Player p = e.getAffected().getBase();
22+
if(p.hasPermission("afnw.bypass.afk")) {
23+
return;
24+
}
25+
26+
FileConfiguration config = plugin.getConfig();
27+
World afkWorld = Bukkit.getWorld(config.getString("afk.afk_world_name", "afk"));
28+
if(afkWorld == null) {
29+
throw new NullPointerException("Lobby World could not be found");
30+
}
31+
int x = config.getInt("afk.afk_point_x", 0);
32+
int y = config.getInt("afk.afk_point_y", 0);
33+
int z = config.getInt("afk.afk_point_z", 0);
34+
35+
y++;
36+
Location afkPoint = new Location(afkWorld, x, y, z);
37+
38+
if(e.getCause() == Cause.MOVE || e.getCause() == Cause.QUIT) {
39+
return;
40+
} else if(e.getCause() == Cause.ACTIVITY || e.getCause() == Cause.COMMAND) {
41+
p.teleport(afkPoint);
42+
} else {
43+
p.teleport(afkPoint);
44+
p.sendMessage(Component.text("AFKモードになったため、AFKポイントに退避しました。", NamedTextColor.GREEN));
45+
}
46+
}
47+
48+
}

src/main/resources/config.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# AfnwCore2 Config File
22
# AfnwCore2に関するいろんな設定を変更できるファイルです。パーミッションの設定はここでは行えません。
33
# 編集した後はサーバーを再起動するか、プラグインを再リロードするか、コマンド "/reload#afnw" を実行してください。
4+
# デフォルト値は万が一指定されていないときにAfnwCore2が代入する値です。(World名のConfigではデフォルト値が入ってもワールドが見つからない場合はRuntimeException(例外)としてクラッシュします。)
45

56
vote: # 投票周りの設定
67
item-size: 1
@@ -9,3 +10,18 @@ vote: # 投票周りの設定
910
# /afnwで交換時に一緒に配布される足場の数を指定してください。int(数)ではない場合はエラーが発生します。デフォルト: 8
1011
send-ticket-size: 1
1112
# 投票時に受け取れるチケットの数を指定してください。int(数)ではない場合はエラーが発生します。デフォルト: 1
13+
14+
tp:
15+
standby: 10
16+
# TPコマンド(not /tp)を使用した際の待機時間を病で指定します。int(数)ではない場合はエラーが発生します。デフォルト: 10
17+
lobby_world_name: "lobby"
18+
# ロビーワールドの名前を指定します。デフォルト:lobby
19+
20+
afk:
21+
afk_world_name: "afk"
22+
# AFKポイントとして利用するワールド名を指定します。デフォルト:afk
23+
afk_point_x: 0
24+
afk_point_y: 0
25+
afk_point_z: 0
26+
# AFKポイントとして利用する座標をそれぞれ指定します。int(数)ではない場合はエラーが発生します。窒息を防ぐため、Y座標のみ一つ足された数値で利用されるので注意してください。
27+
# デフォルト値は0です。必ず指定することをおすすめします。

src/main/resources/plugin.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ prefix: AfnwCore2
66
load: STARTUP
77
authors: [ merunno, afnwteam ]
88
description: That world, once again.
9+
depend: [ Essentials ]
910
website: https://github.com/AfnwTeam/AfnwCore2
1011

1112
permissions:
@@ -15,6 +16,8 @@ permissions:
1516
default: op
1617
afnw.bypass.break.arable:
1718
default: op
19+
afnw.bypass.afk:
20+
default: op
1821
afnw.command.afnw:
1922
default: false
2023
afnw.command.vote:
@@ -30,6 +33,8 @@ permissions:
3033
description: DO NOT RUN COMMAND BY PLAYER
3134
afnw.command.config_reload:
3235
default: false
36+
afnw.command.lobby:
37+
default: not op
3338

3439
commands:
3540
afnw:
@@ -40,7 +45,9 @@ commands:
4045
description: プレイヤーを強制的にリスポーンさせます。
4146
usage: /respawn <player>
4247
ticket:
43-
description: チケットに関するコマンド
48+
description: チケットコマンドのサブグループ
4449
usage: /ticket <subcommand>
4550
config_reload:
46-
description: コンフィグファイルのリロード
51+
description: コンフィグファイルのリロードを行います。
52+
lobby:
53+
description: ロビーへTPします。

0 commit comments

Comments
 (0)