Partial updates to 1.21.2

This commit is contained in:
Sollace 2024-10-14 21:15:49 +01:00
parent 7e0272bd7f
commit 57ac3e4fee
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
31 changed files with 99 additions and 93 deletions

View file

@ -3,10 +3,10 @@ org.gradle.daemon=false
# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=1.21.1
yarn_mappings=1.21.1+build.3
loader_version=0.16.4
fabric_version=0.102.0+1.21.1
minecraft_version=1.21.2-pre3
yarn_mappings=1.21.2-pre3+build.4
loader_version=0.16.7
fabric_version=0.105.4+1.21.2
# Mod Properties
group=com.minelittlepony
@ -21,9 +21,9 @@ org.gradle.daemon=false
# Dependencies
fabwork_version=1.3.2+1.21
modmenu_version=11.0.0-beta.1
modmenu_version=12.0.0-beta.1
minelp_version=4.12.0+1.21
kirin_version=1.20.0+1.21
kirin_version=1.20.0+1.21.3
trinkets_version=3.10.0
terraformer_api_version=11.0.0-alpha.1

View file

@ -9,6 +9,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity;
import com.minelittlepony.unicopia.entity.mob.UEntities;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.registry.Registries;
import net.minecraft.registry.tag.TagKey;
@ -34,7 +35,7 @@ public interface Debug {
try {
for (var type : BoatEntity.Type.values()) {
var balloon = UEntities.AIR_BALLOON.create(world);
var balloon = UEntities.AIR_BALLOON.create(world, SpawnReason.SPAWN_ITEM_USE);
balloon.setBasketType(AirBalloonEntity.BasketType.of(type));
balloon.asItem();
}

View file

@ -24,7 +24,7 @@ public interface USounds {
SoundEvent ENTITY_PLAYER_EARTHPONY_DASH = ENTITY_RAVAGER_STEP;
SoundEvent ENTITY_PLAYER_CHANGELING_BUZZ = register("entity.player.changeling.buzz");
SoundEvent ENTITY_PLAYER_CHANGELING_TRANSFORM = register("entity.player.changeling.transform");
SoundEvent ENTITY_PLAYER_CHANGELING_FEED = ENTITY_GENERIC_DRINK;
RegistryEntry<SoundEvent> ENTITY_PLAYER_CHANGELING_FEED = ENTITY_GENERIC_DRINK;
SoundEvent ENTITY_PLAYER_CHANGELING_CLIMB = ENTITY_CHICKEN_STEP;
SoundEvent ENTITY_PLAYER_UNICORN_TELEPORT = register("entity.player.unicorn.teleport");
SoundEvent ENTITY_PLAYER_KIRIN_RAGE = ENTITY_POLAR_BEAR_WARNING;

View file

@ -18,6 +18,6 @@ public interface WorldConvertable {
}
default <T> RegistryEntry<T> entryFor(RegistryKey<T> key) {
return asWorld().getRegistryManager().get(key.getRegistryRef()).getEntry(key).orElseThrow();
return asWorld().getRegistryManager().getOrThrow(key.getRegistryRef()).getEntry(key.getValue()).orElseThrow();
}
}

View file

@ -302,7 +302,7 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
maxWarmup = compound.getInt("maxWarmup");
maxCooldown = compound.getInt("maxCooldown");
triggered = compound.getBoolean("triggered");
activeAbility = Abilities.REGISTRY.getOrEmpty(Identifier.of(compound.getString("activeAbility")));
activeAbility = Abilities.REGISTRY.getOptionalValue(Identifier.of(compound.getString("activeAbility")));
}
}
}

View file

@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.event.GameEvent;
@ -38,8 +39,8 @@ public class BatEeeeAbility extends ScreechAbility {
}
}
if (strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) {
player.asEntity().damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F);
if (player.asWorld() instanceof ServerWorld sw && strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) {
player.asEntity().damage(sw, player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F);
UCriteria.SCREECH_SELF.trigger(player.asEntity());
}
}

View file

@ -82,12 +82,12 @@ public class ChangelingFeedAbility implements Ability<Hit> {
if (targets.size() > 0) {
new ChangelingFeedingSpell(targets, maximumHealthGain, maximumFoodGain).apply(iplayer);
iplayer.playSound(USounds.ENTITY_PLAYER_CHANGELING_FEED, 0.1F, iplayer.getRandomPitch());
iplayer.playSound(USounds.ENTITY_PLAYER_CHANGELING_FEED.value(), 0.1F, iplayer.getRandomPitch());
return true;
}
}
iplayer.playSound(USounds.Vanilla.ENTITY_PLAYER_BURP, 1, (float)player.getWorld().random.nextTriangular(1F, 0.2F));
iplayer.playSound(USounds.Vanilla.ENTITY_PLAYER_BURP, 1, player.getWorld().random.nextTriangular(1F, 0.2F));
return true;
}

