package at.petrak.hexcasting.common.impl; import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.api.addldata.ADMediaHolder; import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.api.player.Sentinel; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Consumer; public class HexAPIImpl implements HexAPI { private static final ConcurrentMap, EntityVelocityGetter> SPECIAL_VELOCITIES = new ConcurrentHashMap<>(); private static final ConcurrentMap, Consumer> SPECIAL_BRAINSWEEPS = new ConcurrentHashMap<>(); public void registerSpecialVelocityGetter(EntityType key, EntityVelocityGetter getter) { if (SPECIAL_VELOCITIES.containsKey(key)) { HexAPI.LOGGER.warn("A special velocity getter was already registered to {}, clobbering it!", key.toString()); } SPECIAL_VELOCITIES.put(key, getter); } @Override public Vec3 getEntityVelocitySpecial(Entity entity) { EntityType type = entity.getType(); if (SPECIAL_VELOCITIES.containsKey(type)) { var velGetter = SPECIAL_VELOCITIES.get(type); var erasedGetter = (EntityVelocityGetter) velGetter; return erasedGetter.getVelocity(entity); } return entity.getDeltaMovement(); } //region brainsweeping @Override public void registerCustomBrainsweepingBehavior(EntityType key, Consumer hook) { if (SPECIAL_BRAINSWEEPS.containsKey(key)) { HexAPI.LOGGER.warn("A special brainsweep hook was already registered to {}, clobbering it!", key.toString()); } SPECIAL_BRAINSWEEPS.put(key, hook); } @Override public Consumer getBrainsweepBehavior(EntityType mobType) { var behavior = SPECIAL_BRAINSWEEPS.getOrDefault(mobType, this.defaultBrainsweepingBehavior()); return (Consumer) behavior; } @Override public Consumer defaultBrainsweepingBehavior() { return mob -> { mob.removeFreeWill(); // TODO: do we add this? // if (mob instanceof InventoryCarrier inv) { // inv.getInventory().removeAllItems().forEach(mob::spawnAtLocation); // } }; } //endregion @Override public @Nullable Sentinel getSentinel(ServerPlayer player) { return IXplatAbstractions.INSTANCE.getSentinel(player); } @Override public @Nullable ADMediaHolder findMediaHolder(ItemStack stack) { return IXplatAbstractions.INSTANCE.findMediaHolder(stack); } @Override public FrozenPigment getColorizer(Player player) { return IXplatAbstractions.INSTANCE.getColorizer(player); } }