92 lines
3.2 KiB
Java
92 lines
3.2 KiB
Java
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<EntityType<?>, EntityVelocityGetter<?>> SPECIAL_VELOCITIES
|
|
= new ConcurrentHashMap<>();
|
|
private static final ConcurrentMap<EntityType<?>, Consumer<?>> SPECIAL_BRAINSWEEPS
|
|
= new ConcurrentHashMap<>();
|
|
|
|
public <T extends Entity> void registerSpecialVelocityGetter(EntityType<T> key,
|
|
EntityVelocityGetter<T> 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 <T extends Mob> void registerCustomBrainsweepingBehavior(EntityType<T> key, Consumer<T> 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 <T extends Mob> Consumer<T> getBrainsweepBehavior(EntityType<T> mobType) {
|
|
var behavior = SPECIAL_BRAINSWEEPS.getOrDefault(mobType, this.defaultBrainsweepingBehavior());
|
|
return (Consumer<T>) behavior;
|
|
}
|
|
|
|
@Override
|
|
public Consumer<Mob> 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);
|
|
}
|
|
}
|