View file

@ -3,6 +3,8 @@ package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import java.util.function.DoubleSupplier;
import java.util.function.Supplier;
import java.util.stream.StreamSupport;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.ability.data.Pos;
@ -28,6 +30,8 @@ import net.minecraft.item.Items;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.recipe.RecipeEntry;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
@ -132,10 +136,13 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
return 0;
}
@SuppressWarnings("unchecked")
private boolean applyDirectly(Pony player, BlockPos pos) {
return player.asWorld().getRecipeManager()
.getAllMatches(URecipes.GROWING, new TransformCropsRecipe.PlacementArea(player, pos), player.asWorld())
.stream()
var placementArea = new TransformCropsRecipe.PlacementArea(player, pos);
return StreamSupport.stream(((ServerWorld)player.asWorld()).getRecipeManager().values().spliterator(), false)
.filter(recipe -> recipe.value().getType() == URecipes.GROWING)
.map(recipe -> (RecipeEntry<TransformCropsRecipe>)recipe)
.filter(recipe -> recipe.value().matches(placementArea, player.asWorld()))
.map(recipe -> recipe.value().checkPattern(player.asWorld(), pos))
.filter(result -> result.matchedLocations().size() + 1 >= TransformCropsRecipe.MINIMUM_INPUT)
.filter(result -> {

View file

@ -90,7 +90,9 @@ public class EarthPonyKickAbility implements Ability<Pos> {
if (e instanceof LivingEntity entity) {
float calculatedStrength = 0.5F * (1 + player.getLevel().getScaled(9));
entity.damage(player.damageOf(UDamageTypes.KICK, player), player.asWorld().random.nextBetween(2, 10) + calculatedStrength);
if (player.asWorld() instanceof ServerWorld sw) {
entity.damage(sw, player.damageOf(UDamageTypes.KICK, player), player.asWorld().random.nextBetween(2, 10) + calculatedStrength);
}
entity.takeKnockback(calculatedStrength, origin.x - entity.getX(), origin.z - entity.getZ());
Living.updateVelocity(entity);
player.subtractEnergyCost(3);
@ -109,7 +111,7 @@ public class EarthPonyKickAbility implements Ability<Pos> {
}
if (type == ActivationType.DOUBLE_TAP && player.asEntity().isOnGround() && player.getMagicalReserves().getMana().get() > 40) {
player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(3.5F, 0.3F));
player.getPhysics().dashForward(player.asWorld().random.nextTriangular(3.5F, 0.3F));
player.subtractEnergyCost(4);
player.asEntity().addExhaustion(5);
return true;

View file

@ -85,7 +85,7 @@ public class EarthPonyStompAbility implements Ability<Hit> {
public Optional<Hit> prepare(Pony player) {
if (player.asEntity().getVelocity().y * player.getPhysics().getGravitySignum() < 0
&& !player.asEntity().getAbilities().flying
&& !player.asEntity().isFallFlying()
&& !player.asEntity().isGliding()
&& !player.asEntity().isUsingRiptide()) {
thrustDownwards(player);
return Hit.INSTANCE;
@ -144,7 +144,7 @@ public class EarthPonyStompAbility implements Ability<Hit> {
-(player.getY() - i.getY() - liftAmount) / inertia + (dist < 1 ? dist : 0),
-(player.getZ() - i.getZ()) / inertia);
double amount = (1.5F * player.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE).getValue() + heavyness * 0.4) / (float)(dist * 1.3F);
double amount = (1.5F * player.getAttributeInstance(EntityAttributes.ATTACK_DAMAGE).getValue() + heavyness * 0.4) / (float)(dist * 1.3F);
if (i instanceof PlayerEntity) {
Race.Composite race = Pony.of((PlayerEntity)i).getCompositeRace();
@ -161,7 +161,7 @@ public class EarthPonyStompAbility implements Ability<Hit> {
amount /= EnchantmentUtil.getImpactReduction(l);
}
i.damage(iplayer.damageOf(UDamageTypes.SMASH, iplayer), (float)amount);
i.damage((ServerWorld)iplayer.asWorld(), iplayer.damageOf(UDamageTypes.SMASH, iplayer), (float)amount);
Living.updateVelocity(i);
}
});

View file

@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.entity.mob.FriendlyCreeperEntity;
import com.minelittlepony.unicopia.entity.mob.UEntities;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.conversion.EntityConversionContext;
import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.particle.ParticleTypes;
@ -25,11 +26,13 @@ public class HugAbility extends CarryAbility {
pony.setAnimation(Animation.ARMS_FORWARD, Animation.Recipient.ANYONE);
if (rider instanceof CreeperEntity creeper) {
FriendlyCreeperEntity friendlyCreeper = creeper.convertTo(UEntities.FRIENDLY_CREEPER, true);
player.getWorld().spawnEntity(friendlyCreeper);
friendlyCreeper.startRiding(player, true);
Living.getOrEmpty(friendlyCreeper).ifPresent(living -> living.setCarrier(player));
FriendlyCreeperEntity friendlyCreeper = creeper.convertTo(UEntities.FRIENDLY_CREEPER, EntityConversionContext.create(creeper, true, true), e -> {
e.startRiding(player, true);
Living.getOrEmpty(e).ifPresent(living -> living.setCarrier(player));
});
if (friendlyCreeper != null) {
player.getWorld().spawnEntity(friendlyCreeper);
}
} else if (rider instanceof FriendlyCreeperEntity creeper) {
creeper.startRiding(player, true);
Living.getOrEmpty(creeper).ifPresent(living -> living.setCarrier(player));

View file

@ -125,8 +125,8 @@ public class PeckAbility implements Ability<Hit> {
boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(living);
boolean isBracing = isEarthPony && player.asEntity().isSneaking();
if (!isBracing) {
living.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
if (!isBracing && living.getWorld() instanceof ServerWorld sw) {
living.damage(sw, player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
}
Vec3d knockVec = player.getOriginVector().subtract(living.getPos()).multiply(strength);

View file

@ -20,6 +20,7 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
@ -103,12 +104,12 @@ public class ScreechAbility implements Ability<Numeric> {
boolean isBracing = isEarthPony && player.asEntity().isSneaking();
if (!isBracing) {
living.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
living.damage((ServerWorld)player.asWorld(), player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
if (living.getWorld().random.nextInt(MOB_SPOOK_PROBABILITY) == 0) {
RegistryUtils.pickRandom(living.getWorld(), UTags.Items.SPOOKED_MOB_DROPS).ifPresent(drop -> {
living.dropStack(drop.getDefaultStack());
living.dropStack((ServerWorld)living.getWorld(), drop.getDefaultStack());
living.playSound(USounds.Vanilla.ENTITY_ITEM_PICKUP, 1, 0.1F);
UCriteria.SPOOK_MOB.trigger(player.asEntity());
});

View file

@ -67,7 +67,7 @@ public class SeaponySonarPulseAbility implements Ability<Hit> {
if (distance < 4) {
float scale = 1 - (distance/10F);
((LivingEntity)target).takeKnockback(0.7 * scale, -offset.x, -offset.z);
target.damage(target.getDamageSources().sonicBoom(player.asEntity()), 10 * scale);
target.damage((ServerWorld)target.getWorld(), target.getDamageSources().sonicBoom(player.asEntity()), 10 * scale);
} else {
emitPing(player, target.getPos(), 10, 1, 1.3F);
}

View file

@ -2,17 +2,13 @@ package com.minelittlepony.unicopia.ability.data.tree;
import java.util.*;
import java.util.function.Supplier;
import com.google.gson.JsonElement;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.util.Resources;
import com.minelittlepony.unicopia.util.Weighted;
import com.minelittlepony.unicopia.util.serialization.CodecUtils;
import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
@ -23,10 +19,9 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.registry.tag.TagKey;
public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResourceReloadListener {
public class TreeTypeLoader extends JsonDataLoader<TreeTypeLoader.TreeTypeDef> implements IdentifiableResourceReloadListener {
private static final Identifier ID = Unicopia.id("data/tree_type");
public static final TreeTypeLoader INSTANCE = new TreeTypeLoader();
@ -34,7 +29,7 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour
private Map<Identifier, TreeTypeDef> entries = new HashMap<>();
TreeTypeLoader() {
super(Resources.GSON, "tree_types");
super(TreeTypeDef.CODEC, "tree_types");
}
public Map<Identifier, TreeTypeDef> getEntries() {
@ -46,18 +41,9 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour
return ID;
}
@SuppressWarnings("unchecked")
@Override
protected void apply(Map<Identifier, JsonElement> resources, ResourceManager manager, Profiler profiler) {
entries = Map.ofEntries(resources.entrySet().stream()
.filter(Objects::nonNull)
.map(entry -> TreeTypeDef.CODEC.decode(JsonOps.INSTANCE, entry.getValue())
.result()
.map(p -> p.getFirst())
.map(p -> Map.entry(entry.getKey(), p))
.orElse(null))
.filter(Objects::nonNull)
.toArray(Map.Entry[]::new));
protected void apply(Map<Identifier, TreeTypeDef> resources, ResourceManager manager, Profiler profiler) {
entries = resources;
TreeTypes.load(entries);
}
@ -120,15 +106,13 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour
@Override
public void appendTo(Weighted.Builder<Supplier<ItemStack>> weighted) {
if (item.isPresent()) {
Registries.ITEM.getOrEmpty(item.get()).ifPresent(item -> {
Registries.ITEM.getOptionalValue(item.get()).ifPresent(item -> {
weighted.put(weight, item::getDefaultStack);
});
} else {
weighted.put(weight, () -> {
return Registries.ITEM.getOrCreateEntryList(TagKey.of(RegistryKeys.ITEM, tag.get()))
.getRandom(Weighted.getRng())
.map(RegistryEntry::value)
.map(Item::getDefaultStack)
return Registries.ITEM.getRandomEntry(TagKey.of(RegistryKeys.ITEM, tag.get()), Weighted.getRng())
.map(entry -> entry.value().getDefaultStack())
.orElse(ItemStack.EMPTY);
});
}

View file

@ -34,7 +34,6 @@ abstract class MixinLivingEntityRenderer<T extends LivingEntity, M extends Entit
@Shadow
private @Final List<FeatureRenderer<T, M>> features;
MixinLivingEntityRenderer() { super(null); }
@Nullable
private AccessoryFeatureRenderer<T, M> accessories;

View file

@ -51,7 +51,7 @@ abstract class MixinServerPlayerEntity extends PlayerEntity implements ScreenHan
target = "net/minecraft/entity/player/PlayerEntity$SleepFailureReason.NOT_POSSIBLE_NOW:Lnet/minecraft/entity/player/PlayerEntity$SleepFailureReason;"
), cancellable = true, require = 0)
private void onTrySleep(BlockPos pos, CallbackInfoReturnable<Either<PlayerEntity.SleepFailureReason, Unit>> info) {
if (get().getSpecies().isNocturnal() && get().asWorld().getGameRules().getBoolean(UGameRules.DO_NOCTURNAL_BAT_PONIES)) {
if (get().getSpecies().isNocturnal() && ((ServerWorld)get().asWorld()).getGameRules().getBoolean(UGameRules.DO_NOCTURNAL_BAT_PONIES)) {
((PlayerEntity)this).sendMessage(Text.translatable("block.unicopia.bed.no_sleep.nocturnal"), true);
info.setReturnValue(Either.left(PlayerEntity.SleepFailureReason.OTHER_PROBLEM));

View file

@ -39,7 +39,7 @@ public record MsgRequestSpeciesChange (
}
if (force) {
if (sender.getWorld().getGameRules().getBoolean(UGameRules.ANNOUNCE_TRIBE_JOINS)) {
if (((ServerWorld)sender.getWorld()).getGameRules().getBoolean(UGameRules.ANNOUNCE_TRIBE_JOINS)) {
Text message = Text.translatable("respawn.reason.joined_new_tribe",
sender.getDisplayName(),
player.getSpecies().getDisplayName(), player.getSpecies().getAltDisplayName());

View file

@ -26,7 +26,7 @@ public record MagicParticleEffect (
).apply(instance, MagicParticleEffect::new));
public static final PacketCodec<ByteBuf, MagicParticleEffect> PACKET_CODEC = PacketCodec.tuple(
PacketCodecs.BOOL, MagicParticleEffect::tinted,
PacketCodecs.VECTOR3F, MagicParticleEffect::color,
PacketCodecs.VECTOR_3F, MagicParticleEffect::color,
MagicParticleEffect::new
);

View file

@ -36,7 +36,7 @@ public record SphereParticleEffect (
public static final PacketCodec<RegistryByteBuf, SphereParticleEffect> createPacketCodec(ParticleType<SphereParticleEffect> type) {
return PacketCodec.tuple(
PacketCodecs.VECTOR3F, SphereParticleEffect::color,
PacketCodecs.VECTOR_3F, SphereParticleEffect::color,
PacketCodecs.FLOAT, SphereParticleEffect::alpha,
PacketCodecs.FLOAT, SphereParticleEffect::radius,
PacketCodecUtils.VECTOR, SphereParticleEffect::offset,

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.recipe;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.util.Untyped;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.Ingredient;
@ -19,13 +20,13 @@ public class CloudShapingRecipe extends StonecuttingRecipe {
}
@Override
public RecipeType<?> getType() {
return URecipes.CLOUD_SHAPING;
public RecipeType<StonecuttingRecipe> getType() {
return Untyped.cast(URecipes.CLOUD_SHAPING);
}
@Override
public RecipeSerializer<?> getSerializer() {
return URecipes.CLOUD_SHAPING_SERIALIZER;
public RecipeSerializer<StonecuttingRecipe> getSerializer() {
return Untyped.cast(URecipes.CLOUD_SHAPING_SERIALIZER);
}
@Override

View file

@ -43,7 +43,7 @@ public class GlowingRecipe extends ItemCombinationRecipe {
}
@Override
public RecipeSerializer<?> getSerializer() {
public RecipeSerializer<? extends GlowingRecipe> getSerializer() {
return URecipes.GLOWING_SERIALIZER;
}
}

View file

@ -31,7 +31,7 @@ public class JarExtractRecipe extends SpecialCraftingRecipe {
@Override
public ItemStack craft(CraftingRecipeInput inventory, @Nullable WrapperLookup manager) {
ItemStack jar = ItemStack.EMPTY;
for (int i = 0; i < inventory.getSize(); i++) {
for (int i = 0; i < inventory.size(); i++) {
ItemStack stack = inventory.getStackInSlot(i);
if (stack.isEmpty()) {
continue;
@ -56,7 +56,7 @@ public class JarExtractRecipe extends SpecialCraftingRecipe {
}
@Override
public RecipeSerializer<?> getSerializer() {
public RecipeSerializer<? extends JarExtractRecipe> getSerializer() {
return URecipes.JAR_INSERT_SERIALIZER;
}
}

View file

@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.item.component.Appearance;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.RecipeSerializer;
import net.minecraft.recipe.SpecialCraftingRecipe;
import net.minecraft.recipe.book.CraftingRecipeCategory;
import net.minecraft.recipe.input.CraftingRecipeInput;
import net.minecraft.registry.RegistryWrapper.WrapperLookup;
@ -38,7 +39,7 @@ public class JarInsertRecipe extends ItemCombinationRecipe {
}
@Override
public RecipeSerializer<?> getSerializer() {
public RecipeSerializer<? extends JarInsertRecipe> getSerializer() {
return URecipes.JAR_INSERT_SERIALIZER;
}

View file

@ -137,7 +137,7 @@ public class TransformCropsRecipe implements Recipe<TransformCropsRecipe.Placeme
}
@Override
public int getSize() {
public int size() {
return 0;
}
}

View file

@ -21,6 +21,8 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.Entity.RemovalReason;
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.server.world.ServerWorld;
@ -138,7 +140,7 @@ public record Altar(
public void generateDecorations(World world) {
world.setBlockState(origin, UBlocks.SPECTRAL_FIRE.getDefaultState(), Block.FORCE_STATE | Block.NOTIFY_ALL);
pillars.forEach(pillar -> {
FloatingArtefactEntity artefact = UEntities.FLOATING_ARTEFACT.create(world);
FloatingArtefactEntity artefact = UEntities.FLOATING_ARTEFACT.create(world, SpawnReason.NATURAL);
artefact.setStack(UItems.ALICORN_BADGE.getDefaultStack());
artefact.setPosition(pillar.up().toCenterPos());
artefact.setInvulnerable(true);
@ -159,7 +161,13 @@ public record Altar(
}
private void removeExisting(@Nullable Entity except, World world, BlockPos pillar) {
world.getOtherEntities(except, new Box(pillar.up()), IS_PARTICIPANT).forEach(Entity::kill);
world.getOtherEntities(except, new Box(pillar.up()), IS_PARTICIPANT).forEach(e -> {
if (world instanceof ServerWorld sw) {
e.kill(sw);
} else {
e.setRemoved(RemovalReason.KILLED);
}
});
}
public boolean isValid(World world) {

View file

@ -19,8 +19,8 @@ public interface ULootTableEntryType {
});
LootTableEvents.ALL_LOADED.register((resourceManager, registry) -> {
extentionTableIds.forEach((base, extra) -> {
registry.getOrEmpty(base).ifPresent(table -> {
registry.getOrEmpty(extra).ifPresent(extraTable -> {
registry.getOptionalValue(base).ifPresent(table -> {
registry.getOptionalValue(extra).ifPresent(extraTable -> {
table.pools = Stream.concat(table.pools.stream(), extraTable.pools.stream()).toList();
});
});

View file

@ -21,7 +21,7 @@ public interface InventoryUtil {
}
static Stream<Integer> slots(RecipeInput inventory) {
return Stream.iterate(0, i -> i < inventory.getSize(), i -> i + 1);
return Stream.iterate(0, i -> i < inventory.size(), i -> i + 1);
}
static int getOpenSlot(Inventory inventory) {

View file

@ -6,7 +6,7 @@ public interface LimbAnimationUtil {
static void resetToZero(LimbAnimator animator) {
animator.setSpeed(0);
animator.updateLimbs(-animator.getPos(), 1);
animator.updateLimbs(-animator.getPos(), 1, 1);
animator.setSpeed(0);
}
@ -17,7 +17,7 @@ public interface LimbAnimationUtil {
resetToZero(to);
to.setSpeed(prevSpeed);
to.updateLimbs(pos, 1);
to.updateLimbs(pos, 1, 1);
to.setSpeed(speed);
}
}

View file

@ -15,7 +15,6 @@ import net.minecraft.util.Util;
import net.minecraft.registry.*;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.registry.entry.RegistryEntryList;
import net.minecraft.registry.entry.RegistryEntryList.Named;
import net.minecraft.world.World;
public interface RegistryUtils {
@ -35,8 +34,12 @@ public interface RegistryUtils {
.buildAndRegister();
}
@SuppressWarnings("unchecked")
static <T> RegistryEntryList<T> entriesForTag(World world, TagKey<T> key) {
return world.getRegistryManager().get(key.registry()).getOrCreateEntryList(key);
return world.getRegistryManager().getOrThrow(key.registryRef())
.getOptional(key)
.map(RegistryEntryList.class::cast)
.orElse(RegistryEntryList.<T>empty());
}
static <T> Stream<T> valuesForTag(World world, TagKey<T> key) {
@ -52,29 +55,18 @@ public interface RegistryUtils {
}
static <T> Optional<T> pickRandom(World world, TagKey<T> key, Predicate<T> filter) {
return Util.getRandomOrEmpty(world.getRegistryManager().getOptional(key.registry())
.flatMap(registry -> registry.getEntryList(key))
.stream()
.flatMap(Named::stream)
.map(RegistryEntry::value)
.filter(filter)
.toList(), world.random);
return Util.getRandomOrEmpty(entriesForTag(world, key).stream().map(RegistryEntry::value).filter(filter).toList(), world.random);
}
static <T> Optional<RegistryEntry<T>> pickRandomEntry(World world, TagKey<T> key, Predicate<RegistryEntry<T>> filter) {
return Util.getRandomOrEmpty(world.getRegistryManager().getOptional(key.registry())
.flatMap(registry -> registry.getEntryList(key))
.stream()
.flatMap(Named::stream)
.filter(filter)
.toList(), world.random);
return Util.getRandomOrEmpty(entriesForTag(world, key).stream().filter(filter).toList(), world.random);
}
static <T> boolean isIn(World world, T obj, RegistryKey<? extends Registry<T>> registry, TagKey<T> tag) {
return world.getRegistryManager().get(registry).getEntry(obj).isIn(tag);
return world.getRegistryManager().getOrThrow(registry).getEntry(obj).isIn(tag);
}
static <T> Identifier getId(World world, T obj, RegistryKey<? extends Registry<T>> registry) {
return world.getRegistryManager().get(registry).getId(obj);
return world.getRegistryManager().getOrThrow(registry).getId(obj);
}
}

View file

@ -1,8 +1,14 @@
package com.minelittlepony.unicopia.util;
import java.util.Optional;
public interface Untyped {
@SuppressWarnings("unchecked")
static <K, T extends K> T cast(K t) {
return (T)t;
}
static <K, T extends K> Optional<T> cast(Optional<K> t) {
return t.map(Untyped::cast);
}
}