-
-
Notifications
You must be signed in to change notification settings - Fork 377
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Firework effect section #5542
Firework effect section #5542
Changes from 28 commits
be31180
e90f26e
08c9164
2c89cba
ef7885b
50e0a26
d3bf799
33d8f6a
99be168
ae10ac5
b13ad8c
9b189d6
6dc151c
6235d08
6f0157d
c46239a
6157d51
456282a
8fc13c0
242717b
ff2a955
a4d5d81
251c06e
31b8dc6
fc358a2
28222cc
28eef10
384be9f
9559c50
2fa34d4
3ff79b4
3277e4b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,173 @@ | ||||||||||||||||||||
/** | ||||||||||||||||||||
* This file is part of Skript. | ||||||||||||||||||||
* | ||||||||||||||||||||
* Skript is free software: you can redistribute it and/or modify | ||||||||||||||||||||
* it under the terms of the GNU General Public License as published by | ||||||||||||||||||||
* the Free Software Foundation, either version 3 of the License, or | ||||||||||||||||||||
* (at your option) any later version. | ||||||||||||||||||||
* | ||||||||||||||||||||
* Skript is distributed in the hope that it will be useful, | ||||||||||||||||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||||||||||||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||||||||||||||||
* GNU General Public License for more details. | ||||||||||||||||||||
* | ||||||||||||||||||||
* You should have received a copy of the GNU General Public License | ||||||||||||||||||||
* along with Skript. If not, see <http://www.gnu.org/licenses/>. | ||||||||||||||||||||
* | ||||||||||||||||||||
* Copyright Peter Güttinger, SkriptLang team and contributors | ||||||||||||||||||||
*/ | ||||||||||||||||||||
|
||||||||||||||||||||
package ch.njol.skript.sections; | ||||||||||||||||||||
|
||||||||||||||||||||
import java.util.List; | ||||||||||||||||||||
|
||||||||||||||||||||
import org.bukkit.FireworkEffect; | ||||||||||||||||||||
import org.bukkit.Location; | ||||||||||||||||||||
import org.bukkit.World; | ||||||||||||||||||||
import org.bukkit.entity.Entity; | ||||||||||||||||||||
import org.bukkit.entity.Firework; | ||||||||||||||||||||
import org.bukkit.event.Event; | ||||||||||||||||||||
import org.bukkit.event.HandlerList; | ||||||||||||||||||||
import org.bukkit.inventory.meta.FireworkMeta; | ||||||||||||||||||||
import org.bukkit.util.Consumer; | ||||||||||||||||||||
import org.jetbrains.annotations.NotNull; | ||||||||||||||||||||
import org.jetbrains.annotations.Nullable; | ||||||||||||||||||||
|
||||||||||||||||||||
import ch.njol.skript.Skript; | ||||||||||||||||||||
import ch.njol.skript.config.SectionNode; | ||||||||||||||||||||
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.lang.EffectSection; | ||||||||||||||||||||
import ch.njol.skript.lang.Expression; | ||||||||||||||||||||
import ch.njol.skript.lang.SkriptParser.ParseResult; | ||||||||||||||||||||
import ch.njol.skript.lang.Trigger; | ||||||||||||||||||||
import ch.njol.skript.lang.TriggerItem; | ||||||||||||||||||||
import ch.njol.skript.registrations.EventValues; | ||||||||||||||||||||
import ch.njol.skript.util.Getter; | ||||||||||||||||||||
import ch.njol.skript.variables.Variables; | ||||||||||||||||||||
import ch.njol.util.Kleenean; | ||||||||||||||||||||
|
||||||||||||||||||||
@Name("Launch Firework") | ||||||||||||||||||||
@Description({ | ||||||||||||||||||||
"Launch firework effects at the given location(s).", | ||||||||||||||||||||
"This can be used as an effect and as a section.", | ||||||||||||||||||||
"If it is used as a section, the section is run before the entity is added to the world.", | ||||||||||||||||||||
"You can modify the firework in this section, using for example <code>event-entity</code>.", | ||||||||||||||||||||
"Do note that other event values, such as <code>player</code>, won't work in this section." | ||||||||||||||||||||
}) | ||||||||||||||||||||
@Examples({ | ||||||||||||||||||||
"launch ball large coloured red, purple and white fading to light green and black at player's location with duration 1", | ||||||||||||||||||||
"", | ||||||||||||||||||||
"command /firework:", | ||||||||||||||||||||
"\ttrigger:", | ||||||||||||||||||||
"\t\tlaunch a firework with effects ball large coloured red at player:", | ||||||||||||||||||||
"\t\t\tset metadata value \"cancel damage\" of event-entity to true", | ||||||||||||||||||||
Comment on lines
+65
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
"", | ||||||||||||||||||||
"# Firework launch section example", | ||||||||||||||||||||
"on damage:", | ||||||||||||||||||||
"\tdamage cause is entity explosion", | ||||||||||||||||||||
"\tmetadata value \"cancel damage\" of event-projectile is true", | ||||||||||||||||||||
"\tcancel event", | ||||||||||||||||||||
}) | ||||||||||||||||||||
@Since("2.4, INSERT VERSION (section)") | ||||||||||||||||||||
public class EffSecFireworkLaunch extends EffectSection { | ||||||||||||||||||||
|
||||||||||||||||||||
public static class FireworkSectionLaunchEvent extends Event { | ||||||||||||||||||||
|
||||||||||||||||||||
private final Firework firework; | ||||||||||||||||||||
|
||||||||||||||||||||
public FireworkSectionLaunchEvent(Firework firework) { | ||||||||||||||||||||
this.firework = firework; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
public Firework getFirework() { | ||||||||||||||||||||
return firework; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
@Override | ||||||||||||||||||||
@NotNull | ||||||||||||||||||||
public HandlerList getHandlers() { | ||||||||||||||||||||
throw new IllegalStateException(); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
static { | ||||||||||||||||||||
Skript.registerSection(EffSecFireworkLaunch.class, "(launch|deploy) [[a] firework [with effect[s]]] %fireworkeffects% at %locations% [([with] (duration|power)|timed) %-number%]"); | ||||||||||||||||||||
EventValues.registerEventValue(FireworkSectionLaunchEvent.class, Firework.class, new Getter<Firework, FireworkSectionLaunchEvent>() { | ||||||||||||||||||||
@Override | ||||||||||||||||||||
public Firework get(FireworkSectionLaunchEvent fireworkLaunchEvent) { | ||||||||||||||||||||
return fireworkLaunchEvent.getFirework(); | ||||||||||||||||||||
} | ||||||||||||||||||||
}, EventValues.TIME_NOW); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
private Expression<FireworkEffect> effects; | ||||||||||||||||||||
private Expression<Location> locations; | ||||||||||||||||||||
|
||||||||||||||||||||
@Nullable | ||||||||||||||||||||
public static Entity lastSpawned; | ||||||||||||||||||||
|
||||||||||||||||||||
@Nullable | ||||||||||||||||||||
private Expression<Number> power; | ||||||||||||||||||||
|
||||||||||||||||||||
@Nullable | ||||||||||||||||||||
private Trigger trigger; | ||||||||||||||||||||
|
||||||||||||||||||||
@Override | ||||||||||||||||||||
@SuppressWarnings("unchecked") | ||||||||||||||||||||
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult, | ||||||||||||||||||||
@Nullable SectionNode sectionNode, @Nullable List<TriggerItem> triggerItems) { | ||||||||||||||||||||
|
||||||||||||||||||||
effects = (Expression<FireworkEffect>) exprs[0]; | ||||||||||||||||||||
locations = (Expression<Location>) exprs[1]; | ||||||||||||||||||||
power = (Expression<Number>) exprs[2]; | ||||||||||||||||||||
|
||||||||||||||||||||
if (sectionNode != null) | ||||||||||||||||||||
trigger = loadCode(sectionNode, "firework launch", FireworkSectionLaunchEvent.class); | ||||||||||||||||||||
Comment on lines
+129
to
+130
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be good to include the logic from EffSecSpawn that forbids delays. Skript/src/main/java/ch/njol/skript/sections/EffSecSpawn.java Lines 125 to 133 in 0355df1
|
||||||||||||||||||||
|
||||||||||||||||||||
return true; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
@Override | ||||||||||||||||||||
@Nullable | ||||||||||||||||||||
protected TriggerItem walk(Event event) { | ||||||||||||||||||||
FireworkEffect[] effects = this.effects.getArray(event); | ||||||||||||||||||||
Object localVars = Variables.copyLocalVariables(event); | ||||||||||||||||||||
Consumer<Firework> consumer = null; | ||||||||||||||||||||
if (trigger != null) { | ||||||||||||||||||||
consumer = firework -> { | ||||||||||||||||||||
FireworkSectionLaunchEvent fireworkLaunchEvent = new FireworkSectionLaunchEvent(firework); | ||||||||||||||||||||
Variables.setLocalVariables(fireworkLaunchEvent, localVars); | ||||||||||||||||||||
trigger.execute(fireworkLaunchEvent); | ||||||||||||||||||||
Variables.setLocalVariables(event, localVars); | ||||||||||||||||||||
}; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
int power = this.power != null ? this.power.getOptionalSingle(event).orElse(1).intValue() : 1; | ||||||||||||||||||||
|
||||||||||||||||||||
for (Location location : locations.getArray(event)) { | ||||||||||||||||||||
World world = location.getWorld(); | ||||||||||||||||||||
if (world == null) | ||||||||||||||||||||
continue; | ||||||||||||||||||||
Firework firework = world.spawn(location, Firework.class, consumer); | ||||||||||||||||||||
FireworkMeta meta = firework.getFireworkMeta(); | ||||||||||||||||||||
meta.addEffects(effects); | ||||||||||||||||||||
meta.setPower(power); | ||||||||||||||||||||
firework.setFireworkMeta(meta); | ||||||||||||||||||||
lastSpawned = firework; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
return super.walk(event, false); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
@Override | ||||||||||||||||||||
public String toString(@Nullable Event event, boolean debug) { | ||||||||||||||||||||
return "launch fireworks " + effects.toString(event, debug) + | ||||||||||||||||||||
" at " + locations.toString(event, debug) + | ||||||||||||||||||||
" timed " + (power != null ? power.toString(event, debug) : "1"); | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
I think duration is a more familiar term for fireworks |
||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's better to be verbose for toString IMO