Skip to content

Commit

Permalink
Merge branch 'dev/feature' into feature/total-experience-get-xp
Browse files Browse the repository at this point in the history
  • Loading branch information
erenkarakal authored Feb 5, 2025
2 parents 2f979f5 + e1565dc commit 18a8ecc
Show file tree
Hide file tree
Showing 16 changed files with 426 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,11 @@ public boolean supportsNameChange() {
@Override
public void setName(String name) {
BlockState state = block.getState();
if (state instanceof Nameable nameable)
if (state instanceof Nameable nameable) {
//noinspection deprecation
nameable.setCustomName(name);
state.update(true, false);
}
}
},
//</editor-fold>
Expand Down
50 changes: 48 additions & 2 deletions src/main/java/ch/njol/skript/classes/data/SkriptClasses.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,21 @@
import ch.njol.skript.util.visual.VisualEffect;
import ch.njol.skript.util.visual.VisualEffects;
import ch.njol.yggdrasil.Fields;
import org.skriptlang.skript.lang.util.SkriptQueue;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.script.Script;
import org.skriptlang.skript.lang.util.SkriptQueue;
import org.skriptlang.skript.util.Executable;

import java.io.File;
import java.io.NotSerializableException;
import java.io.StreamCorruptedException;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -731,7 +733,51 @@ public void change(SkriptQueue[] what, Object @Nullable [] delta, ChangeMode mod
}
}
})
.serializer(new YggdrasilSerializer<>())
.parser(new Parser<SkriptQueue>() {

@Override
public boolean canParse(ParseContext context) {
return false;
}

@Override
public String toString(SkriptQueue queue, int flags) {
return Classes.toString(queue.toArray(), flags, true);
}

@Override
public String toVariableNameString(SkriptQueue queue) {
return this.toString(queue, 0);
}

})
.serializer(new Serializer<SkriptQueue>() {
@Override
public Fields serialize(SkriptQueue queue) throws NotSerializableException {
Fields fields = new Fields();
fields.putObject("contents", queue.toArray());
return fields;
}

@Override
public void deserialize(SkriptQueue queue, Fields fields)
throws StreamCorruptedException, NotSerializableException {
Object[] contents = fields.getObject("contents", Object[].class);
queue.clear();
if (contents != null)
queue.addAll(List.of(contents));
}

@Override
public boolean mustSyncDeserialization() {
return false;
}

@Override
protected boolean canBeInstantiated() {
return true;
}
})
);


