It started on work with commands then I got carried away.

This commit is contained in:
MattBDev 2019-07-25 14:44:10 -04:00
parent 01c371df9c
commit ff5860113d
184 changed files with 1694 additions and 2580 deletions

View File

@ -5,7 +5,6 @@ import com.boydti.fawe.IFawe;
import com.boydti.fawe.beta.implementation.QueueHandler;
import com.boydti.fawe.bukkit.beta.BukkitQueue;
import com.boydti.fawe.bukkit.beta.BukkitQueueHandler;
import com.boydti.fawe.bukkit.chat.BukkitChatManager;
import com.boydti.fawe.bukkit.listener.BrushListener;
import com.boydti.fawe.bukkit.listener.BukkitImageListener;
import com.boydti.fawe.bukkit.listener.CFIPacketListener;
@ -97,11 +96,6 @@ public class FaweBukkit implements IFawe, Listener {
if (Bukkit.getVersion().contains("git-Paper") && Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) {
new RenderListener(plugin);
}
try {
Fawe.get().setChatManager(new BukkitChatManager());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
} catch (final Throwable e) {
e.printStackTrace();
Bukkit.getServer().shutdown();

View File

@ -1,64 +0,0 @@
package com.boydti.fawe.bukkit.chat;
import com.boydti.fawe.bukkit.BukkitPlayer;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.util.chat.ChatManager;
import com.boydti.fawe.util.chat.Message;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
public class BukkitChatManager implements ChatManager<FancyMessage> {
@Override
public FancyMessage builder() {
return new FancyMessage("");
}
@Override
public void color(Message message, String color) {
message.$(this).color(ChatColor.getByChar(BBC.color(color).substring(1)));
}
@Override
public void tooltip(Message message, Message... tooltips) {
List<FancyMessage> lines = new ArrayList<>();
for (Message tooltip : tooltips) {
lines.add(tooltip.$(this));
}
message.$(this).formattedTooltip(lines);
}
@Override
public void command(Message message, String command) {
message.$(this).command(command);
}
@Override
public void text(Message message, String text) {
message.$(this).color(BBC.color(text));
}
@Override
public void send(Message Message, FawePlayer player) {
if (!(player instanceof BukkitPlayer)) {
player.sendMessage(Message.$(this).toOldMessageFormat());
} else {
Message.$(this).send(((BukkitPlayer) player).parent);
}
}
@Override
public void suggest(Message Message, String command) {
Message.$(this).suggest(command);
}
@Override
public void link(Message Message, String url) {
Message.$(this).link(url);
}
}

View File

@ -1,874 +0,0 @@
package com.boydti.fawe.bukkit.chat;
import static com.boydti.fawe.bukkit.chat.TextualComponent.rawText;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* Represents a formattable message. Such messages can use elements such as colors, formatting
* codes, hover and click data, and other features provided by the vanilla Minecraft <a
* href="http://minecraft.gamepedia.com/Tellraw#Raw_JSON_Text">JSON message formatter</a>. This
* class allows plugins to emulate the functionality of the vanilla Minecraft <a
* href="http://minecraft.gamepedia.com/Commands#tellraw">tellraw command</a>.
* <p>
* This class follows the builder pattern, allowing for method chaining. It is set up such that
* invocations of property-setting methods will affect the current editing component, and a call to
* {@link #then()} or {@link #then(String)} will append a new editing component to the end of the
* message, optionally initializing it with text. Further property-setting method calls will affect
* that editing component.
* </p>
*/
public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<MessagePart>,
ConfigurationSerializable {
static {
ConfigurationSerialization.registerClass(FancyMessage.class);
}
private List<MessagePart> messageParts;
private int index;
private String jsonString;
private boolean dirty;
private static Constructor<?> nmsPacketPlayOutChatConstructor;
@Override
public FancyMessage clone() throws CloneNotSupportedException {
FancyMessage instance = (FancyMessage) super.clone();
instance.messageParts = new ArrayList<>(messageParts.size());
for (int i = 0; i < messageParts.size(); i++) {
instance.messageParts.add(i, messageParts.get(i).clone());
}
instance.index = index;
instance.dirty = false;
instance.jsonString = null;
return instance;
}
/**
* Creates a JSON message with text.
*
* @param firstPartText The existing text in the message.
*/
public FancyMessage(String firstPartText) {
this(rawText(firstPartText));
}
private FancyMessage(TextualComponent firstPartText) {
messageParts = new ArrayList<>();
messageParts.add(new MessagePart(firstPartText));
index = messageParts.size();
jsonString = null;
dirty = false;
if (nmsPacketPlayOutChatConstructor == null) {
try {
nmsPacketPlayOutChatConstructor = Reflection.getNMSClass("PacketPlayOutChat")
.getDeclaredConstructor(Reflection.getNMSClass("IChatBaseComponent"));
nmsPacketPlayOutChatConstructor.setAccessible(true);
} catch (NoSuchMethodException e) {
Bukkit.getLogger()
.log(Level.SEVERE, "Could not find Minecraft method or constructor.", e);
} catch (SecurityException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not access constructor.", e);
}
}
}
/**
* Creates a JSON message without text.
*/
public FancyMessage() {
this((TextualComponent) null);
}
/**
* Sets the text of the current editing component to a value.
*
* @param text The new text of the current editing component.
* @return This builder instance.
*/
public FancyMessage text(String text) {
MessagePart latest = latest();
latest.text = rawText(text);
dirty = true;
return this;
}
/**
* Sets the text of the current editing component to a value.
*
* @param text The new text of the current editing component.
* @return This builder instance.
*/
public FancyMessage text(TextualComponent text) {
MessagePart latest = latest();
latest.text = text;
dirty = true;
return this;
}
/**
* @param text Text with coloring
* @return This builder instance.
* @throws IllegalArgumentException If the specified {@code ChatColor} enumeration value is not
* a color (but a format value).
*/
public FancyMessage color(String text) {
index = messageParts.size();
boolean color = false;
ArrayDeque<ChatColor> colors = new ArrayDeque<>();
int last = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (color != (color = false)) {
ChatColor chatColor = ChatColor.getByChar(c);
if (chatColor != null) {
if (i - last > 1) {
append(text.substring(last, i - 1));
colors.forEach(this::color);
colors.clear();
}
colors.add(chatColor);
last = i + 1;
}
}
if (c == '\u00A7') {
color = true;
}
}
if (text.length() - last > 0) {
append(text.substring(last));
colors.forEach(this::color);
}
index++;
return this;
}
/**
* Sets the color of the current editing component to a value.<br /> Setting the color will
* clear current styles
*
* @param color The new color of the current editing component.
* @return This builder instance.
* @throws IllegalArgumentException If the specified {@code ChatColor} enumeration value is not
* a color (but a format value).
*/
public FancyMessage color(ChatColor color) {
if (!color.isColor()) {
if (color.isFormat()) {
return style(color);
}
if (color == ChatColor.RESET) {
color = ChatColor.WHITE;
}
} else {
latest().styles.clear();
}
latest().color = color;
dirty = true;
return this;
}
/**
* Sets the stylization of the current editing component.
*
* @param styles The array of styles to apply to the editing component.
* @return This builder instance.
* @throws IllegalArgumentException If any of the enumeration values in the array do not
* represent formatters.
*/
public FancyMessage style(ChatColor... styles) {
for (ChatColor style : styles) {
if (!style.isFormat()) {
color(style);
}
}
latest().styles.addAll(Arrays.asList(styles));
dirty = true;
return this;
}
/**
* Set the behavior of the current editing component to instruct the client to open a file on
* the client side filesystem when the currently edited part of the {@code FancyMessage} is
* clicked.
*
* @param path The path of the file on the client filesystem.
* @return This builder instance.
*/
public FancyMessage file(String path) {
onClick("open_file", path);
return this;
}
/**
* Set the behavior of the current editing component to instruct the client to open a webpage in
* the client's web browser when the currently edited part of the {@code FancyMessage} is
* clicked.
*
* @param url The URL of the page to open when the link is clicked.
* @return This builder instance.
*/
public FancyMessage link(String url) {
onClick("open_url", url);
return this;
}
/**
* Set the behavior of the current editing component to instruct the client to replace the chat
* input box content with the specified string when the currently edited part of the {@code
* FancyMessage} is clicked. The client will not immediately send the command to the server to
* be executed unless the client player submits the command/chat message, usually with the enter
* key.
*
* @param command The text to display in the chat bar of the client.
* @return This builder instance.
*/
public FancyMessage suggest(String command) {
onClick("suggest_command", command);
return this;
}
/**
* Set the behavior of the current editing component to instruct the client to append the chat
* input box content with the specified string when the currently edited part of the {@code
* FancyMessage} is SHIFT-CLICKED. The client will not immediately send the command to the
* server to be executed unless the client player submits the command/chat message, usually with
* the enter key.
*
* @param command The text to append to the chat bar of the client.
* @return This builder instance.
*/
public FancyMessage insert(String command) {
onCurrent(m -> m.insertionData = command);
dirty = true;
return this;
}
/**
* Set the behavior of the current editing component to instruct the client to send the
* specified string to the server as a chat message when the currently edited part of the {@code
* FancyMessage} is clicked. The client <b>will</b> immediately send the command to the server
* to be executed when the editing component is clicked.
*
* @param command The text to display in the chat bar of the client.
* @return This builder instance.
*/
public FancyMessage command(String command) {
onClick("run_command", command);
return this;
}
/**
* Set the behavior of the current editing component to display raw text when the client hovers
* over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param text The text, which supports newlines, which will be displayed to the client upon
* hovering.
* @return This builder instance.
*/
public FancyMessage tooltip(String text) {
onHover("show_text", new JsonString(text));
return this;
}
/**
* Set the behavior of the current editing component to display raw text when the client hovers
* over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param lines The lines of text which will be displayed to the client upon hovering. The
* iteration order of this object will be the order in which the lines of the
* tooltip are created.
* @return This builder instance.
*/
public FancyMessage tooltip(Iterable<String> lines) {
tooltip(ArrayWrapper.toArray(lines, String.class));
return this;
}
/**
* Set the behavior of the current editing component to display raw text when the client hovers
* over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param lines The lines of text which will be displayed to the client upon hovering.
* @return This builder instance.
*/
public FancyMessage tooltip(String... lines) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < lines.length; i++) {
builder.append(lines[i]);
if (i != lines.length - 1) {
builder.append('\n');
}
}
tooltip(builder.toString());
return this;
}
/**
* Set the behavior of the current editing component to display formatted text when the client
* hovers over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param text The formatted text which will be displayed to the client upon hovering.
* @return This builder instance.
*/
public FancyMessage formattedTooltip(FancyMessage text) {
for (MessagePart component : text.messageParts) {
if (component.clickActionData != null && component.clickActionName != null) {
throw new IllegalArgumentException("The tooltip text cannot have click data.");
} else if (component.hoverActionData != null && component.hoverActionName != null) {
throw new IllegalArgumentException("The tooltip text cannot have a tooltip.");
}
}
onHover("show_text", text);
return this;
}
/**
* Set the behavior of the current editing component to display the specified lines of formatted
* text when the client hovers over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param lines The lines of formatted text which will be displayed to the client upon
* hovering.
* @return This builder instance.
*/
public FancyMessage formattedTooltip(FancyMessage... lines) {
if (lines.length < 1) {
onHover(null, null); // Clear tooltip
return this;
}
FancyMessage result = new FancyMessage();
result.messageParts
.clear(); // Remove the one existing text component that exists by default, which destabilizes the object
for (int i = 0; i < lines.length; i++) {
try {
for (MessagePart component : lines[i]) {
if (component.clickActionData != null && component.clickActionName != null) {
throw new IllegalArgumentException(
"The tooltip text cannot have click data.");
} else if (component.hoverActionData != null
&& component.hoverActionName != null) {
throw new IllegalArgumentException(
"The tooltip text cannot have a tooltip.");
}
if (component.hasText()) {
result.messageParts.add(component.clone());
result.index = result.messageParts.size();
}
}
if (i != lines.length - 1) {
result.messageParts.add(new MessagePart(rawText("\n")));
result.index = result.messageParts.size();
}
} catch (CloneNotSupportedException e) {
Bukkit.getLogger().log(Level.WARNING, "Failed to clone object", e);
return this;
}
}
return formattedTooltip(
result.messageParts.isEmpty() ? null : result); // Throws NPE if size is 0, intended
}
/**
* Set the behavior of the current editing component to display the specified lines of formatted
* text when the client hovers over the text.
* <p>Tooltips do not inherit display characteristics, such as color and styles, from the
* message component on which they are applied.</p>
*
* @param lines The lines of text which will be displayed to the client upon hovering. The
* iteration order of this object will be the order in which the lines of the
* tooltip are created.
* @return This builder instance.
*/
public FancyMessage formattedTooltip(Iterable<FancyMessage> lines) {
return formattedTooltip(ArrayWrapper.toArray(lines, FancyMessage.class));
}
/**
* If the text is a translatable key, and it has replaceable values, this function can be used
* to set the replacements that will be used in the message.
*
* @param replacements The replacements, in order, that will be used in the language-specific
* message.
* @return This builder instance.
*/
public FancyMessage translationReplacements(String... replacements) {
for (String str : replacements) {
latest().translationReplacements.add(new JsonString(str));
}
dirty = true;
return this;
}
/*
/**
* If the text is a translatable key, and it has replaceable values, this function can be used to set the replacements that will be used in the message.
* @param replacements The replacements, in order, that will be used in the language-specific message.
* @return This builder instance.
*/ /* ------------
public FancyMessage translationReplacements(final Iterable<? extends CharSequence> replacements){
for(CharSequence str : replacements){
latest().translationReplacements.add(new JsonString(str));
}
return this;
}
*/
/**
* If the text is a translatable key, and it has replaceable values, this function can be used
* to set the replacements that will be used in the message.
*
* @param replacements The replacements, in order, that will be used in the language-specific
* message.
* @return This builder instance.
*/
public FancyMessage translationReplacements(FancyMessage... replacements) {
Collections.addAll(latest().translationReplacements, replacements);
dirty = true;
return this;
}
/**
* If the text is a translatable key, and it has replaceable values, this function can be used
* to set the replacements that will be used in the message.
*
* @param replacements The replacements, in order, that will be used in the language-specific
* message.
* @return This builder instance.
*/
public FancyMessage translationReplacements(Iterable<FancyMessage> replacements) {
return translationReplacements(
ArrayWrapper.toArray(replacements, FancyMessage.class));
}
/**
* Terminate construction of the current editing component, and begin construction of a new
* message component. After a successful call to this method, all setter methods will refer to a
* new message component, created as a result of the call to this method.
*
* @param text The text which will populate the new message component.
* @return This builder instance.
*/
public FancyMessage then(String text) {
return then(rawText(text));
}
private FancyMessage append(String text) {
if (!latest().hasText()) {
throw new IllegalStateException("previous message part has no text");
}
MessagePart latest = latest();
messageParts.add(new MessagePart(rawText(text)));
latest().color = latest.color;
latest().styles.addAll(latest.styles);
dirty = true;
return this;
}
/**
* Terminate construction of the current editing component, and begin construction of a new
* message component. After a successful call to this method, all setter methods will refer to a
* new message component, created as a result of the call to this method.
*
* @param text The text which will populate the new message component.
* @return This builder instance.
*/
public FancyMessage then(TextualComponent text) {
if (!latest().hasText()) {
throw new IllegalStateException("previous message part has no text");
}
messageParts.add(new MessagePart(text));
index = messageParts.size();
dirty = true;
return this;
}
/**
* Terminate construction of the current editing component, and begin construction of a new
* message component. After a successful call to this method, all setter methods will refer to a
* new message component, created as a result of the call to this method.
*
* @return This builder instance.
*/
public FancyMessage then() {
if (!latest().hasText()) {
throw new IllegalStateException("previous message part has no text");
}
messageParts.add(new MessagePart());
index = messageParts.size();
dirty = true;
return this;
}
@Override
public void writeJson(JsonWriter writer) throws IOException {
if (messageParts.size() == 1) {
latest().writeJson(writer);
} else {
writer.beginObject().name("text").value("").name("extra").beginArray();
for (MessagePart part : this) {
part.writeJson(writer);
}
writer.endArray().endObject();
}
}
/**
* Serialize this fancy message, converting it into syntactically-valid JSON using a {@link
* JsonWriter}. This JSON should be compatible with vanilla formatter commands such as {@code
* /tellraw}.
*
* @return The JSON string representing this object.
*/
public String toJSONString() {
if (!dirty && jsonString != null) {
return jsonString;
}
StringWriter string = new StringWriter();
JsonWriter json = new JsonWriter(string);
try {
writeJson(json);
json.close();
} catch (IOException e) {
throw new RuntimeException("invalid message");
}
jsonString = string.toString();
dirty = false;
return jsonString;
}
/**
* Sends this message to a player. The player will receive the fully-fledged formatted display
* of this message.
*
* @param player The player who will receive the message.
*/
public void send(Player player) {
send(player, toJSONString());
}
private void send(CommandSender sender, String jsonString) {
if (!(sender instanceof Player)) {
sender.sendMessage(toOldMessageFormat());
return;
}
Player player = (Player) sender;
try {
Object handle = Reflection.getHandle(player);
Object connection = Reflection.getField(handle.getClass(), "playerConnection")
.get(handle);
Reflection
.getMethod(connection.getClass(), "sendPacket", Reflection.getNMSClass("Packet"))
.invoke(connection, createChatPacket(jsonString));
} catch (IllegalArgumentException e) {
Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
} catch (IllegalAccessException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
} catch (InstantiationException e) {
Bukkit.getLogger().log(Level.WARNING, "Underlying class is abstract.", e);
} catch (InvocationTargetException e) {
Bukkit.getLogger()
.log(Level.WARNING, "A error has occurred during invoking of method.", e);
} catch (NoSuchMethodException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not find method.", e);
} catch (ClassNotFoundException e) {
Bukkit.getLogger().log(Level.WARNING, "Could not find class.", e);
}
}
// The ChatSerializer's instance of Gson
private static Object nmsChatSerializerGsonInstance;
private static Method fromJsonMethod;
private Object createChatPacket(String json)
throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
if (nmsChatSerializerGsonInstance == null) {
// Find the field and its value, completely bypassing obfuscation
Class<?> chatSerializerClazz;
// Get the three parts of the version string (major version is currently unused)
// vX_Y_RZ
// X = major
// Y = minor
// Z = revision
final String version = Reflection.getVersion();
String[] split = version.substring(1, version.length() - 1)
.split("_"); // Remove trailing dot
//int majorVersion = Integer.parseInt(split[0]);
int minorVersion = Integer.parseInt(split[1]);
int revisionVersion = Integer.parseInt(split[2].substring(1)); // Substring to ignore R
if (minorVersion < 8 || minorVersion == 8 && revisionVersion == 1) {
chatSerializerClazz = Reflection.getNMSClass("ChatSerializer");
} else {
chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer");
}
if (chatSerializerClazz == null) {
throw new ClassNotFoundException("Can't find the ChatSerializer class");
}
for (Field declaredField : chatSerializerClazz.getDeclaredFields()) {
if (Modifier.isFinal(declaredField.getModifiers()) && Modifier
.isStatic(declaredField.getModifiers()) && declaredField.getType().getName()
.endsWith("Gson")) {
// We've found our field
declaredField.setAccessible(true);
nmsChatSerializerGsonInstance = declaredField.get(null);
fromJsonMethod = nmsChatSerializerGsonInstance.getClass()
.getMethod("fromJson", String.class, Class.class);
break;
}
}
}
// Since the method is so simple, and all the obfuscated methods have the same name, it's easier to reimplement 'IChatBaseComponent a(String)' than to reflectively call it
// Of course, the implementation may change, but fuzzy matches might break with signature changes
Object serializedChatComponent = fromJsonMethod.invoke(nmsChatSerializerGsonInstance, json,
Reflection.getNMSClass("IChatBaseComponent"));
return nmsPacketPlayOutChatConstructor.newInstance(serializedChatComponent);
}
/**
* Sends this message to a command sender. If the sender is a player, they will receive the
* fully-fledged formatted display of this message. Otherwise, they will receive a version of
* this message with less formatting.
*
* @param sender The command sender who will receive the message.
* @see #toOldMessageFormat()
*/
public void send(CommandSender sender) {
send(sender, toJSONString());
}
/**
* Sends this message to multiple command senders.
*
* @param senders The command senders who will receive the message.
* @see #send(CommandSender)
*/
public void send(Iterable<? extends CommandSender> senders) {
String string = toJSONString();
for (CommandSender sender : senders) {
send(sender, string);
}
}
/**
* Convert this message to a human-readable string with limited formatting. This method is used
* to send this message to clients without JSON formatting support.
* <p>
* Serialization of this message by using this message will include (in this order for each
* message part):
* <ol>
* <li>The color of each message part.</li>
* <li>The applicable stylizations for each message part.</li>
* <li>The core text of the message part.</li>
* </ol>
* The primary omissions are tooltips and clickable actions. Consequently, this method should be used only as a last resort.
* </p>
* <p>
* Color and formatting can be removed from the returned string by using {@link ChatColor#stripColor(String)}.</p>
*
* @return A human-readable string representing limited formatting in addition to the core text
* of this message.
*/
public String toOldMessageFormat() {
StringBuilder result = new StringBuilder();
for (MessagePart part : this) {
result.append(part.color == null ? "" : part.color);
for (ChatColor formatSpecifier : part.styles) {
result.append(formatSpecifier);
}
result.append(part.text);
}
return result.toString();
}
private void onCurrent(Consumer<MessagePart> call) {
for (int i = index - 1; i < messageParts.size(); i++) {
call.accept(messageParts.get(i));
}
}
private MessagePart latest() {
return messageParts.get(messageParts.size() - 1);
}
private void onClick(String name, String data) {
onCurrent(m -> {
m.clickActionName = name;
m.clickActionData = data;
});
dirty = true;
}
private void onHover(String name, JsonRepresentedObject data) {
onCurrent(m -> {
m.hoverActionName = name;
m.hoverActionData = data;
});
dirty = true;
}
// Doc copied from interface
@Override
public Map<String, Object> serialize() {
HashMap<String, Object> map = new HashMap<>();
map.put("messageParts", messageParts);
// map.put("JSON", toJSONString());
return map;
}
/**
* Deserializes a JSON-represented message from a mapping of key-value pairs. This is called by
* the Bukkit serialization API. It is not intended for direct public API consumption.
*
* @param serialized The key-value mapping which represents a fancy message.
*/
@SuppressWarnings("unchecked")
public static FancyMessage deserialize(Map<String, Object> serialized) {
FancyMessage msg = new FancyMessage();
msg.messageParts = (List<MessagePart>) serialized.get("messageParts");
msg.jsonString = serialized.containsKey("JSON") ? serialized.get("JSON").toString() : null;
msg.dirty = !serialized.containsKey("JSON");
return msg;
}
/**
* <b>Internally called method. Not for API consumption.</b>
*/
@Override
@NotNull
public Iterator<MessagePart> iterator() {
return messageParts.iterator();
}
private static JsonParser _stringParser = new JsonParser();
/**
* Deserializes a fancy message from its JSON representation. This JSON representation is of the
* format of that returned by {@link #toJSONString()}, and is compatible with vanilla inputs.
*
* @param json The JSON string which represents a fancy message.
* @return A {@code FancyMessage} representing the parameterized JSON message.
*/
public static FancyMessage deserialize(String json) {
JsonObject serialized = _stringParser.parse(json).getAsJsonObject();
JsonArray extra = serialized.getAsJsonArray("extra"); // Get the extra component
FancyMessage returnVal = new FancyMessage();
returnVal.messageParts.clear();
for (JsonElement mPrt : extra) {
MessagePart component = new MessagePart();
JsonObject messagePart = mPrt.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : messagePart.entrySet()) {
// Deserialize text
if (TextualComponent.isTextKey(entry.getKey())) {
// The map mimics the YAML serialization, which has a "key" field and one or more "value" fields
Map<String, Object> serializedMapForm = new HashMap<>(); // Must be object due to Bukkit serializer API compliance
serializedMapForm.put("key", entry.getKey());
if (entry.getValue().isJsonPrimitive()) {
// Assume string
serializedMapForm.put("value", entry.getValue().getAsString());
} else {
// Composite object, but we assume each element is a string
for (Map.Entry<String, JsonElement> compositeNestedElement : entry
.getValue().getAsJsonObject().entrySet()) {
serializedMapForm.put("value." + compositeNestedElement.getKey(),
compositeNestedElement.getValue().getAsString());
}
}
component.text = TextualComponent.deserialize(serializedMapForm);
} else if (MessagePart.stylesToNames.inverse().containsKey(entry.getKey())) {
if (entry.getValue().getAsBoolean()) {
component.styles
.add(MessagePart.stylesToNames.inverse().get(entry.getKey()));
}
} else if (entry.getKey().equals("color")) {
component.color = ChatColor.valueOf(entry.getValue().getAsString().toUpperCase());
} else if (entry.getKey().equals("clickEvent")) {
JsonObject object = entry.getValue().getAsJsonObject();
component.clickActionName = object.get("action").getAsString();
component.clickActionData = object.get("value").getAsString();
} else if (entry.getKey().equals("hoverEvent")) {
JsonObject object = entry.getValue().getAsJsonObject();
component.hoverActionName = object.get("action").getAsString();
if (object.get("value").isJsonPrimitive()) {
// Assume string
component.hoverActionData = new JsonString(
object.get("value").getAsString());
} else {
// Assume composite type
// The only composite type we currently store is another FancyMessage
// Therefore, recursion time!
component.hoverActionData = deserialize(object.get("value")
.toString() /* This should properly serialize the JSON object as a JSON string */);
}
} else if (entry.getKey().equals("insertion")) {
component.insertionData = entry.getValue().getAsString();
} else if (entry.getKey().equals("with")) {
for (JsonElement object : entry.getValue().getAsJsonArray()) {
if (object.isJsonPrimitive()) {
component.translationReplacements
.add(new JsonString(object.getAsString()));
} else {
// Only composite type stored in this array is - again - FancyMessages
// Recurse within this function to parse this as a translation replacement
component.translationReplacements.add(deserialize(object.toString()));
}
}
}
}
returnVal.messageParts.add(component);
returnVal.index = returnVal.messageParts.size();
}
return returnVal;
}
}

