11package org .vortex .resourceloader ;
22
3+ import com .sun .net .httpserver .HttpServer ;
34import org .bukkit .ChatColor ;
45import org .bukkit .command .Command ;
56import org .bukkit .command .CommandExecutor ;
67import org .bukkit .command .CommandSender ;
78import org .bukkit .configuration .ConfigurationSection ;
89import org .bukkit .entity .Player ;
10+ import org .bukkit .event .EventHandler ;
11+ import org .bukkit .event .Listener ;
12+ import org .bukkit .event .player .PlayerJoinEvent ;
913import 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
0 commit comments