Skip to content

Commit 9997ea1

Browse files
authored
Merge pull request #1 from plexusorg/codex/guild-worlds-gui
Add ASP guild worlds and management GUIs
2 parents 610f1be + 5f54368 commit 9997ea1

24 files changed

Lines changed: 1083 additions & 5 deletions

build.gradle.kts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
plugins {
22
java
33
`maven-publish`
4+
id("com.gradleup.shadow") version "9.2.2"
45
}
56

67
repositories {
8+
mavenLocal()
9+
710
maven {
811
url = uri("https://repo.papermc.io/repository/maven-public/")
912
}
@@ -13,6 +16,10 @@ repositories {
1316
}
1417

1518
mavenCentral()
19+
20+
maven {
21+
url = uri("https://repo.infernalsuite.com/repository/maven-snapshots/")
22+
}
1623
}
1724

1825
dependencies {
@@ -21,6 +28,8 @@ dependencies {
2128
compileOnly("io.papermc.paper:paper-api:26.1.2.build.+")
2229
implementation("org.apache.commons:commons-lang3:3.20.0")
2330
compileOnly("dev.plex:api:2.0-SNAPSHOT")
31+
compileOnly("com.infernalsuite.asp:api:4.0.0-SNAPSHOT")
32+
implementation("com.infernalsuite.asp:file-loader:4.0.0-SNAPSHOT")
2433
implementation("org.jetbrains:annotations:26.1.0")
2534
}
2635

@@ -45,6 +54,16 @@ tasks.getByName<Jar>("jar") {
4554
archiveVersion.set("")
4655
}
4756

57+
tasks.shadowJar {
58+
archiveBaseName.set("Module-Guilds")
59+
archiveClassifier.set("")
60+
archiveVersion.set("")
61+
}
62+
63+
tasks.build {
64+
dependsOn(tasks.shadowJar)
65+
}
66+
4867
tasks {
4968
compileJava {
5069
options.encoding = Charsets.UTF_8.name()

src/main/java/dev/plex/Guilds.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import dev.plex.config.ModuleConfig;
55
import dev.plex.guild.GuildHolder;
66
import dev.plex.handler.ChatHandlerImpl;
7+
import dev.plex.handler.GuildMenuListener;
8+
import dev.plex.handler.GuildWorldProtectionListener;
9+
import dev.plex.handler.RankPermissionMenuListener;
710
import dev.plex.module.PlexModule;
811
import dev.plex.api.storage.ModuleStorage;
912
import dev.plex.storage.GuildRepository;
1013
import dev.plex.storage.JdbiGuildRepository;
14+
import dev.plex.world.GuildWorldService;
1115
import lombok.Getter;
1216

1317
import java.sql.SQLException;
@@ -18,6 +22,10 @@ public class Guilds extends PlexModule
1822
{
1923
private static Guilds module;
2024
private final GuildHolder guildHolder = new GuildHolder();
25+
private final GuildMenuListener guildMenuListener = new GuildMenuListener();
26+
private final GuildWorldProtectionListener guildWorldProtectionListener = new GuildWorldProtectionListener();
27+
private final RankPermissionMenuListener rankPermissionMenuListener = new RankPermissionMenuListener();
28+
private final GuildWorldService guildWorldService = new GuildWorldService();
2129

2230
private GuildRepository guildRepository;
2331

@@ -36,10 +44,11 @@ public void load()
3644
@Override
3745
public void enable()
3846
{
47+
guildWorldService.enable();
3948
ModuleStorage storage = api().storage().forModule(this);
4049
try
4150
{
42-
storage.migrations().run(List.of("001_initial_schema"));
51+
storage.migrations().run(List.of("001_initial_schema", "002_guild_world_permissions"));
4352
}
4453
catch (SQLException e)
4554
{
@@ -62,11 +71,15 @@ public void enable()
6271
guildHolder.replaceAll(guilds);
6372
});
6473
registerListener(new ChatHandlerImpl());
74+
registerListener(guildMenuListener);
75+
registerListener(guildWorldProtectionListener);
76+
registerListener(rankPermissionMenuListener);
6577
}
6678

6779
@Override
6880
public void disable()
6981
{
82+
guildWorldService.disable();
7083
guildHolder.clear();
7184
}
7285

src/main/java/dev/plex/command/GuildCommand.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,29 @@ public GuildCommand()
4040
this.registerSubCommand(new ChatSubCommand());
4141
this.registerSubCommand(new SetHomeSubCommand());
4242
this.registerSubCommand(new HomeSubCommand());
43+
this.registerSubCommand(new WorldSubCommand());
44+
this.registerSubCommand(new PermissionsSubCommand());
4345
this.registerSubCommand(new OwnerSubCommand());
4446
this.registerSubCommand(new InviteSubCommand());
4547
this.registerSubCommand(new AcceptSubCommand());
4648
this.registerSubCommand(new DenySubCommand());
49+
this.registerSubCommand(new MenuSubCommand());
4750
}
4851

4952
@Override
5053
protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args)
5154
{
5255
if (args.length == 0)
5356
{
54-
return getSubs();
57+
if (player == null)
58+
{
59+
return getSubs();
60+
}
61+
Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(
62+
guild -> Guilds.get().getGuildMenuListener().openHome(player, guild),
63+
() -> player.sendMessage(messageComponent("guildNotFound"))
64+
);
65+
return null;
5566
}
5667
if (args[0].equalsIgnoreCase("help"))
5768
{

src/main/java/dev/plex/command/sub/CreateSubCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ protected Component execute(@NotNull CommandSender commandSender, @Nullable Play
3737
{
3838
return messageComponent("alreadyInGuild");
3939
}
40-
Guilds.get().getGuildRepository().createGuild(player, StringUtils.join(args, " ")).whenComplete((guild, throwable) ->
40+
Guilds.get().getGuildRepository().createGuild(player, StringUtils.join(args, " "))
41+
.thenCompose(guild -> Guilds.get().getGuildWorldService().ensureWorld(guild).thenApply(world -> guild))
42+
.whenComplete((guild, throwable) ->
4143
{
4244
if (throwable != null)
4345
{
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.plex.command.sub;
2+
3+
import dev.plex.Guilds;
4+
import dev.plex.command.source.RequiredCommandSource;
5+
import net.kyori.adventure.text.Component;
6+
import org.bukkit.command.CommandSender;
7+
import org.bukkit.entity.Player;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
public class MenuSubCommand extends GuildSubCommand
12+
{
13+
public MenuSubCommand()
14+
{
15+
super(command("menu")
16+
.description("Opens the guild management menu")
17+
.usage("/guild <command>")
18+
.aliases("gui,panel")
19+
.permission("plex.guilds.menu")
20+
.source(RequiredCommandSource.IN_GAME)
21+
.build());
22+
}
23+
24+
@Override
25+
protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args)
26+
{
27+
assert player != null;
28+
Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(
29+
guild -> Guilds.get().getGuildMenuListener().openHome(player, guild),
30+
() -> send(player, messageComponent("guildNotFound"))
31+
);
32+
return null;
33+
}
34+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.plex.command.sub;
2+
3+
import dev.plex.Guilds;
4+
import dev.plex.command.source.RequiredCommandSource;
5+
import net.kyori.adventure.text.Component;
6+
import org.bukkit.command.CommandSender;
7+
import org.bukkit.entity.Player;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
public class PermissionsSubCommand extends GuildSubCommand
12+
{
13+
public PermissionsSubCommand()
14+
{
15+
super(command("permissions")
16+
.description("Opens the rank permissions GUI")
17+
.usage("/guild <command>")
18+
.aliases("perms")
19+
.permission("plex.guilds.permissions")
20+
.source(RequiredCommandSource.IN_GAME)
21+
.build());
22+
}
23+
24+
@Override
25+
protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args)
26+
{
27+
assert player != null;
28+
Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild ->
29+
{
30+
if (!guild.isOwner(player.getUniqueId()))
31+
{
32+
send(player, messageComponent("guildNotOwner"));
33+
return;
34+
}
35+
Guilds.get().getRankPermissionMenuListener().openRankList(player, guild);
36+
}, () -> send(player, messageComponent("guildNotFound")));
37+
return null;
38+
}
39+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package dev.plex.command.sub;
2+
3+
import dev.plex.Guilds;
4+
import dev.plex.command.source.RequiredCommandSource;
5+
import net.kyori.adventure.text.Component;
6+
import org.bukkit.Location;
7+
import org.bukkit.World;
8+
import org.bukkit.command.CommandSender;
9+
import org.bukkit.entity.Player;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
public class WorldSubCommand extends GuildSubCommand
14+
{
15+
public WorldSubCommand()
16+
{
17+
super(command("world")
18+
.description("Teleports to your guild world")
19+
.usage("/guild <command>")
20+
.aliases("base")
21+
.permission("plex.guilds.world")
22+
.source(RequiredCommandSource.IN_GAME)
23+
.build());
24+
}
25+
26+
@Override
27+
protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args)
28+
{
29+
assert player != null;
30+
Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild ->
31+
{
32+
send(player, messageComponent("guildWorldLoading"));
33+
Guilds.get().getGuildWorldService().ensureWorld(guild).whenComplete((world, throwable) ->
34+
{
35+
if (throwable != null)
36+
{
37+
Guilds.get().api().scheduler().executeGlobal(() ->
38+
{
39+
throwable.printStackTrace();
40+
send(player, messageComponent("guildWorldLoadFailed"));
41+
});
42+
return;
43+
}
44+
Guilds.get().api().scheduler().executeEntity(player, () -> teleport(player, world), 1L);
45+
});
46+
}, () -> send(player, messageComponent("guildNotFound")));
47+
return null;
48+
}
49+
50+
private void teleport(Player player, World world)
51+
{
52+
Location spawnLocation = world.getSpawnLocation().toCenterLocation();
53+
player.teleportAsync(spawnLocation);
54+
}
55+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package dev.plex.gui;
2+
3+
import dev.plex.guild.Guild;
4+
import org.bukkit.inventory.Inventory;
5+
import org.bukkit.inventory.InventoryHolder;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.util.UUID;
9+
10+
public record GuildMenuInventoryHolder(Guild guild, GuildMenuView view, UUID memberUuid) implements InventoryHolder
11+
{
12+
@Override
13+
public @NotNull Inventory getInventory()
14+
{
15+
throw new UnsupportedOperationException();
16+
}
17+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dev.plex.gui;
2+
3+
public enum GuildMenuView
4+
{
5+
HOME,
6+
MEMBERS,
7+
MEMBER
8+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package dev.plex.gui;
2+
3+
import dev.plex.guild.Guild;
4+
import org.bukkit.inventory.Inventory;
5+
import org.bukkit.inventory.InventoryHolder;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
public record RankPermissionInventoryHolder(Guild guild, String rankName) implements InventoryHolder
9+
{
10+
@Override
11+
public @NotNull Inventory getInventory()
12+
{
13+
throw new UnsupportedOperationException();
14+
}
15+
}

0 commit comments

Comments
 (0)