Skip to content

Commit

Permalink
Make this experiment use Paper's integration
Browse files Browse the repository at this point in the history
This results in much faster execution times comparable to the current system. However, it also means that Spigot is no longer supported, and versions below 1.17 won't work. (Paper 1.17+ only now)
  • Loading branch information
APickledWalrus committed Jul 24, 2022
1 parent c10ec7d commit a6566f3
Show file tree
Hide file tree
Showing 15 changed files with 201 additions and 284 deletions.
16 changes: 10 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ dependencies {
shadow group: 'io.papermc', name: 'paperlib', version: '1.0.7'
shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.0.0'
implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.19-R0.1-SNAPSHOT'
shadow group: 'net.kyori', name: 'adventure-text-minimessage', version: '4.11.0-SNAPSHOT'
shadow group: 'net.kyori', name: 'adventure-platform-bukkit', version: '4.1.1-SNAPSHOT'
shadow group: 'net.kyori', name: 'adventure-text-serializer-legacy', version: '4.11.0-SNAPSHOT'
shadow group: 'net.kyori', name: 'adventure-text-serializer-plain', version: '4.11.0-SNAPSHOT'
implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.2.600'
implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1'
Expand Down Expand Up @@ -75,9 +74,15 @@ tasks.withType(ShadowJar) {
configurations = [
project.configurations.shadow
]
dependencies {
include(dependency('io.papermc:paperlib'))
include(dependency('org.bstats:bstats-bukkit'))
include(dependency('org.bstats:bstats-base'))
include(dependency('net.kyori:adventure-text-serializer-legacy'))
include(dependency('net.kyori:adventure-text-serializer-plain'))
}
relocate 'io.papermc.lib', 'ch.njol.skript.paperlib'
relocate 'org.bstats', 'ch.njol.skript.bstats'
relocate 'net.kyori', 'ch.njol.skript.kyori'
manifest {
attributes(
'Name': 'ch/njol/skript',
Expand Down Expand Up @@ -187,7 +192,7 @@ void createTestTask(String name, String environments, boolean devMode, int javaV

def latestEnv = 'java17/paper-1.19.json'
def latestJava = 17
def oldestJava = 8
def oldestJava = 17

tasks.withType(JavaCompile).configureEach {
options.compilerArgs += ["-source", "" + oldestJava, "-target", "" + oldestJava]
Expand All @@ -196,11 +201,10 @@ tasks.withType(JavaCompile).configureEach {
// Register different Skript testing tasks
createTestTask('quickTest', 'src/test/skript/environments/' + latestEnv, false, latestJava, false)
createTestTask('skriptTestJava17', 'src/test/skript/environments/java17', false, latestJava, false)
createTestTask('skriptTestJava8', 'src/test/skript/environments/java8', false, oldestJava, false)
createTestTask('skriptTestDev', 'src/test/skript/environments/' + (project.property('testEnv') == null
? latestEnv : project.property('testEnv') + '.json'), true, Integer.parseInt(project.property('testEnvJavaVersion') == null
? latestJava : project.property('testEnvJavaVersion')), false)
tasks.register('skriptTest') {dependsOn skriptTestJava8, skriptTestJava17}
tasks.register('skriptTest') {dependsOn skriptTestJava17}
createTestTask('genDocs', 'src/test/skript/environments/' + (project.property('testEnv') == null
? latestEnv : project.property('testEnv') + '.json'), false, Integer.parseInt(project.property('testEnvJavaVersion') == null
? latestJava : project.property('testEnvJavaVersion')), true)
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/ch/njol/skript/Skript.java
Original file line number Diff line number Diff line change
Expand Up @@ -1742,7 +1742,7 @@ static void logEx(final String... lines) {
// }

public static void info(final CommandSender sender, final String info) {
ComponentHandler.audienceFrom(sender).sendMessage(SKRIPT_PREFIX_COMPONENT.append(ComponentHandler.parse(info)));
sender.sendMessage(SKRIPT_PREFIX_COMPONENT.append(ComponentHandler.parse(info)));
}

/**
Expand All @@ -1765,11 +1765,11 @@ public static void adminBroadcast(final String message) {
* @param info
*/
public static void message(final CommandSender sender, final String info) {
ComponentHandler.audienceFrom(sender).sendMessage(ComponentHandler.parse(info));
sender.sendMessage(ComponentHandler.parse(info));
}

public static void error(final CommandSender sender, final String error) {
ComponentHandler.audienceFrom(sender).sendMessage(SKRIPT_PREFIX_COMPONENT.append(ComponentHandler.parse(error).color(NamedTextColor.DARK_RED)));
sender.sendMessage(SKRIPT_PREFIX_COMPONENT.append(ComponentHandler.parse(error).color(NamedTextColor.DARK_RED)));
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/ch/njol/skript/command/ScriptCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public boolean execute(final CommandSender sender, final String commandLabel, fi
final ScriptCommandEvent event = new ScriptCommandEvent(ScriptCommand.this, sender);

if (!permission.isEmpty() && !sender.hasPermission(permission)) {
ComponentHandler.audienceFrom(sender).sendMessage(ComponentHandler.parseFromSingleExpression(event, permissionMessage));
sender.sendMessage(ComponentHandler.parseFromSingleExpression(event, permissionMessage));
return false;
}

Expand Down
134 changes: 58 additions & 76 deletions src/main/java/ch/njol/skript/expressions/ExprName.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,21 @@
*/
package ch.njol.skript.expressions;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.ArrayList;
import java.util.List;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.Aliases;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.util.slot.Slot;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.GameRule;
import org.bukkit.Nameable;
Expand All @@ -41,21 +50,8 @@
import org.bukkit.inventory.meta.ItemMeta;
import org.eclipse.jdt.annotation.Nullable;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.Aliases;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.util.slot.Slot;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import net.md_5.bungee.api.ChatColor;
import java.util.ArrayList;
import java.util.List;

@Name("Name / Display Name / Tab List Name")
@Description({"Represents the Minecraft account, display or tab list name of a player, or the custom name of an item, entity, block, inventory, or gamerule.",
Expand Down Expand Up @@ -99,24 +95,14 @@
" set the player's tab list name to \"<green>%player's name%\"",
"set the name of the player's tool to \"Legendary Sword of Awesomeness\""})
@Since("before 2.1, 2.2-dev20 (inventory name), 2.4 (non-living entity support, changeable inventory name)")
public class ExprName extends SimplePropertyExpression<Object, String> {

@Nullable
static final MethodHandle TITLE_METHOD;
static final boolean HAS_GAMERULES;
public class ExprName extends SimplePropertyExpression<Object, Component> {

static {
HAS_GAMERULES = Skript.classExists("org.bukkit.GameRule");
register(ExprName.class, String.class, "(1¦name[s]|2¦(display|nick|chat|custom)[ ]name[s])", "offlineplayers/entities/blocks/itemtypes/inventories/slots"
+ (HAS_GAMERULES ? "/gamerules" : ""));
register(ExprName.class, String.class, "(3¦(player|tab)[ ]list name[s])", "players");

// Get the old method for getting the name of an inventory.
MethodHandle _METHOD = null;
try {
_METHOD = MethodHandles.lookup().findVirtual(Inventory.class, "getTitle", MethodType.methodType(String.class));
} catch (IllegalAccessException | NoSuchMethodException ignored) {}
TITLE_METHOD = _METHOD;
register(ExprName.class, Component.class,
"(1:name[s]|2:(display|nick|chat|custom)[ ]name[s])",
"offlineplayers/entities/blocks/itemtypes/inventories/slots/gamerules"
);
register(ExprName.class, Component.class, "(3:(player|tab)[ ]list name[s])", "players");
}

/*
Expand All @@ -137,51 +123,45 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye

@Override
@Nullable
public String convert(Object o) {
public Component convert(Object o) {
if (o instanceof OfflinePlayer && ((OfflinePlayer) o).isOnline())
o = ((OfflinePlayer) o).getPlayer();

if (o instanceof Player) {
switch (mark) {
case 1:
return ((Player) o).getName();
return ((Player) o).name();
case 2:
return ((Player) o).getDisplayName();
return ((Player) o).displayName();
case 3:
return ((Player) o).getPlayerListName();
return ((Player) o).playerListName();
}
} else if (o instanceof OfflinePlayer) {
return mark == 1 ? ((OfflinePlayer) o).getName() : null;
if (mark != 1)
return null;
String name = ((OfflinePlayer) o).getName();
return name != null ? Component.text(name) : null;
} else if (o instanceof Entity) {
return ((Entity) o).getCustomName();
return ((Entity) o).customName();
} else if (o instanceof Block) {
BlockState state = ((Block) o).getState();
if (state instanceof Nameable)
return ((Nameable) state).getCustomName();
return ((Nameable) state).customName();
} else if (o instanceof ItemType) {
ItemMeta m = ((ItemType) o).getItemMeta();
return m.hasDisplayName() ? m.getDisplayName() : null;
return m.hasDisplayName() ? m.displayName() : null;
} else if (o instanceof Inventory) {
if (TITLE_METHOD != null) {
try {
return (String) TITLE_METHOD.invoke(o);
} catch (Throwable e) {
Skript.exception(e);
return null;
}
} else {
if (!((Inventory) o).getViewers().isEmpty())
return ((Inventory) o).getViewers().get(0).getOpenInventory().getTitle();
return null;
}
if (!((Inventory) o).getViewers().isEmpty())
return ((Inventory) o).getViewers().get(0).getOpenInventory().title();
return null;
} else if (o instanceof Slot) {
ItemStack is = ((Slot) o).getItem();
if (is != null && is.hasItemMeta()) {
ItemMeta m = is.getItemMeta();
return m.hasDisplayName() ? m.getDisplayName() : null;
return m.hasDisplayName() ? m.displayName() : null;
}
} else if (HAS_GAMERULES && o instanceof GameRule) {
return ((GameRule) o).getName();
} else if (o instanceof GameRule) {
return Component.text(((GameRule) o).getName());
}
return null;
}
Expand All @@ -194,40 +174,40 @@ public Class<?>[] acceptChange(ChangeMode mode) {
Skript.error("Can't change the Minecraft name of a player. Change the 'display name' or 'tab list name' instead.");
return null;
}
return CollectionUtils.array(String.class);
return CollectionUtils.array(Component.class);
}
return null;
}

@Override
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
String name = delta != null ? (String) delta[0] : null;
Component name = delta != null ? (Component) delta[0] : null;
for (Object o : getExpr().getArray(e)) {
if (o instanceof Player) {
switch (mark) {
case 2:
((Player) o).setDisplayName(name != null ? name + ChatColor.RESET : ((Player) o).getName());
((Player) o).displayName(name);
break;
case 3: // Null check not necessary. This method will use the player's name if 'name' is null.
((Player) o).setPlayerListName(name);
case 3:
((Player) o).playerListName(name);
break;
}
} else if (o instanceof Entity) {
((Entity) o).setCustomName(name);
((Entity) o).customName(name);
if (mark == 2 || mode == ChangeMode.RESET) // Using "display name"
((Entity) o).setCustomNameVisible(name != null);
if (o instanceof LivingEntity)
((LivingEntity) o).setRemoveWhenFarAway(name == null);
} else if (o instanceof Block) {
BlockState state = ((Block) o).getState();
if (state instanceof Nameable) {
((Nameable) state).setCustomName(name);
((Nameable) state).customName(name);
state.update();
}
} else if (o instanceof ItemType) {
ItemType i = (ItemType) o;
ItemMeta m = i.getItemMeta();
m.setDisplayName(name);
m.displayName(name);
i.setItemMeta(m);
} else if (o instanceof Inventory) {
Inventory inv = (Inventory) o;
Expand All @@ -241,7 +221,7 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
if (!type.isCreatable())
return;
if (name == null)
name = type.getDefaultTitle();
name = type.defaultTitle();

Inventory copy;
if (type == InventoryType.CHEST) {
Expand All @@ -256,7 +236,7 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
ItemStack is = s.getItem();
if (is != null && !AIR.isOfType(is)) {
ItemMeta m = is.hasItemMeta() ? is.getItemMeta() : Bukkit.getItemFactory().getItemMeta(is.getType());
m.setDisplayName(name);
m.displayName(name);
is.setItemMeta(m);
s.setItem(is);
}
Expand All @@ -265,17 +245,19 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
}

@Override
public Class<String> getReturnType() {
return String.class;
public Class<Component> getReturnType() {
return Component.class;
}

@Override
protected String getPropertyName() {
switch (mark) {
case 1: return "name";
case 2: return "display name";
case 3: return "tablist name";
default: return "name";
case 2:
return "display name";
case 3:
return "tablist name";
default:
return "name";
}
}

Expand Down
Loading

0 comments on commit a6566f3

Please sign in to comment.