Class Variable<T>
- All Implemented Interfaces:
Debuggable,Expression<T>,KeyProviderExpression<T>,KeyReceiverExpression<T>,Loopable<T>,Simplifiable<Expression<? extends T>>,SyntaxElement
-
Field Summary
Fields -
Method Summary
Modifier and TypeMethodDescriptionClass<?> @Nullable []Tests whether this expression supports the given mode, and if yes what type it expects thedeltato be.booleanWhile all keyed expressions may offer their keys, some may prefer that they are not used unless strictly required (e.g.booleanReturns whether this expression can return keys.voidchange(org.bukkit.event.Event event, Object @NotNull [] delta, Changer.ChangeMode mode, @NotNull String @NotNull [] keys) An alternative changer method that provides a set of keys as well as a set of values.voidchange(org.bukkit.event.Event event, Object @Nullable [] delta, Changer.ChangeMode mode) Changes the expression's value by the given amount.<R> voidchangeInPlace(org.bukkit.event.Event event, Function<T, R> changeFunction) Changes the contents of an expression using the givenFunction.<R> voidchangeInPlace(org.bukkit.event.Event event, Function<T, R> changeFunction, boolean getAll) Changes the contents of an expression using the givenFunction.booleanChecks this expression against the given checker.booleanChecks this expression against the given checker.static <T> TconvertIfOldPlayer(String key, boolean local, org.bukkit.event.Event event, T object) T[]getAll(org.bukkit.event.Event event) Gets all possible return values of this expression, i.e.@NotNull String @NotNull []getAllKeys(org.bukkit.event.Event event) A set of keys, matching the length and order of the immediately-previousExpression.getAll(Event)values array.booleangetAnd()Returns true if this expression returns all possible values, false if it only returns some of them.T[]getArray(org.bukkit.event.Event event) Get all the values of this expression.@NotNull String @NotNull []getArrayKeys(org.bukkit.event.Event event) A set of keys, matching the length and order of the immediately-previousExpression.getArray(Event)values array.<R> Variable<R> getConvertedExpression(Class<R>... to) Tries to convert this expression to the given type.getName()@Nullable ObjectgetRaw(org.bukkit.event.Event event) Gets the value of this variable as stored in the variables map.Gets the return type of this expression.getSingle(org.bukkit.event.Event event) Get the single value of this expression.Expression<?> Returns the original expression that was parsed, i.e.intgetTime()booleaninit(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) Called just after the constructor andSyntaxElement.preInit().booleanReturns whether this value represents the default value of its type for the event, i.e.booleanbooleanisList()booleanisLocal()booleanChecks whether the given 'loop-...' expression should match this loop, e.g.booleanisSingle()Keyed expressions should never be single.static booleanisValidVariableName(String name, boolean allowListVariable, boolean printErrors) Checks whether a string is a valid variable name.iterator(org.bukkit.event.Event event) Returns the same asExpression.getArray(Event)but as an iterator.keyedIterator(org.bukkit.event.Event event) Returns an iterator over the keyed values of this expression.static <T> @Nullable Variable<T> newInstance(String name, Class<? extends T>[] types) Creates a new variable instance with the given name and types.For expressions that might return multiple (incalculable at parse time) types, this provides a list of all possible types.booleansetTime(int time) Sets the time of this expression, i.e.Expression<? extends T> simplify()Simplifies this object.booleanChecks whether the expression allows using 'next loop-value' when provided as the iterator for a SecLoop.toString()Should returntoString(null, false)toString(@Nullable org.bukkit.event.Event event, boolean debug) variablesIterator(org.bukkit.event.Event event) Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface ch.njol.skript.lang.Expression
beforeChange, canBeSingle, canReturn, getAcceptedChangeModes, getOptionalSingle, getSyntaxTypeName, stream, streamAllMethods inherited from interface ch.njol.skript.lang.KeyProviderExpression
isIndexLoopMethods inherited from interface ch.njol.skript.lang.SyntaxElement
getParser, preInit
-
Field Details
-
SEPARATOR
- See Also:
-
LOCAL_VARIABLE_TOKEN
- See Also:
-
EPHEMERAL_VARIABLE_TOKEN
- See Also:
-
-
Method Details
-
isValidVariableName
public static boolean isValidVariableName(String name, boolean allowListVariable, boolean printErrors) Checks whether a string is a valid variable name. This is used to verify variable names as well as command and function arguments.- Parameters:
name- The name to testallowListVariable- Whether to allow a list variableprintErrors- Whether to print errors when they are encountered- Returns:
- true if the name is valid, false otherwise.
-
newInstance
@Nullable public static <T> @Nullable Variable<T> newInstance(String name, Class<? extends T>[] types) Creates a new variable instance with the given name and types. Prints errors.- Type Parameters:
T- The supertype the variable is expected to be.- Parameters:
name- The raw name of the variable.types- The types this variable is expected to be.- Returns:
- A new variable instance, or null if the name is invalid or the variable could not be created.
-
init
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) Description copied from interface:SyntaxElementCalled just after the constructor andSyntaxElement.preInit().- Specified by:
initin interfaceSyntaxElement- Parameters:
expressions- all %expr%s included in the matching pattern in the order they appear in the pattern. If an optional value was left out, it will still be included in this list holding the default value of the desired type, which usually depends on the event.matchedPattern- The index of the pattern which matchedisDelayed- Whether this expression is used after a delay or not (i.e. if the event has already passed when this expression will be called)parseResult- Additional information about the match.- Returns:
- Whether this expression was initialised successfully. An error should be printed prior to returning false to specify the cause.
- See Also:
-
isLocal
public boolean isLocal()- Returns:
- Whether this variable is a local variable, i.e. starts with
LOCAL_VARIABLE_TOKEN.
-
isEphemeral
public boolean isEphemeral()- Returns:
- Whether this variable is an ephemeral variable, i.e. starts with
EPHEMERAL_VARIABLE_TOKEN.
-
isList
public boolean isList()- Returns:
- Whether this variable is a list variable, i.e. ends with
+ "*".
-
isSingle
public boolean isSingle()Description copied from interface:KeyProviderExpressionKeyed expressions should never be single.- Specified by:
isSinglein interfaceExpression<T>- Specified by:
isSinglein interfaceKeyProviderExpression<T>- Returns:
- true if this expression will ever only return one value at most, false if it can return multiple values.
-
getReturnType
Description copied from interface:ExpressionGets the return type of this expression.- Specified by:
getReturnTypein interfaceExpression<T>- Returns:
- A supertype of any objects returned by
Expression.getSingle(Event)and the component type of any arrays returned byExpression.getArray(Event)
-
possibleReturnTypes
Description copied from interface:ExpressionFor expressions that might return multiple (incalculable at parse time) types, this provides a list of all possible types. Use cases include: expressions that depend on the return type of their input.- Specified by:
possibleReturnTypesin interfaceExpression<T>- Returns:
- A list of all possible types this might return
-
toString
- Specified by:
toStringin interfaceDebuggable- Parameters:
event- The event to get information from. This is always null if debug == false.debug- If true this should print more information, if false this should print what is shown to the end user- Returns:
- String representation of this object
-
toString
Description copied from interface:DebuggableShould returntoString(null, false)- Specified by:
toStringin interfaceDebuggable- Overrides:
toStringin classObject
-
getConvertedExpression
Description copied from interface:ExpressionTries to convert this expression to the given type. This method can print an error prior to returning null to specify the cause.Please note that expressions whose
returnTypeis not Object will not be parsed at all for a certain class if there's no converter from the expression's returnType to the desired class. Thus this method should only be overridden if this expression's returnType is Object.The returned expression should delegate this method to the original expression's method to prevent excessive converted expression chains (see also
ConvertedExpression).- Specified by:
getConvertedExpressionin interfaceExpression<T>- Parameters:
to- The desired return type of the returned expression- Returns:
- Expression with the desired return type or null if the expression can't be converted to the given type. Returns the expression itself if it already returns the desired type.
- See Also:
-
getRaw
Gets the value of this variable as stored in the variables map. This method also checks against default variables. -
convertIfOldPlayer
@Nullable public static <T> T convertIfOldPlayer(String key, boolean local, org.bukkit.event.Event event, @Nullable T object) -
keyedIterator
Description copied from interface:KeyProviderExpressionReturns an iterator over the keyed values of this expression.
This should only be called iffKeyProviderExpression.canReturnKeys()returnstrue.- Specified by:
keyedIteratorin interfaceKeyProviderExpression<T>- Parameters:
event- The event context- Returns:
- An iterator over the key-value pairs of this expression
-
variablesIterator
-
iterator
Description copied from interface:LoopableReturns the same asExpression.getArray(Event)but as an iterator. This method should be overridden by expressions intended to be looped to increase performance. -
acceptChange
Description copied from interface:ExpressionTests whether this expression supports the given mode, and if yes what type it expects thedeltato be.Use
Changer.ChangerUtils.acceptsChange(Expression, ChangeMode, Class...)to test whether an expression supports changing, don't directly use this method!Please note that if a changer is registered for this expression's
returnTypethis method does not have to be overridden. If you override it though make sure to return super.acceptChange(mode), and to handle the appropriate ChangeMode(s) inExpression.change(Event, Object[], ChangeMode)with super.change(...).Unlike
Changer.acceptChange(ChangeMode)this method may print errors.- Specified by:
acceptChangein interfaceExpression<T>- Parameters:
mode- The mode to check- Returns:
- An array of types that
Expression.change(Event, Object[], ChangeMode)accepts as itsdeltaparameter (which can be arrays to denote that multiple of that type are accepted), or null if the given mode is not supported. ForChanger.ChangeMode.DELETEandChanger.ChangeMode.RESETthis can return any non-null array to mark them as supported.
-
change
public void change(org.bukkit.event.Event event, Object @NotNull [] delta, Changer.ChangeMode mode, @NotNull @NotNull String @NotNull [] keys) Description copied from interface:KeyReceiverExpressionAn alternative changer method that provides a set of keys as well as a set of values. This is only ever called forChanger.ChangeMode.supportsKeyedChange()safe change modes, where a set of values is provided. (This will never be called for valuelessChanger.ChangeMode.DELETEorChanger.ChangeMode.RESETchangers, for example.)- Specified by:
changein interfaceKeyReceiverExpression<T>- Parameters:
event- The current event contextdelta- The change valuesmode- The key-safe change modeChanger.ChangeMode.SETkeys- The keys, matching the length and order of the values array
-
change
public void change(org.bukkit.event.Event event, Object @Nullable [] delta, Changer.ChangeMode mode) throws UnsupportedOperationException Description copied from interface:ExpressionChanges the expression's value by the given amount. This will only be called on supported modes and with the desireddeltatype as returned byExpression.acceptChange(ChangeMode)- Specified by:
changein interfaceExpression<T>- Parameters:
event- The eventdelta- An array with one or more instances of one or more of the classes returned byExpression.acceptChange(ChangeMode)for the given change mode (null forChanger.ChangeMode.DELETEandChanger.ChangeMode.RESET). This can be a Object[], thus casting is not allowed.mode- TheChanger.ChangeModeof the attempted change- Throws:
UnsupportedOperationException- (optional) - If this method was called on an unsupported ChangeMode.
-
changeInPlace
public <R> void changeInPlace(org.bukkit.event.Event event, Function<T, R> changeFunction, boolean getAll) Changes the contents of an expression using the givenFunction. Intended for changes that change properties of the values of the expression, rather than completely changing the expression. For example,set vector length of {_v} to 1, rather thanset {_v} to vector(0,1,0).
This is a 1 to 1 transformation and should not add elements. Returning null will remove the element. Returning a type not accepted byExpression.acceptChange(ChangeMode)forChanger.ChangeMode.SETwill depend on the implementer. The default implementation will remove the element.
This expression must supportChanger.ChangeMode.SETfor this method to work.- Specified by:
changeInPlacein interfaceExpression<T>- Type Parameters:
R- The output type of the change function. Must be a type returned by {Expression.acceptChange(ChangeMode)} forChanger.ChangeMode.SET.- Parameters:
event- The event to use for local variables and evaluationchangeFunction- A 1-to-1 function that transforms a single input to a single output. Returning null will remove the element. Returning a type not accepted byExpression.acceptChange(ChangeMode)forChanger.ChangeMode.SETwill depend on the implementer. The default implementation will remove the element.getAll- This has no effect for a Variable, asgetArray(Event)is the same asgetAll(Event).
-
changeInPlace
Description copied from interface:ExpressionChanges the contents of an expression using the givenFunction. Intended for changes that change properties of the values of the expression, rather than completely changing the expression. For example,set vector length of {_v} to 1, rather thanset {_v} to vector(0,1,0).
This is a 1 to 1 transformation and should not add elements. Returning null will remove the element. Returning a type not accepted byExpression.acceptChange(ChangeMode)forChanger.ChangeMode.SETwill depend on the implementer. The default implementation will remove the element.
This expression must supportChanger.ChangeMode.SETfor this method to work.- Specified by:
changeInPlacein interfaceExpression<T>- Type Parameters:
R- The output type of the change function. Must be a type returned by {Expression.acceptChange(ChangeMode)} forChanger.ChangeMode.SET.- Parameters:
event- The event to use for local variables and evaluationchangeFunction- A 1-to-1 function that transforms a single input to a single output. Returning null will remove the element. Returning a type not accepted byExpression.acceptChange(ChangeMode)forChanger.ChangeMode.SETwill depend on the implementer. The default implementation will remove the element.
-
getSingle
Description copied from interface:ExpressionGet the single value of this expression.This method may only return null if it always returns null for the given event, i.e. it is equivalent to getting a random element out of
Expression.getAll(Event)or null iff that array is empty.Do not use this in conditions, use
Expression.check(Event, Predicate, boolean)instead.- Specified by:
getSinglein interfaceExpression<T>- Parameters:
event- The event- Returns:
- The value or null if this expression doesn't have any value for the event
-
getArrayKeys
@NotNull public @NotNull String @NotNull [] getArrayKeys(org.bukkit.event.Event event) throws SkriptAPIException Description copied from interface:KeyProviderExpressionA set of keys, matching the length and order of the immediately-previousExpression.getArray(Event)values array.
This should only be called immediately after aExpression.getArray(Event)invocation, and iffKeyProviderExpression.canReturnKeys()returnstrue. If it is called without a matching values request (or after a delay) then the behaviour is undefined, in which case:- the method may throw an error,
- the method may return keys not matching any previous values,
- or the method may return nothing at all.
- Specified by:
getArrayKeysin interfaceKeyProviderExpression<T>- Parameters:
event- The event context- Returns:
- A set of keys, of the same length as
Expression.getArray(Event) - Throws:
SkriptAPIException
-
getAllKeys
Description copied from interface:KeyProviderExpressionA set of keys, matching the length and order of the immediately-previousExpression.getAll(Event)values array.
This should only be called immediately after aExpression.getAll(Event)invocation, and iffKeyProviderExpression.canReturnKeys()returnstrue. If it is called without a matching values request (or after a delay) then the behaviour is undefined, in which case:- the method may throw an error,
- the method may return keys not matching any previous values,
- or the method may return nothing at all.
- Specified by:
getAllKeysin interfaceKeyProviderExpression<T>- Parameters:
event- The event context- Returns:
- A set of keys, of the same length as
Expression.getAll(Event)
-
canReturnKeys
public boolean canReturnKeys()Description copied from interface:KeyProviderExpressionReturns whether this expression can return keys.
If this returns false, thenKeyProviderExpression.getArrayKeys(Event)andKeyProviderExpression.getAllKeys(Event)should never be called.- Specified by:
canReturnKeysin interfaceKeyProviderExpression<T>- Returns:
- Whether this expression can return keys
-
areKeysRecommended
public boolean areKeysRecommended()Description copied from interface:KeyProviderExpressionWhile all keyed expressions may offer their keys, some may prefer that they are not used unless strictly required (e.g. variables).- Specified by:
areKeysRecommendedin interfaceKeyProviderExpression<T>- Returns:
- Whether the caller is recommended to ask for keys after asking for values
-
getArray
Description copied from interface:ExpressionGet all the values of this expression. The returned array is empty if this expression doesn't have any values for the given event.The returned array must not contain any null values.
Do not use this in conditions, use
Expression.check(Event, Predicate, boolean)instead.- Specified by:
getArrayin interfaceExpression<T>- Parameters:
event- The event- Returns:
- An array of values of this expression which must neither be null nor contain nulls, and which must not be an internal array.
-
getAll
Description copied from interface:ExpressionGets all possible return values of this expression, i.e. it returns the same asExpression.getArray(Event)ifExpression.getAnd()is true, otherwise all possible values forExpression.getSingle(Event).- Specified by:
getAllin interfaceExpression<T>- Parameters:
event- The event- Returns:
- An array of all possible values of this expression for the given event which must neither be null nor contain nulls, and which must not be an internal array.
-
isLoopOf
Description copied from interface:LoopableChecks whether the given 'loop-...' expression should match this loop, e.g. loop-block matches any loops that loop through blocks and loop-argument matches an argument loop.You should usually just return false as e.g. loop-block will automatically match the expression if its returnType is Block or a subtype of it.
-
check
Description copied from interface:ExpressionChecks this expression against the given checker. This is the normal version of this method and the one which must be used for simple checks, or as the innermost check of nested checks.Usual implementation (may differ, e.g. may return false for nonexistent values independent of negated):
return negated ^
Expression.check(Event, Predicate);- Specified by:
checkin interfaceExpression<T>- Parameters:
event- The event to be used for evaluationchecker- The checker that determines whether this expression matchesnegated- The checking condition's negated state. This is used to invert the output of the checker if set to true (i.e. negated ^ checker.check(...))- Returns:
- Whether this expression matches or doesn't match the given checker depending on the condition's negated state.
- See Also:
-
check
Description copied from interface:ExpressionChecks this expression against the given checker. This method must only be used around other checks, useExpression.check(Event, Predicate, boolean)for a simple check or the innermost check of a nested check.- Specified by:
checkin interfaceExpression<T>- Parameters:
event- The event to be used for evaluationchecker- A checker that determines whether this expression matches- Returns:
- Whether this expression matches the given checker
- See Also:
-
getName
-
getAnd
public boolean getAnd()Description copied from interface:ExpressionReturns true if this expression returns all possible values, false if it only returns some of them.This method significantly influences
Expression.check(Event, Predicate),Expression.check(Event, Predicate, boolean)andCondIsSetand thus breaks conditions that use this expression if it returns a wrong value.This method must return true if this is a
singleexpression. // TODO make this method irrelevant for single expressions- Specified by:
getAndin interfaceExpression<T>- Returns:
- Whether this expression returns all values at once or only part of them.
-
setTime
public boolean setTime(int time) Description copied from interface:ExpressionSets the time of this expression, i.e. whether the returned value represents this expression before or after the event.This method will not be called if this expression is guaranteed to be used after a delay (an error will be printed immediately), but will be called if it only can be after a delay (e.g. if the preceding delay is in an if or a loop) as well as if there's no delay involved.
If this method returns false the expression will be discarded and an error message is printed. Custom error messages must be of
ErrorQuality.SEMANTIC_ERRORto be printed (NB:Skript.error(String)always creates semantic errors).- Specified by:
setTimein interfaceExpression<T>- Parameters:
time- -1 for past or 1 for future. 0 is never passed to this method as it represents the default state.- Returns:
- Whether this expression has distinct time states, e.g. a player never changes but a block can. This should be sensitive for the event (using
ParserInstance.isCurrentEvent(Class)). - See Also:
-
getTime
public int getTime()- Specified by:
getTimein interfaceExpression<T>- Returns:
- The value passed to
Expression.setTime(int)or 0 if it was never changed. - See Also:
-
isDefault
public boolean isDefault()Description copied from interface:ExpressionReturns whether this value represents the default value of its type for the event, i.e. it can be replaced with a call to event.getXyz() if one knows the event invalid input: '&' value type.This method might be removed in the future as it's better to check whether value == event.getXyz() for every value an expression returns.
- Specified by:
isDefaultin interfaceExpression<T>- Returns:
- Whether this is the return types' default expression
-
getSource
Description copied from interface:ExpressionReturns the original expression that was parsed, i.e. without any conversions done.- Specified by:
getSourcein interfaceExpression<T>- Returns:
- The unconverted source expression of this expression or this expression itself if it was never converted.
-
simplify
Description copied from interface:SimplifiableSimplifies this object. This should be called immediately after init() returns true. If simplification is not possible, the object is returned as is.
References to the original object should be replaced with the simplified object.
Any returned object should attempt to maintain the original value ofDebuggable.toString(Event, boolean). An addition indicating that the value was simplified can be added in the debug string. SeeSimplifiedLiteralfor an example.
Simplification should never invalidate contracts. For example, any simplified expression should take care to return the same or a more specific type than the original expression, never a more generic type. Likewise, be sure to maintain the behavior of change() and acceptsChange(). Failure to do so can result in unexpected behavior and tricky bugs.
Finally, simplified results should updateExpression.getSource()to point to the expression prior to simplification. This makes maintaining the above contracts easier.- Specified by:
simplifyin interfaceExpression<T>- Specified by:
simplifyin interfaceSimplifiable<T>- Returns:
- the simplified object.
- See Also:
-
supportsLoopPeeking
public boolean supportsLoopPeeking()Description copied from interface:LoopableChecks whether the expression allows using 'next loop-value' when provided as the iterator for a SecLoop.- Specified by:
supportsLoopPeekingin interfaceLoopable<T>- Returns:
-