1+ package org .vortex .resourceloader ;
2+
3+ import org .bukkit .ChatColor ;
4+ import org .bukkit .command .Command ;
5+ import org .bukkit .command .CommandExecutor ;
6+ import org .bukkit .command .CommandSender ;
7+ import org .bukkit .command .TabCompleter ;
8+ import org .bukkit .util .StringUtil ;
9+ import org .bukkit .scheduler .BukkitRunnable ;
10+
11+ import java .io .File ;
12+ import java .io .IOException ;
13+ import java .util .ArrayList ;
14+ import java .util .Collections ;
15+ import java .util .List ;
16+
17+ public class MergeCommand implements CommandExecutor , TabCompleter {
18+ private final Resourceloader plugin ;
19+ private final ResourcePackMerger merger ;
20+ private boolean isCurrentlyMerging = false ;
21+
22+ public MergeCommand (Resourceloader plugin ) {
23+ this .plugin = plugin ;
24+ this .merger = new ResourcePackMerger (plugin );
25+ }
26+
27+ public ResourcePackMerger getMerger () {
28+ return merger ;
29+ }
30+
31+ @ Override
32+ public boolean onCommand (CommandSender sender , Command command , String label , String [] args ) {
33+ if (!sender .hasPermission ("resourceloader.admin" )) {
34+ sender .sendMessage (ChatColor .RED + "You don't have permission to merge resource packs." );
35+ return true ;
36+ }
37+
38+ if (isCurrentlyMerging ) {
39+ sender .sendMessage (ChatColor .RED + "A merge operation is already in progress. Please wait." );
40+ return true ;
41+ }
42+
43+ if (args .length < 3 ) {
44+ sender .sendMessage (ChatColor .RED + "Usage: /mergepack <output_name> <pack1> <pack2> [pack3...]" );
45+ return true ;
46+ }
47+
48+ String outputName = args [0 ];
49+ if (!outputName .toLowerCase ().endsWith (".zip" )) {
50+ outputName += ".zip" ;
51+ }
52+
53+ // Validate all packs exist before starting the merge
54+ List <File > inputPacks = new ArrayList <>();
55+ for (int i = 1 ; i < args .length ; i ++) {
56+ String packName = args [i ];
57+ File packFile = plugin .getResourcePacks ().get (packName );
58+ if (packFile == null ) {
59+ sender .sendMessage (ChatColor .RED + "Resource pack '" + packName + "' not found!" );
60+ return true ;
61+ }
62+ inputPacks .add (packFile );
63+ }
64+
65+ // Mark as merging
66+ isCurrentlyMerging = true ;
67+ sender .sendMessage (ChatColor .YELLOW + "Starting resource pack merge process..." );
68+
69+ // Use final variables for the inner class
70+ final String finalOutputName = outputName ;
71+ final List <File > finalInputPacks = inputPacks ;
72+
73+ new BukkitRunnable () {
74+ @ Override
75+ public void run () {
76+ try {
77+ // Perform merge operation async
78+ merger .mergeResourcePacks (finalInputPacks , finalOutputName );
79+
80+ // Switch back to main thread to update plugin state
81+ new BukkitRunnable () {
82+ @ Override
83+ public void run () {
84+ try {
85+ plugin .loadResourcePacks ();
86+ sender .sendMessage (ChatColor .GREEN + "Successfully merged resource packs into: " + finalOutputName );
87+ } catch (Exception e ) {
88+ sender .sendMessage (ChatColor .RED + "Error loading merged pack: " + e .getMessage ());
89+ plugin .getLogger ().warning ("Error loading merged pack: " + e .getMessage ());
90+ e .printStackTrace ();
91+ } finally {
92+ isCurrentlyMerging = false ;
93+ }
94+ }
95+ }.runTask (plugin );
96+
97+ } catch (IOException e ) {
98+ // Switch back to main thread to send error message
99+ new BukkitRunnable () {
100+ @ Override
101+ public void run () {
102+ sender .sendMessage (ChatColor .RED + "Failed to merge resource packs: " + e .getMessage ());
103+ plugin .getLogger ().warning ("Failed to merge resource packs: " + e .getMessage ());
104+ e .printStackTrace ();
105+ isCurrentlyMerging = false ;
106+ }
107+ }.runTask (plugin );
108+ }
109+ }
110+ }.runTaskAsynchronously (plugin );
111+
112+ return true ;
113+ }
114+
115+ @ Override
116+ public List <String > onTabComplete (CommandSender sender , Command command , String alias , String [] args ) {
117+ List <String > completions = new ArrayList <>();
118+
119+ if (args .length >= 2 ) {
120+ if (sender .hasPermission ("resourceloader.admin" )) {
121+ List <String > packs = new ArrayList <>(plugin .getResourcePacks ().keySet ());
122+ StringUtil .copyPartialMatches (args [args .length - 1 ], packs , completions );
123+ }
124+ }
125+
126+ Collections .sort (completions );
127+ return completions ;
128+ }
129+ }
0 commit comments