3
0
Mirror von https://github.com/IntellectualSites/FastAsyncWorldEdit.git synchronisiert 2024-11-20 01:40:06 +01:00
Dieser Commit ist enthalten in:
Jesse Boyd 2019-12-23 06:04:24 +00:00
Commit 50c19f5a1c
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 59F1DE6293AF6E1F
11 geänderte Dateien mit 122 neuen und 90 gelöschten Zeilen

Datei anzeigen

@ -15,4 +15,4 @@ You can do so here: https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13
- [] I included all information required in the sections above - [] I included all information required in the sections above
- [] I tested my changes and approved their functionality - [] I tested my changes and approved their functionality
- [] I ensured my changes do not break other parts of the code - [] I ensured my changes do not break other parts of the code
- [] I read and followed the [contribution guidelines](https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/blob/breaking/CONTRIBUTING.md) - [] I read and followed the [contribution guidelines](https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/blob/1.15/CONTRIBUTING.md)

Datei anzeigen

@ -3,13 +3,9 @@ name: Java CI
on: on:
push: push:
branches: branches:
- master
- merge
- 1.15 - 1.15
pull_request: pull_request:
branches: branches:
- master
- merge
- 1.15 - 1.15
jobs: jobs:

69
CONTRIBUTING.md Normale Datei
Datei anzeigen

@ -0,0 +1,69 @@
Contributing
============
Thank you for your interest in contributing to FastAsyncWorldEdit! We appreciate your
effort, but to make sure that the inclusion of your patch is a smooth process, we
ask that you make note of the following guidelines.
* **Follow the [Oracle coding conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html).**
We can't stress this enough; if your code has notable issues, it may delay
the process significantly.
* **Target Java 8 for source and compilation.** Make sure to mark methods with
` @Override` that override methods of parent classes, or that implement
methods of interfaces.
* **Use only spaces for indentation.** Our indents are 4-spaces long, and tabs
are unacceptable.
* **Wrap code to a 120 column limit.** We do this to make side by side diffs
and other such tasks easier. Ignore this guideline if it makes the code
too unreadable.
* **Write complete Javadocs.** Do so only for public methods, and make sure
that your `@param` and `@return` fields are not just blank.
* **Don't tag classes with @author.** Some legacy classes may have this tag,
but we are phasing it out.
* **Make sure the code is efficient.** One way you can achieve this is to spend
around ten minutes to think about what the code is doing and whether it
seems awfully roundabout. If you had to copy the same large piece of
code in several places, that's bad.
* **Keep commit summaries under 70 characters.** For more details, place two
new lines after the summary line and write away!
* **Test your code.** We're not interested in broken code, for the obvious reasons.
* **Write unit tests.** While this is strictly optional, we recommend it for
complicated algorithms.
Checklist
---------
Ready to submit? Perform the checklist below:
1. Have all tabs been replaced into four spaces? Are indentations 4-space wide?
2. Have I written proper Javadocs for my public methods? Are the @param and
@return fields actually filled out?
3. Have I `git rebase`d my pull request to the latest commit of the target
branch?
4. Have I combined my commits into a reasonably small number (if not one)
commit using `git rebase`?
5. Have I made my pull request too large? Pull requests should introduce
small sets of changes at a time. Major changes should be discussed with
the team prior to starting work.
6. Are my commit messages descriptive?
You should be aware of `git rebase`.
It allows you to modify existing commit messages, and combine, break apart, or
adjust past changes.
Example
-------
This is **GOOD:**
if (var.func(param1, param2)) {
// do things
}
This is **EXTREMELY BAD:**
if(var.func( param1, param2 ))
{
// do things
}

Datei anzeigen

@ -15,12 +15,11 @@ FAWE is a fork of WorldEdit that has huge speed and memory improvements and cons
## Downloads ## Downloads
### 1.13+ ### 1.13+
* [Download](https://empcraft.com/fawe/download/) * [Download](https://intellectualsites.github.io/download/fawe.html)
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit-Breaking/) * [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit-1.15/)
* [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit-1.13/javadoc/)
### < 1.12.2 ### < 1.12.2
* [Download](https://empcraft.com/fawe/download/?bukkit) * [Download](https://intellectualsites.github.io/download/fawe.html)
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit/) * [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit/)
* [Repository](https://github.com/boy0001/FastAsyncWorldedit) * [Repository](https://github.com/boy0001/FastAsyncWorldedit)
* [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit/javadoc/) * [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit/javadoc/)

Datei anzeigen

@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.NMSAdapter;
import com.boydti.fawe.config.Settings; import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.collection.BitArray4096; import com.boydti.fawe.object.collection.BitArray4096;
import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.ReflectionUtils;
import com.boydti.fawe.util.TaskManager; import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypesCache; import com.sk89q.worldedit.world.block.BlockTypesCache;
@ -83,11 +84,7 @@ public final class BukkitAdapter_1_13 extends NMSAdapter {
} catch (NoSuchFieldException paper) { } catch (NoSuchFieldException paper) {
tmp = DataPaletteBlock.class.getDeclaredField("j"); tmp = DataPaletteBlock.class.getDeclaredField("j");
} }
Field modifiersField = Field.class.getDeclaredField("modifiers"); ReflectionUtils.setAccessibleNonFinal(tmp);
modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(tmp);
int newModifiers = modifiers & (~Modifier.FINAL);
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
fieldLock = tmp; fieldLock = tmp;
fieldLock.setAccessible(true); fieldLock.setAccessible(true);
} }

