Unicopia/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java

70 lines
3.3 KiB
Java
Raw Normal View History

2020-04-15 17:22:29 +02:00
package com.minelittlepony.unicopia.ability;
2020-05-06 15:55:25 +02:00
import java.util.EnumMap;
2022-01-01 00:03:22 +01:00
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
2020-05-06 15:55:25 +02:00
import java.util.Set;
import java.util.function.BiFunction;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.Unicopia;
2022-12-19 00:12:49 +01:00
import com.minelittlepony.unicopia.util.RegistryUtils;
2020-06-26 11:44:47 +02:00
import net.minecraft.util.*;
2022-12-18 22:07:24 +01:00
import net.minecraft.registry.Registry;
2020-04-15 17:22:29 +02:00
public interface Abilities {
2022-12-19 00:12:49 +01:00
Registry<Ability<?>> REGISTRY = RegistryUtils.createSimple(Unicopia.id("abilities"));
Map<AbilitySlot, Set<Ability<?>>> BY_SLOT = new EnumMap<>(AbilitySlot.class);
BiFunction<AbilitySlot, Race.Composite, List<Ability<?>>> BY_SLOT_AND_COMPOSITE_RACE = Util.memoize((slot, race) -> {
return BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>())
.stream()
.filter(a -> a.canUse(race))
.toList();
});
2020-04-15 17:22:29 +02:00
2020-04-25 15:46:29 +02:00
// unicorn / alicorn
Ability<?> CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY);
Ability<?> SHOOT = register(new UnicornProjectileAbility(), "shoot", AbilitySlot.PRIMARY);
Ability<?> TIME = register(new TimeChangeAbility(), "time_control", AbilitySlot.SECONDARY);
Ability<?> TELEPORT = register(new UnicornTeleportAbility(), "teleport", AbilitySlot.SECONDARY);
Ability<?> GROUP_TELEPORT = register(new UnicornGroupTeleportAbility(), "teleport_group", AbilitySlot.SECONDARY);
Ability<?> DISPELL = register(new UnicornDispellAbility(), "dispell", AbilitySlot.TERTIARY);
2020-04-15 17:22:29 +02:00
2020-04-25 15:46:29 +02:00
// earth / alicorn
Ability<?> KICK = register(new EarthPonyKickAbility(), "kick", AbilitySlot.PRIMARY);
2020-05-06 15:55:25 +02:00
Ability<?> GROW = register(new EarthPonyGrowAbility(), "grow", AbilitySlot.SECONDARY);
2020-09-25 12:50:23 +02:00
Ability<?> STOMP = register(new EarthPonyStompAbility(), "stomp", AbilitySlot.TERTIARY);
2023-10-16 16:18:36 +02:00
Ability<?> HUG = register(new HugAbility(), "hug", AbilitySlot.TERTIARY);
2020-04-15 17:22:29 +02:00
2020-10-14 21:07:36 +02:00
// pegasus
Ability<?> RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY);
Ability<?> CAPTURE_CLOUD = register(new PegasusCaptureStormAbility(), "capture_cloud", AbilitySlot.SECONDARY);
2020-10-14 21:07:36 +02:00
2020-04-25 15:46:29 +02:00
// pegasus / bat / alicorn / changeling
Ability<?> CARRY = register(new CarryAbility(), "carry", AbilitySlot.PRIMARY);
2023-09-03 23:14:24 +02:00
Ability<?> TOGGLE_FLIGHT = register(new PegasusFlightToggleAbility(), "toggle_flight", AbilitySlot.TERTIARY);
2020-04-25 15:46:29 +02:00
// changeling
2020-09-25 12:50:23 +02:00
Ability<?> DISGUISE = register(new ChangelingDisguiseAbility(), "disguise", AbilitySlot.SECONDARY);
Ability<?> FEED = register(new ChangelingFeedAbility(), "feed", AbilitySlot.SECONDARY);
2020-04-15 17:22:29 +02:00
2020-09-25 20:24:48 +02:00
// bat
Ability<?> HANG = register(new BatPonyHangAbility(), "hang", AbilitySlot.TERTIARY);
Ability<?> EEEE = register(new BatEeeeAbility(), "eee", AbilitySlot.SECONDARY);
2020-09-25 20:24:48 +02:00
2023-10-09 23:05:41 +02:00
// kirin
Ability<?> RAGE = register(new KirinRageAbility(), "rage", AbilitySlot.PRIMARY);
2023-10-10 21:13:45 +02:00
Ability<?> NIRIK_BLAST = register(new NirikBlastAbility(), "nirik_blast", AbilitySlot.SECONDARY);
2023-10-10 00:43:59 +02:00
Ability<?> KIRIN_CAST = register(new KirinCastingAbility(), "kirin_cast", AbilitySlot.SECONDARY);
2023-10-09 23:05:41 +02:00
2020-05-06 15:55:25 +02:00
static <T extends Ability<?>> T register(T power, String name, AbilitySlot slot) {
Identifier id = Unicopia.id(name);
2022-01-01 00:03:22 +01:00
BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power);
2020-06-26 11:44:47 +02:00
return Registry.register(REGISTRY, id, power);
2020-04-15 17:22:29 +02:00
}
static void bootstrap() {}
2020-04-15 17:22:29 +02:00
}