View File

@ -1,156 +0,0 @@
package com.boydti.fawe.bukkit.chat;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
/**
* Internal class: Represents a component of a JSON-serializable {@link FancyMessage}.
*/
final class MessagePart implements JsonRepresentedObject, ConfigurationSerializable, Cloneable {
ChatColor color = ChatColor.WHITE;
ArrayList<ChatColor> styles = new ArrayList<>();
String clickActionName = null;
String clickActionData = null;
String hoverActionName = null;
JsonRepresentedObject hoverActionData = null;
TextualComponent text = null;
String insertionData = null;
ArrayList<JsonRepresentedObject> translationReplacements = new ArrayList<>();
MessagePart(final TextualComponent text) {
this.text = text;
}
MessagePart() {
this.text = null;
}
boolean hasText() {
return text != null;
}
@Override
@SuppressWarnings("unchecked")
public MessagePart clone() throws CloneNotSupportedException {
MessagePart obj = (MessagePart) super.clone();
obj.styles = (ArrayList<ChatColor>) styles.clone();
if (hoverActionData instanceof JsonString) {
obj.hoverActionData = new JsonString(((JsonString) hoverActionData).getValue());
} else if (hoverActionData instanceof FancyMessage) {
obj.hoverActionData = ((FancyMessage) hoverActionData).clone();
}
obj.translationReplacements = (ArrayList<JsonRepresentedObject>) translationReplacements.clone();
return obj;
}
static final BiMap<ChatColor, String> stylesToNames;
static {
ImmutableBiMap.Builder<ChatColor, String> builder = ImmutableBiMap.builder();
for (final ChatColor style : ChatColor.values()) {
if (!style.isFormat()) {
continue;
}
String styleName;
switch (style) {
case MAGIC:
styleName = "obfuscated";
break;
case UNDERLINE:
styleName = "underlined";
break;
default:
styleName = style.name().toLowerCase();
break;
}
builder.put(style, styleName);
}
stylesToNames = builder.build();
}
public void writeJson(JsonWriter json) {
try {
json.beginObject();
text.writeJson(json);
json.name("color").value(color.name().toLowerCase());
for (final ChatColor style : styles) {
json.name(stylesToNames.get(style)).value(true);
}
if (clickActionName != null && clickActionData != null) {
json.name("clickEvent")
.beginObject()
.name("action").value(clickActionName)
.name("value").value(clickActionData)
.endObject();
}
if (hoverActionName != null && hoverActionData != null) {
json.name("hoverEvent")
.beginObject()
.name("action").value(hoverActionName)
.name("value");
hoverActionData.writeJson(json);
json.endObject();
}
if (insertionData != null) {
json.name("insertion").value(insertionData);
}
if (translationReplacements.size() > 0 && text != null && TextualComponent.isTranslatableText(text)) {
json.name("with").beginArray();
for (JsonRepresentedObject obj : translationReplacements) {
obj.writeJson(json);
}
json.endArray();
}
json.endObject();
} catch (IOException e) {
Bukkit.getLogger().log(Level.WARNING, "A problem occured during writing of JSON string", e);
}
}
public Map<String, Object> serialize() {
HashMap<String, Object> map = new HashMap<>();
map.put("text", text);
map.put("styles", styles);
map.put("color", color.getChar());
map.put("hoverActionName", hoverActionName);
map.put("hoverActionData", hoverActionData);
map.put("clickActionName", clickActionName);
map.put("clickActionData", clickActionData);
map.put("insertion", insertionData);
map.put("translationReplacements", translationReplacements);
return map;
}
@SuppressWarnings("unchecked")
public static MessagePart deserialize(Map<String, Object> serialized) {
MessagePart part = new MessagePart((TextualComponent) serialized.get("text"));
part.styles = (ArrayList<ChatColor>) serialized.get("styles");
part.color = ChatColor.getByChar(serialized.get("color").toString());
part.hoverActionName = (String) serialized.get("hoverActionName");
part.hoverActionData = (JsonRepresentedObject) serialized.get("hoverActionData");
part.clickActionName = (String) serialized.get("clickActionName");
part.clickActionData = (String) serialized.get("clickActionData");
part.insertionData = (String) serialized.get("insertion");
part.translationReplacements = (ArrayList<JsonRepresentedObject>) serialized.get("translationReplacements");
return part;
}
static {
ConfigurationSerialization.registerClass(MessagePart.class);
}
}

View File

