Skip to content

Commit

Permalink
Improve registering event values (#7269)
Browse files Browse the repository at this point in the history
* init commit

* deprecate getter

* update others

* remove getter from eventvalues

* improve deprecation warning

* forget to change to getter

---------

Co-authored-by: Moderocky <admin@moderocky.com>
  • Loading branch information
Efnilite and Moderocky authored Dec 19, 2024
1 parent e301294 commit 537087f
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 295 deletions.
115 changes: 31 additions & 84 deletions src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package ch.njol.skript.classes.data;

import java.time.Duration;
import java.time.temporal.TemporalAmount;
import java.time.temporal.TemporalUnit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.bukkitutil.InventoryUtils;
Expand Down Expand Up @@ -57,17 +66,9 @@
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
* @author Peter Güttinger
*/
@SuppressWarnings("deprecation")
public final class BukkitEventValues {

public BukkitEventValues() {
Expand All @@ -78,90 +79,36 @@ public BukkitEventValues() {
static {

// === WorldEvents ===
EventValues.registerEventValue(WorldEvent.class, World.class, new Getter<World, WorldEvent>() {
@Override
@Nullable
public World get(final WorldEvent e) {
return e.getWorld();
}
}, 0);
EventValues.registerEventValue(WorldEvent.class, World.class, WorldEvent::getWorld);
// StructureGrowEvent - a WorldEvent
EventValues.registerEventValue(StructureGrowEvent.class, Block.class, new Getter<Block, StructureGrowEvent>() {
@Override
@Nullable
public Block get(final StructureGrowEvent e) {
return e.getLocation().getBlock();
}
}, 0);
EventValues.registerEventValue(StructureGrowEvent.class, Block[].class, new Getter<Block[], StructureGrowEvent>() {
@Override
@Nullable
public Block[] get(StructureGrowEvent event) {
return event.getBlocks().stream()
EventValues.registerEventValue(StructureGrowEvent.class, Block.class, e -> e.getLocation().getBlock());

EventValues.registerEventValue(StructureGrowEvent.class, Block[].class,
event -> event.getBlocks().stream()
.map(BlockState::getBlock)
.toArray(Block[]::new);
}
}, EventValues.TIME_NOW);
EventValues.registerEventValue(StructureGrowEvent.class, Block.class, new Getter<Block, StructureGrowEvent>() {
@Override
@Nullable
public Block get(StructureGrowEvent event) {
for (final BlockState bs : event.getBlocks()) {
if (bs.getLocation().equals(event.getLocation()))
return new BlockStateBlock(bs);
}
return event.getLocation().getBlock();
}
}, EventValues.TIME_FUTURE);
EventValues.registerEventValue(StructureGrowEvent.class, Block[].class, new Getter<Block[], StructureGrowEvent>() {
@Override
@Nullable
public Block[] get(StructureGrowEvent event) {
return event.getBlocks().stream()
.map(BlockStateBlock::new)
.toArray(Block[]::new);
.toArray(Block[]::new));
EventValues.registerEventValue(StructureGrowEvent.class, Block.class, event -> {
for (BlockState bs : event.getBlocks()) {
if (bs.getLocation().equals(event.getLocation()))
return new BlockStateBlock(bs);
}
return event.getLocation().getBlock();
}, EventValues.TIME_FUTURE);
EventValues.registerEventValue(StructureGrowEvent.class, Block[].class, event ->
event.getBlocks().stream()
.map(BlockStateBlock::new)
.toArray(Block[]::new),
EventValues.TIME_FUTURE);
// WeatherEvent - not a WorldEvent (wtf ô_Ô)
EventValues.registerEventValue(WeatherEvent.class, World.class, new Getter<World, WeatherEvent>() {
@Override
@Nullable
public World get(final WeatherEvent e) {
return e.getWorld();
}
}, 0);
EventValues.registerEventValue(WeatherEvent.class, World.class, WeatherEvent::getWorld);
// ChunkEvents
EventValues.registerEventValue(ChunkEvent.class, Chunk.class, new Getter<Chunk, ChunkEvent>() {
@Override
@Nullable
public Chunk get(final ChunkEvent e) {
return e.getChunk();
}
}, 0);
EventValues.registerEventValue(ChunkEvent.class, Chunk.class, ChunkEvent::getChunk);

// === BlockEvents ===
EventValues.registerEventValue(BlockEvent.class, Block.class, new Getter<Block, BlockEvent>() {
@Override
@Nullable
public Block get(final BlockEvent e) {
return e.getBlock();
}
}, 0);
EventValues.registerEventValue(BlockEvent.class, World.class, new Getter<World, BlockEvent>() {
@Override
@Nullable
public World get(final BlockEvent e) {
return e.getBlock().getWorld();
}
}, 0);
EventValues.registerEventValue(BlockEvent.class, Block.class, BlockEvent::getBlock);
EventValues.registerEventValue(BlockEvent.class, World.class, e -> e.getBlock().getWorld());
// REMIND workaround of the event's location being at the entity in block events that have an entity event value
EventValues.registerEventValue(BlockEvent.class, Location.class, new Getter<Location, BlockEvent>() {
@Override
@Nullable
public Location get(final BlockEvent e) {
return BlockUtils.getLocation(e.getBlock());
}
}, 0);
EventValues.registerEventValue(BlockEvent.class, Location.class, e -> BlockUtils.getLocation(e.getBlock()));
// BlockPlaceEvent
EventValues.registerEventValue(BlockPlaceEvent.class, Player.class, new Getter<Player, BlockPlaceEvent>() {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@
*/
package ch.njol.skript.expressions.base;

import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import ch.njol.skript.Skript;
import ch.njol.skript.SkriptAPIException;
import ch.njol.skript.classes.Changer;
Expand All @@ -39,11 +34,16 @@
import ch.njol.skript.log.SkriptLogger;
import ch.njol.skript.registrations.Classes;
import ch.njol.skript.registrations.EventValues;
import ch.njol.skript.util.Getter;
import ch.njol.skript.util.Utils;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.converter.Converter;

import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
* A useful class for creating default expressions. It simply returns the event value of the given type.
Expand Down Expand Up @@ -78,7 +78,7 @@ public static <T> void register(Class<? extends EventValueExpression<T>> express
Skript.registerExpression(expression, type, ExpressionType.EVENT, "[the] " + pattern);
}

private final Map<Class<? extends Event>, Getter<? extends T, ?>> getters = new HashMap<>();
private final Map<Class<? extends Event>, Converter<?, ? extends T>> converters = new HashMap<>();

private final Class<?> componentType;
private final Class<? extends T> type;
Expand Down Expand Up @@ -133,8 +133,8 @@ public boolean init() {
return false;
}
for (Class<? extends Event> event : events) {
if (getters.containsKey(event)) {
hasValue = getters.get(event) != null;
if (converters.containsKey(event)) {
hasValue = converters.get(event) != null;
continue;
}
if (EventValues.hasMultipleGetters(event, type, getTime()) == Kleenean.TRUE) {
Expand All @@ -143,14 +143,14 @@ public boolean init() {
"You must define which " + typeName + " to use.");
return false;
}
Getter<? extends T, ?> getter;
Converter<?, ? extends T> converter;
if (exact) {
getter = EventValues.getExactEventValueGetter(event, type, getTime());
converter = EventValues.getExactEventValueGetter(event, type, getTime());
} else {
getter = EventValues.getEventValueGetter(event, type, getTime());
converter = EventValues.getEventValueGetter(event, type, getTime());
}
if (getter != null) {
getters.put(event, getter);
if (converter != null) {
converters.put(event, converter);
hasValue = true;
}
}
Expand Down Expand Up @@ -186,19 +186,19 @@ protected T[] get(Event event) {
@Nullable
@SuppressWarnings("unchecked")
private <E extends Event> T getValue(E event) {
if (getters.containsKey(event.getClass())) {
final Getter<? extends T, ? super E> g = (Getter<? extends T, ? super E>) getters.get(event.getClass());
return g == null ? null : g.get(event);
if (converters.containsKey(event.getClass())) {
final Converter<? super E, ? extends T> g = (Converter<? super E, ? extends T>) converters.get(event.getClass());
return g == null ? null : g.convert(event);
}

for (final Entry<Class<? extends Event>, Getter<? extends T, ?>> p : getters.entrySet()) {
for (final Entry<Class<? extends Event>, Converter<?, ? extends T>> p : converters.entrySet()) {
if (p.getKey().isAssignableFrom(event.getClass())) {
getters.put(event.getClass(), p.getValue());
return p.getValue() == null ? null : ((Getter<? extends T, ? super E>) p.getValue()).get(event);
converters.put(event.getClass(), p.getValue());
return p.getValue() == null ? null : ((Converter<? super E, ? extends T>) p.getValue()).convert(event);
}
}

getters.put(event.getClass(), null);
converters.put(event.getClass(), null);

return null;
}
Expand Down Expand Up @@ -237,7 +237,7 @@ public boolean setTime(int time) {
if (has) {
super.setTime(time);
// Since the time was changed, we now need to re-initialize the getters we already got. START
getters.clear();
converters.clear();
init();
// END
return true;
Expand Down
Loading

0 comments on commit 537087f

Please sign in to comment.