Skip to content

Commit d16e094

Browse files
Location with Yaw/Pitch (SkriptLang#8351)
1 parent 7da4411 commit d16e094

4 files changed

Lines changed: 119 additions & 35 deletions

File tree

src/main/java/ch/njol/skript/Skript.java

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,30 @@
33
import ch.njol.skript.aliases.Aliases;
44
import ch.njol.skript.bukkitutil.BurgerHelper;
55
import ch.njol.skript.classes.ClassInfo;
6-
import ch.njol.skript.classes.data.BukkitClasses;
7-
import ch.njol.skript.classes.data.BukkitEventValues;
8-
import ch.njol.skript.classes.data.DefaultComparators;
9-
import ch.njol.skript.classes.data.DefaultConverters;
10-
import ch.njol.skript.classes.data.DefaultFunctions;
11-
import ch.njol.skript.classes.data.DefaultOperations;
12-
import ch.njol.skript.classes.data.JavaClasses;
13-
import ch.njol.skript.classes.data.SkriptClasses;
6+
import ch.njol.skript.classes.data.*;
147
import ch.njol.skript.command.Commands;
158
import ch.njol.skript.doc.Documentation;
169
import ch.njol.skript.events.EvtSkript;
1710
import ch.njol.skript.expressions.arithmetic.ExprArithmetic;
1811
import ch.njol.skript.hooks.Hook;
1912
import ch.njol.skript.lang.*;
2013
import ch.njol.skript.lang.Condition.ConditionType;
14+
import ch.njol.skript.lang.Effect;
2115
import ch.njol.skript.lang.util.SimpleExpression;
2216
import ch.njol.skript.localization.Language;
2317
import ch.njol.skript.localization.Message;
2418
import ch.njol.skript.localization.PluralizingArgsMessage;
25-
import ch.njol.skript.log.BukkitLoggerFilter;
26-
import ch.njol.skript.log.CountingLogHandler;
27-
import ch.njol.skript.log.ErrorDescLogHandler;
28-
import ch.njol.skript.log.ErrorQuality;
29-
import ch.njol.skript.log.LogEntry;
30-
import ch.njol.skript.log.LogHandler;
31-
import ch.njol.skript.log.SkriptLogger;
32-
import ch.njol.skript.log.TestingLogHandler;
33-
import ch.njol.skript.log.Verbosity;
19+
import ch.njol.skript.log.*;
3420
import ch.njol.skript.registrations.Classes;
3521
import ch.njol.skript.registrations.EventValues;
3622
import ch.njol.skript.registrations.Feature;
37-
import ch.njol.skript.test.runner.EffObjectives;
38-
import ch.njol.skript.test.runner.SkriptAsyncJUnitTest;
39-
import ch.njol.skript.test.runner.SkriptJUnitTest;
40-
import ch.njol.skript.test.runner.SkriptTestEvent;
41-
import ch.njol.skript.test.runner.TestMode;
42-
import ch.njol.skript.test.runner.TestTracker;
23+
import ch.njol.skript.test.runner.*;
4324
import ch.njol.skript.timings.SkriptTimings;
4425
import ch.njol.skript.update.ReleaseManifest;
4526
import ch.njol.skript.update.ReleaseStatus;
4627
import ch.njol.skript.update.UpdateManifest;
28+
import ch.njol.skript.util.*;
4729
import ch.njol.skript.util.Date;
48-
import ch.njol.skript.util.EmptyStacktraceException;
49-
import ch.njol.skript.util.ExceptionUtils;
50-
import ch.njol.skript.util.FileUtils;
51-
import ch.njol.skript.util.Task;
52-
import ch.njol.skript.util.Utils;
53-
import ch.njol.skript.util.Version;
5430
import ch.njol.skript.util.chat.BungeeConverter;
5531
import ch.njol.skript.util.chat.ChatMessages;
5632
import ch.njol.skript.variables.Variables;
@@ -62,12 +38,7 @@
6238
import com.google.gson.Gson;
6339
import com.google.gson.GsonBuilder;
6440
import org.bstats.bukkit.Metrics;
65-
import org.bukkit.Bukkit;
66-
import org.bukkit.ChatColor;
67-
import org.bukkit.Material;
68-
import org.bukkit.OfflinePlayer;
69-
import org.bukkit.Server;
70-
import org.bukkit.World;
41+
import org.bukkit.*;
7142
import org.bukkit.command.CommandSender;
7243
import org.bukkit.command.PluginCommand;
7344
import org.bukkit.entity.Player;
@@ -103,6 +74,7 @@
10374
import org.skriptlang.skript.bukkit.itemcomponents.ItemComponentModule;
10475
import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer;
10576
import org.skriptlang.skript.bukkit.loottables.LootTableModule;
77+
import org.skriptlang.skript.bukkit.misc.MiscModule;
10678
import org.skriptlang.skript.bukkit.particles.ParticleModule;
10779
import org.skriptlang.skript.bukkit.potion.PotionModule;
10880
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
@@ -610,6 +582,7 @@ public void onEnable() {
610582
new InteractionModule(),
611583
new ItemComponentModule(),
612584
new PotionModule(),
585+
new MiscModule(),
613586
new ParticleModule());
614587
} catch (final Exception e) {
615588
exception(e, "Could not load required .class files: " + e.getLocalizedMessage());
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.skriptlang.skript.bukkit.misc;
2+
3+
import org.skriptlang.skript.addon.AddonModule;
4+
import org.skriptlang.skript.addon.SkriptAddon;
5+
import org.skriptlang.skript.bukkit.misc.expressions.ExprWithYawPitch;
6+
import org.skriptlang.skript.registration.SyntaxRegistry;
7+
8+
public class MiscModule implements AddonModule {
9+
10+
@Override
11+
public void load(SkriptAddon addon) {
12+
SyntaxRegistry registry = addon.syntaxRegistry();
13+
ExprWithYawPitch.register(registry);
14+
}
15+
16+
@Override
17+
public String name() {
18+
return "bukkit/misc";
19+
}
20+
21+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.skriptlang.skript.bukkit.misc.expressions;
2+
3+
import ch.njol.skript.doc.Description;
4+
import ch.njol.skript.doc.Example;
5+
import ch.njol.skript.doc.Name;
6+
import ch.njol.skript.doc.Since;
7+
import ch.njol.skript.expressions.base.PropertyExpression;
8+
import ch.njol.skript.lang.Expression;
9+
import ch.njol.skript.lang.SkriptParser.ParseResult;
10+
import ch.njol.skript.lang.SyntaxStringBuilder;
11+
import ch.njol.util.Kleenean;
12+
import org.bukkit.Location;
13+
import org.bukkit.event.Event;
14+
import org.jspecify.annotations.Nullable;
15+
import org.skriptlang.skript.registration.SyntaxInfo;
16+
import org.skriptlang.skript.registration.SyntaxRegistry;
17+
18+
@Name("Location with Yaw/Pitch")
19+
@Description("Returns the given locations with the specified yaw and/or pitch.")
20+
@Example("set {_location} to player's location with yaw 0 and pitch 0")
21+
@Since("INSERT VERSION")
22+
public class ExprWithYawPitch extends PropertyExpression<Location, Location> {
23+
24+
public static void register(SyntaxRegistry registry) {
25+
registry.register(SyntaxRegistry.EXPRESSION, SyntaxInfo.Expression.builder(ExprWithYawPitch.class, Location.class)
26+
.supplier(ExprWithYawPitch::new)
27+
.addPattern("%locations% with [a] (:yaw|:pitch) [of] %number%")
28+
.addPattern("%locations% with [a] yaw [of] %number% and [a] pitch [of] %number%")
29+
.build());
30+
}
31+
32+
private Expression<Number> yaw, pitch;
33+
34+
@Override
35+
@SuppressWarnings("unchecked")
36+
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
37+
setExpr((Expression<? extends Location>) expressions[0]);
38+
if (parseResult.hasTag("yaw")) {
39+
yaw = (Expression<Number>) expressions[1];
40+
} else if (parseResult.hasTag("pitch")) {
41+
pitch = (Expression<Number>) expressions[1];
42+
} else {
43+
yaw = (Expression<Number>) expressions[1];
44+
pitch = (Expression<Number>) expressions[2];
45+
}
46+
return true;
47+
}
48+
49+
@Override
50+
protected Location[] get(Event event, Location[] source) {
51+
Number yaw = this.yaw != null ? this.yaw.getSingle(event) : null;
52+
Number pitch = this.pitch != null ? this.pitch.getSingle(event) : null;
53+
return get(source, location -> {
54+
float finalYaw = yaw != null ? yaw.floatValue() : location.getYaw();
55+
float finalPitch = pitch != null ? pitch.floatValue() : location.getPitch();
56+
Location clone = location.clone();
57+
clone.setYaw(finalYaw);
58+
clone.setPitch(finalPitch);
59+
return clone;
60+
});
61+
}
62+
63+
@Override
64+
public Class<? extends Location> getReturnType() {
65+
return Location.class;
66+
}
67+
68+
@Override
69+
public String toString(@Nullable Event event, boolean debug) {
70+
return new SyntaxStringBuilder(event, debug)
71+
.append(getExpr(), "with")
72+
.appendIf(yaw != null, "yaw", yaw)
73+
.appendIf(yaw != null && pitch != null, "and")
74+
.appendIf(pitch != null, "pitch", pitch)
75+
.toString();
76+
}
77+
78+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
test "location with yaw and pitch":
2+
set {_original} to event-location
3+
4+
assert (event-location with yaw 20)'s yaw is 20
5+
assert (event-location with pitch 30)'s pitch is 30
6+
7+
set {_location} to event-location with yaw 40 and pitch 50
8+
assert {_location}'s yaw is 40
9+
assert {_location}'s pitch is 50
10+
11+
assert event-location's yaw is {_original}'s yaw with "Location with yaw mutated the original object"
12+
assert event-location's pitch is {_original}'s pitch with "Location with pitch mutated the original object"

0 commit comments

Comments
 (0)