@ -26,7 +26,9 @@ import com.sk89q.worldedit.event.platform.Interaction;
import com.sk89q.worldedit.extension.platform.PlatformManager;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.util.formatting.text.TextComponent.Builder;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.List;
import com.sk89q.worldedit.world.block.BlockStateHolder;
@ -59,7 +61,7 @@ public class CFIPacketListener implements Listener {
// Direct digging to the virtual world
registerBlockEvent(PacketType.Play.Client.BLOCK_DIG, false, new RunnableVal3<PacketEvent, VirtualWorld, BlockVector3>() {
@Override
public void run(PacketEvent event, VirtualWorld gen, BlockVector3 pt) {
public void run(Builder event, URI gen, String pt) {
try {
Player plr = event.getPlayer();
BlockVector3 realPos = pt.add(gen.getOrigin().toBlockPoint());
@ -75,7 +77,7 @@ public class CFIPacketListener implements Listener {
// Direct placing to the virtual world
RunnableVal3<PacketEvent, VirtualWorld, BlockVector3> placeTask = new RunnableVal3<PacketEvent, VirtualWorld, BlockVector3>() {
@Override
public void run(PacketEvent event, VirtualWorld gen, BlockVector3 pt) {
public void run(Builder event, URI gen, String pt) {
try {
Player plr = event.getPlayer();
List<EnumWrappers.Hand> hands = event.getPacket().getHands().getValues();
@ -112,7 +114,7 @@ public class CFIPacketListener implements Listener {
// Cancel block change packets where the real world overlaps with the virtual one
registerBlockEvent(PacketType.Play.Server.BLOCK_CHANGE, false, new RunnableVal3<PacketEvent, VirtualWorld, BlockVector3>() {
@Override
public void run(PacketEvent event, VirtualWorld gen, BlockVector3 pt) {
public void run(Builder event, URI gen, String pt) {
// Do nothing
}
});

View File

@ -3,7 +3,7 @@ package com.boydti.fawe.bukkit.regions;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.util.Perm;
import com.boydti.fawe.util.Permission;
import com.massivecraft.factions.FLocation;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import org.bukkit.Chunk;
@ -30,7 +30,8 @@ public class FactionsOneFeature extends BukkitMaskManager implements Listener {
public FaweMask getMask(final FawePlayer<Player> fp, MaskType type) {
final Player player = fp.parent;
final Chunk chunk = player.getLocation().getChunk();
final boolean perm = Perm.hasPermission(FawePlayer.wrap(player), "fawe.factions.wilderness");
final boolean perm = Permission
.hasPermission(fp.toWorldEditPlayer(), "fawe.factions.wilderness");
final World world = player.getWorld();
RegionWrapper locs = new RegionWrapper(chunk.getX(), chunk.getX(), chunk.getZ(), chunk.getZ());
@ -40,7 +41,7 @@ public class FactionsOneFeature extends BukkitMaskManager implements Listener {
if (this.isAdded(locs, world, player, perm, type)) {
boolean hasPerm = true;
while (hasPerm && (count > 0)) {
while (hasPerm && count > 0) {
count--;
hasPerm = false;

View File

@ -4,7 +4,7 @@ import com.boydti.fawe.bukkit.FaweBukkit;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.util.Perm;
import com.boydti.fawe.util.Permission;
import com.massivecraft.factions.Board;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.Faction;
@ -28,7 +28,8 @@ public class FactionsUUIDFeature extends BukkitMaskManager implements Listener {
public FaweMask getMask(final FawePlayer<Player> fp, MaskType type) {
final Player player = fp.parent;
final Chunk chunk = player.getLocation().getChunk();
final boolean perm = Perm.hasPermission(FawePlayer.wrap(player), "fawe.factions.wilderness");
final boolean perm = Permission
.hasPermission(fp.toWorldEditPlayer(), "fawe.factions.wilderness");
final World world = player.getWorld();
RegionWrapper locs = new RegionWrapper(chunk.getX(), chunk.getX(), chunk.getZ(), chunk.getZ());
@ -38,7 +39,7 @@ public class FactionsUUIDFeature extends BukkitMaskManager implements Listener {
if (this.isAdded(locs, world, player, perm, type)) {
boolean hasPerm = true;
while (hasPerm && (count > 0)) {
while (hasPerm && count > 0) {
count--;
hasPerm = false;

View File

@ -1,15 +1,15 @@
package com.boydti.fawe.bukkit.wrapper.state;
import com.boydti.fawe.bukkit.chat.FancyMessage;
import com.boydti.fawe.bukkit.wrapper.AsyncBlock;
import com.boydti.fawe.bukkit.wrapper.AsyncBlockState;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer;
import com.sk89q.worldedit.util.formatting.text.serializer.legacy.LegacyComponentSerializer;
import java.util.Map;
import net.minecraft.server.v1_14_R1.TileEntitySign;
import org.bukkit.DyeColor;
import org.bukkit.block.Sign;
import org.bukkit.persistence.PersistentDataContainer;
@ -37,18 +37,18 @@ public class AsyncSign extends AsyncBlockState implements Sign {
private String fromJson(String jsonInput) {
if (jsonInput == null || jsonInput.isEmpty()) return "";
return FancyMessage.deserialize(jsonInput).toOldMessageFormat();
return GsonComponentSerializer.INSTANCE.deserialize(jsonInput).toString();
}
private String toJson(String oldInput) {
if (oldInput == null || oldInput.isEmpty()) return "";
return new FancyMessage("").color(oldInput).toJSONString();
return LegacyComponentSerializer.INSTANCE.serialize(TextComponent.of(oldInput));
}
@Override
public String getLine(int index) throws IndexOutOfBoundsException {
CompoundTag nbt = getNbtData();
return nbt == null ? null : fromJson(nbt.getString("Text" + (index + 1)));
return nbt == null ? "" : fromJson(nbt.getString("Text" + (index + 1)));
}
@Override
@ -80,7 +80,7 @@ public class AsyncSign extends AsyncBlockState implements Sign {
CompoundTag nbt = getNbtData();
if (nbt != null) {
String color = nbt.getString("Color").toUpperCase();
if (color != null) return DyeColor.valueOf(color);
return DyeColor.valueOf(color);
}
return DyeColor.BLACK;
}

View File

@ -7,27 +7,39 @@ import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.brush.visualization.VisualQueue;
import com.boydti.fawe.regions.general.plot.PlotSquaredFeature;
import com.boydti.fawe.util.*;
import com.boydti.fawe.util.chat.ChatManager;
import com.boydti.fawe.util.chat.PlainChatManager;
import com.boydti.fawe.util.CachedTextureUtil;
import com.boydti.fawe.util.CleanTextureUtil;
import com.boydti.fawe.util.FaweTimer;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.MemUtil;
import com.boydti.fawe.util.RandomTextureUtil;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.util.TextureUtil;
import com.boydti.fawe.util.WEManager;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.factory.DefaultTransformParser;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.session.request.Request;
import javax.annotation.Nullable;
import javax.management.InstanceAlreadyExistsException;
import javax.management.NotificationEmitter;
import java.io.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.util.*;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.annotation.Nullable;
import javax.management.InstanceAlreadyExistsException;
import javax.management.NotificationEmitter;
/**
* [ WorldEdit action]
@ -80,7 +92,6 @@ public class Fawe {
private VisualQueue visualQueue;
private TextureUtil textures;
private DefaultTransformParser transformParser;
private ChatManager chatManager = new PlainChatManager();
private QueueHandler queueHandler;
@ -202,15 +213,6 @@ public class Fawe {
return queueHandler;
}
public ChatManager getChatManager() {
return chatManager;
}
public void setChatManager(ChatManager chatManager) {
checkNotNull(chatManager);
this.chatManager = chatManager;
}
public DefaultTransformParser getTransformParser() {
return transformParser;
}

View File

@ -16,8 +16,10 @@ import java.util.UUID;
* Interface for setting blocks
*/
public interface IChunkSet extends IBlocks, OutputExtent {
@Override
boolean setBiome(int x, int y, int z, BiomeType biome);
@Override
boolean setBlock(int x, int y, int z, BlockStateHolder holder);
boolean isEmpty();

View File

@ -59,11 +59,13 @@ public interface IQueueExtent extends Flushable, Trimable, Extent {
*/
<T extends Future<T>> T submit(IChunk<T> chunk);
@Override
default boolean setBlock(final int x, final int y, final int z, final BlockStateHolder state) {
final IChunk chunk = getCachedChunk(x >> 4, z >> 4);
return chunk.setBlock(x & 15, y, z & 15, state);
}
@Override
default boolean setBiome(final int x, final int y, final int z, final BiomeType biome) {
final IChunk chunk = getCachedChunk(x >> 4, z >> 4);
return chunk.setBiome(x & 15, y, z & 15, biome);
@ -127,4 +129,4 @@ public interface IQueueExtent extends Flushable, Trimable, Extent {
boolean isEmpty();
void sendChunk(int chunkX, int chunkZ, int bitMask);
}
}

View File

@ -47,6 +47,7 @@ import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TextComponent.Builder;
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent;
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BlockStateHolder;
@ -354,7 +355,7 @@ public class CFICommands {
floor(fp, BlockTypes.SNOW.getDefaultState().with(PropertyKey.LAYERS, 7), image, mask, disableWhiteOnly);
main(fp, BlockTypes.SNOW_BLOCK, image, mask, disableWhiteOnly);
smooth(fp, 1, 8, image, mask, disableWhiteOnly);
TextComponent.of("Added snow!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Added snow!"));
assertSettings(fp).resetComponent();
component(fp);
}
@ -383,17 +384,28 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void paletteblocks(FawePlayer fp, Player player, LocalSession session, @Arg(name = "arg", desc = "String", def = "") String arg) throws EmptyClipboardException, InputParseException, FileNotFoundException {
if (arg == null) {
TextComponent.of("What blocks do you want to color with?").append(newline())
.text("[All]").cmdTip(alias() + " PaletteBlocks *").text(" - All available blocks")
.append(newline())
.text("[Clipboard]").cmdTip(alias() + " PaletteBlocks #clipboard").text(" - The blocks in your clipboard")
.append(newline())
.text("[List]").suggestTip(alias() + " PaletteBlocks stone,gravel").text(" - A comma separated list of blocks")
.append(newline())
.text("[Complexity]").cmdTip(alias() + " Complexity").text(" - Block textures within a complexity range")
.append(newline())
.text("< [Back]").cmdTip(alias() + " " + Commands.getAlias(CFICommands.class, "coloring"))
.send(fp);
TextComponent build = TextComponent.builder("What blocks do you want to color with?")
.append(newline())
.append(TextComponent.of("[All]")
.clickEvent(ClickEvent.runCommand("/cfi PaletteBlocks *")))
.append(" - All available blocks")
.append(newline())
.append(TextComponent.of("[Clipboard]")
.clickEvent(ClickEvent.runCommand("/cfi PaletteBlocks #clipboard")))
.append(" - The blocks in your clipboard")
.append(newline())
.append(TextComponent.of("[List]")
.clickEvent(ClickEvent.runCommand("/cfi PaletteBlocks stone,gravel")))
.append(" - A comma separated list of blocks")
.append(newline())
.append(TextComponent.of("[Complexity]")
.clickEvent(ClickEvent.runCommand("/cfi Complexity")))
.append(" - Block textures within a complexity range")
.append(newline())
.append(TextComponent.of("< [Back]").clickEvent(ClickEvent
.runCommand("/cfi " + Commands.getAlias(CFICommands.class, "coloring"))))
.build();
fp.toWorldEditPlayer().print(build);
return;
}
HeightMapMCAGenerator generator = assertSettings(fp).getGenerator();
@ -505,7 +517,7 @@ public class CFICommands {
} else {
gen.addSchems(load(imageMask), mask, multi.getHolders(), rarity, distance, rotate);
}
TextComponent.of("Added schematics!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Added schematics!"));
populate(fp);
}
@ -527,7 +539,7 @@ public class CFICommands {
} else {
gen.setBiome(biome);
}
TextComponent.of("Set biome!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set biome!"));
assertSettings(fp).resetComponent();
component(fp);
}
@ -539,7 +551,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void caves(FawePlayer fp) throws WorldEditException {
assertSettings(fp).getGenerator().addCaves();
TextComponent.of("Added caves!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Added caves!"));
populate(fp);
}
@ -580,7 +592,6 @@ public class CFICommands {
gen.setHeights(Integer.parseInt(arg));
}
fp.toWorldEditPlayer().print("Set Height!");
TextComponent.of("Set height!").send(fp);
component(fp);
}
@ -592,7 +603,8 @@ public class CFICommands {
public void waterId(FawePlayer fp, BlockStateHolder block) throws WorldEditException {
CFISettings settings = assertSettings(fp);
settings.getGenerator().setWaterId(block.getBlockType().getInternalId());
TextComponent.of("Set water id!").send(fp);
fp.toWorldEditPlayer().print("Set water id!");
settings.resetComponent();
component(fp);
}
@ -606,7 +618,7 @@ public class CFICommands {
public void baseId(FawePlayer fp, BlockStateHolder block) throws WorldEditException {
CFISettings settings = assertSettings(fp);
settings.getGenerator().setBedrockId(block.getBlockType().getInternalId());
TextComponent.of("Set base id!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set base id!"));
settings.resetComponent();
component(fp);
}
@ -620,7 +632,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void worldthickness(FawePlayer fp, int height) throws WorldEditException {
assertSettings(fp).getGenerator().setWorldThickness(height);
TextComponent.of("Set world thickness!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set world thickness!"));
component(fp);
}
@ -633,7 +645,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void floorthickness(FawePlayer fp, int height) throws WorldEditException {
assertSettings(fp).getGenerator().setFloorThickness(height);
TextComponent.of("Set floor thickness!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set floor thickness!"));
component(fp);
}
@ -645,7 +657,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void update(FawePlayer fp) throws WorldEditException {
assertSettings(fp).getGenerator().update();
TextComponent.of("Chunks refreshed!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Chunks refreshed!"));
mainMenu(fp);
}
@ -657,7 +669,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void tp(FawePlayer fp) throws WorldEditException {
HeightMapMCAGenerator gen = assertSettings(fp).getGenerator();
TextComponent.of("Teleporting...").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Teleporting..."));
Vector3 origin = gen.getOrigin();
Player player = fp.getPlayer();
player.setPosition(origin.subtract(16, 0, 16));
@ -675,7 +687,7 @@ public class CFICommands {
@CommandPermissions("worldedit.anvil.cfi")
public void waterheight(FawePlayer fp, int height) throws WorldEditException {
assertSettings(fp).getGenerator().setWaterHeight(height);
TextComponent.of("Set water height!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set water height!"));
component(fp);
}
@ -689,7 +701,7 @@ public class CFICommands {
public void glass(FawePlayer fp, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(fp);
settings.getGenerator().setColorWithGlass(load(image));
TextComponent.of("Set color with glass!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set color with glass!"));
settings.resetColoring();
mainMenu(fp);
}
@ -714,7 +726,7 @@ public class CFICommands {
gen.setColor(load(image));
}
settings.resetColoring();
TextComponent.of("Set color with blocks!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set color with blocks!"));
mainMenu(fp);
}
@ -730,7 +742,7 @@ public class CFICommands {
public void blockbiome(FawePlayer fp, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(fp);
settings.getGenerator().setBlockAndBiomeColor(load(image), mask, load(imageMask), !disableWhiteOnly);
TextComponent.of("Set color with blocks and biomes!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set color with blocks and biomes!"));
settings.resetColoring();
mainMenu(fp);
}
@ -746,7 +758,7 @@ public class CFICommands {
public void biomecolor(FawePlayer fp, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(fp);
settings.getGenerator().setBiomeColor(load(image));
TextComponent.of("Set color with biomes!").send(fp);
fp.toWorldEditPlayer().print(TextComponent.of("Set color with biomes!"));
settings.resetColoring();
mainMenu(fp);
}
@ -811,13 +823,12 @@ public class CFICommands {
.append(newline());
if (settings.image != null) {
StringBuilder colorArgs = new StringBuilder();
colorArgs.append(" " + settings.imageArg);
StringBuilder colorArgs = new StringBuilder(" " + settings.imageArg);
if (settings.imageMask != null) {
colorArgs.append(" " + settings.imageMaskArg);
colorArgs.append(" ").append(settings.imageMaskArg);
}
if (settings.mask != null) {
colorArgs.append(" " + settings.maskArg);
colorArgs.append(" ").append(settings.maskArg);
}
if (!settings.whiteOnly) {
colorArgs.append(" -w");
@ -854,14 +865,26 @@ public class CFICommands {
settings.maskArg = mask != null ? split[index++] : null;
settings.whiteOnly = !disableWhiteOnly;
StringBuilder cmd = new StringBuilder(alias() + " mask ");
StringBuilder cmd = new StringBuilder("/cfi mask ");
TextComponent.of(">> Current Settings <<").append(newline())
.text("Image Mask ").text("[" + settings.imageMaskArg + "]").suggestTip(cmd + "http://")
String s = "/cfi mask http://";
String s1 = "/cfi mask <mask>";
String s2 = alias() + " " + settings.getCategory();
TextComponent build = TextComponent.builder(">> Current Settings <<")
.append(newline())
.text("WorldEdit Mask ").text("[" + settings.maskArg + "]").suggestTip(cmd + "<mask>")
.append("Image Mask ").append(
TextComponent.of("[" + settings.imageMaskArg + "]")
.hoverEvent(HoverEvent.showText(TextComponent.of(s)))
.clickEvent(ClickEvent.suggestCommand("/cfi mask http://")))
.append(newline())
.text("< [Back]").cmdTip(alias() + " " + settings.getCategory()).send(fp);
.append("WorldEdit Mask ").append(TextComponent.of("[" + settings.maskArg + "]")
.hoverEvent(HoverEvent.showText(TextComponent.of(s1)))
.clickEvent(ClickEvent.suggestCommand(s1)))
.append(newline())
.append(
TextComponent.of("< [Back]").hoverEvent(HoverEvent.showText(TextComponent.of(s2)))
.clickEvent(ClickEvent.runCommand(s2))).build();
fp.toWorldEditPlayer().print(build);
}
@Command(
@ -881,10 +904,17 @@ public class CFICommands {
if (pattern != null) {
settings.getCategory().accept(fp);
} else {
TextComponent.of(">> Current Settings <<").append(newline())
.text("Pattern ").text("[Click Here]").suggestTip(cmd + " stone")
.append(newline())
.text("< [Back]").cmdTip(alias() + " " + settings.getCategory()).send(fp);
String s = cmd + " stone";
String s1 = alias() + " " + settings.getCategory();
TextComponent build = TextComponent.builder(">> Current Settings <<").append(newline())
.append("Pattern ").append(TextComponent.of("[Click Here]")
.hoverEvent(HoverEvent.showText(TextComponent.of(s)))
.clickEvent(ClickEvent.suggestCommand(s)))
.append(newline())
.append(TextComponent.of("< [Back]")
.hoverEvent(HoverEvent.showText(TextComponent.of(s1)))
.clickEvent(ClickEvent.runCommand(s1))).build();
fp.toWorldEditPlayer().print(build);
}
}
@ -917,13 +947,12 @@ public class CFICommands {
settings.image = image;
settings.imageArg = image != null ? split[index++] : null;
StringBuilder cmd = new StringBuilder(alias() + " image ");
if (image == null) {
TextComponent build = TextComponent.builder("Please provide an image:")
.append(newline())
.append("From a URL: ").append("[Click Here]")//TODO .suggestTip(cmd + "http://")
.append("From a URL: ").append(TextComponent.of("[Click Here]").clickEvent(ClickEvent.suggestCommand("/cfi image http://")))
.append(newline())
.append("From a file: ").append("[Click Here]")//TODO .suggestTip(cmd + "file://")
.append("From a file: ").append(TextComponent.of("[Click Here]").clickEvent(ClickEvent.suggestCommand("/cfi image file://")))
.build();
fp.toWorldEditPlayer().print(build);
} else {
@ -994,50 +1023,76 @@ public class CFICommands {
String snow = Commands.getAlias(CFICommands.class, "snow");
//TODO
// Message msg = TextComponent.builder(">> Current Settings <<").append(newline())
// .append("Mask ").append("[" + mask + "]").cmdTip(alias() + " mask")
// .append(newline())
// .append("Pattern ").append("[" + pattern + "]").cmdTip(alias() + " pattern")
// .append(newline())
// .append(newline())
// .append(">> Components <<")
// .append(newline())
// .append("[Height]").suggestTip(alias() + " " + alias("height") + " 120").text(" - Terrain height for whole map")
// .append(newline())
// .text("[WaterHeight]").suggestTip(alias() + " " + alias("waterheight") + " 60").text(" - Sea level for whole map")
// .append(newline())
// .text("[FloorThickness]").suggestTip(alias() + " " + alias("floorthickness") + " 60").text(" - Floor thickness of entire map")
// .append(newline())
// .text("[WorldThickness]").suggestTip(alias() + " " + alias("worldthickness") + " 60").text(" - World thickness of entire map")
// .append(newline())
// .text("[Snow]").suggestTip(alias() + " " + alias("snow") + maskArgs).text(" - Set snow in the masked areas")
// .append(newline());
//
// if (pattern != null) {
// String disabled = "You must specify a pattern";
// msg
// .text("[&cWaterId]").tooltip(disabled).append(newline())
// .text("[&cBedrockId]").tooltip(disabled).append(newline())
// .text("[&cFloor]").tooltip(disabled).append(newline())
// .text("[&cMain]").tooltip(disabled).append(newline())
// .text("[&cColumn]").tooltip(disabled).append(newline())
// .text("[&cOverlay]").tooltip(disabled).append(newline());
// } else {
// StringBuilder compArgs = new StringBuilder();
// compArgs.append(" " + settings.patternArg + maskArgs);
//
// msg
// .text("[WaterId]").cmdTip(alias() + " waterId " + pattern).text(" - Water id for whole map").append(newline())
// .text("[BedrockId]").cmdTip(alias() + " baseId " + pattern).text(" - Bedrock id for whole map").append(newline())
// .text("[Floor]").cmdTip(alias() + " floor" + compArgs).text(" - Set the floor in the masked areas").append(newline())
// .text("[Main]").cmdTip(alias() + " main" + compArgs).text(" - Set the main block in the masked areas").append(newline())
// .text("[Column]").cmdTip(alias() + " column" + compArgs).text(" - Set the columns in the masked areas").append(newline())
// .text("[Overlay]").cmdTip(alias() + " overlay" + compArgs).text(" - Set the overlay in the masked areas").append(newline());
// }
//
// msg.append(newline())
// .text("< [Back]").cmdTip(alias())
// .send(fp);
@NonNull Builder msg = TextComponent.builder(">> Current Settings <<").append(newline())
.append("Mask ").append(TextComponent.of("[" + mask + "]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " mask")))
.clickEvent(ClickEvent.runCommand(alias() + " mask")))
.append(newline())
.append("Pattern ").append(TextComponent.of("[" + pattern + "]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " pattern")))
.clickEvent(ClickEvent.runCommand(alias() + " pattern")))
.append(newline())
.append(newline())
.append(">> Components <<")
.append(newline())
.append(TextComponent.of("[Height]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " " + alias("height") + " 120")))
.clickEvent(ClickEvent.suggestCommand(alias() + " " + alias("height") + " 120"))).append(" - Terrain height for whole map")
.append(newline())
.append(TextComponent.of("[WaterHeight]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " " + alias("waterheight") + " 60")))
.clickEvent(ClickEvent.suggestCommand(alias() + " " + alias("waterheight") + " 60"))).append(" - Sea level for whole map")
.append(newline())
.append(TextComponent.of("[FloorThickness]").hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " " + alias("floorthickness") + " 60")))
.clickEvent(ClickEvent.suggestCommand(alias() + " " + alias("floorthickness") + " 60"))).append(" - Floor thickness of entire map")
.append(newline())
.append(TextComponent.of("[WorldThickness]").hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " " + alias("worldthickness") + " 60")))
.clickEvent(ClickEvent.suggestCommand(alias() + " " + alias("worldthickness") + " 60"))).append(" - World thickness of entire map")
.append(newline())
.append(TextComponent.of("[Snow]").hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " " + alias("snow") + maskArgs)))
.clickEvent(ClickEvent.suggestCommand(alias() + " " + alias("snow") + maskArgs))).append(" - Set snow in the masked areas")
.append(newline());
if (pattern != null) {
String disabled = "You must specify a pattern";
msg.append(TextComponent.of("[&cWaterId]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline())
.append(TextComponent.of("[&cBedrockId]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[&cFloor]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[&cMain]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[&cColumn]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[&cOverlay]").hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline());
} else {
StringBuilder compArgs = new StringBuilder();
compArgs.append(" " + settings.patternArg + maskArgs);
msg
.append(TextComponent.of("[WaterId]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " waterId " + pattern)))
.clickEvent(ClickEvent.runCommand(alias() + " waterId " + pattern)))
.append(" - Water id for whole map")
.append(newline())
.append(TextComponent.of("[BedrockId]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " baseId " + pattern)))
.clickEvent(ClickEvent.runCommand(alias() + " baseId " + pattern)))
.append(TextComponent.of(" - Bedrock id for whole map"))
.append(newline())
.append(TextComponent.of("[Floor]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " floor " + compArgs)))
.clickEvent(ClickEvent.runCommand(alias() + " floor " + compArgs)))
.append(TextComponent.of(" - Set the floor in the masked areas")).append(newline())
.append(TextComponent.of("[Main]")
.hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " main " + compArgs)))
.clickEvent(ClickEvent.runCommand(alias() + " main " + compArgs)))
.append(TextComponent.of(" - Set the main block in the masked areas")).append(newline())
.append(TextComponent.of("[Column]").hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " column" + compArgs)))
.clickEvent(ClickEvent.runCommand(alias() + " column" + compArgs))).append(" - Set the columns in the masked areas").append(newline())
.append(TextComponent.of("[Overlay]").hoverEvent(HoverEvent.showText(TextComponent.of(alias() + " overlay" + compArgs)))
.clickEvent(ClickEvent.runCommand(alias() + " overlay" + compArgs))).append(" - Set the overlay in the masked areas").append(newline());
}
msg.append(newline())
.append(TextComponent.of("< [Back]").hoverEvent(HoverEvent.showText(TextComponent.of(alias()))).clickEvent(ClickEvent.runCommand(alias())));
fp.toWorldEditPlayer().print(msg.build());
}
private static CFISettings assertSettings(FawePlayer fp) {

View File

@ -10,7 +10,6 @@ import com.boydti.fawe.object.task.AsyncNotifyQueue;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.world.World;
import java.io.File;
import java.io.IOException;
@ -50,7 +49,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
this(FaweAPI.getWorld(world));
}
public RollbackDatabase(final World world) throws SQLException, ClassNotFoundException {
public RollbackDatabase(World world) throws SQLException, ClassNotFoundException {
this.prefix = "";
this.worldName = world.getName();
this.world = world;
@ -96,7 +95,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
}
}
public void delete(final UUID uuid, final int id) {
public void delete(UUID uuid, int id) {
addTask(new Runnable() {
@Override
public void run() {
@ -127,12 +126,13 @@ public class RollbackDatabase extends AsyncNotifyQueue {
});
}
public void getPotentialEdits(final UUID uuid, final long minTime, final BlockVector3 pos1, final BlockVector3 pos2, final RunnableVal<DiskStorageHistory> onEach, final Runnable whenDone, final boolean delete, final boolean ascending) {
public void getPotentialEdits(UUID uuid, long minTime, BlockVector3 pos1, BlockVector3 pos2, RunnableVal<DiskStorageHistory> onEach, Runnable whenDone, boolean delete, boolean ascending) {
final World world = FaweAPI.getWorld(this.worldName);
addTask(new Runnable() {
@Override
public void run() {
String stmtStr = ascending ? (uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC) : (uuid == null ? GET_EDITS : GET_EDITS_USER);
String stmtStr = ascending ? uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC :
uuid == null ? GET_EDITS : GET_EDITS_USER;
try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) {
stmt.setInt(1, pos1.getBlockX());
stmt.setInt(2, pos2.getBlockX());
@ -243,7 +243,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
}
commit();
return true;
} catch (final Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
return false;
@ -258,7 +258,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
connection.commit();
connection.setAutoCommit(true);
}
} catch (final SQLException e) {
} catch (SQLException e) {
e.printStackTrace();
}
}
@ -270,11 +270,11 @@ public class RollbackDatabase extends AsyncNotifyQueue {
if (!Fawe.imp().getDirectory().exists()) {
Fawe.imp().getDirectory().mkdirs();
}
if (!(dbLocation.exists())) {
if (!dbLocation.exists()) {
try {
dbLocation.getParentFile().mkdirs();
dbLocation.createNewFile();
} catch (final IOException e) {
} catch (IOException e) {
e.printStackTrace();
Fawe.debug("&cUnable to create database!");
}
@ -299,9 +299,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
if (connection == null) {
try {
forceConnection();
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final SQLException e) {
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@ -312,7 +310,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
* Closes the connection with the database
*
* @return true if successful
* @throws java.sql.SQLException if the connection cannot be closed
* @throws SQLException if the connection cannot be closed
*/
public boolean closeConnection() throws SQLException {
if (connection == null) {
@ -332,12 +330,12 @@ public class RollbackDatabase extends AsyncNotifyQueue {
* Checks if a connection is open with the database
*
* @return true if the connection is open
* @throws java.sql.SQLException if the connection cannot be checked
* @throws SQLException if the connection cannot be checked
*/
public boolean checkConnection() {
try {
return (connection != null) && !connection.isClosed();
} catch (final SQLException e) {
return connection != null && !connection.isClosed();
} catch (SQLException e) {
return false;
}
}

View File

@ -108,7 +108,7 @@ public abstract class FawePlayer<T> extends Metadatable {
}
@Deprecated
public FawePlayer(final T parent) {
public FawePlayer(T parent) {
this.parent = parent;
Fawe.get().register(this);
if (Settings.IMP.CLIPBOARD.USE_DISK) {
@ -247,7 +247,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* Queue an action to run async
* @param run
*/
public void queueAction(final Runnable run) {
public void queueAction(Runnable run) {
runAction(run, false, true);
}
@ -288,7 +288,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* @param async
* @return false if the task was ran or queued
*/
public boolean runAction(final Runnable ifFree, boolean checkFree, boolean async) {
public boolean runAction(Runnable ifFree, boolean checkFree, boolean async) {
if (checkFree) {
if (runningCount.get() != 0) return false;
}
@ -363,7 +363,7 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @param world
*/
public void loadSessionsFromDisk(final World world) {
public void loadSessionsFromDisk(World world) {
if (world == null) {
return;
}
@ -417,14 +417,14 @@ public abstract class FawePlayer<T> extends Metadatable {
* @param perm
* @return
*/
public abstract boolean hasPermission(final String perm);
public abstract boolean hasPermission(String perm);
/**
* Send a message to the player
*
* @param message
*/
public abstract void sendMessage(final String message);
public abstract void sendMessage(String message);
/**
* Print a WorldEdit error.
@ -438,7 +438,7 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @param substring
*/
public abstract void executeCommand(final String substring);
public abstract void executeCommand(String substring);
/**
* Get the player's location
@ -473,7 +473,7 @@ public abstract class FawePlayer<T> extends Metadatable {
public Region getSelection() {
try {
return this.getSession().getSelection(this.getPlayer().getWorld());
} catch (final IncompleteRegionException e) {
} catch (IncompleteRegionException e) {
return null;
}
}
@ -509,7 +509,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* @param region
*/
@Deprecated
public void setSelection(final RegionWrapper region) {
public void setSelection(RegionWrapper region) {
final Player player = this.getPlayer();
BlockVector3 top = region.getMaximumPoint();
top.withY(getWorld().getMaxY());
@ -539,7 +539,7 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @param selector
*/
public void setSelection(final RegionSelector selector) {
public void setSelection(RegionSelector selector) {
this.getSession().setRegionSelector(toWorldEditPlayer().getWorld(), selector);
}
@ -551,7 +551,7 @@ public abstract class FawePlayer<T> extends Metadatable {
public Region getLargestRegion() {
int area = 0;
Region max = null;
for (final Region region : this.getCurrentRegions()) {
for (Region region : this.getCurrentRegions()) {
final int tmp = region.getArea();
if (tmp > area) {
area = tmp;

View File

@ -5,7 +5,6 @@ import com.boydti.fawe.object.mask.SurfaceMask;
import com.boydti.fawe.object.pattern.BiomePattern;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
@ -52,7 +51,6 @@ public class SplatterBrush extends ScatterBrush {
}
return false;
}, vector -> editSession.setBlock(vector, finalPattern), recursion);
visitor.setMaxBranch(2);
visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS));
visitor.visit(position);
Operations.completeBlindly(visitor);

View File

@ -10,7 +10,6 @@ import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.command.tool.brush.Brush;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.function.RegionFunction;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.function.operation.Operations;
@ -21,7 +20,6 @@ import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.interpolation.Node;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class SplineBrush implements Brush, ResettableTool {
@ -50,7 +48,7 @@ public class SplineBrush implements Brush, ResettableTool {
}
@Override
public void build(EditSession editSession, final BlockVector3 position, Pattern pattern, double size) throws WorldEditException {
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws WorldEditException {
Mask mask = editSession.getMask();
if (mask == null) {
mask = new IdMask(editSession);
@ -70,12 +68,9 @@ public class SplineBrush implements Brush, ResettableTool {
}
final ArrayList<BlockVector3> points = new ArrayList<>();
if (size > 0) {
DFSRecursiveVisitor visitor = new DFSRecursiveVisitor(mask, new RegionFunction() {
@Override
public boolean apply(BlockVector3 p) {
points.add(p);
return true;
}
DFSRecursiveVisitor visitor = new DFSRecursiveVisitor(mask, p -> {
points.add(p);
return true;
}, (int) size, 1);
List<BlockVector3> directions = visitor.getDirections();
for (int x = -1; x <= 1; x++) {
@ -90,7 +85,7 @@ public class SplineBrush implements Brush, ResettableTool {
}
}
}
Collections.sort(directions, (o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq()));
directions.sort((o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq()));
visitor.visit(position);
Operations.completeBlindly(visitor);
if (points.size() > numSplines) {
@ -121,7 +116,7 @@ public class SplineBrush implements Brush, ResettableTool {
final List<Node> nodes = new ArrayList<>(centroids.size());
for (final Vector3 nodevector : centroids) {
for (Vector3 nodevector : centroids) {
final Node n = new Node(nodevector);
n.setTension(tension);
n.setBias(bias);
@ -133,7 +128,7 @@ public class SplineBrush implements Brush, ResettableTool {
List<BlockVector3> currentSpline = new ArrayList<>();
for (ArrayList<BlockVector3> points : positionSets) {
int listSize = points.size();
int index = (int) (i * listSize / (double) (numSplines));
int index = (int) (i * listSize / (double) numSplines);
currentSpline.add(points.get(index));
}
editSession.drawSpline(pattern, currentSpline, 0, 0, 0, 10, 0, true);
@ -161,12 +156,10 @@ public class SplineBrush implements Brush, ResettableTool {
private BlockVector3 normal(Collection<BlockVector3> points, BlockVector3 centroid) {
int n = points.size();
switch (n) {
case 1: {
case 1:
return null;
}
case 2: {
case 2:
return null;
}
}
// Calc full 3x3 covariance matrix, excluding symmetries:
@ -179,9 +172,9 @@ public class SplineBrush implements Brush, ResettableTool {
MutableVector3 r = new MutableVector3();
for (BlockVector3 p : points) {
r.mutX((p.getX() - centroid.getX()));
r.mutY((p.getY() - centroid.getY()));
r.mutZ((p.getZ() - centroid.getZ()));
r.mutX(p.getX() - centroid.getX());
r.mutY(p.getY() - centroid.getY());
r.mutZ(p.getZ() - centroid.getZ());
xx += r.getX() * r.getX();
xy += r.getX() * r.getY();
xz += r.getX() * r.getZ();
@ -214,7 +207,6 @@ public class SplineBrush implements Brush, ResettableTool {
double b = (xz * xy - yz * xx) / det_z;
dir = BlockVector3.at(a, b, 1.0);
}
;
return dir.normalize();
}
}

View File

@ -4,7 +4,6 @@ import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
@ -14,8 +13,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.weather.WeatherType;
import com.sk89q.worldedit.world.weather.WeatherTypes;
import javax.annotation.Nullable;
public abstract class ImmutableVirtualWorld implements VirtualWorld {
@ -34,12 +31,6 @@ public abstract class ImmutableVirtualWorld implements VirtualWorld {
return BiomeTypes.FOREST;
}
@Nullable
@Override
public Operation commit() {
return null;
}
@Override
public String getName() {
return Integer.toString(hashCode());
@ -90,16 +81,6 @@ public abstract class ImmutableVirtualWorld implements VirtualWorld {
unsupported();
}
@Override
public WeatherType getWeather() {
return WeatherTypes.CLEAR;
}
@Override
public long getRemainingWeatherDuration() {
return 0;
}
@Override
public void setWeather(WeatherType weatherType) {
unsupported();

View File

@ -17,11 +17,6 @@ import java.io.IOException;
public interface VirtualWorld extends SimpleWorld, Closeable {
Vector3 getOrigin();
@Override
default BaseBlock getFullBlock(BlockVector3 position) {
return getBlock(position).toBaseBlock();
}
@Override
default BaseBlock getFullBlock(int x, int y, int z) {
return getBlock(x, y, z).toBaseBlock();

View File

@ -6,7 +6,6 @@ import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.command.tool.BrushTool;
import com.sk89q.worldedit.command.tool.Tool;
import com.sk89q.worldedit.command.tool.brush.Brush;
import com.sk89q.worldedit.entity.Player;
public class VisualQueue extends SingleThreadIntervalQueue<FawePlayer> {
@ -17,7 +16,8 @@ public class VisualQueue extends SingleThreadIntervalQueue<FawePlayer> {
@Override
public void operate(FawePlayer fp) {
LocalSession session = fp.getSession();
LocalSession session = WorldEdit.getInstance().getSessionManager()
.get(fp.toWorldEditPlayer());
Player player = fp.getPlayer();
Tool tool = session.getTool(player);
if (tool instanceof BrushTool) {

View File

@ -1942,11 +1942,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
return false;
}
@Override
public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException {
return false;
}
@Override
public void dropItem(Vector3 position, BaseItemStack item) {
// TODO Auto-generated method stub
@ -1970,4 +1965,4 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
// TODO Auto-generated method stub
return null;
}
}
}

View File

@ -33,11 +33,6 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
super.addChangeTask(queue);
}
@Override
public boolean closeAsync() {
return super.closeAsync();
}
@Override
public boolean flush() {
return parent.flush();

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.object.clipboard;
import com.boydti.fawe.jnbt.NBTStreamer;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
@ -10,7 +9,6 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.List;
public class AbstractDelegateFaweClipboard extends FaweClipboard {

View File

@ -3,7 +3,6 @@ package com.boydti.fawe.object.clipboard;
import com.boydti.fawe.jnbt.NBTStreamer;
import com.boydti.fawe.object.IntegerTrio;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.Tag;
@ -16,7 +15,6 @@ import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@ -127,13 +125,14 @@ public class CPUOptimizedClipboard extends FaweClipboard {
return BlockVector3.at(width, height, length);
}
private int ylast;
private int ylasti;
private int zlast;
private int zlasti;
private int yLast;
private int yLastI;
private int zLast;
private int zLastI;
public int getIndex(int x, int y, int z) {
return x + ((ylast == y) ? ylasti : (ylasti = (ylast = y) * area)) + ((zlast == z) ? zlasti : (zlasti = (zlast = z) * width));
return x + ((yLast == y) ? yLastI : (yLastI = (yLast = y) * area)) + ((zLast == z) ? zLastI
: (zLastI = (zLast = z) * width));
}
@Override

View File

@ -9,9 +9,6 @@ import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.Extent;
@ -19,10 +16,12 @@ import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
@ -82,7 +81,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
area = width * length;
this.volume = length * width * height;
if ((braf.length() - HEADER_SIZE) == (volume << 2) + area) {
if (braf.length() - HEADER_SIZE == (volume << 2) + area) {
hasBiomes = true;
}
autoCloseTask();
@ -357,7 +356,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
}
@Override
public void forEach(final BlockReader task, boolean air) {
public void forEach(BlockReader task, boolean air) {
byteBuffer.force();
int pos = HEADER_SIZE;
IntegerTrio trio = new IntegerTrio();
@ -418,7 +417,8 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
}
public int getIndex(int x, int y, int z) {
return x + ((ylast == y) ? ylasti : (ylasti = (ylast = y) * area)) + ((zlast == z) ? zlasti : (zlasti = (zlast = z) * width));
return x + (ylast == y ? ylasti : (ylasti = (ylast = y) * area)) + (zlast == z
? zlasti : (zlasti = (zlast = z) * width));
}
@Override
@ -445,7 +445,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
@Override
public BaseBlock getBlock(int i) {
try {
int diskIndex = (HEADER_SIZE) + (i << 2);
int diskIndex = HEADER_SIZE + (i << 2);
int combinedId = byteBuffer.getInt(diskIndex);
BlockType type = BlockTypes.getFromStateId(combinedId);
BaseBlock base = type.withStateId(combinedId).toBaseBlock();
@ -464,7 +464,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
} else {
// x + z * width + y * area;
int y = i / area;
int newI = (i - (y * area));
int newI = i - y * area;
int z = newI / width;
int x = newI - z * width;
nbt = nbtMap.get(new IntegerTrio(x, y, z));
@ -494,7 +494,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
@Override
public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) {
try {
int index = (HEADER_SIZE) + ((getIndex(x, y, z) << 2));
int index = HEADER_SIZE + (getIndex(x, y, z) << 2);
int combined = block.getInternalId();
byteBuffer.putInt(index, combined);
boolean hasNbt = block instanceof BaseBlock && block.hasNbtData();
@ -512,12 +512,12 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
public <B extends BlockStateHolder<B>> boolean setBlock(int i, B block) {
try {
int combined = block.getInternalId();
int index = (HEADER_SIZE) + (i << 2);
int index = HEADER_SIZE + (i << 2);
byteBuffer.putInt(index, combined);
boolean hasNbt = block instanceof BaseBlock && block.hasNbtData();
if (hasNbt) {
int y = i / area;
int newI = (i - (y * area));
int newI = i - y * area;
int z = newI / width;
int x = newI - z * width;
setTile(x, y, z, block.getNbtData());

View File

@ -1,25 +1,17 @@
package com.boydti.fawe.object.clipboard;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
public class EmptyClipboard implements Clipboard {
public static final EmptyClipboard INSTANCE = new EmptyClipboard();
@ -56,22 +48,6 @@ public class EmptyClipboard implements Clipboard {
return BlockVector3.ZERO;
}
@Override
public List<? extends Entity> getEntities(Region region) {
return Collections.emptyList();
}
@Override
public List<? extends Entity> getEntities() {
return Collections.emptyList();
}
@Nullable
@Override
public Entity createEntity(Location location, BaseEntity entity) {
return null;
}
@Override
public BaseBlock getFullBlock(BlockVector3 position) {
return BlockTypes.AIR.getDefaultState().toBaseBlock();
@ -97,9 +73,4 @@ public class EmptyClipboard implements Clipboard {
return false;
}
@Nullable
@Override
public Operation commit() {
return null;
}
}

View File

@ -66,11 +66,11 @@ public abstract class FaweClipboard {
<B extends BlockStateHolder<B>> void run(int x, int y, int z, B block);
}
public abstract void streamBiomes(final NBTStreamer.ByteReader task);
public abstract void streamBiomes(NBTStreamer.ByteReader task);
public void streamCombinedIds(final NBTStreamer.ByteReader task) {
public void streamCombinedIds(NBTStreamer.ByteReader task) {
forEach(new BlockReader() {
private int index = 0;
private int index;
@Override
public <B extends BlockStateHolder<B>> void run(int x, int y, int z, B block) {

View File

@ -5,7 +5,6 @@ import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
import java.io.InputStream;
import java.net.URI;
import java.util.UUID;

View File

@ -5,27 +5,25 @@ import com.boydti.fawe.jnbt.NBTStreamer;
import com.boydti.fawe.object.IntegerTrio;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import net.jpountz.util.SafeUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import net.jpountz.util.SafeUtils;
public class MemoryOptimizedClipboard extends FaweClipboard {

View File

@ -1,15 +1,18 @@
package com.boydti.fawe.object.clipboard;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.session.ClipboardHolder;
import java.net.URI;
import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import static com.google.common.base.Preconditions.checkNotNull;
public class MultiClipboardHolder extends URIClipboardHolder {
private final List<URIClipboardHolder> holders;
private Clipboard[] cached;

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.object.clipboard;
import com.boydti.fawe.jnbt.NBTStreamer;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
@ -11,7 +10,6 @@ import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.List;
public abstract class ReadOnlyClipboard extends FaweClipboard {

View File

@ -4,15 +4,14 @@ import com.boydti.fawe.object.change.MutableBlockChange;
import com.boydti.fawe.object.change.MutableTileChange;
import com.boydti.fawe.object.changeset.MemoryOptimizedHistory;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.history.change.Change;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.Iterator;
public class ResizableClipboardBuilder extends MemoryOptimizedHistory {

View File

@ -1,14 +1,13 @@
package com.boydti.fawe.object.clipboard;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.session.ClipboardHolder;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
public class URIClipboardHolder extends ClipboardHolder {
private final URI uri;

View File

@ -2,8 +2,8 @@ package com.boydti.fawe.object.clipboard;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockTypes;
public class WorldCutClipboard extends WorldCopyClipboard {

View File

@ -5,9 +5,9 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.item.ItemTypes;
import java.io.File;

View File

@ -2,12 +2,10 @@ package com.boydti.fawe.object.clipboard.remap;
import com.boydti.fawe.util.MainUtil;
import com.google.common.io.Resources;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

View File

@ -2,9 +2,6 @@ package com.boydti.fawe.object.collection;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
@ -12,6 +9,7 @@ import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;
/**
* Adapt a collection to a set
@ -67,6 +65,7 @@ public class AdaptedSetCollection<T, V> implements Set<V> {
return adapted.toArray(a);
}
@Override
public boolean add(V v) {
return adapted.add(v);
}
@ -81,6 +80,7 @@ public class AdaptedSetCollection<T, V> implements Set<V> {
return adapted.containsAll(c);
}
@Override
public boolean addAll(@NotNull Collection<? extends V> c) {
return adapted.addAll(c);
}
@ -90,6 +90,7 @@ public class AdaptedSetCollection<T, V> implements Set<V> {
return adapted.removeAll(c);
}
@Override
public boolean removeIf(Predicate<? super V> filter) {
return adapted.removeIf(filter);
}
@ -129,6 +130,7 @@ public class AdaptedSetCollection<T, V> implements Set<V> {
return adapted.parallelStream();
}
@Override
public void forEach(Consumer<? super V> action) {
adapted.forEach(action);
}

View File

@ -4,9 +4,6 @@ import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.AbstractRegion;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.world.World;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
@ -34,6 +31,7 @@ public abstract class BlockSet extends AbstractRegion {
}
}
@Override
public boolean contains(BlockVector3 obj) {
return contains(obj.getX(), obj.getY(), obj.getZ());
}
@ -94,10 +92,15 @@ public abstract class BlockSet extends AbstractRegion {
public abstract void set(int x, int y, int z);
public abstract void clear(int x, int y, int z);
public abstract boolean remove(int x, int y, int z);
@Override
public abstract Iterator<BlockVector3> iterator();
@Override
public abstract Set<BlockVector2> getChunks();
@Override
public abstract Set<BlockVector3> getChunkCubes();
@Override
public abstract BlockVector3 getMaximumPoint();
@Override
public abstract BlockVector3 getMinimumPoint();
@Override

View File

@ -19,7 +19,6 @@ import java.util.*;
*/
public class BlockVectorSet extends AbstractCollection<BlockVector3> implements Set<BlockVector3> {
private Int2ObjectMap<LocalBlockVectorSet> localSets = new Int2ObjectOpenHashMap<>();
private MutableBlockVector3 mutable = new MutableBlockVector3();
@Override
public int size() {

View File

@ -4,10 +4,9 @@ import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.util.MemUtil;
import com.boydti.fawe.util.Perm;
import com.boydti.fawe.util.Permission;
import com.boydti.fawe.util.WEManager;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
@ -27,7 +26,7 @@ public class MemoryCheckingExtent extends AbstractDelegateExtent {
if (MemUtil.isMemoryLimited()) {
if (this.player != null) {
player.sendMessage(BBC.WORLDEDIT_CANCEL_REASON.format(BBC.WORLDEDIT_CANCEL_REASON_LOW_MEMORY.s()));
if (Perm.hasPermission(this.player, "worldedit.fast")) {
if (Permission.hasPermission(this.player.toWorldEditPlayer(), "worldedit.fast")) {
BBC.WORLDEDIT_OOM_ADMIN.send(this.player);
}
}

View File

@ -1,10 +1,8 @@
package com.boydti.fawe.object.extent;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.util.WEManager;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
@ -12,7 +10,6 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
@ -20,8 +17,6 @@ import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.List;
public class ProcessedWEExtent extends AbstractDelegateExtent {
private final FaweLimit limit;
private final AbstractDelegateExtent extent;
@ -48,21 +43,6 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
return super.createEntity(location, entity);
}
@Override
public BiomeType getBiome(final BlockVector2 position) {
return super.getBiome(position);
}
@Override
public List<? extends Entity> getEntities() {
return super.getEntities();
}
@Override
public List<? extends Entity> getEntities(final Region region) {
return super.getEntities(region);
}
@Override
public BlockState getBlock(int x, int y, int z) {
if (!limit.MAX_CHECKS()) {

View File

@ -36,7 +36,7 @@ public final class AsyncBufferedOutputStream extends FilterOutputStream {
}
/**
* Creates an asynchronous buffered output stream with defined buffersize and
* Creates an asynchronous buffered output stream with defined bufferSize and
* 5 maximal buffers.
*/
public AsyncBufferedOutputStream(OutputStream out, int bufSize) {
@ -46,7 +46,7 @@ public final class AsyncBufferedOutputStream extends FilterOutputStream {
/**
* Creates an asynchronous buffered output stream.
*
* @param out the outputstream to layer on.
* @param out the outputStream to layer on.
* @param bufSize the buffer size.
* @param maxBuffers the number of buffers to keep in parallel.
*/
@ -179,4 +179,4 @@ public final class AsyncBufferedOutputStream extends FilterOutputStream {
}
}
}
}

View File

@ -1,12 +1,9 @@
package com.github.luben.zstd;
import java.io.InputStream;
import com.github.luben.zstd.util.Native;
import java.io.FilterInputStream;
import java.io.IOException;
import java.lang.IndexOutOfBoundsException;
import com.github.luben.zstd.util.Native;
import com.github.luben.zstd.Zstd;
import java.io.InputStream;
/**
* InputStream filter that decompresses the data provided
@ -42,16 +39,13 @@ public class ZstdInputStream extends FilterInputStream {
private native int initDStream(long stream);
private native int decompressStream(long stream, byte[] dst, int dst_size, byte[] src, int src_size);
// The main constuctor / legacy version dispatcher
// The main constructor / legacy version dispatcher
public ZstdInputStream(InputStream inStream) throws IOException {
// FilterInputStream constructor
super(inStream);
// allocate input buffer with max frame header size
src = new byte[srcBuffSize];
if (src == null) {
throw new IOException("Error allocating the input buffer of size " + srcBuffSize);
}
stream = createDStream();
int size = initDStream(stream);
if (Zstd.isError(size)) {
@ -80,9 +74,9 @@ public class ZstdInputStream extends FilterInputStream {
throw new IOException("Stream closed");
}
// guard agains buffer overflows
// guard against buffer overflows
if (offset < 0 || len > dst.length - offset) {
throw new IndexOutOfBoundsException("Requested lenght " + len
throw new IndexOutOfBoundsException("Requested length " + len
+ " from offset " + offset + " in buffer of size " + dst.length);
}
int dstSize = offset + len;

View File

@ -4,7 +4,6 @@ import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import java.util.Arrays;
public class AngleMask extends SolidBlockMask implements ResettableMask {

View File

@ -3,11 +3,8 @@ package com.boydti.fawe.object.mask;
import com.boydti.fawe.object.extent.LightingExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class BlockLightMask extends AbstractExtentMask {
private final int min, max;

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.object.mask;
import com.boydti.fawe.object.extent.LightingExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.math.BlockVector3;

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.util.Set;
// TODO FIXME

View File

@ -2,11 +2,8 @@ package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class IdMask extends AbstractExtentMask implements ResettableMask {
private transient int id = -1;

View File

@ -3,11 +3,8 @@ package com.boydti.fawe.object.mask;
import com.boydti.fawe.object.extent.LightingExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class LightMask extends AbstractExtentMask {
private final int min, max;

View File

@ -33,6 +33,6 @@ public class MaskedTargetBlock extends TargetBlock {
}
}
Location currentBlock = getCurrentBlock();
return (currentBlock != null || !useLastBlock ? currentBlock : lastBlock);
return currentBlock != null || !useLastBlock ? currentBlock : lastBlock;
}
}
}

View File

@ -3,11 +3,8 @@ package com.boydti.fawe.object.mask;
import com.boydti.fawe.object.extent.LightingExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class OpacityMask extends AbstractExtentMask {
private final int min, max;

View File

@ -1,11 +1,8 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.function.mask.AbstractMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
/**
* Restricts the
*/

View File

@ -10,22 +10,25 @@ public class ROCAngleMask extends AngleMask {
@Override
protected boolean testSlope(int x, int y, int z) {
double slope, tmp;
boolean aboveMin;
double tmp;
lastY = y;
int base = getHeight(x, y, z);
slope = ((getHeight(x + distance, y, z) - base) - (base - getHeight(x - distance, y, z))) * ADJACENT_MOD;
double slope =
(getHeight(x + distance, y, z) - base - (base - getHeight(x - distance, y, z)))
* ADJACENT_MOD;
tmp = ((getHeight(x, y, z + distance) - base) - (base - getHeight(x, y, z - distance))) * ADJACENT_MOD;
tmp = (getHeight(x, y, z + distance) - base - (base - getHeight(x, y, z - distance))) * ADJACENT_MOD;
if (Math.abs(tmp) > Math.abs(slope)) slope = tmp;
tmp = ((getHeight(x + distance, y, z + distance) - base) - (base - getHeight(x - distance, y, z - distance))) * DIAGONAL_MOD;
tmp = (getHeight(x + distance, y, z + distance) - base - (base - getHeight(x - distance, y,
z - distance))) * DIAGONAL_MOD;
if (Math.abs(tmp) > Math.abs(slope)) slope = tmp;
tmp = ((getHeight(x - distance, y, z + distance) - base) - (base - getHeight(x + distance, y, z - distance))) * DIAGONAL_MOD;
tmp = (getHeight(x - distance, y, z + distance) - base - (base - getHeight(x + distance, y,
z - distance))) * DIAGONAL_MOD;
if (Math.abs(tmp) > Math.abs(slope)) slope = tmp;
return lastValue = (slope >= min && slope <= max);
return lastValue = slope >= min && slope <= max;
}
}
}

View File

@ -1,11 +1,8 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.function.mask.AbstractMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class RadiusMask extends AbstractMask implements ResettableMask {
private transient BlockVector3 pos;

View File

@ -2,7 +2,6 @@ package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.function.mask.AbstractMask;
import com.sk89q.worldedit.math.BlockVector3;
import java.util.SplittableRandom;
public class RandomMask extends AbstractMask implements ResettableMask {
@ -23,4 +22,4 @@ public class RandomMask extends AbstractMask implements ResettableMask {
public void reset() {
random = new SplittableRandom();
}
}
}

View File

@ -3,11 +3,8 @@ package com.boydti.fawe.object.mask;
import com.boydti.fawe.object.extent.LightingExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
public class SkyLightMask extends AbstractExtentMask {
private final int min, max;

View File

@ -1,13 +1,10 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import javax.annotation.Nullable;
/**
* Restricts the
*/

View File

@ -1,11 +1,8 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.function.mask.AbstractMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
/**
* Restricts the
*/

View File

@ -1,11 +1,8 @@
package com.boydti.fawe.object.mask;
import com.sk89q.worldedit.function.mask.AbstractMask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.math.BlockVector3;
import javax.annotation.Nullable;
/**
* Restricts the
*/

View File

@ -1,11 +1,10 @@
package com.boydti.fawe.object.pattern;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import static com.google.common.base.Preconditions.checkNotNull;
public abstract class AbstractExtentPattern extends AbstractPattern {
private transient final Extent extent;

View File

@ -1,13 +1,11 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.boydti.fawe.object.DataAnglePattern;
import com.boydti.fawe.util.TextureHolder;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
@ -69,4 +67,4 @@ public class AngleColorPattern extends DataAnglePattern {
if (newBlock == null) return false;
return set.setBlock(extent, newBlock.getDefaultState());
}
}
}

View File

@ -1,6 +1,5 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.util.TextureHolder;
import com.boydti.fawe.util.TextureUtil;
import com.sk89q.worldedit.WorldEditException;
@ -9,8 +8,6 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockType;
import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
public class AverageColorPattern extends AbstractExtentPattern {
private transient TextureHolder holder;

View File

@ -1,14 +1,10 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector2;
import com.sk89q.worldedit.world.biome.BiomeType;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
public class BiomePattern extends ExistingPattern {
private final BiomeType biome;

View File

@ -1,20 +1,15 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.FilterBlock;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.collection.LocalBlockVectorSet;
import com.boydti.fawe.util.FaweTimer;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.util.UUID;
public class BufferedPattern extends AbstractPattern implements ResettablePattern {

View File

@ -1,16 +1,13 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.DelegateFilterBlock;
import com.boydti.fawe.beta.FilterBlock;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import static com.google.common.base.Preconditions.checkNotNull;
public class DataPattern extends AbstractExtentPattern {
private final Pattern pattern;

View File

@ -1,6 +1,5 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.util.TextureHolder;
import com.boydti.fawe.util.TextureUtil;
import com.sk89q.worldedit.WorldEditException;
@ -9,8 +8,6 @@ import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockType;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DesaturatePattern extends AbstractPattern {
private final TextureHolder holder;
@ -40,8 +37,7 @@ public class DesaturatePattern extends AbstractPattern {
int red = (int) (r + value * (l - r));
int green = (int) (g + value * (l - g));
int blue = (int) (b + value * (l - b));
int newColor = (alpha << 24) + (red << 16) + (green << 8) + (blue << 0);
return newColor;
return (alpha << 24) + (red << 16) + (green << 8) + (blue << 0);
}
@Override

View File

@ -1,10 +1,9 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
public class ExistingPattern extends AbstractExtentPattern {
public ExistingPattern(Extent extent) {

View File

@ -1,20 +1,17 @@
package com.boydti.fawe.object.pattern;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.internal.expression.runtime.EvaluationException;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.io.IOException;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* A mask that evaluates an expression.
* <p>

View File

@ -1,8 +1,8 @@
package com.boydti.fawe.object.pattern;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
@ -10,13 +10,10 @@ import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.io.IOException;
import java.io.NotSerializableException;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* A pattern that reads from {@link Clipboard}.
*/
@ -51,4 +48,4 @@ public class FullClipboardPattern extends AbstractExtentPattern {
private void writeObject(java.io.ObjectOutputStream stream) throws IOException {
throw new NotSerializableException("Clipboard cannot be serialized!");
}
}
}

View File

@ -1,13 +1,9 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.FaweCache;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
public class IdDataMaskPattern extends AbstractExtentPattern {
private final Pattern pattern;
@ -27,4 +23,4 @@ public class IdDataMaskPattern extends AbstractExtentPattern {
int newData = newBlock.getInternalPropertiesId() + oldData - (oldData & bitMask);
return newBlock.withPropertyId(newData).toBaseBlock();
}
}
}

View File

@ -1,14 +1,11 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
public class Linear2DBlockPattern extends AbstractPattern {
@ -35,4 +32,4 @@ public class Linear2DBlockPattern extends AbstractPattern {
}
return patternsArray[index].apply(extent, get, set);
}
}
}

View File

@ -1,14 +1,11 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
public class Linear3DBlockPattern extends AbstractPattern {

View File

@ -1,13 +1,11 @@
package com.boydti.fawe.object.pattern;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
public class LinearBlockPattern extends AbstractPattern implements ResettablePattern {

View File

@ -1,16 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.boydti.fawe.beta.SingleFilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
public class MaskedPattern extends AbstractPattern {

View File

@ -1,18 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.DelegateFilterBlock;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
public class NoXPattern extends AbstractPattern {
@ -25,15 +19,15 @@ public class NoXPattern extends AbstractPattern {
@Override
public BaseBlock apply(BlockVector3 pos) {
mutable.mutY((pos.getY()));
mutable.mutZ((pos.getZ()));
mutable.mutY(pos.getY());
mutable.mutZ(pos.getZ());
return pattern.apply(mutable);
}
@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
mutable.mutY((get.getY()));
mutable.mutZ((get.getZ()));
mutable.mutY(get.getY());
mutable.mutZ(get.getZ());
return pattern.apply(extent, mutable, set);
}
}

View File

@ -19,15 +19,15 @@ public class NoYPattern extends AbstractPattern {
@Override
public BaseBlock apply(BlockVector3 pos) {
mutable.mutX((pos.getX()));
mutable.mutZ((pos.getZ()));
mutable.mutX(pos.getX());
mutable.mutZ(pos.getZ());
return pattern.apply(mutable);
}
@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
mutable.mutX((get.getX()));
mutable.mutZ((get.getZ()));
mutable.mutX(get.getX());
mutable.mutZ(get.getZ());
return pattern.apply(extent, mutable, set);
}
}

View File

@ -1,18 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.DelegateFilterBlock;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
public class NoZPattern extends AbstractPattern {
@ -26,15 +20,15 @@ public class NoZPattern extends AbstractPattern {
@Override
public BaseBlock apply(BlockVector3 pos) {
mutable.mutX((pos.getX()));
mutable.mutY((pos.getY()));
mutable.mutX(pos.getX());
mutable.mutY(pos.getY());
return pattern.apply(mutable);
}
@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
mutable.mutX((get.getX()));
mutable.mutY((get.getY()));
mutable.mutX(get.getX());
mutable.mutY(get.getY());
return pattern.apply(extent, mutable, set);
}
}

View File

@ -1,17 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
public class OffsetPattern extends AbstractPattern {
@ -28,17 +23,17 @@ public class OffsetPattern extends AbstractPattern {
@Override
public BaseBlock apply(BlockVector3 position) {
mutable.mutX((position.getX() + dx));
mutable.mutY((position.getY() + dy));
mutable.mutZ((position.getZ() + dz));
mutable.mutX(position.getX() + dx);
mutable.mutY(position.getY() + dy);
mutable.mutZ(position.getZ() + dz);
return pattern.apply(mutable);
}
@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
mutable.mutX((get.getX() + dx));
mutable.mutY((get.getY() + dy));
mutable.mutZ((get.getZ() + dz));
mutable.mutX(get.getX() + dx);
mutable.mutY(get.getY() + dy);
mutable.mutZ(get.getZ() + dz);
return pattern.apply(extent, get, mutable);
}
}

View File

@ -1,12 +1,10 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.boydti.fawe.object.string.MutableCharSequence;
import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.StringMan;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.registry.state.AbstractProperty;
@ -17,7 +15,6 @@ import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.ArrayList;
import java.util.List;
@ -173,7 +170,7 @@ public class PropertyPattern extends AbstractExtentPattern {
last = i + 1;
break;
}
default: {
default:
Operator tmp = getOp(c);
if (tmp != null) {
operator = tmp;
@ -186,7 +183,6 @@ public class PropertyPattern extends AbstractExtentPattern {
last = i + 1;
}
break;
}
}
}
}

View File

@ -1,8 +1,9 @@
package com.boydti.fawe.object.pattern;
import static com.google.common.base.Preconditions.checkNotNull;
import com.boydti.fawe.object.schematic.Schematic;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
@ -12,12 +13,10 @@ import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import static com.google.common.base.Preconditions.checkNotNull;
public class RandomFullClipboardPattern extends AbstractPattern {
private final Extent extent;
private final MutableBlockVector3 mutable = new MutableBlockVector3();

View File

@ -1,15 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.util.SplittableRandom;
public class RandomOffsetPattern extends AbstractPattern {
@ -47,4 +44,4 @@ public class RandomOffsetPattern extends AbstractPattern {
mutable.mutZ((set.getZ() + r.nextInt(dz2) - dz));
return pattern.apply(extent, get, mutable);
}
}
}

View File

@ -1,15 +1,12 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import java.io.IOException;
import com.sk89q.worldedit.world.block.BaseBlock;
public class RelativePattern extends AbstractPattern implements ResettablePattern {

View File

@ -1,7 +1,5 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.FilterBlock;
import com.boydti.fawe.util.TextureHolder;
import com.boydti.fawe.util.TextureUtil;
import com.sk89q.worldedit.WorldEditException;
@ -11,8 +9,6 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockType;
import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
public class SaturatePattern extends AbstractPattern {
private final TextureHolder holder;

View File

@ -1,19 +1,15 @@
package com.boydti.fawe.object.pattern;
import com.boydti.fawe.beta.FilterBlock;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.io.IOException;
import java.util.SplittableRandom;
public class SolidRandomOffsetPattern extends AbstractPattern {
@ -47,27 +43,25 @@ public class SolidRandomOffsetPattern extends AbstractPattern {
@Override
public BaseBlock apply(BlockVector3 position) {
mutable.mutX((position.getX() + r.nextInt(dx2) - dx));
mutable.mutY((position.getY() + r.nextInt(dy2) - dy));
mutable.mutZ((position.getZ() + r.nextInt(dz2) - dz));
mutable.mutX(position.getX() + r.nextInt(dx2) - dx);
mutable.mutY(position.getY() + r.nextInt(dy2) - dy);
mutable.mutZ(position.getZ() + r.nextInt(dz2) - dz);
BaseBlock block = pattern.apply(mutable);
if (block.getMaterial().isSolid()) {
return block;
} else {
return pattern.apply(position);
}
return pattern.apply(position);
}
@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
mutable.mutX((set.getX() + r.nextInt(dx2) - dx));
mutable.mutY((set.getY() + r.nextInt(dy2) - dy));
mutable.mutZ((set.getZ() + r.nextInt(dz2) - dz));
mutable.mutX(set.getX() + r.nextInt(dx2) - dx);
mutable.mutY(set.getY() + r.nextInt(dy2) - dy);
mutable.mutZ(set.getZ() + r.nextInt(dz2) - dz);
BlockStateHolder block = pattern.apply(mutable);
if (block.getMaterial().isSolid()) {
return pattern.apply(extent, get, mutable);
} else {
return pattern.apply(extent, get, set);
}
return pattern.apply(extent, get, set);
}
}
}

View File

@ -16,7 +16,6 @@ public class SurfaceRandomOffsetPattern extends AbstractPattern {
private final MutableBlockVector3 cur;
private final MutableBlockVector3[] buffer;
private final MutableBlockVector3[] allowed;
private MutableBlockVector3 next;
public SurfaceRandomOffsetPattern(Pattern pattern, int distance) {
this.pattern = pattern;

View File

@ -155,7 +155,7 @@ public class FuzzyRegionSelector extends AbstractDelegateExtent implements Regio
}
@Override
public List<BlockVector3> getVerticies() {
public List<BlockVector3> getVertices() {
return positions;
}

View File

@ -230,7 +230,7 @@ public class PolyhedralRegionSelector implements RegionSelector, CUIRegion {
}
@Override
public List<BlockVector3> getVerticies() {
public List<BlockVector3> getVertices() {
return new ArrayList<>(region.getVertices());
}
}

View File

@ -3,8 +3,14 @@ package com.boydti.fawe.object.schematic;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.*;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.jnbt.NBTOutputStream;
import com.sk89q.jnbt.NamedTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
@ -26,8 +32,6 @@ import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.entity.EntityTypes;
import com.sk89q.worldedit.world.storage.NBTConversions;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@ -35,6 +39,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.jetbrains.annotations.NotNull;
public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
private static final int WARN_SIZE = 32;
@ -73,7 +78,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
// Init clipboard
BlockVector3 origin = BlockVector3.at(0, 0, 0);
CuboidRegion region = new CuboidRegion(origin, origin.add(width, height, length).subtract(BlockVector3.ONE));
BlockArrayClipboard clipboard = new BlockArrayClipboard(region, clipboardId);
Clipboard clipboard = new BlockArrayClipboard(region, clipboardId);
// Blocks
ListTag blocks = (ListTag) tags.get("blocks");
if (blocks != null) {
@ -86,10 +91,6 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
String name = ((StringTag) map.get("Name")).getValue();
BlockType type = BlockTypes.get(name);
BlockState state = type.getDefaultState();
if (type == null) {
Fawe.debug("Unknown block: " + name);
continue;
}
CompoundTag properties = (CompoundTag) map.get("Properties");
if (properties != null) {
for (Map.Entry<String, Tag> entry : properties.getValue().entrySet()) {
@ -167,85 +168,79 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
// Size
structure.put("size", Arrays.asList(width, height, length));
// Palette
{
ArrayList<HashMap<String, Object>> palette = new ArrayList<>();
for (BlockVector3 point : region) {
BlockStateHolder block = clipboard.getBlock(point);
int combined = block.getInternalId();
BlockType type = block.getBlockType();
ArrayList<HashMap<String, Object>> palette = new ArrayList<>();
for (BlockVector3 point : region) {
BlockStateHolder block = clipboard.getBlock(point);
int combined = block.getInternalId();
BlockType type = block.getBlockType();
if (type == BlockTypes.STRUCTURE_VOID || indexes.containsKey(combined)) {
continue;
}
if (type == BlockTypes.STRUCTURE_VOID || indexes.containsKey(combined)) {
continue;
}
indexes.put(combined, (Integer) palette.size());
HashMap<String, Object> paletteEntry = new HashMap<>();
paletteEntry.put("Name", type.getId());
if (block.getInternalId() != type.getInternalId()) {
Map<String, Object> properties = null;
for (AbstractProperty property : (List<AbstractProperty<?>>) type.getProperties()) {
int propIndex = property.getIndex(block.getInternalId());
if (propIndex != 0) {
if (properties == null) properties = new HashMap<>();
Object value = property.getValues().get(propIndex);
properties.put(property.getName(), value.toString());
}
}
if (properties != null) {
paletteEntry.put("Properties", properties);
indexes.put(combined, (Integer) palette.size());
HashMap<String, Object> paletteEntry = new HashMap<>();
paletteEntry.put("Name", type.getId());
if (block.getInternalId() != type.getInternalId()) {
Map<String, Object> properties = null;
for (AbstractProperty property : (List<AbstractProperty<?>>) type.getProperties()) {
int propIndex = property.getIndex(block.getInternalId());
if (propIndex != 0) {
if (properties == null) properties = new HashMap<>();
Object value = property.getValues().get(propIndex);
properties.put(property.getName(), value.toString());
}
}
palette.add(paletteEntry);
}
if (!palette.isEmpty()) {
structure.put("palette", palette);
if (properties != null) {
paletteEntry.put("Properties", properties);
}
}
palette.add(paletteEntry);
}
if (!palette.isEmpty()) {
structure.put("palette", palette);
}
// Blocks
{
ArrayList<Map<String, Object>> blocks = new ArrayList<>();
BlockVector3 min = region.getMinimumPoint();
for (BlockVector3 point : region) {
BaseBlock block = clipboard.getFullBlock(point);
if (block.getBlockType() != BlockTypes.STRUCTURE_VOID) {
int combined = block.getInternalId();
int index = indexes.get(combined);
List<Integer> pos = Arrays.asList(point.getX() - min.getX(),
point.getY() - min.getY(), point.getZ() - min.getZ());
if (!block.hasNbtData()) {
blocks.add(FaweCache.asMap("state", index, "pos", pos));
} else {
blocks.add(
FaweCache.asMap("state", index, "pos", pos, "nbt", block.getNbtData()));
}
ArrayList<Map<String, Object>> blocks = new ArrayList<>();
BlockVector3 min = region.getMinimumPoint();
for (BlockVector3 point : region) {
BaseBlock block = clipboard.getFullBlock(point);
if (block.getBlockType() != BlockTypes.STRUCTURE_VOID) {
int combined = block.getInternalId();
int index = indexes.get(combined);
List<Integer> pos = Arrays.asList(point.getX() - min.getX(),
point.getY() - min.getY(), point.getZ() - min.getZ());
if (!block.hasNbtData()) {
blocks.add(FaweCache.asMap("state", index, "pos", pos));
} else {
blocks.add(
FaweCache.asMap("state", index, "pos", pos, "nbt", block.getNbtData()));
}
}
if (!blocks.isEmpty()) {
structure.put("blocks", blocks);
}
}
if (!blocks.isEmpty()) {
structure.put("blocks", blocks);
}
// Entities
{
ArrayList<Map<String, Object>> entities = new ArrayList<>();
for (Entity entity : clipboard.getEntities()) {
Location loc = entity.getLocation();
List<Double> pos = Arrays.asList(loc.getX(), loc.getY(), loc.getZ());
List<Integer> blockPos = Arrays.asList(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
BaseEntity state = entity.getState();
if (state != null) {
CompoundTag nbt = state.getNbtData();
Map<String, Tag> nbtMap = ReflectionUtils.getMap(nbt.getValue());
// Replace rotation data
nbtMap.put("Rotation", writeRotation(entity.getLocation(), "Rotation"));
nbtMap.put("id", new StringTag(state.getType().getId()));
Map<String, Object> entityMap = FaweCache.asMap("pos", pos, "blockPos", blockPos, "nbt", nbt);
entities.add(entityMap);
}
}
if (!entities.isEmpty()) {
structure.put("entities", entities);
ArrayList<Map<String, Object>> entities = new ArrayList<>();
for (Entity entity : clipboard.getEntities()) {
Location loc = entity.getLocation();
List<Double> pos = Arrays.asList(loc.getX(), loc.getY(), loc.getZ());
List<Integer> blockPos = Arrays.asList(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
BaseEntity state = entity.getState();
if (state != null) {
CompoundTag nbt = state.getNbtData();
Map<String, Tag> nbtMap = ReflectionUtils.getMap(nbt.getValue());
// Replace rotation data
nbtMap.put("Rotation", writeRotation(entity.getLocation()));
nbtMap.put("id", new StringTag(state.getType().getId()));
Map<String, Object> entityMap = FaweCache.asMap("pos", pos, "blockPos", blockPos, "nbt", nbt);
entities.add(entityMap);
}
}
if (!entities.isEmpty()) {
structure.put("entities", entities);
}
out.writeNamedTag("", FaweCache.asTag(structure));
close();
}
@ -260,18 +255,4 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
}
}
private Tag writeVector(BlockVector3 vector, String name) {
List<DoubleTag> list = new ArrayList<>();
list.add(new DoubleTag(vector.getX()));
list.add(new DoubleTag(vector.getY()));
list.add(new DoubleTag(vector.getZ()));
return new ListTag(DoubleTag.class, list);
}
private Tag writeRotation(Location location, String name) {
List<FloatTag> list = new ArrayList<>();
list.add(new FloatTag(location.getYaw()));
list.add(new FloatTag(location.getPitch()));
return new ListTag(FloatTag.class, list);
}
}

View File

@ -51,9 +51,6 @@ public class PNGWriter implements ClipboardWriter {
double[] dpxi = new double[Math.max(256, width)];
double[] dpyj = new double[length];
double[] dpyi = new double[Math.max(256, width)];
double[] hd = new double[256];
for (int i = 0; i < hd.length; i++) {
}
for (int j = 0; j < dpxj.length; j++) {
dpxj[j] = cx + j * d;
dpyj[j] = imageSize / 2 + d + j * d_2;
@ -165,4 +162,4 @@ public class PNGWriter implements ClipboardWriter {
public void close() throws IOException {
out.close();
}
}
}

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.object.schematic;
import static com.google.common.base.Preconditions.checkNotNull;
import com.boydti.fawe.object.clipboard.FaweClipboard;
import com.boydti.fawe.object.clipboard.ReadOnlyClipboard;
import com.boydti.fawe.util.EditSessionBuilder;
@ -18,6 +20,7 @@ import com.sk89q.worldedit.function.RegionFunction;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.visitor.RegionVisitor;
import com.sk89q.worldedit.math.BlockVector2;
@ -29,17 +32,14 @@ import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkNotNull;
public class Schematic {
private final Clipboard clipboard;
public Schematic(Clipboard clipboard) {
@ -54,14 +54,15 @@ public class Schematic {
*/
public Schematic(Region region) {
checkNotNull(region);
checkNotNull(region.getWorld(), "World cannot be null (use the other constructor for the region)");
EditSession session = new EditSessionBuilder(region.getWorld()).allowedRegionsEverywhere().autoQueue(false).build();
checkNotNull(region.getWorld(),
"World cannot be null (use the other constructor for the region)");
EditSession session = new EditSessionBuilder(region.getWorld()).allowedRegionsEverywhere()
.autoQueue(false).build();
this.clipboard = new BlockArrayClipboard(region, ReadOnlyClipboard.of(session, region));
}
public
@Nullable
Clipboard getClipboard() {
public Clipboard getClipboard() {
return clipboard;
}
@ -104,7 +105,8 @@ public class Schematic {
}
}
public EditSession paste(World world, BlockVector3 to, boolean allowUndo, boolean pasteAir, @Nullable Transform transform) {
public EditSession paste(World world, BlockVector3 to, boolean allowUndo, boolean pasteAir,
@Nullable Transform transform) {
return paste(world, to, allowUndo, pasteAir, true, transform);
}
@ -118,14 +120,16 @@ public class Schematic {
* @param transform
* @return
*/
public EditSession paste(World world, BlockVector3 to, boolean allowUndo, boolean pasteAir, boolean copyEntities, @Nullable Transform transform) {
public EditSession paste(World world, BlockVector3 to, boolean allowUndo, boolean pasteAir,
boolean copyEntities, @Nullable Transform transform) {
checkNotNull(world);
checkNotNull(to);
EditSession editSession;
if (world instanceof EditSession) {
editSession = (EditSession) world;
} else {
EditSessionBuilder builder = new EditSessionBuilder(world).autoQueue(true).checkMemory(false).allowedRegionsEverywhere().limitUnlimited();
EditSessionBuilder builder = new EditSessionBuilder(world).autoQueue(true)
.checkMemory(false).allowedRegionsEverywhere().limitUnlimited();
if (allowUndo) {
editSession = builder.build();
} else {
@ -141,7 +145,8 @@ public class Schematic {
editSession.flushQueue();
return editSession;
}
ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(), clipboard.getOrigin(), editSession, to);
ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(),
clipboard.getOrigin(), editSession, to);
if (transform != null && !transform.isIdentity()) {
copy.setTransform(transform);
}
@ -165,16 +170,13 @@ public class Schematic {
public void paste(Extent extent, BlockVector3 to, boolean pasteAir, Transform transform) {
checkNotNull(transform);
Region region = clipboard.getRegion();
Extent source = clipboard;
if (transform != null) {
source = new BlockTransformExtent(clipboard, transform);
}
ForwardExtentCopy copy = new ForwardExtentCopy(source, clipboard.getRegion(), clipboard.getOrigin(), extent, to);
if (transform != null) {
copy.setTransform(transform);
}
copy.setCopyingBiomes(!(clipboard instanceof BlockArrayClipboard) || ((BlockArrayClipboard) clipboard).IMP.hasBiomes());
Extent source = new BlockTransformExtent(clipboard, transform);
ForwardExtentCopy copy = new ForwardExtentCopy(source, clipboard.getRegion(),
clipboard.getOrigin(), extent, to);
copy.setTransform(transform);
copy.setCopyingBiomes(
!(clipboard instanceof BlockArrayClipboard) || ((BlockArrayClipboard) clipboard).IMP
.hasBiomes());
if (extent instanceof EditSession) {
EditSession editSession = (EditSession) extent;
Mask sourceMask = editSession.getSourceMask();
@ -190,13 +192,14 @@ public class Schematic {
Operations.completeBlindly(copy);
}
public void paste(Extent extent, BlockVector3 to, final boolean pasteAir) {
public void paste(Extent extent, BlockVector3 to, boolean pasteAir) {
Region region = clipboard.getRegion().clone();
final int maxY = extent.getMaximumPoint().getBlockY();
final BlockVector3 bot = clipboard.getMinimumPoint();
final BlockVector3 origin = clipboard.getOrigin();
final boolean copyBiomes = !(clipboard instanceof BlockArrayClipboard) || ((BlockArrayClipboard) clipboard).IMP.hasBiomes();
final boolean copyBiomes =
!(clipboard instanceof BlockArrayClipboard) || ((BlockArrayClipboard) clipboard).IMP
.hasBiomes();
// Optimize for BlockArrayClipboard
if (clipboard instanceof BlockArrayClipboard && region instanceof CuboidRegion) {
@ -209,9 +212,11 @@ public class Schematic {
if (copyBiomes) {
bac.IMP.forEach(new FaweClipboard.BlockReader() {
MutableBlockVector2 mpos2d = new MutableBlockVector2();
{
mpos2d.setComponents(Integer.MIN_VALUE, Integer.MIN_VALUE);
}
@Override
public <B extends BlockStateHolder<B>> void run(int x, int y, int z, B block) {
try {
@ -225,7 +230,9 @@ public class Schematic {
return;
}
extent.setBlock(xx, y + rely, zz, block);
} catch (WorldEditException e) { throw new RuntimeException(e);}
} catch (WorldEditException e) {
throw new RuntimeException(e);
}
}
}, true);
} else {
@ -234,7 +241,9 @@ public class Schematic {
public <B extends BlockStateHolder<B>> void run(int x, int y, int z, B block) {
try {
extent.setBlock(x + relx, y + rely, z + relz, block);
} catch (WorldEditException e) { throw new RuntimeException(e);}
} catch (WorldEditException e) {
throw new RuntimeException(e);
}
}
}, pasteAir);
}
@ -243,12 +252,14 @@ public class Schematic {
final int relx = to.getBlockX() - origin.getBlockX();
final int rely = to.getBlockY() - origin.getBlockY();
final int relz = to.getBlockZ() - origin.getBlockZ();
RegionVisitor visitor = new RegionVisitor(region, new RegionFunction() {
// MutableBlockVector2 mpos2d_2 = new MutableBlockVector2();
Operation visitor = new RegionVisitor(region, new RegionFunction() {
// MutableBlockVector2 mpos2d_2 = new MutableBlockVector2();
MutableBlockVector2 mpos2d = new MutableBlockVector2();
{
mpos2d.setComponents(Integer.MIN_VALUE, Integer.MIN_VALUE);
}
@Override
public boolean apply(BlockVector3 mutable) throws WorldEditException {
BlockStateHolder block = clipboard.getBlock(mutable);
@ -257,7 +268,8 @@ public class Schematic {
if (copyBiomes && xx != mpos2d.getBlockX() && zz != mpos2d.getBlockZ()) {
mpos2d.setComponents(xx, zz);
// extent.setBiome(mpos2d, clipboard.getBiome(mpos2d_2.setComponents(mutable.getBlockX(), mutable.getBlockZ())));
extent.setBiome(mpos2d, clipboard.getBiome(BlockVector2.at(mutable.getBlockX(), mutable.getBlockZ())));
extent.setBiome(mpos2d, clipboard
.getBiome(BlockVector2.at(mutable.getBlockX(), mutable.getBlockZ())));
}
if (!pasteAir && block.getBlockType().getMaterial().isAir()) {
return false;
@ -275,11 +287,14 @@ public class Schematic {
// entities
for (Entity entity : clipboard.getEntities()) {
// skip players on pasting schematic
if (entity.getState() != null && entity.getState().getType().getId().equals("minecraft:player")) {
if (entity.getState() != null && entity.getState().getType().getId()
.equals("minecraft:player")) {
continue;
}
Location pos = entity.getLocation();
Location newPos = new Location(pos.getExtent(), pos.getX() + entityOffsetX, pos.getY() + entityOffsetY, pos.getZ() + entityOffsetZ, pos.getYaw(), pos.getPitch());
Location newPos = new Location(pos.getExtent(), pos.getX() + entityOffsetX,
pos.getY() + entityOffsetY, pos.getZ() + entityOffsetZ, pos.getYaw(),
pos.getPitch());
extent.createEntity(newPos, entity.getState());
}
}

View File

@ -10,8 +10,8 @@ public class CleanTextureUtil extends TextureUtil {
super(parent.getFolder());
this.min = minPercent;
this.max = maxPercent;
int minIndex = ((parent.distances.length - 1) * minPercent) / 100;
int maxIndex = ((parent.distances.length - 1) * maxPercent) / 100;
int minIndex = (parent.distances.length - 1) * minPercent / 100;
int maxIndex = (parent.distances.length - 1) * maxPercent / 100;
long min = parent.distances[minIndex];
long max = parent.distances[maxIndex];
for (; minIndex > 0 && parent.distances[minIndex - 1] == min; minIndex--) ;
@ -44,4 +44,4 @@ public class CleanTextureUtil extends TextureUtil {
public int getMax() {
return max;
}
}
}

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.util;
import static com.google.common.base.Preconditions.checkNotNull;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.config.BBC;
@ -24,12 +26,9 @@ import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.eventbus.EventBus;
import com.sk89q.worldedit.world.World;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull;
public class EditSessionBuilder {
private World world;
@ -294,7 +293,7 @@ public class EditSessionBuilder {
}
if (checkMemory) {
if (MemUtil.isMemoryLimitedSlow()) {
if (Perm.hasPermission(player, "worldedit.fast")) {
if (Permission.hasPermission(player.toWorldEditPlayer(), "worldedit.fast")) {
BBC.WORLDEDIT_OOM_ADMIN.send(player);
}
throw FaweException.LOW_MEMORY;

View File

@ -15,14 +15,14 @@ public final class IOUtil {
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
return (ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0);
}
public static void writeInt(OutputStream out, int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
out.write(v >>> 24 & 0xFF);
out.write(v >>> 16 & 0xFF);
out.write(v >>> 8 & 0xFF);
out.write(v >>> 0 & 0xFF);
}
public static int readVarInt(InputStream in) throws IOException {
@ -30,7 +30,7 @@ public final class IOUtil {
int offset = 0;
int b;
while ((b = in.read()) > 127) {
i |= (b - 128) << offset;
i |= b - 128 << offset;
offset += 7;
}
i |= b << offset;

View File

@ -17,12 +17,12 @@ public class ImgurUtility {
return uploadImage(new FileInputStream(file));
}
public static URL uploadImage(InputStream is) throws IOException {
is = new BufferedInputStream(is);
public static URL uploadImage(InputStream inputStream) throws IOException {
inputStream = new BufferedInputStream(inputStream);
FastByteArrayOutputStream baos = new FastByteArrayOutputStream(Short.MAX_VALUE);
int d;
while ((d = is.read()) != -1) {
baos.write(d);
int i;
while ((i = inputStream.read()) != -1) {
baos.write(i);
}
baos.flush();
return uploadImage(baos.toByteArray());

View File

@ -1,44 +0,0 @@
package com.boydti.fawe.util;
import com.boydti.fawe.object.FawePlayer;
public enum Perm {
/*
* Permission related functions
*/
ADMIN("fawe.admin", "admin");
public String s;
public String cat;
Perm(String perm, String cat) {
this.s = perm;
this.cat = cat;
}
public boolean has(FawePlayer<?> player) {
return this.hasPermission(player, this);
}
public boolean hasPermission(FawePlayer<?> player, Perm perm) {
return hasPermission(player, perm.s);
}
public static boolean hasPermission(FawePlayer<?> player, String perm) {
if (player == null || player.hasPermission(ADMIN.s)) {
return true;
}
if (player.hasPermission(perm)) {
return true;
}
final String[] nodes = perm.split("\\.");
final StringBuilder n = new StringBuilder();
for (int i = 0; i < nodes.length - 1; i++) {
n.append(nodes[i]).append(".");
if (player.hasPermission(n + "*")) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,37 @@
package com.boydti.fawe.util;
import com.sk89q.worldedit.util.auth.Subject;
public enum Permission {
/*
* Permission related functions
*/
ADMIN("fawe.admin", "admin");
public String permission;
public String cat;
Permission(String permission, String category) {
this.permission = permission;
this.cat = category;
}
public static boolean hasPermission(Subject player, String permission) {
if (player == null || player.hasPermission(ADMIN.permission)) {
return true;
}
if (player.hasPermission(permission)) {
return true;
}
final String[] nodes = permission.split("\\.");
final StringBuilder n = new StringBuilder();
for (int i = 0; i < nodes.length - 1; i++) {
n.append(nodes[i]).append(".");
if (player.hasPermission(n + "*")) {
return true;
}
}
return false;
}
}

View File

@ -21,9 +21,9 @@ public class RandomTextureUtil extends CachedTextureUtil {
int red1 = (c1 >> 16) & 0xFF;
int green1 = (c1 >> 8) & 0xFF;
int blue1 = (c1 >> 0) & 0xFF;
byte red2 = (byte) ((c2 >> 16));
byte green2 = (byte) ((c2 >> 8));
byte blue2 = (byte) ((c2 >> 0));
byte red2 = (byte) (c2 >> 16);
byte green2 = (byte) (c2 >> 8);
byte blue2 = (byte) (c2 >> 0);
int red = MathMan.clamp(red1 + random(red2), 0, 255);
int green = MathMan.clamp(green1 + random(green2), 0, 255);
int blue = MathMan.clamp(blue1 + random(blue2), 0, 255);

View File

@ -8,10 +8,8 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class StringMan {
@ -37,10 +35,8 @@ public class StringMan {
}
public static boolean containsAny(CharSequence sequence, String any) {
for (int i = 0; i < sequence.length(); i++) {
if (any.indexOf(sequence.charAt(i)) != -1) return true;
}
return false;
return IntStream.range(0, sequence.length())
.anyMatch(i -> any.indexOf(sequence.charAt(i)) != -1);
}
public static boolean containsIgnoreCase(String haystack, String needle) {
@ -122,14 +118,11 @@ public class StringMan {
int len = string.length();
for (int i = len - 1; i >= 0; i--) {
char c = string.charAt(i);
switch (c) {
case '-':
val = -val;
break;
default:
val = val + (c - 48) * numIndex;
numIndex *= 10;
break;
if (c == '-') {
val = -val;
} else {
val = val + (c - 48) * numIndex;
numIndex *= 10;
}
}
return val;
@ -518,7 +511,8 @@ public class StringMan {
}
public static boolean isEqualIgnoreCase(String a, String b) {
return ((a == b) || ((a != null) && (b != null) && (a.length() == b.length()) && a.equalsIgnoreCase(b)));
return a == b ||
a != null && b != null && a.length() == b.length() && a.equalsIgnoreCase(b);
}
public static String repeat(String s, int n) {

View File

@ -32,7 +32,7 @@ public class WEManager {
if (!(currentExtent instanceof NullExtent)) {
field.set(parent, new NullExtent((Extent) field.get(parent), reason));
}
} catch (final Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
throw reason;
@ -42,41 +42,33 @@ public class WEManager {
cancelEditSafe(parent, reason);
}
public boolean maskContains(final HashSet<RegionWrapper> mask, final int x, final int z) {
for (final RegionWrapper region : mask) {
if ((x >= region.minX) && (x <= region.maxX) && (z >= region.minZ) && (z <= region.maxZ)) {
public boolean maskContains(HashSet<RegionWrapper> mask, int x, int z) {
for (RegionWrapper region : mask) {
if (x >= region.minX && x <= region.maxX && z >= region.minZ && z <= region.maxZ) {
return true;
}
}
return false;
}
public boolean maskContains(RegionWrapper[] mask, final int x, final int z) {
public boolean maskContains(RegionWrapper[] mask, int x, int z) {
switch (mask.length) {
case 0:
return false;
case 1:
return mask[0].isIn(x, z);
default:
for (final RegionWrapper region : mask) {
if (region.isIn(x, z)) {
return true;
}
}
return false;
return Arrays.stream(mask).anyMatch(region -> region.isIn(x, z));
}
}
@Deprecated
public Region[] getMask(final FawePlayer<?> player) {
public Region[] getMask(FawePlayer<?> player) {
return getMask(player, FaweMaskManager.MaskType.getDefaultMaskType());
}
public boolean isIn(int x, int y, int z, Region region) {
if (region.contains(x, y, z)) {
return true;
}
return false;
return region.contains(x, y, z);
}
/**
@ -85,7 +77,7 @@ public class WEManager {
* @param player
* @return
*/
public Region[] getMask(final FawePlayer<?> player, FaweMaskManager.MaskType type) {
public Region[] getMask(FawePlayer<?> player, FaweMaskManager.MaskType type) {
if (!Settings.IMP.REGION_RESTRICTIONS || player.hasPermission("fawe.bypass") || player.hasPermission("fawe.bypass.regions")) {
return new Region[]{RegionWrapper.GLOBAL()};
}
@ -129,7 +121,7 @@ public class WEManager {
}
}
Set<FaweMask> tmpMasks = new HashSet<>();
for (final FaweMaskManager manager : managers) {
for (FaweMaskManager manager : managers) {
if (player.hasPermission("fawe." + manager.getKey())) {
try {
if (manager.isExclusive() && !masks.isEmpty()) continue;
@ -154,17 +146,19 @@ public class WEManager {
}
public boolean intersects(final Region region1, final Region region2) {
public boolean intersects(Region region1, Region region2) {
BlockVector3 rg1P1 = region1.getMinimumPoint();
BlockVector3 rg1P2 = region1.getMaximumPoint();
BlockVector3 rg2P1 = region2.getMinimumPoint();
BlockVector3 rg2P2 = region2.getMaximumPoint();
return (rg1P1.getBlockX() <= rg2P2.getBlockX()) && (rg1P2.getBlockX() >= rg2P1.getBlockX()) && (rg1P1.getBlockZ() <= rg2P2.getBlockZ()) && (rg1P2.getBlockZ() >= rg2P1.getBlockZ());
return rg1P1.getBlockX() <= rg2P2.getBlockX() && rg1P2.getBlockX() >= rg2P1.getBlockX() &&
rg1P1.getBlockZ() <= rg2P2.getBlockZ() &&
rg1P2.getBlockZ() >= rg2P1.getBlockZ();
}
public boolean regionContains(final Region selection, final HashSet<Region> mask) {
for (final Region region : mask) {
public boolean regionContains(Region selection, HashSet<Region> mask) {
for (Region region : mask) {
if (this.intersects(region, selection)) {
return true;
}
@ -172,29 +166,29 @@ public class WEManager {
return false;
}
public boolean delay(final FawePlayer<?> player, final String command) {
public boolean delay(FawePlayer<?> player, String command) {
final long start = System.currentTimeMillis();
return this.delay(player, () -> {
try {
if ((System.currentTimeMillis() - start) > 1000) {
if (System.currentTimeMillis() - start > 1000) {
BBC.WORLDEDIT_RUN.send(FawePlayer.wrap(player));
}
TaskManager.IMP.task(() -> {
final long start1 = System.currentTimeMillis();
player.executeCommand(command.substring(1));
TaskManager.IMP.later(() -> SetQueue.IMP.addEmptyTask(() -> {
if ((System.currentTimeMillis() - start1) > 1000) {
if (System.currentTimeMillis() - start1 > 1000) {
BBC.WORLDEDIT_COMPLETE.send(FawePlayer.wrap(player));
}
}), 2);
});
} catch (final Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
}, false, false);
}
public boolean delay(final FawePlayer<?> player, final Runnable whenDone, final boolean delayed, final boolean onlyDelayedExecution) {
public boolean delay(FawePlayer<?> player, Runnable whenDone, boolean delayed, boolean onlyDelayedExecution) {
final boolean free = SetQueue.IMP.addEmptyTask(null);
if (free) {
if (delayed) {
@ -202,14 +196,14 @@ public class WEManager {
whenDone.run();
}
} else {
if ((whenDone != null) && !onlyDelayedExecution) {
if (whenDone != null && !onlyDelayedExecution) {
whenDone.run();
} else {
return false;
}
}
} else {
if (!delayed && (player != null)) {
if (!delayed && player != null) {
BBC.WORLDEDIT_DELAYED.send(player);
}
SetQueue.IMP.addEmptyTask(whenDone);

View File

@ -1,21 +0,0 @@
package com.boydti.fawe.util.chat;
import com.boydti.fawe.object.FawePlayer;
public interface ChatManager<T> {
T builder();
void color(Message message, String color);
void tooltip(Message message, Message... tooltip);
void command(Message message, String command);
void text(Message message, String text);
void send(Message message, FawePlayer player);
void suggest(Message message, String command);
void link(Message message, String url);
}

View File

@ -1,127 +0,0 @@
package com.boydti.fawe.util.chat;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FawePlayer;
import com.sk89q.worldedit.extension.platform.Actor;
import java.io.Serializable;
import java.util.Objects;
public class Message {
private Object builder;
private boolean active;
public Message() {
try {
reset(Fawe.get().getChatManager());
} catch (Throwable e) {
Fawe.debug("Doesn't support fancy chat for " + Fawe.imp().getPlatform());
Fawe.get().setChatManager(new PlainChatManager());
reset(Fawe.get().getChatManager());
}
active = !(Fawe.get().getChatManager() instanceof PlainChatManager);
}
public Message(String text) {
this();
text(text);
}
public <T> T $(ChatManager<T> manager) {
return (T) this.builder;
}
public <T> T reset(ChatManager<T> manager) {
return (T) (this.builder = manager.builder());
}
public boolean supportsInteraction() {
return active;
}
public Message text(BBC caption, Object... args) {
return text(caption.format(args));
}
public Message text(Serializable text) {
Fawe.get().getChatManager().text(this, BBC.color(Objects.toString(text)));
return this;
}
public Message link(String text) {
Fawe.get().getChatManager().link(this, text);
return this;
}
public Message tooltip(Message... tooltip) {
Fawe.get().getChatManager().tooltip(this, tooltip);
return this;
}
public Message tooltip(String tooltip) {
return tooltip(new Message(tooltip));
}
public Message command(String command) {
Fawe.get().getChatManager().command(this, "/" + command);
return this;
}
public Message newline() {
return text("\n");
}
public Message cmdTip(String commandAndTooltip) {
return tooltip(commandAndTooltip).command(commandAndTooltip);
}
public Message linkTip(String linkAndTooltip) {
return tooltip(linkAndTooltip).link(linkAndTooltip);
}
public Message cmdOptions(String prefix, String suffix, String... options) {
for (int i = 0; i < options.length; i++) {
if (i != 0) text(" | ");
text("[" + options[i] + "]")
.cmdTip(prefix + options[i] + suffix);
}
return this;
}
public Message suggestTip(String commandAndTooltip) {
return tooltip(commandAndTooltip).suggest(commandAndTooltip);
}
public Message suggest(String command) {
Fawe.get().getChatManager().suggest(this, command);
return this;
}
public void send(Actor player) {
send(FawePlayer.wrap(player));
}
public void send(FawePlayer player) {
Fawe.get().getChatManager().send(this, player);
}
public Message paginate(String baseCommand, int page, int totalPages) {
if (!active) {
return text(BBC.PAGE_FOOTER.format(baseCommand, page + 1));
}
if (page < totalPages && page > 1) { // Back | Next
this.text("<<").command(baseCommand + " " + (page - 1)).text(" | ").text(">>")
.command(baseCommand + " " + (page + 1));
} else if (page <= 1 && totalPages > page) { // Next
this.text(" -").text(" | ").text(">>")
.command(baseCommand + " " + (page + 1));
} else if (page == totalPages && totalPages > 1) { // Back
this.text("<<").command(baseCommand + " " + (page - 1)).text(" | ").text("- ");
} else {
this.text(" - | - ");
}
return this;
}
}

Some files were not shown because too many files have changed in this diff Show More