Skip to content

Commit 1a9337c

Browse files
Add files via upload
1 parent 55f8092 commit 1a9337c

File tree

3 files changed

+206
-37
lines changed

3 files changed

+206
-37
lines changed

src/main/java/org/vortex/resourceloader/Resourceloader.java

Lines changed: 188 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,140 @@
11
package org.vortex.resourceloader;
22

3+
import com.sun.net.httpserver.HttpServer;
34
import org.bukkit.ChatColor;
45
import org.bukkit.command.Command;
56
import org.bukkit.command.CommandExecutor;
67
import org.bukkit.command.CommandSender;
78
import org.bukkit.configuration.ConfigurationSection;
89
import org.bukkit.entity.Player;
10+
import org.bukkit.event.EventHandler;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.player.PlayerJoinEvent;
913
import org.bukkit.plugin.java.JavaPlugin;
1014

11-
import java.net.URL;
15+
import java.io.File;
16+
import java.io.IOException;
17+
import java.io.OutputStream;
18+
import java.net.InetSocketAddress;
19+
import java.nio.file.Files;
20+
import java.util.HashMap;
21+
import java.util.Map;
22+
23+
public final class Resourceloader extends JavaPlugin implements Listener {
24+
private final Map<String, String> packHashes = new HashMap<>();
25+
private HttpServer httpServer;
26+
private int port;
1227

13-
public final class Resourceloader extends JavaPlugin {
1428
@Override
1529
public void onEnable() {
1630
saveDefaultConfig();
31+
setupResourcePackFolder();
32+
setupHttpServer();
1733

18-
// Register commands
1934
getCommand("load").setExecutor(new LoadCommand(this));
2035
getCommand("resourcereload").setExecutor(new ResourceReloadCommand(this));
2136
getCommand("listpacks").setExecutor(new ListPacksCommand(this));
37+
getCommand("autoload").setExecutor(new AutoloadCommand(this));
38+
39+
getServer().getPluginManager().registerEvents(this, this);
2240

2341
getLogger().info("Resourceloader has been enabled!");
2442
}
2543

44+
private void setupResourcePackFolder() {
45+
File packFolder = new File(getDataFolder(), "packs");
46+
if (!packFolder.exists()) {
47+
packFolder.mkdirs();
48+
}
49+
}
50+
51+
private void setupHttpServer() {
52+
try {
53+
httpServer = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
54+
port = httpServer.getAddress().getPort();
55+
56+
httpServer.createContext("/packs/", exchange -> {
57+
String requestPath = exchange.getRequestURI().getPath();
58+
String fileName = requestPath.substring("/packs/".length());
59+
File packFile = new File(getDataFolder(), "packs" + File.separator + fileName);
60+
61+
if (packFile.exists() && packFile.isFile()) {
62+
exchange.getResponseHeaders().set("Content-Type", "application/zip");
63+
exchange.sendResponseHeaders(200, packFile.length());
64+
65+
try (OutputStream os = exchange.getResponseBody()) {
66+
Files.copy(packFile.toPath(), os);
67+
}
68+
} else {
69+
String response = "Resource pack not found";
70+
exchange.sendResponseHeaders(404, response.length());
71+
try (OutputStream os = exchange.getResponseBody()) {
72+
os.write(response.getBytes());
73+
}
74+
}
75+
exchange.close();
76+
});
77+
78+
httpServer.setExecutor(null);
79+
httpServer.start();
80+
getLogger().info("Resource pack server started successfully");
81+
} catch (IOException e) {
82+
getLogger().severe("Failed to start HTTP server: " + e.getMessage());
83+
}
84+
}
85+
86+
@EventHandler
87+
public void onPlayerJoin(PlayerJoinEvent event) {
88+
Player player = event.getPlayer();
89+
String packName = getConfig().getString("player-packs." + player.getUniqueId());
90+
91+
if (packName != null) {
92+
getServer().getScheduler().runTaskLater(this, () -> {
93+
if (player.isOnline()) {
94+
String path;
95+
if (packName.equals("server")) {
96+
path = getConfig().getString("server-pack");
97+
} else {
98+
ConfigurationSection packs = getConfig().getConfigurationSection("resource-packs");
99+
path = packs != null ? packs.getString(packName) : null;
100+
}
101+
102+
if (path != null && !path.isEmpty()) {
103+
loadResourcePack(player, packName, path);
104+
}
105+
}
106+
}, 20L);
107+
}
108+
}
109+
110+
private void loadResourcePack(Player player, String packName, String path) {
111+
if (path == null || path.isEmpty()) {
112+
player.sendMessage(ChatColor.RED + "Invalid path configured for pack '" + packName + "'");
113+
return;
114+
}
115+
116+
try {
117+
String finalUrl;
118+
if (path.startsWith("http://") || path.startsWith("https://")) {
119+
finalUrl = path;
120+
} else {
121+
finalUrl = String.format("http://localhost:%d/packs/%s", port, path);
122+
}
123+
124+
player.setResourcePack(finalUrl);
125+
player.sendMessage(ChatColor.GREEN + "Loading the " + packName + " resource pack...");
126+
getLogger().info("Resource pack '" + packName + "' load attempted for player " + player.getName());
127+
} catch (Exception e) {
128+
player.sendMessage(ChatColor.RED + "Failed to load resource pack: " + e.getMessage());
129+
getLogger().warning("Resource pack loading failed: " + e.getMessage());
130+
}
131+
}
132+
26133
@Override
27134
public void onDisable() {
135+
if (httpServer != null) {
136+
httpServer.stop(0);
137+
}
28138
getLogger().info("Resourceloader has been disabled!");
29139
}
30140

@@ -47,19 +157,17 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
47157
return true;
48158
}
49159

50-
// If no arguments, load the default server pack
51160
if (args.length < 1) {
52-
String defaultPackUrl = plugin.getConfig().getString("server-pack");
53-
if (defaultPackUrl == null || defaultPackUrl.isEmpty()) {
161+
String defaultPackPath = plugin.getConfig().getString("server-pack");
162+
if (defaultPackPath == null || defaultPackPath.isEmpty()) {
54163
player.sendMessage(ChatColor.RED + "No default server pack configured!");
55164
return true;
56165
}
57166

58-
loadResourcePack(player, "server", defaultPackUrl);
167+
plugin.loadResourcePack(player, "server", defaultPackPath);
59168
return true;
60169
}
61170

62-
// Handle specific pack loading
63171
String packName = args[0].toLowerCase();
64172
ConfigurationSection packs = plugin.getConfig().getConfigurationSection("resource-packs");
65173

@@ -68,26 +176,78 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
68176
return true;
69177
}
70178

71-
String resourcePackUrl = packs.getString(packName);
72-
loadResourcePack(player, packName, resourcePackUrl);
179+
String resourcePackPath = packs.getString(packName);
180+
plugin.loadResourcePack(player, packName, resourcePackPath);
73181
return true;
74182
}
183+
}
184+
185+
public class AutoloadCommand implements CommandExecutor {
186+
private final Resourceloader plugin;
187+
188+
public AutoloadCommand(Resourceloader plugin) {
189+
this.plugin = plugin;
190+
}
75191

76-
private void loadResourcePack(Player player, String packName, String url) {
77-
if (url == null || url.isEmpty()) {
78-
player.sendMessage(ChatColor.RED + "Invalid URL configured for pack '" + packName + "'");
79-
return;
192+
@Override
193+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
194+
if (!(sender instanceof Player player)) {
195+
sender.sendMessage(ChatColor.RED + "This command can only be used by players.");
196+
return true;
80197
}
81198

82-
try {
83-
new URL(url);
84-
player.setResourcePack(url);
85-
player.sendMessage(ChatColor.GREEN + "Loading the " + packName + " resource pack ...");
86-
plugin.getLogger().info("Resource pack '" + packName + "' load attempted for player " + player.getName());
87-
} catch (Exception e) {
88-
player.sendMessage(ChatColor.RED + "Failed to load resource pack: Invalid URL or download error");
89-
plugin.getLogger().warning("Resource pack loading failed: " + e.getMessage());
199+
if (!player.hasPermission("resourceloader.autoload")) {
200+
player.sendMessage(ChatColor.RED + "You do not have permission to set autoload preferences.");
201+
return true;
202+
}
203+
204+
if (args.length < 1) {
205+
String currentPack = plugin.getConfig().getString("player-packs." + player.getUniqueId());
206+
if (currentPack != null) {
207+
player.sendMessage(ChatColor.YELLOW + "Your current autoload pack is: " + currentPack);
208+
player.sendMessage(ChatColor.YELLOW + "Use '/autoload clear' to disable autoload.");
209+
} else {
210+
player.sendMessage(ChatColor.YELLOW + "You don't have an autoload pack set.");
211+
player.sendMessage(ChatColor.YELLOW + "Use '/autoload <packname>' to set one.");
212+
}
213+
return true;
214+
}
215+
216+
String packName = args[0].toLowerCase();
217+
218+
if (packName.equals("clear")) {
219+
plugin.getConfig().set("player-packs." + player.getUniqueId(), null);
220+
plugin.saveConfig();
221+
player.sendMessage(ChatColor.GREEN + "Cleared your autoload preference.");
222+
return true;
90223
}
224+
225+
if (packName.equals("server")) {
226+
String serverPack = plugin.getConfig().getString("server-pack");
227+
if (serverPack == null || serverPack.isEmpty()) {
228+
player.sendMessage(ChatColor.RED + "No default server pack configured!");
229+
return true;
230+
}
231+
plugin.getConfig().set("player-packs." + player.getUniqueId(), "server");
232+
plugin.saveConfig();
233+
player.sendMessage(ChatColor.GREEN + "Set your autoload to the default server pack.");
234+
return true;
235+
}
236+
237+
ConfigurationSection packs = plugin.getConfig().getConfigurationSection("resource-packs");
238+
if (packs == null || !packs.contains(packName)) {
239+
player.sendMessage(ChatColor.RED + "Resource pack '" + packName + "' not found!");
240+
return true;
241+
}
242+
243+
plugin.getConfig().set("player-packs." + player.getUniqueId(), packName);
244+
plugin.saveConfig();
245+
player.sendMessage(ChatColor.GREEN + "Set '" + packName + "' as your autoload resource pack.");
246+
247+
String resourcePackPath = packs.getString(packName);
248+
plugin.loadResourcePack(player, packName, resourcePackPath);
249+
250+
return true;
91251
}
92252
}
93253

@@ -107,18 +267,19 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
107267

108268
sender.sendMessage(ChatColor.YELLOW + "Available Resource Packs:");
109269

110-
// Show default server pack
111270
String serverPack = plugin.getConfig().getString("server-pack");
112271
if (serverPack != null && !serverPack.isEmpty()) {
113-
sender.sendMessage(ChatColor.GREEN + "Default Server Pack: " + ChatColor.GRAY + "(/load)");
272+
String packType = serverPack.startsWith("http") ? "URL" : "File";
273+
sender.sendMessage(ChatColor.GREEN + "Default Server Pack: " + ChatColor.GRAY +
274+
"(/load) [" + packType + "]");
114275
}
115276

116-
// List additional packs
117277
ConfigurationSection packs = plugin.getConfig().getConfigurationSection("resource-packs");
118278
if (packs != null && !packs.getKeys(false).isEmpty()) {
119-
sender.sendMessage(ChatColor.GREEN + "Additional Packs:");
120279
for (String packName : packs.getKeys(false)) {
121-
sender.sendMessage(ChatColor.GRAY + "- " + packName + " (/load " + packName + ")");
280+
String packPath = packs.getString(packName);
281+
String packType = packPath != null && packPath.startsWith("http") ? "URL" : "File";
282+
sender.sendMessage(ChatColor.GRAY + "- " + packName + " (/load " + packName + ") [" + packType + "]");
122283
}
123284
}
124285

src/main/resources/config.yml

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
# Main server resource pack URL
2-
# This pack is loaded when using /load without arguments
3-
server-pack: "https://example.com/server-pack.zip"
1+
# Main server resource pack
2+
# Can be either a URL or a file name in the packs folder
3+
# For URLs: "https://example.com/server-pack.zip"
4+
# For files: "server-pack.zip"
5+
server-pack: "server-pack.zip"
46

57
# Additional resource packs
6-
# These packs can be loaded using /load <packname>
7-
# To add a new pack, use a key:"value" format
8+
# Can use either URLs or files from the packs folder
89
resource-packs:
9-
example: "https://example.com/dungeons-pack.zip"
10-
example0: "https://example.com/example0.zip"
11-
example1: "https://example.com/example0.zip"
10+
dungeons: "dungeons-pack.zip"
11+
pvp: "https://example.com/pvp-pack.zip"
12+
holiday: "holiday-pack.zip"

src/main/resources/plugin.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: Resourceloader
2-
version: '1.0'
2+
version: '1.1'
33
main: org.vortex.resourceloader.Resourceloader
44
api-version: '1.13'
55
description: A simple and flexible resource pack loader for Minecraft servers
@@ -26,6 +26,10 @@ commands:
2626
usage: /resourcereload
2727
permission: resourceloader.reload
2828
aliases: [rlresource]
29+
autoload:
30+
description: Set your preferred resource pack for automatic loading
31+
usage: /autoload [packname|clear]
32+
permission: resourceloader.autoload
2933

3034
permissions:
3135
resourceloader.load:
@@ -36,4 +40,7 @@ permissions:
3640
default: true
3741
resourceloader.reload:
3842
description: Allows reloading the plugin configuration
39-
default: op
43+
default: op
44+
resourceloader.autoload:
45+
description: Allows setting resource pack for automatic loading
46+
default: true

0 commit comments

Comments
 (0)