Expand Down
5 changes: 3 additions & 2 deletions src/main/java/ch/njol/skript/effects/EffConnect.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ public class EffConnect extends Effect {

static {
Skript.registerEffect(EffConnect.class,
"(send|connect) %players% to [proxy|bungeecord] [server] %string%",
"connect %players% to [proxy|bungeecord] [server] %string%",
"send %players% to [proxy|bungeecord] server %string%",
"transfer %players% to server %string% [on port %-number%]"
);
}
Expand All @@ -51,7 +52,7 @@ public class EffConnect extends Effect {
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
players = (Expression<Player>) exprs[0];
server = (Expression<String>) exprs[1];
transfer = matchedPattern == 1;
transfer = matchedPattern == 2;

if (transfer) {
port = (Expression<Number>) exprs[2];
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/ch/njol/skript/expressions/ExprName.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ public class ExprName extends SimplePropertyExpression<Object, String> {
serializer = BungeeComponentSerializer.get();

List<String> patterns = new ArrayList<>();
patterns.addAll(Arrays.asList(getPatterns("name[s]", "offlineplayers/entities/inventories/nameds")));
patterns.addAll(Arrays.asList(getPatterns("(display|nick|chat|custom)[ ]name[s]", "offlineplayers/entities/inventories/nameds")));
patterns.addAll(Arrays.asList(getPatterns("name[s]", "offlineplayers/entities/nameds/inventories")));
patterns.addAll(Arrays.asList(getPatterns("(display|nick|chat|custom)[ ]name[s]", "offlineplayers/entities/nameds/inventories")));
patterns.addAll(Arrays.asList(getPatterns("(player|tab)[ ]list name[s]", "players")));

Skript.registerExpression(ExprName.class, String.class, ExpressionType.COMBINED, patterns.toArray(new String[0]));
Expand Down
18 changes: 16 additions & 2 deletions src/main/java/ch/njol/skript/lang/SkriptParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import ch.njol.skript.lang.function.ExprFunctionCall;
import ch.njol.skript.lang.function.FunctionReference;
import ch.njol.skript.lang.function.Functions;
import ch.njol.skript.lang.parser.ParseStackOverflowException;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.lang.parser.ParsingStack;
import ch.njol.skript.lang.util.SimpleLiteral;
import ch.njol.skript.localization.Language;
import ch.njol.skript.localization.Message;
Expand Down Expand Up @@ -183,6 +185,7 @@ public boolean hasTag(String tag) {
}

private <T extends SyntaxElement> @Nullable T parse(Iterator<? extends SyntaxElementInfo<? extends T>> source) {
ParsingStack parsingStack = getParser().getParsingStack();
try (ParseLogHandler log = SkriptLogger.startParseLogHandler()) {
while (source.hasNext()) {
SyntaxElementInfo<? extends T> info = source.next();
Expand All @@ -193,15 +196,24 @@ public boolean hasTag(String tag) {
assert pattern != null;
ParseResult parseResult;
try {
parsingStack.push(new ParsingStack.Element(info, patternIndex));
parseResult = parse_i(pattern);
} catch (MalformedPatternException e) {
String message = "pattern compiling exception, element class: " + info.getElementClass().getName();
try {
JavaPlugin providingPlugin = JavaPlugin.getProvidingPlugin(info.getElementClass());
message += " (provided by " + providingPlugin.getName() + ")";
} catch (IllegalArgumentException | IllegalStateException ignored) {}
throw new RuntimeException(message, e);
} catch (IllegalArgumentException | IllegalStateException ignored) { }

throw new RuntimeException(message, e);
} catch (StackOverflowError e) {
// Parsing caused a stack overflow, possibly due to too long lines
throw new ParseStackOverflowException(e, new ParsingStack(parsingStack));
} finally {
// Recursive parsing call done, pop the element from the parsing stack
ParsingStack.Element stackElement = parsingStack.pop();

assert stackElement.syntaxElementInfo() == info && stackElement.patternIndex() == patternIndex;
}
if (parseResult != null) {
assert parseResult.source != null; // parse results from parse_i have a source
Expand Down Expand Up @@ -249,6 +261,8 @@ public boolean hasTag(String tag) {
}
}
}

// No successful syntax elements parsed, print errors and return
log.printError();
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ch.njol.skript.lang.parser;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

/**
* An exception noting that a {@link StackOverflowError} has occurred
* during Skript parsing. Contains information about the {@link ParsingStack}
* from when the stack overflow occurred.
*/
public class ParseStackOverflowException extends RuntimeException {

protected final ParsingStack parsingStack;

public ParseStackOverflowException(StackOverflowError cause, ParsingStack parsingStack) {
super(createMessage(parsingStack), cause);
this.parsingStack = parsingStack;
}

/**
* Creates the exception message from the given {@link ParsingStack}.
*/
private static String createMessage(ParsingStack stack) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();

PrintStream printStream = new PrintStream(stream);
stack.print(printStream);

return stream.toString();
}

}
27 changes: 18 additions & 9 deletions src/main/java/ch/njol/skript/lang/parser/ParserInstance.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,7 @@
import org.skriptlang.skript.lang.structure.Structure;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;

public final class ParserInstance implements Experimented {
Expand Down Expand Up @@ -461,6 +457,19 @@ public String getIndentation() {
return indentation;
}

// Parsing stack

private final ParsingStack parsingStack = new ParsingStack();

/**
* Gets the current parsing stack.
* <p>
* Although the stack can be modified, doing so is not recommended.
*/
public ParsingStack getParsingStack() {
return parsingStack;
}

// Experiments API

@Override
Expand Down Expand Up @@ -705,8 +714,8 @@ public HashMap<String, String> getCurrentOptions() {
@Deprecated
public @Nullable SkriptEvent getCurrentSkriptEvent() {
Structure structure = getCurrentStructure();
if (structure instanceof SkriptEvent)
return (SkriptEvent) structure;
if (structure instanceof SkriptEvent event)
return event;
return null;
}

Expand All @@ -715,15 +724,15 @@ public HashMap<String, String> getCurrentOptions() {
*/
@Deprecated
public void setCurrentSkriptEvent(@Nullable SkriptEvent currentSkriptEvent) {
setCurrentStructure(currentSkriptEvent);
this.setCurrentStructure(currentSkriptEvent);
}

/**
* @deprecated Use {@link #setCurrentStructure(Structure)} with 'null'.
*/
@Deprecated
public void deleteCurrentSkriptEvent() {
setCurrentStructure(null);
this.setCurrentStructure(null);
}

/**
Expand Down
Loading

0 comments on commit 18a8ecc

Please sign in to comment.