Datei anzeigen

@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.DelegateLock;
import com.boydti.fawe.config.Settings; import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.collection.BitArray4096; import com.boydti.fawe.object.collection.BitArray4096;
import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.ReflectionUtils;
import com.boydti.fawe.util.TaskManager; import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypesCache; import com.sk89q.worldedit.world.block.BlockTypesCache;
@ -83,11 +84,7 @@ public final class BukkitAdapter_1_14 extends NMSAdapter {
} catch (NoSuchFieldException paper) { } catch (NoSuchFieldException paper) {
tmp = DataPaletteBlock.class.getDeclaredField("j"); tmp = DataPaletteBlock.class.getDeclaredField("j");
} }
Field modifiersField = Field.class.getDeclaredField("modifiers"); ReflectionUtils.setAccessibleNonFinal(tmp);
modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(tmp);
int newModifiers = modifiers & (~Modifier.FINAL);
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
fieldLock = tmp; fieldLock = tmp;
fieldLock.setAccessible(true); fieldLock.setAccessible(true);
} }

Datei anzeigen

@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.NMSAdapter;
import com.boydti.fawe.config.Settings; import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.collection.BitArray4096; import com.boydti.fawe.object.collection.BitArray4096;
import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.ReflectionUtils;
import com.boydti.fawe.util.TaskManager; import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypesCache; import com.sk89q.worldedit.world.block.BlockTypesCache;
@ -18,7 +19,6 @@ import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
@ -66,11 +66,7 @@ public final class BukkitAdapter_1_15 extends NMSAdapter {
fieldDirtyBits.setAccessible(true); fieldDirtyBits.setAccessible(true);
Field tmp = DataPaletteBlock.class.getDeclaredField("j"); Field tmp = DataPaletteBlock.class.getDeclaredField("j");
Field modifiersField = Field.class.getDeclaredField("modifiers"); ReflectionUtils.setAccessibleNonFinal(tmp);
modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(tmp);
int newModifiers = modifiers & (~Modifier.FINAL);
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
fieldLock = tmp; fieldLock = tmp;
fieldLock.setAccessible(true); fieldLock.setAccessible(true);

Datei anzeigen

@ -141,7 +141,7 @@ public class LocalBlockVector2DSet implements Set<BlockVector2> {
@Override @Override
public Object[] toArray() { public Object[] toArray() {
return toArray(null); return toArray((Object[]) null);
} }
@Override @Override

Datei anzeigen

@ -160,7 +160,7 @@ public class LocalBlockVectorSet implements Set<BlockVector3> {
@NotNull @Override @NotNull @Override
public Object[] toArray() { public Object[] toArray() {
return toArray(null); return toArray((Object[]) null);
} }
@NotNull @Override @NotNull @Override

Datei anzeigen

@ -78,7 +78,7 @@ public class ReflectionUtils {
} }
public static Object makeEnum(Class<?> enumClass, String value, int ordinal, public static Object makeEnum(Class<?> enumClass, String value, int ordinal,
Class<?>[] additionalTypes, Object[] additionalValues) throws Exception { Class<?>[] additionalTypes, Object[] additionalValues) throws Exception {
Object[] parms = new Object[additionalValues.length + 2]; Object[] parms = new Object[additionalValues.length + 2];
parms[0] = value; parms[0] = value;
parms[1] = ordinal; parms[1] = ordinal;
@ -96,9 +96,8 @@ public class ReflectionUtils {
return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes)); return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes));
} }
public static void setFailsafeFieldValue(Field field, Object target, Object value) public static void setAccessibleNonFinal(Field field)
throws NoSuchFieldException, IllegalAccessException { throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// let's make the field accessible // let's make the field accessible
field.setAccessible(true); field.setAccessible(true);
@ -106,15 +105,35 @@ public class ReflectionUtils {
// not be final anymore, thus tricking reflection into // not be final anymore, thus tricking reflection into
// letting us modify the static final field // letting us modify the static final field
if (Modifier.isFinal(field.getModifiers())) { if (Modifier.isFinal(field.getModifiers())) {
Field modifiersField = Field.class.getDeclaredField("modifiers"); try {
modifiersField.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers");
int modifiers = modifiersField.getInt(field); modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(field);
// blank out the final bit in the modifiers int // blank out the final bit in the modifiers int
modifiers &= ~Modifier.FINAL; modifiers &= ~Modifier.FINAL;
modifiersField.setInt(field, modifiers); modifiersField.setInt(field, modifiers);
} catch (NoSuchFieldException e) {
// Java 12+ compatibility - search fields with hidden method for modifiers
// same concept as above, just with a more hacky way of getting to the modifiers
Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
getDeclaredFields0.setAccessible(true);
Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false);
for (Field classField : fields) {
if ("modifiers".equals(classField.getName())) {
classField.setAccessible(true);
classField.set(field, field.getModifiers() & ~Modifier.FINAL);
break;
}
}
}
} }
}
public static void setFailsafeFieldValue(Field field, Object target, Object value)
throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
setAccessibleNonFinal(field);
try { try {
FieldAccessor fa = ReflectionFactory.getReflectionFactory().newFieldAccessor(field, false); FieldAccessor fa = ReflectionFactory.getReflectionFactory().newFieldAccessor(field, false);
fa.set(target, value); fa.set(target, value);
@ -124,7 +143,7 @@ public class ReflectionUtils {
} }
private static void blankField(Class<?> enumClass, String fieldName) private static void blankField(Class<?> enumClass, String fieldName)
throws NoSuchFieldException, IllegalAccessException { throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
for (Field field : Class.class.getDeclaredFields()) { for (Field field : Class.class.getDeclaredFields()) {
if (field.getName().contains(fieldName)) { if (field.getName().contains(fieldName)) {
AccessibleObject.setAccessible(new Field[]{field}, true); AccessibleObject.setAccessible(new Field[]{field}, true);
@ -134,8 +153,8 @@ public class ReflectionUtils {
} }
} }
private static void cleanEnumCache(Class<?> enumClass) static void cleanEnumCache(Class<?> enumClass)
throws NoSuchFieldException, IllegalAccessException { throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6 blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6
blankField(enumClass, "enumConstants"); // IBM JDK blankField(enumClass, "enumConstants"); // IBM JDK
} }

Datei anzeigen

@ -2,7 +2,10 @@ package com.boydti.fawe.util;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import java.lang.reflect.*; import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -41,15 +44,15 @@ public class ReflectionUtils9 {
// 5. Set new values field // 5. Set new values field
try { try {
setFailsafeFieldValue(valuesField, null, ReflectionUtils.setFailsafeFieldValue(valuesField, null,
values.toArray((T[]) Array.newInstance(enumType, 0))); values.toArray((T[]) Array.newInstance(enumType, 0)));
} catch (Throwable e) { } catch (Throwable e) {
Field ordinalField = Enum.class.getDeclaredField("ordinal"); Field ordinalField = Enum.class.getDeclaredField("ordinal");
setFailsafeFieldValue(ordinalField, newValue, 0); ReflectionUtils.setFailsafeFieldValue(ordinalField, newValue, 0);
} }
// 6. Clean enum cache // 6. Clean enum cache
cleanEnumCache(enumType); ReflectionUtils.cleanEnumCache(enumType);
return newValue; return newValue;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -64,55 +67,11 @@ public class ReflectionUtils9 {
Object instance = unsafe.allocateInstance(enumClass); Object instance = unsafe.allocateInstance(enumClass);
Field ordinalField = Enum.class.getDeclaredField("ordinal"); Field ordinalField = Enum.class.getDeclaredField("ordinal");
setFailsafeFieldValue(ordinalField, instance, 0); ReflectionUtils.setFailsafeFieldValue(ordinalField, instance, 0);
Field nameField = Enum.class.getDeclaredField("name"); Field nameField = Enum.class.getDeclaredField("name");
setFailsafeFieldValue(nameField, instance, value); ReflectionUtils.setFailsafeFieldValue(nameField, instance, value);
return instance; return instance;
} }
public static void setFailsafeFieldValue(Field field, Object target, Object value)
throws NoSuchFieldException, IllegalAccessException {
// let's make the field accessible
field.setAccessible(true);
// next we change the modifier in the Field instance to
// not be final anymore, thus tricking reflection into
// letting us modify the static final field
if (Modifier.isFinal(field.getModifiers())) {
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(field);
// blank out the final bit in the modifiers int
modifiers &= ~Modifier.FINAL;
modifiersField.setInt(field, modifiers);
}
try {
if (target == null) field.set(null, value);
else field.set(target, value);
} catch (NoSuchMethodError error) {
field.set(target, value);
}
}
private static void blankField(Class<?> enumClass, String fieldName)
throws NoSuchFieldException, IllegalAccessException {
for (Field field : Class.class.getDeclaredFields()) {
if (field.getName().contains(fieldName)) {
AccessibleObject.setAccessible(new Field[]{field}, true);
setFailsafeFieldValue(field, enumClass, null);
break;
}
}
}
private static void cleanEnumCache(Class<?> enumClass)
throws NoSuchFieldException, IllegalAccessException {
blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6
blankField(enumClass, "enumConstants"); // IBM JDK
}
} }