mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-31 09:33:43 +01:00 
			
		
		
		
	Optimized plot saving + plot music
Fixes #244 - Faster PlotMe conversion - faster uuid mode conversion
This commit is contained in:
		| @@ -732,7 +732,7 @@ public class PlotSquared { | |||||||
|         final List<String> booleanFlags = Arrays.asList("notify-enter", "notify-leave", "item-drop", "invincible", "instabreak", "drop-protection", "forcefield", "titles", "pve", "pvp", "no-worldedit", "redstone", "keep"); |         final List<String> booleanFlags = Arrays.asList("notify-enter", "notify-leave", "item-drop", "invincible", "instabreak", "drop-protection", "forcefield", "titles", "pve", "pvp", "no-worldedit", "redstone", "keep"); | ||||||
|         final List<String> intervalFlags = Arrays.asList("feed", "heal"); |         final List<String> intervalFlags = Arrays.asList("feed", "heal"); | ||||||
|         final List<String> stringFlags = Arrays.asList("greeting", "farewell"); |         final List<String> stringFlags = Arrays.asList("greeting", "farewell"); | ||||||
|         final List<String> intFlags = Arrays.asList("entity-cap", "mob-cap", "animal-cap", "hostile-cap", "vehicle-cap"); |         final List<String> intFlags = Arrays.asList("entity-cap", "mob-cap", "animal-cap", "hostile-cap", "vehicle-cap", "music"); | ||||||
|         for (final String flag : stringFlags) { |         for (final String flag : stringFlags) { | ||||||
|             FlagManager.addFlag(new AbstractFlag(flag)); |             FlagManager.addFlag(new AbstractFlag(flag)); | ||||||
|         } |         } | ||||||
| @@ -798,6 +798,9 @@ public class PlotSquared { | |||||||
|                     case "storm": |                     case "storm": | ||||||
|                     case "on": |                     case "on": | ||||||
|                         return "rain"; |                         return "rain"; | ||||||
|  |                     case "lightning": | ||||||
|  |                     case "thunder": | ||||||
|  |                         return "thunder"; | ||||||
|                     case "clear": |                     case "clear": | ||||||
|                     case "off": |                     case "off": | ||||||
|                     case "sun": |                     case "sun": | ||||||
|   | |||||||
| @@ -329,64 +329,124 @@ public class SQLManager implements AbstractDB { | |||||||
|     	} |     	} | ||||||
|         int packet; |         int packet; | ||||||
|         if (Settings.DB.USE_MYSQL) { |         if (Settings.DB.USE_MYSQL) { | ||||||
|             packet = Math.min(size, 50000); |             packet = Math.min(size, 5000); | ||||||
|         } else { |         } else { | ||||||
|             packet = Math.min(size, 50); |             packet = Math.min(size, 50); | ||||||
|         } |         } | ||||||
|         final int amount = size / packet; |         final int amount = size / packet; | ||||||
|  |          | ||||||
|  |         try { | ||||||
|  |             int count = 0; | ||||||
|  |             PreparedStatement preparedStmt = null; | ||||||
|  |             String statement = null; | ||||||
|  |             int last = -1; | ||||||
|             for (int j = 0; j <= amount; j++) { |             for (int j = 0; j <= amount; j++) { | ||||||
|                 final List<T> subList = objList.subList(j * packet, Math.min(size, (j + 1) * packet)); |                 final List<T> subList = objList.subList(j * packet, Math.min(size, (j + 1) * packet)); | ||||||
|                 if (subList.size() == 0) { |                 if (subList.size() == 0) { | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|             String statement = mod.getCreateMySQL(subList.size()); |                 if (last == -1) { | ||||||
|             PreparedStatement stmt = null; |                     last = subList.size(); | ||||||
|             try { |                     statement = mod.getCreateMySQL(subList.size()); | ||||||
|                 stmt = this.connection.prepareStatement(statement.toString()); |                     preparedStmt = this.connection.prepareStatement(statement.toString()); | ||||||
|  |                 } | ||||||
|  |                 if (subList.size() != last || (count % 5000 == 0 && count > 0)) { | ||||||
|  |                     preparedStmt.executeBatch(); | ||||||
|  |                     preparedStmt.close(); | ||||||
|  |                      | ||||||
|  |                     statement = mod.getCreateMySQL(subList.size()); | ||||||
|  |                     preparedStmt = this.connection.prepareStatement(statement.toString()); | ||||||
|  |                 } | ||||||
|                 for (int i = 0; i < subList.size(); i++) { |                 for (int i = 0; i < subList.size(); i++) { | ||||||
|  |                     count++; | ||||||
|                     final T obj = subList.get(i); |                     final T obj = subList.get(i); | ||||||
|                     mod.setMySQL(stmt,i , obj); |                     mod.setMySQL(preparedStmt, i , obj); | ||||||
|                 } |                 } | ||||||
|                 stmt.executeUpdate(); |                 last = subList.size(); | ||||||
|                 stmt.close(); |                 preparedStmt.addBatch(); | ||||||
|             } catch (final Exception e) { |             } | ||||||
|  |             PlotSquared.log("&aSuccess 1: " + count + " | " + objList.get(0).getClass().getCanonicalName()); | ||||||
|  |             preparedStmt.executeBatch(); | ||||||
|  |             preparedStmt.clearParameters(); | ||||||
|  |             preparedStmt.close(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         catch (Exception e) { | ||||||
|  |             if (Settings.DB.USE_MYSQL) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 PlotSquared.log("&cERROR 1: " + " | " + objList.get(0).getClass().getCanonicalName()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|         try { |         try { | ||||||
|                 	String unionstmt = mod.getCreateSQLite(subList.size()); |             int count = 0; | ||||||
|                     stmt = this.connection.prepareStatement(unionstmt.toString()); |             PreparedStatement preparedStmt = null; | ||||||
|  |             String statement = null; | ||||||
|  |             int last = -1; | ||||||
|  |             for (int j = 0; j <= amount; j++) { | ||||||
|  |                 final List<T> subList = objList.subList(j * packet, Math.min(size, (j + 1) * packet)); | ||||||
|  |                 if (subList.size() == 0) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 if (last == -1) { | ||||||
|  |                     last = subList.size(); | ||||||
|  |                     statement = mod.getCreateSQLite(subList.size()); | ||||||
|  |                     preparedStmt = this.connection.prepareStatement(statement.toString()); | ||||||
|  |                 } | ||||||
|  |                 if (subList.size() != last || (count % 5000 == 0 && count > 0)) { | ||||||
|  |                     preparedStmt.executeBatch(); | ||||||
|  |                     preparedStmt.close(); | ||||||
|  |                      | ||||||
|  |                     statement = mod.getCreateSQLite(subList.size()); | ||||||
|  |                     preparedStmt = this.connection.prepareStatement(statement.toString()); | ||||||
|  |                 } | ||||||
|                 for (int i = 0; i < subList.size(); i++) { |                 for (int i = 0; i < subList.size(); i++) { | ||||||
|                     	mod.setSQLite(stmt, i, subList.get(i)); |                     count++; | ||||||
|  |                     final T obj = subList.get(i); | ||||||
|  |                     mod.setSQLite(preparedStmt, i , obj); | ||||||
|                 } |                 } | ||||||
|                     stmt.executeUpdate(); |                 last = subList.size(); | ||||||
|                     stmt.close(); |                 preparedStmt.addBatch(); | ||||||
|             } |             } | ||||||
|                 catch (Exception e2) { |             PlotSquared.log("&aSuccess 2: " + count + " | " + objList.get(0).getClass().getCanonicalName()); | ||||||
|                     e2.printStackTrace(); |             preparedStmt.executeBatch(); | ||||||
|  |             preparedStmt.clearParameters(); | ||||||
|  |             preparedStmt.close(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         catch (Exception e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |             PlotSquared.log("&cERROR 2: " + " | " + objList.get(0).getClass().getCanonicalName()); | ||||||
|  |         } | ||||||
|  |          | ||||||
|         PlotSquared.log("&6[WARN] " + "Could not bulk save!"); |         PlotSquared.log("&6[WARN] " + "Could not bulk save!"); | ||||||
|         try { |         try { | ||||||
|                         for (final T obj : subList) {    |             PreparedStatement preparedStmt = null; | ||||||
|  |             String nonBulk = mod.getCreateSQL(); | ||||||
|  |             preparedStmt = this.connection.prepareStatement(nonBulk.toString()); | ||||||
|  |             for (final T obj : objList) {    | ||||||
|                 try { |                 try { | ||||||
|                                 stmt = connection.prepareStatement(mod.getCreateSQL()); |                     mod.setSQL(preparedStmt, obj); | ||||||
|                                 mod.setSQL(stmt, obj); |                     preparedStmt.addBatch(); | ||||||
|                                 stmt.executeUpdate(); |  | ||||||
|                                 stmt.close(); |  | ||||||
|                 } catch (final Exception e3) { |                 } catch (final Exception e3) { | ||||||
|                     PlotSquared.log("&c[ERROR] " + "Failed to save " + obj + "!"); |                     PlotSquared.log("&c[ERROR] " + "Failed to save " + obj + "!"); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|                     } catch (final Exception e4) { |             PlotSquared.log("&aSuccess 3"); | ||||||
|                         e4.printStackTrace(); |             preparedStmt.executeBatch(); | ||||||
|  |             preparedStmt.close(); | ||||||
|  |         } | ||||||
|  |         catch (Exception e3) { | ||||||
|  |             e3.printStackTrace(); | ||||||
|             PlotSquared.log("&c[ERROR] " + "Failed to save all!"); |             PlotSquared.log("&c[ERROR] " + "Failed to save all!"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     public void createSettings(final ArrayList<SettingsPair> myList) { |     public void createSettings(final ArrayList<SettingsPair> myList) { | ||||||
|         final StmtMod<SettingsPair> mod = new StmtMod<SettingsPair>() { |         final StmtMod<SettingsPair> mod = new StmtMod<SettingsPair>() { | ||||||
|             @Override |             @Override | ||||||
|             public String getCreateMySQL(int size) { |             public String getCreateMySQL(int size) { | ||||||
|                 return getCreateMySQL(size, CREATE_SETTINGS, 10); |                 return getCreateMySQL(size, "INSERT INTO `" + prefix + "plot_settings`(`plot_plot_id`,`biome`,`rain`,`custom_time`,`time`,`deny_entry`,`alias`,`flags`,`merged`,`position`) VALUES ", 10); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
| @@ -397,7 +457,6 @@ public class SQLManager implements AbstractDB { | |||||||
|             @Override |             @Override | ||||||
|             public String getCreateSQL() { |             public String getCreateSQL() { | ||||||
|                 return "INSERT INTO `" + SQLManager.this.prefix + "plot_settings`(`plot_plot_id`) VALUES(?)"; |                 return "INSERT INTO `" + SQLManager.this.prefix + "plot_settings`(`plot_plot_id`) VALUES(?)"; | ||||||
| //                return "INSERT INTO `" + SQLManager.this.prefix + "plot_settings`(`plot_plot_id`,`biome`,`rain`,`custom_time`,`time`,`deny_entry`,`alias`,`flags`,`merged`,`position`) VALUES(?,?,?,?,?,?,?,?,?,?)"; |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|   | |||||||
| @@ -11,9 +11,9 @@ public abstract class StmtMod<T> { | |||||||
| 	public String getCreateMySQL(int size, String query, int params) { | 	public String getCreateMySQL(int size, String query, int params) { | ||||||
| 		final StringBuilder statement = new StringBuilder(query); | 		final StringBuilder statement = new StringBuilder(query); | ||||||
|         for (int i = 0; i < size - 1; i++) { |         for (int i = 0; i < size - 1; i++) { | ||||||
|             statement.append(StringUtils.repeat("(?),", params)); |             statement.append("(" + StringUtils.repeat(",(?)", params).substring(1) + "),"); | ||||||
|         } |         } | ||||||
|         statement.append(StringUtils.repeat(",(?)", params).substring(1)); |         statement.append("(" + StringUtils.repeat(",(?)", params).substring(1) + ")"); | ||||||
|         return statement.toString(); |         return statement.toString(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|   | |||||||
| @@ -180,6 +180,19 @@ public class FlagManager { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     public static boolean addPlotFlagAbs(final Plot plot, final Flag flag) { | ||||||
|  |         final boolean result = EventUtil.manager.callFlagAdd(flag, plot); | ||||||
|  |         if (!result) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         final Flag hasFlag = getPlotFlag(plot, flag.getKey()); | ||||||
|  |         if (hasFlag != null) { | ||||||
|  |             plot.settings.flags.remove(hasFlag); | ||||||
|  |         } | ||||||
|  |         plot.settings.flags.add(flag); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static boolean addClusterFlag(final PlotCluster cluster, final Flag flag) { |     public static boolean addClusterFlag(final PlotCluster cluster, final Flag flag) { | ||||||
|         //TODO plot cluster flag event |         //TODO plot cluster flag event | ||||||
|         final Flag hasFlag = getSettingFlag(cluster.world, cluster.settings, flag.getKey()); |         final Flag hasFlag = getSettingFlag(cluster.world, cluster.settings, flag.getKey()); | ||||||
|   | |||||||
| @@ -25,7 +25,9 @@ import java.util.UUID; | |||||||
|  |  | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.ChatColor; | import org.bukkit.ChatColor; | ||||||
|  | import org.bukkit.Effect; | ||||||
| import org.bukkit.GameMode; | import org.bukkit.GameMode; | ||||||
|  | import org.bukkit.Material; | ||||||
| import org.bukkit.WeatherType; | import org.bukkit.WeatherType; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| @@ -65,12 +67,16 @@ public class PlotListener extends APlotListener { | |||||||
|         return name; |         return name; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private WeatherType getWeatherType(String str) { |     private void setWeather(Player player, String str) { | ||||||
|         str = str.toLowerCase(); |         switch (str.toLowerCase()) { | ||||||
|         if (str.equals("rain")) { |             case "clear": { | ||||||
|             return WeatherType.DOWNFALL; |                 player.setPlayerWeather(WeatherType.CLEAR); | ||||||
|         } else { |                 return; | ||||||
|             return WeatherType.CLEAR; |             } | ||||||
|  |             case "rain": { | ||||||
|  |                 player.setPlayerWeather(WeatherType.DOWNFALL); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -109,7 +115,7 @@ public class PlotListener extends APlotListener { | |||||||
|             } |             } | ||||||
|             final Flag weatherFlag = FlagManager.getPlotFlag(plot, "weather"); |             final Flag weatherFlag = FlagManager.getPlotFlag(plot, "weather"); | ||||||
|             if (weatherFlag != null) { |             if (weatherFlag != null) { | ||||||
|                 player.setPlayerWeather(getWeatherType(weatherFlag.getValueString())); |                 setWeather(player, weatherFlag.getValueString()); | ||||||
|             } |             } | ||||||
|             if ((FlagManager.isBooleanFlag(plot, "titles", Settings.TITLES)) && (C.TITLE_ENTERED_PLOT.s().length() > 2)) { |             if ((FlagManager.isBooleanFlag(plot, "titles", Settings.TITLES)) && (C.TITLE_ENTERED_PLOT.s().length() > 2)) { | ||||||
|                 Flag greetingFlag = FlagManager.getPlotFlag(plot, "greeting"); |                 Flag greetingFlag = FlagManager.getPlotFlag(plot, "greeting"); | ||||||
| @@ -130,6 +136,14 @@ public class PlotListener extends APlotListener { | |||||||
|                 final PlayerEnterPlotEvent callEvent = new PlayerEnterPlotEvent(player, plot); |                 final PlayerEnterPlotEvent callEvent = new PlayerEnterPlotEvent(player, plot); | ||||||
|                 Bukkit.getPluginManager().callEvent(callEvent); |                 Bukkit.getPluginManager().callEvent(callEvent); | ||||||
|             } |             } | ||||||
|  |             Flag musicFlag = FlagManager.getPlotFlag(plot, "music"); | ||||||
|  |             if (musicFlag != null) { | ||||||
|  |                 player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); | ||||||
|  |                 Integer id = (Integer) musicFlag.getValue(); | ||||||
|  |                 if (id != 0) { | ||||||
|  |                     player.playEffect(player.getLocation(), Effect.RECORD_PLAY, Material.getMaterial(id)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|             CommentManager.sendTitle(pp, plot); |             CommentManager.sendTitle(pp, plot); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -150,6 +164,9 @@ public class PlotListener extends APlotListener { | |||||||
|         if (FlagManager.getPlotFlag(plot, "weather") != null) { |         if (FlagManager.getPlotFlag(plot, "weather") != null) { | ||||||
|             player.resetPlayerWeather(); |             player.resetPlayerWeather(); | ||||||
|         } |         } | ||||||
|  |         if (FlagManager.getPlotFlag(plot, "music") != null) { | ||||||
|  |             player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean getFlagValue(final String value) { |     public boolean getFlagValue(final String value) { | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ import org.bukkit.plugin.java.JavaPlugin; | |||||||
| import com.intellectualcrafters.plot.config.C; | import com.intellectualcrafters.plot.config.C; | ||||||
| import com.intellectualcrafters.plot.events.PlayerEnterPlotEvent; | import com.intellectualcrafters.plot.events.PlayerEnterPlotEvent; | ||||||
| import com.intellectualcrafters.plot.events.PlayerLeavePlotEvent; | import com.intellectualcrafters.plot.events.PlayerLeavePlotEvent; | ||||||
|  | import com.intellectualcrafters.plot.flag.Flag; | ||||||
| import com.intellectualcrafters.plot.flag.FlagManager; | import com.intellectualcrafters.plot.flag.FlagManager; | ||||||
| import com.intellectualcrafters.plot.object.Plot; | import com.intellectualcrafters.plot.object.Plot; | ||||||
| import com.intellectualcrafters.plot.object.PlotHandler; | import com.intellectualcrafters.plot.object.PlotHandler; | ||||||
| @@ -143,9 +144,13 @@ public class PlotPlusListener extends PlotListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (meta != null) { |         if (meta != null) { | ||||||
|  |             int id = meta.getMaterial().getId(); | ||||||
|  |             FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("music"), id)); | ||||||
|  |             player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); | ||||||
|             for (final Player p : plotPlayers) { |             for (final Player p : plotPlayers) { | ||||||
|                 p.playEffect(p.getLocation(), Effect.RECORD_PLAY, meta.getMaterial()); |                 player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); | ||||||
|                 MainUtil.sendMessage(pp, C.RECORD_PLAY.s().replaceAll("%player", player.getName()).replaceAll("%name", meta.toString())); |                 player.playEffect(player.getLocation(), Effect.RECORD_PLAY, id); | ||||||
|  |                 APlotListener.manager.plotEntry(BukkitUtil.getPlayer(p), plot); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -144,4 +144,9 @@ public class BukkitPlayer implements PlotPlayer { | |||||||
|             this.meta.remove(key); |             this.meta.remove(key); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return getName(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 boy0001
					boy0001