More 1.21.2 updates

This commit is contained in:
Sollace 2024-10-14 22:09:00 +01:00
parent 57ac3e4fee
commit e06c6108f5
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
31 changed files with 148 additions and 120 deletions

View file

@ -15,6 +15,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.Spell;
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.client.TextHelper; import com.minelittlepony.unicopia.client.TextHelper;
import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.effect.EffectUtils;
import com.minelittlepony.unicopia.util.TypedActionResult;
import net.minecraft.item.Item.TooltipContext; import net.minecraft.item.Item.TooltipContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -25,7 +26,6 @@ import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.text.MutableText; import net.minecraft.text.MutableText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.minecraft.util.TypedActionResult;
public record CustomisedSpellType<T extends Spell> ( public record CustomisedSpellType<T extends Spell> (
SpellType<T> type, SpellType<T> type,

View file

@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.block.jar.EntityJarContents; import com.minelittlepony.unicopia.block.jar.EntityJarContents;
import com.minelittlepony.unicopia.block.jar.FluidOnlyJarContents; import com.minelittlepony.unicopia.block.jar.FluidOnlyJarContents;
import com.minelittlepony.unicopia.block.jar.ItemsJarContents; import com.minelittlepony.unicopia.block.jar.ItemsJarContents;
import com.minelittlepony.unicopia.util.TypedActionResult;
import com.mojang.serialization.MapCodec; import com.mojang.serialization.MapCodec;
import com.minelittlepony.unicopia.block.jar.FakeFluidJarContents; import com.minelittlepony.unicopia.block.jar.FakeFluidJarContents;
@ -29,8 +30,6 @@ import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.ItemActionResult;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -54,11 +53,11 @@ public class ItemJarBlock extends JarBlock implements BlockEntityProvider, Inven
} }
@Override @Override
protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { protected ActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
if (hand == Hand.OFF_HAND) { if (hand == Hand.OFF_HAND) {
return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; return ActionResult.PASS_TO_DEFAULT_BLOCK_ACTION;
} }
return world.getBlockEntity(pos, UBlockEntities.ITEM_JAR).map(data -> data.interact(player, hand)).orElse(ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION); return world.getBlockEntity(pos, UBlockEntities.ITEM_JAR).map(data -> data.interact(player, hand)).orElse(ActionResult.PASS_TO_DEFAULT_BLOCK_ACTION);
} }
@Override @Override
@ -110,10 +109,10 @@ public class ItemJarBlock extends JarBlock implements BlockEntityProvider, Inven
super(UBlockEntities.ITEM_JAR, pos, state); super(UBlockEntities.ITEM_JAR, pos, state);
} }
public ItemActionResult interact(PlayerEntity player, Hand hand) { public ActionResult interact(PlayerEntity player, Hand hand) {
TypedActionResult<JarContents> result = contents.interact(player, hand); TypedActionResult<JarContents> result = contents.interact(player, hand);
contents = result.getValue(); contents = result.value();
return result.getResult().isAccepted() ? ItemActionResult.SUCCESS : result.getResult() == ActionResult.FAIL ? ItemActionResult.FAIL : ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; return result.result().isAccepted() ? ActionResult.SUCCESS : result.result() == ActionResult.FAIL ? ActionResult.FAIL : ActionResult.PASS_TO_DEFAULT_BLOCK_ACTION;
} }
public JarContents getContents() { public JarContents getContents() {

View file

@ -8,12 +8,14 @@ import com.google.common.base.Suppliers;
import com.minelittlepony.unicopia.block.ItemJarBlock.FluidJarContents; import com.minelittlepony.unicopia.block.ItemJarBlock.FluidJarContents;
import com.minelittlepony.unicopia.block.ItemJarBlock.JarContents; import com.minelittlepony.unicopia.block.ItemJarBlock.JarContents;
import com.minelittlepony.unicopia.block.ItemJarBlock.TileData; import com.minelittlepony.unicopia.block.ItemJarBlock.TileData;
import com.minelittlepony.unicopia.util.TypedActionResult;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.Bucketable; import net.minecraft.entity.Bucketable;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -23,7 +25,6 @@ import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.TypedActionResult;
public record EntityJarContents ( public record EntityJarContents (
TileData tile, TileData tile,
@ -31,7 +32,7 @@ public record EntityJarContents (
Supplier<@Nullable Entity> entity Supplier<@Nullable Entity> entity
) implements FluidJarContents { ) implements FluidJarContents {
public EntityJarContents(TileData tile, NbtCompound compound) { public EntityJarContents(TileData tile, NbtCompound compound) {
this(tile, Registries.ENTITY_TYPE.getOrEmpty(Identifier.tryParse(compound.getString("entity"))).orElse(null)); this(tile, Registries.ENTITY_TYPE.getOptionalValue(Identifier.tryParse(compound.getString("entity"))).orElse(null));
} }
public EntityJarContents(TileData tile) { public EntityJarContents(TileData tile) {
@ -40,7 +41,7 @@ public record EntityJarContents (
public EntityJarContents(TileData tile, EntityType<?> entityType) { public EntityJarContents(TileData tile, EntityType<?> entityType) {
this(tile, entityType, Suppliers.memoize(() -> { this(tile, entityType, Suppliers.memoize(() -> {
return entityType == null ? null : entityType.create(tile.getWorld()); return entityType == null ? null : entityType.create(tile.getWorld(), SpawnReason.LOAD);
})); }));
} }

View file

@ -12,6 +12,7 @@ import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -44,7 +45,7 @@ public interface ElectrifiedBlock {
default void triggerLightning(BlockState state, World world, BlockPos pos) { default void triggerLightning(BlockState state, World world, BlockPos pos) {
Vec3d center = pos.toCenterPos(); Vec3d center = pos.toCenterPos();
if (world instanceof ServerWorld serverWorld) { if (world instanceof ServerWorld serverWorld) {
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world); LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world, SpawnReason.EVENT);
world.getOtherEntities(null, Box.from(center).expand(7)).forEach(entity -> { world.getOtherEntities(null, Box.from(center).expand(7)).forEach(entity -> {
shockEntity(serverWorld, center, lightning, entity); shockEntity(serverWorld, center, lightning, entity);
}); });
@ -56,7 +57,7 @@ public interface ElectrifiedBlock {
default void triggerLightning(BlockState state, World world, BlockPos pos, LivingEntity entity, boolean knockBack) { default void triggerLightning(BlockState state, World world, BlockPos pos, LivingEntity entity, boolean knockBack) {
Vec3d center = pos.toCenterPos(); Vec3d center = pos.toCenterPos();
if (world instanceof ServerWorld serverWorld) { if (world instanceof ServerWorld serverWorld) {
shockEntity(serverWorld, center, EntityType.LIGHTNING_BOLT.create(world), entity); shockEntity(serverWorld, center, EntityType.LIGHTNING_BOLT.create(world, SpawnReason.EVENT), entity);
} }
if (knockBack) { if (knockBack) {
Vec3d offset = center.subtract(entity.getPos()); Vec3d offset = center.subtract(entity.getPos());
@ -72,11 +73,11 @@ public interface ElectrifiedBlock {
} }
float dist = (float)entity.getPos().distanceTo(center); float dist = (float)entity.getPos().distanceTo(center);
if (dist < 4) { if (dist < 4) {
entity.onStruckByLightning(serverWorld, EntityType.LIGHTNING_BOLT.create(serverWorld)); entity.onStruckByLightning(serverWorld, EntityType.LIGHTNING_BOLT.create(serverWorld, SpawnReason.EVENT));
} else { } else {
float damage = 3 / dist; float damage = 3 / dist;
if (damage > 1) { if (damage > 1) {
entity.damage(entity.getDamageSources().lightningBolt(), damage); entity.damage(serverWorld, entity.getDamageSources().lightningBolt(), damage);
} }
} }
} }

View file

@ -69,7 +69,7 @@ public class ButterflyEntity extends AmbientEntity {
} }
public static DefaultAttributeContainer.Builder createButterflyAttributes() { public static DefaultAttributeContainer.Builder createButterflyAttributes() {
return createMobAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2); return createMobAttributes().add(EntityAttributes.MAX_HEALTH, 2);
} }
public static boolean canSpawn(EntityType<? extends ButterflyEntity> type, WorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { public static boolean canSpawn(EntityType<? extends ButterflyEntity> type, WorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) {

View file

@ -26,11 +26,13 @@ import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityPose; import net.minecraft.entity.EntityPose;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.data.DataTracker.Builder; import net.minecraft.entity.data.DataTracker.Builder;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -139,7 +141,7 @@ public class CastSpellEntity extends LightEmittingEntity implements Caster<CastS
if (!isClient()) { if (!isClient()) {
if (!checkConnection()) { if (!checkConnection()) {
kill(); kill((ServerWorld)getWorld());
} }
spells.getSlots().get().ifPresent(spell -> { spells.getSlots().get().ifPresent(spell -> {
@ -157,7 +159,12 @@ public class CastSpellEntity extends LightEmittingEntity implements Caster<CastS
} }
@Override @Override
public void kill() { public boolean damage(ServerWorld world, DamageSource source, float amount) {
return true;
}
@Override
public void kill(ServerWorld world) {
setDead(true); setDead(true);
} }

View file

@ -15,6 +15,7 @@ import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.data.DataTracker.Builder; import net.minecraft.entity.data.DataTracker.Builder;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
@ -183,7 +184,7 @@ public class FloatingArtefactEntity extends StationaryObjectEntity {
} }
@Override @Override
public boolean damage(DamageSource source, float damage) { public boolean damage(ServerWorld world, DamageSource source, float damage) {
if (getWorld().isClient || isInvulnerable()) { if (getWorld().isClient || isInvulnerable()) {
return false; return false;

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.mob; package com.minelittlepony.unicopia.entity.mob;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -18,6 +19,7 @@ import net.minecraft.entity.EntityStatuses;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.boss.ServerBossBar; import net.minecraft.entity.boss.ServerBossBar;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.damage.DamageTypes; import net.minecraft.entity.damage.DamageTypes;
@ -27,7 +29,6 @@ import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.loot.LootTable; import net.minecraft.loot.LootTable;
import net.minecraft.loot.context.LootContextParameterSet;
import net.minecraft.loot.context.LootContextParameters; import net.minecraft.loot.context.LootContextParameters;
import net.minecraft.loot.context.LootContextTypes; import net.minecraft.loot.context.LootContextTypes;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
@ -283,7 +284,7 @@ public class StormCloudEntity extends Entity implements MagicImmune {
return; return;
} }
} }
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(getWorld()); LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(getWorld(), SpawnReason.EVENT);
lightning.refreshPositionAfterTeleport(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); lightning.refreshPositionAfterTeleport(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
lightning.setCosmetic(cosmetic); lightning.setCosmetic(cosmetic);
getWorld().spawnEntity(lightning); getWorld().spawnEntity(lightning);
@ -291,14 +292,13 @@ public class StormCloudEntity extends Entity implements MagicImmune {
} }
@Override @Override
public boolean damage(DamageSource source, float amount) { public boolean damage(ServerWorld world, DamageSource source, float amount) {
super.damage(source, amount);
if (!cursed) { if (!cursed) {
if (random.nextInt(35) == 0 || (source.isOf(DamageTypes.PLAYER_ATTACK) && EquineContext.of(source.getAttacker()).collidesWithClouds())) { if (random.nextInt(35) == 0 || (source.isOf(DamageTypes.PLAYER_ATTACK) && EquineContext.of(source.getAttacker()).collidesWithClouds())) {
if (getSize(1) < 2) { if (getSize(1) < 2) {
if (!getWorld().isClient() && getWorld().getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { if (!world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
RegistryKey<LootTable> table = getType().getLootTableId(); Optional<RegistryKey<LootTable>> table = getType().getLootTableKey();
LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder((ServerWorld)this.getWorld()) LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder(world)
.add(LootContextParameters.THIS_ENTITY, this) .add(LootContextParameters.THIS_ENTITY, this)
.add(LootContextParameters.ORIGIN, this.getPos()) .add(LootContextParameters.ORIGIN, this.getPos())
.add(LootContextParameters.DAMAGE_SOURCE, source) .add(LootContextParameters.DAMAGE_SOURCE, source)
@ -310,7 +310,7 @@ public class StormCloudEntity extends Entity implements MagicImmune {
getRegistryManager().get(RegistryKeys.LOOT_TABLE).get(table) getRegistryManager().get(RegistryKeys.LOOT_TABLE).get(table)
.generateLoot(builder.build(LootContextTypes.ENTITY), 0L, this::dropStack); .generateLoot(builder.build(LootContextTypes.ENTITY), 0L, this::dropStack);
} }
kill(); kill(world);
getWorld().sendEntityStatus(this, EntityStatuses.ADD_DEATH_PARTICLES); getWorld().sendEntityStatus(this, EntityStatuses.ADD_DEATH_PARTICLES);
} else { } else {
split(2 + random.nextInt(4)); split(2 + random.nextInt(4));

View file

@ -166,7 +166,7 @@ public class Acrobatics implements Tickable, NbtSerialisable {
entity.setPosition(pos.getX() + 0.5, pos.getY() - (inverted ? 0 : 1), pos.getZ() + 0.5); entity.setPosition(pos.getX() + 0.5, pos.getY() - (inverted ? 0 : 1), pos.getZ() + 0.5);
entity.setVelocity(Vec3d.ZERO); entity.setVelocity(Vec3d.ZERO);
entity.setSneaking(false); entity.setSneaking(false);
entity.stopFallFlying(); entity.stopGliding();
pony.getPhysics().cancelFlight(true); pony.getPhysics().cancelFlight(true);
} }

View file

@ -5,6 +5,7 @@ import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import net.minecraft.entity.player.HungerManager; import net.minecraft.entity.player.HungerManager;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.world.ServerWorld;
public interface ManaConsumptionUtil { public interface ManaConsumptionUtil {
float MANA_PER_FOOD = 10F; float MANA_PER_FOOD = 10F;
@ -62,8 +63,8 @@ public interface ManaConsumptionUtil {
float consumedHearts = Math.max(0, Math.min(availableHearts - 1, foodSubtract * HEARTS_PER_FOOD)); float consumedHearts = Math.max(0, Math.min(availableHearts - 1, foodSubtract * HEARTS_PER_FOOD));
foodSubtract = addExhaustion(hunger, foodSubtract); foodSubtract = addExhaustion(hunger, foodSubtract);
foodSubtract -= (consumedHearts / HEARTS_PER_FOOD); foodSubtract -= (consumedHearts / HEARTS_PER_FOOD);
if (consumedHearts > 0) { if (consumedHearts > 0 && !entity.getWorld().isClient) {
entity.damage(UDamageSources.of(entity.getWorld()).damageOf(UDamageTypes.EXHAUSTION), consumedHearts); entity.damage((ServerWorld)entity.getWorld(), UDamageSources.of(entity.getWorld()).damageOf(UDamageTypes.EXHAUSTION), consumedHearts);
} }
} }

View file

@ -22,12 +22,12 @@ public class PlayerAttributes implements Tickable {
private final static List<ToggleableAttribute> ATTRIBUTES = List.of( private final static List<ToggleableAttribute> ATTRIBUTES = List.of(
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("earth_pony_strength"), 0.6, Operation.ADD_MULTIPLIED_TOTAL), new EntityAttributeModifier(Unicopia.id("earth_pony_strength"), 0.6, Operation.ADD_MULTIPLIED_TOTAL),
List.of(EntityAttributes.GENERIC_ATTACK_DAMAGE, EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), List.of(EntityAttributes.ATTACK_DAMAGE, EntityAttributes.KNOCKBACK_RESISTANCE),
pony -> pony.getCompositeRace().canUseEarth() pony -> pony.getCompositeRace().canUseEarth()
), ),
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("earth_pony_knockback_resistance"), 6, Operation.ADD_VALUE), new EntityAttributeModifier(Unicopia.id("earth_pony_knockback_resistance"), 6, Operation.ADD_VALUE),
List.of(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), List.of(EntityAttributes.KNOCKBACK_RESISTANCE),
pony -> pony.getCompositeRace().canUseEarth() && pony.asEntity().isSneaking() pony -> pony.getCompositeRace().canUseEarth() && pony.asEntity().isSneaking()
), ),
new ToggleableAttribute( new ToggleableAttribute(
@ -38,7 +38,7 @@ public class PlayerAttributes implements Tickable {
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("pegasus_speed"), 0.2, Operation.ADD_MULTIPLIED_TOTAL), new EntityAttributeModifier(Unicopia.id("pegasus_speed"), 0.2, Operation.ADD_MULTIPLIED_TOTAL),
List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), List.of(EntityAttributes.MOVEMENT_SPEED, EntityAttributes.ATTACK_SPEED),
pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF) pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF)
), ),
new ToggleableAttribute( new ToggleableAttribute(
@ -49,7 +49,7 @@ public class PlayerAttributes implements Tickable {
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("hippogriff_speed"), 0.1, Operation.ADD_MULTIPLIED_TOTAL), new EntityAttributeModifier(Unicopia.id("hippogriff_speed"), 0.1, Operation.ADD_MULTIPLIED_TOTAL),
List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), List.of(EntityAttributes.MOVEMENT_SPEED, EntityAttributes.ATTACK_SPEED),
pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF) pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF)
), ),
new ToggleableAttribute( new ToggleableAttribute(
@ -60,16 +60,16 @@ public class PlayerAttributes implements Tickable {
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("kirin_knockback_vulneravility"), -2, Operation.ADD_VALUE), new EntityAttributeModifier(Unicopia.id("kirin_knockback_vulneravility"), -2, Operation.ADD_VALUE),
List.of(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), List.of(EntityAttributes.KNOCKBACK_RESISTANCE),
pony -> pony.getCompositeRace().includes(Race.KIRIN) pony -> pony.getCompositeRace().includes(Race.KIRIN)
), ),
new ToggleableAttribute( new ToggleableAttribute(
new EntityAttributeModifier(Unicopia.id("kirin_rage"), 0.7, Operation.ADD_MULTIPLIED_TOTAL), new EntityAttributeModifier(Unicopia.id("kirin_rage"), 0.7, Operation.ADD_MULTIPLIED_TOTAL),
List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, List.of(EntityAttributes.MOVEMENT_SPEED,
EntityAttributes.GENERIC_ATTACK_SPEED, EntityAttributes.ATTACK_SPEED,
EntityAttributes.GENERIC_ATTACK_DAMAGE, EntityAttributes.ATTACK_DAMAGE,
EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, EntityAttributes.KNOCKBACK_RESISTANCE,
EntityAttributes.GENERIC_ATTACK_KNOCKBACK EntityAttributes.ATTACK_KNOCKBACK
), ),
SpellType.RAGE::isOn SpellType.RAGE::isOn
) )

View file

@ -8,6 +8,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellTyp
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.EnchantableItem;
import com.minelittlepony.unicopia.util.Copyable; import com.minelittlepony.unicopia.util.Copyable;
import com.minelittlepony.unicopia.util.TypedActionResult;
import com.minelittlepony.unicopia.util.serialization.NbtSerialisable; import com.minelittlepony.unicopia.util.serialization.NbtSerialisable;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
@ -15,7 +16,6 @@ import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtList;
import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
public class PlayerCharmTracker implements NbtSerialisable, Copyable<PlayerCharmTracker> { public class PlayerCharmTracker implements NbtSerialisable, Copyable<PlayerCharmTracker> {

View file

@ -41,6 +41,7 @@ import net.minecraft.block.*;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageSource;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
@ -138,7 +139,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
@Override @Override
public boolean isFlying() { public boolean isFlying() {
return isFlyingSurvival return isFlyingSurvival
&& !entity.isFallFlying() && !entity.isGliding()
&& !entity.hasVehicle() && !entity.hasVehicle()
&& !entity.getAbilities().creativeMode && !entity.getAbilities().creativeMode
&& !entity.isSpectator(); && !entity.isSpectator();
@ -299,7 +300,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
&& ticksInAir > 90) { && ticksInAir > 90) {
entity.getWorld().playSoundFromEntity(null, entity, USounds.Vanilla.ENTITY_PLAYER_BIG_FALL, SoundCategory.PLAYERS, 2, 1F); entity.getWorld().playSoundFromEntity(null, entity, USounds.Vanilla.ENTITY_PLAYER_BIG_FALL, SoundCategory.PLAYERS, 2, 1F);
entity.damage(entity.getDamageSources().generic(), 3); entity.damage((ServerWorld)entity.getWorld(), entity.getDamageSources().generic(), 3);
cancelFlight(true); cancelFlight(true);
} }
} }
@ -394,7 +395,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
entity.setVelocity(velocity.toImmutable()); entity.setVelocity(velocity.toImmutable());
if (isFlying() && !entity.isFallFlying() && !pony.getAcrobatics().isHanging() && pony.isClient()) { if (isFlying() && !entity.isGliding() && !pony.getAcrobatics().isHanging() && pony.isClient()) {
if (!MineLPDelegate.getInstance().getPlayerPonyRace(entity).isEquine() && getHorizontalMotion() > 0.03) { if (!MineLPDelegate.getInstance().getPlayerPonyRace(entity).isEquine() && getHorizontalMotion() > 0.03) {
float pitch = ((LivingEntityDuck)entity).getLeaningPitch(); float pitch = ((LivingEntityDuck)entity).getLeaningPitch();
if (pitch < 1) { if (pitch < 1) {
@ -465,12 +466,16 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
applyThrust(velocity); applyThrust(velocity);
} else if (entity.getWorld().random.nextInt(40) == 0) { } else if (entity.getWorld().random.nextInt(40) == 0) {
entity.getWorld().playSoundFromEntity(null, entity, USounds.Vanilla.ENTITY_PLAYER_BIG_FALL, SoundCategory.PLAYERS, 2, 1.5F); entity.getWorld().playSoundFromEntity(null, entity, USounds.Vanilla.ENTITY_PLAYER_BIG_FALL, SoundCategory.PLAYERS, 2, 1.5F);
entity.damage(entity.getDamageSources().generic(), 0.5F); if (!entity.getWorld().isClient) {
entity.damage((ServerWorld)entity.getWorld(), entity.getDamageSources().generic(), 0.5F);
}
} }
if (type.isAvian() && !entity.getWorld().isClient) { if (type.isAvian() && !entity.getWorld().isClient) {
if (pony.getObservedSpecies() != Race.BAT && entity.getWorld().random.nextInt(9000) == 0) { if (pony.getObservedSpecies() != Race.BAT && entity.getWorld().random.nextInt(9000) == 0) {
entity.dropItem(pony.getObservedSpecies() == Race.HIPPOGRIFF ? UItems.GRYPHON_FEATHER : UItems.PEGASUS_FEATHER); if (!entity.getWorld().isClient) {
entity.dropItem((pony.getObservedSpecies() == Race.HIPPOGRIFF ? UItems.GRYPHON_FEATHER : UItems.PEGASUS_FEATHER).getDefaultStack(), false);
}
playSound(USounds.ENTITY_PLAYER_PEGASUS_MOLT, 0.3F, 1); playSound(USounds.ENTITY_PLAYER_PEGASUS_MOLT, 0.3F, 1);
UCriteria.SHED_FEATHER.trigger(entity); UCriteria.SHED_FEATHER.trigger(entity);
} }
@ -574,7 +579,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
} }
if (pony.getMagicalReserves().getExhaustion().getPercentFill() > 0.99F && ticksInAir % 25 == 0 && !pony.isClient()) { if (pony.getMagicalReserves().getExhaustion().getPercentFill() > 0.99F && ticksInAir % 25 == 0 && !pony.isClient()) {
entity.damage(pony.damageOf(UDamageTypes.EXHAUSTION), entity.getWorld().random.nextBetween(2, 4)); entity.damage((ServerWorld)entity.getWorld(), pony.damageOf(UDamageTypes.EXHAUSTION), entity.getWorld().random.nextBetween(2, 4));
if (entity.getWorld().random.nextInt(110) == 1) { if (entity.getWorld().random.nextInt(110) == 1) {
pony.getLevel().add(1); pony.getLevel().add(1);
@ -666,7 +671,9 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
LivingEntity.FallSounds fallSounds = entity.getFallSounds(); LivingEntity.FallSounds fallSounds = entity.getFallSounds();
playSound(distance > 4 ? fallSounds.big() : fallSounds.small(), 1, entity.getSoundPitch()); playSound(distance > 4 ? fallSounds.big() : fallSounds.small(), 1, entity.getSoundPitch());
} }
entity.damage(entity.getDamageSources().flyIntoWall(), distance); if (!entity.getWorld().isClient) {
entity.damage((ServerWorld)entity.getWorld(), entity.getDamageSources().flyIntoWall(), distance);
}
} }
} }
@ -694,7 +701,9 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
} }
if (entity.getWorld().hasRain(entity.getBlockPos())) { if (entity.getWorld().hasRain(entity.getBlockPos())) {
applyTurbulance(velocity); if (!entity.getWorld().isClient) {
applyTurbulance((ServerWorld)entity.getWorld(), velocity);
}
} else { } else {
float targetUpdraft = WeatherConditions.THERMAL_FIELD.getValue(entity.getWorld(), new BlockPos.Mutable().set(entity.getBlockPos())) / 3F; float targetUpdraft = WeatherConditions.THERMAL_FIELD.getValue(entity.getWorld(), new BlockPos.Mutable().set(entity.getBlockPos())) / 3F;
targetUpdraft *= 1 + motion; targetUpdraft *= 1 + motion;
@ -768,17 +777,13 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
} }
} }
private void applyTurbulance(MutableVector velocity) { private void applyTurbulance(ServerWorld world, MutableVector velocity) {
int globalEffectStrength = entity.getWorld().getGameRules().getInt(UGameRules.WEATHER_EFFECTS_STRENGTH); int globalEffectStrength = world.getGameRules().getInt(UGameRules.WEATHER_EFFECTS_STRENGTH);
float effectStrength = Math.min(1, (float)ticksInAir / MAX_TICKS_TO_WEATHER_EFFECTS) * (globalEffectStrength / 100F); float effectStrength = Math.min(1, (float)ticksInAir / MAX_TICKS_TO_WEATHER_EFFECTS) * (globalEffectStrength / 100F);
Vec3d gust = WeatherConditions.getGustStrength(entity.getWorld(), entity.getBlockPos()) Vec3d gust = WeatherConditions.getGustStrength(entity.getWorld(), entity.getBlockPos())
.multiply(globalEffectStrength / 100D) .multiply(globalEffectStrength / 100D)
.multiply(1 / (1 + Math.floor(pony.getLevel().get() / 10F))); .multiply(1 / (1 + Math.floor(pony.getLevel().get() / 10F)));
if (effectStrength * gust.getX() >= 1) { if (effectStrength * gust.getX() >= 1) {
SoundEmitter.playSoundAt(entity, USounds.AMBIENT_WIND_GUST, SoundCategory.AMBIENT, 3, 1); SoundEmitter.playSoundAt(entity, USounds.AMBIENT_WIND_GUST, SoundCategory.AMBIENT, 3, 1);
} }
@ -796,7 +801,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
velocity.add(airflow.normalize(), windStrength.getValue()); velocity.add(airflow.normalize(), windStrength.getValue());
if (!entity.getWorld().isClient && effectStrength > 0.9F && entity.getWorld().isThundering() && entity.getWorld().random.nextInt(9000) == 0) { if (!entity.getWorld().isClient && effectStrength > 0.9F && entity.getWorld().isThundering() && entity.getWorld().random.nextInt(9000) == 0) {
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.getWorld()); LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.getWorld(), SpawnReason.EVENT);
lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ()); lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ());
entity.getWorld().spawnEntity(lightning); entity.getWorld().spawnEntity(lightning);
@ -847,15 +852,17 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
if (damage > 0) { if (damage > 0) {
pony.subtractEnergyCost(damage / 5F); pony.subtractEnergyCost(damage / 5F);
entity.damage(entity.getDamageSources().flyIntoWall(), Math.min(damage, entity.getHealth() - 1)); if (!entity.getWorld().isClient) {
entity.damage((ServerWorld)entity.getWorld(), entity.getDamageSources().flyIntoWall(), Math.min(damage, entity.getHealth() - 1));
}
if (!isEarthPonySmash) { if (!isEarthPonySmash) {
UCriteria.BREAK_WINDOW.trigger(entity); UCriteria.BREAK_WINDOW.trigger(entity);
} }
} }
if (isEarthPonySmash) { if (isEarthPonySmash && !entity.getWorld().isClient) {
DamageSource damageSource = pony.damageOf(UDamageTypes.STEAMROLLER); DamageSource damageSource = pony.damageOf(UDamageTypes.STEAMROLLER);
pony.findAllEntitiesInRange(speed + 4, EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.and(EntityPredicates.VALID_LIVING_ENTITY)).forEach(e -> e.damage(damageSource, 50)); pony.findAllEntitiesInRange(speed + 4, EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.and(EntityPredicates.VALID_LIVING_ENTITY)).forEach(e -> e.damage((ServerWorld)entity.getWorld(), damageSource, 50));
} }
pony.updateVelocity(); pony.updateVelocity();

View file

@ -482,9 +482,9 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
entity.playSound(SoundEvents.ENTITY_TURTLE_AMBIENT_LAND, 1, 1); entity.playSound(SoundEvents.ENTITY_TURTLE_AMBIENT_LAND, 1, 1);
} }
if (entity.getAir() == -20) { if (entity.getAir() == -20 && !asWorld().isClient) {
entity.setAir(0); entity.setAir(0);
entity.damage(entity.getDamageSources().dryOut(), 2); entity.damage((ServerWorld)asWorld(), entity.getDamageSources().dryOut(), 2);
} }
} }
} }
@ -831,7 +831,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
} }
public ActionResult canSleepNow() { public ActionResult canSleepNow() {
if (asWorld().getGameRules().getBoolean(UGameRules.DO_NOCTURNAL_BAT_PONIES) && getSpecies().isNocturnal()) { if (!asWorld().isClient && ((ServerWorld)asWorld()).getGameRules().getBoolean(UGameRules.DO_NOCTURNAL_BAT_PONIES) && getSpecies().isNocturnal()) {
return asWorld().isDay() || asWorld().getAmbientDarkness() >= 4 ? ActionResult.SUCCESS : ActionResult.FAIL; return asWorld().isDay() || asWorld().getAmbientDarkness() >= 4 ? ActionResult.SUCCESS : ActionResult.FAIL;
} }
@ -899,7 +899,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
public void copyFrom(Pony oldPlayer, boolean alive) { public void copyFrom(Pony oldPlayer, boolean alive) {
boolean forcedSwap = (!alive boolean forcedSwap = (!alive
&& entity instanceof ServerPlayerEntity && entity instanceof ServerPlayerEntity
&& entity.getWorld().getGameRules().getBoolean(UGameRules.SWAP_TRIBE_ON_DEATH) && ((ServerWorld)entity.getWorld()).getGameRules().getBoolean(UGameRules.SWAP_TRIBE_ON_DEATH)
&& oldPlayer.respawnRace.isUnset()) && oldPlayer.respawnRace.isUnset())
|| oldPlayer.getSpecies().isUnset(); || oldPlayer.getSpecies().isUnset();
@ -919,7 +919,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
if (!alive) { if (!alive) {
// putting it here instead of adding another injection point into ServerPlayerEntity.copyFrom() // putting it here instead of adding another injection point into ServerPlayerEntity.copyFrom()
if (!asWorld().getGameRules().getBoolean(GameRules.KEEP_INVENTORY)) { if (!((ServerWorld)asWorld()).getGameRules().getBoolean(GameRules.KEEP_INVENTORY)) {
PlayerInventory inventory = oldPlayer.asEntity().getInventory(); PlayerInventory inventory = oldPlayer.asEntity().getInventory();
for (int i = 0; i < inventory.size(); i++) { for (int i = 0; i < inventory.size(); i++) {
ItemStack stack = inventory.getStack(i); ItemStack stack = inventory.getStack(i);

View file

@ -4,6 +4,7 @@ import net.minecraft.block.Block;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.entity.Entity.RemovalReason;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -23,20 +24,20 @@ public class EmptyJarItem extends BlockItem {
&& entity.getWorld().isThundering() && entity.getWorld().isThundering()
&& entity.getWorld().isSkyVisible(entity.getBlockPos()) && entity.getWorld().isSkyVisible(entity.getBlockPos())
&& entity.getWorld().random.nextInt(130) == 0) { && entity.getWorld().random.nextInt(130) == 0) {
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.getWorld()); LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.getWorld(), SpawnReason.EVENT);
lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ()); lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ());
entity.remove(RemovalReason.DISCARDED); entity.remove(RemovalReason.DISCARDED);
entity.getWorld().spawnEntity(lightning); entity.getWorld().spawnEntity(lightning);
ItemEntity neu = EntityType.ITEM.create(entity.getWorld()); ItemEntity neu = EntityType.ITEM.create(entity.getWorld(), SpawnReason.TRIGGERED);
neu.copyPositionAndRotation(entity); neu.copyPositionAndRotation(entity);
neu.setStack(new ItemStack(this == UItems.RAIN_CLOUD_JAR ? UItems.STORM_CLOUD_JAR : UItems.LIGHTNING_JAR)); neu.setStack(new ItemStack(this == UItems.RAIN_CLOUD_JAR ? UItems.STORM_CLOUD_JAR : UItems.LIGHTNING_JAR));
neu.setInvulnerable(true); neu.setInvulnerable(true);
entity.getWorld().spawnEntity(neu); entity.getWorld().spawnEntity(neu);
ItemEntity copy = EntityType.ITEM.create(entity.getWorld()); ItemEntity copy = EntityType.ITEM.create(entity.getWorld(), SpawnReason.TRIGGERED);
copy.copyPositionAndRotation(entity); copy.copyPositionAndRotation(entity);
copy.setInvulnerable(true); copy.setInvulnerable(true);
copy.setStack(entity.getStack()); copy.setStack(entity.getStack());

View file

@ -11,12 +11,12 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellTyp
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.item.component.UDataComponentTypes;
import com.minelittlepony.unicopia.util.TypedActionResult;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
public interface EnchantableItem extends ItemConvertible { public interface EnchantableItem extends ItemConvertible {
static CustomisedSpellType<?> getSpellEffect(ItemStack stack) { static CustomisedSpellType<?> getSpellEffect(ItemStack stack) {
@ -43,7 +43,7 @@ public interface EnchantableItem extends ItemConvertible {
if (!player.getWorld().isClient && consume) { if (!player.getWorld().isClient && consume) {
player.swingHand(player.getStackInHand(Hand.OFF_HAND) == stack ? Hand.OFF_HAND : Hand.MAIN_HAND); player.swingHand(player.getStackInHand(Hand.OFF_HAND) == stack ? Hand.OFF_HAND : Hand.MAIN_HAND);
player.getItemCooldownManager().set(stack.getItem(), 20); player.getItemCooldownManager().set(stack, 20);
if (!player.isCreative()) { if (!player.isCreative()) {
if (stack.getCount() == 1) { if (stack.getCount() == 1) {
@ -54,7 +54,7 @@ public interface EnchantableItem extends ItemConvertible {
} }
} }
return TypedActionResult.consume(result); return TypedActionResult.success(result);
} }
static boolean isEnchanted(ItemStack stack) { static boolean isEnchanted(ItemStack stack) {

View file

@ -13,14 +13,14 @@ import net.minecraft.block.Block;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.AliasedBlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkSectionPos; import net.minecraft.util.math.ChunkSectionPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -48,7 +48,7 @@ public class WeatherJarItem extends AliasedBlockItem implements Projectile, Proj
} }
@Override @Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) { public ActionResult use(World world, PlayerEntity player, Hand hand) {
if (player.shouldCancelInteraction()) { if (player.shouldCancelInteraction()) {
return super.use(world, player, hand); return super.use(world, player, hand);
} }
@ -100,7 +100,7 @@ public class WeatherJarItem extends AliasedBlockItem implements Projectile, Proj
} }
if (type == Type.LIGHTNING) { if (type == Type.LIGHTNING) {
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world); LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world, SpawnReason.EVENT);
lightning.refreshPositionAfterTeleport(pos.getX(), pos.getY(), pos.getZ()); lightning.refreshPositionAfterTeleport(pos.getX(), pos.getY(), pos.getZ());
world.spawnEntity(lightning); world.spawnEntity(lightning);

View file

@ -8,11 +8,9 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
@ -30,7 +28,7 @@ public class CloudBlockItem extends BlockItem {
} }
@Override @Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) { public ActionResult use(World world, PlayerEntity user, Hand hand) {
InteractionManager.getInstance().sendPlayerLookAngles(user); InteractionManager.getInstance().sendPlayerLookAngles(user);
Vec3d targetPos = user.getEyePos().add(user.getRotationVec(1).multiply(1, 1.5, 1).normalize().multiply(2)); Vec3d targetPos = user.getEyePos().add(user.getRotationVec(1).multiply(1, 1.5, 1).normalize().multiply(2));
ItemPlacementContext context = new ItemPlacementContext(user, hand, user.getStackInHand(hand), new BlockHitResult( ItemPlacementContext context = new ItemPlacementContext(user, hand, user.getStackInHand(hand), new BlockHitResult(
@ -40,13 +38,7 @@ public class CloudBlockItem extends BlockItem {
true true
)); ));
ActionResult actionResult = place(context); return place(context);
if (actionResult.isAccepted()) {
return TypedActionResult.success(context.getStack(), world.isClient);
}
return TypedActionResult.pass(user.getStackInHand(hand));
} }
@Override @Override

View file

@ -34,10 +34,10 @@ public record BreaksIntoItemComponent(
); );
public Optional<Item> getItemAfterBreaking() { public Optional<Item> getItemAfterBreaking() {
return Registries.ITEM.getOrEmpty(itemAfterBreaking()); return Registries.ITEM.getOptionalValue(itemAfterBreaking());
} }
public Optional<SoundEvent> getBreakingSound() { public Optional<SoundEvent> getBreakingSound() {
return Registries.SOUND_EVENT.getOrEmpty(breakingSound); return Registries.SOUND_EVENT.getOptionalValue(breakingSound);
} }
} }

View file

@ -138,13 +138,13 @@ public interface EnchantmentUtil {
@Deprecated @Deprecated
static int getLevel(RegistryKey<Enchantment> enchantment, LivingEntity entity) { static int getLevel(RegistryKey<Enchantment> enchantment, LivingEntity entity) {
return entity.getRegistryManager().get(RegistryKeys.ENCHANTMENT).getEntry(enchantment) return entity.getRegistryManager().getOrThrow(RegistryKeys.ENCHANTMENT).getEntry(enchantment.getValue())
.map(entry -> EnchantmentHelper.getEquipmentLevel(entry, entity)) .map(entry -> EnchantmentHelper.getEquipmentLevel(entry, entity))
.orElse(0); .orElse(0);
} }
private static int getTotalLevel(RegistryKey<Enchantment> enchantment, LivingEntity entity) { private static int getTotalLevel(RegistryKey<Enchantment> enchantment, LivingEntity entity) {
return entity.getRegistryManager().get(RegistryKeys.ENCHANTMENT).getEntry(enchantment) return entity.getRegistryManager().getOrThrow(RegistryKeys.ENCHANTMENT).getEntry(enchantment.getValue())
.map(entry -> getTotalEquipmentLevel(entry, entity)) .map(entry -> getTotalEquipmentLevel(entry, entity))
.orElse(0); .orElse(0);
} }

View file

@ -61,11 +61,11 @@ public class MagicProjectileEntity extends ThrownItemEntity implements WeaklyOwn
} }
public MagicProjectileEntity(World world, LivingEntity thrower) { public MagicProjectileEntity(World world, LivingEntity thrower) {
super(UEntities.THROWN_ITEM, thrower, world); super(UEntities.THROWN_ITEM, thrower, world, UItems.GEMSTONE.getDefaultStack());
} }
protected MagicProjectileEntity(EntityType<? extends MagicProjectileEntity> type, World world, LivingEntity thrower) { protected MagicProjectileEntity(EntityType<? extends MagicProjectileEntity> type, World world, LivingEntity thrower) {
super(type, thrower, world); super(type, thrower, world, UItems.GEMSTONE.getDefaultStack());
} }
@Override @Override
@ -221,8 +221,8 @@ public class MagicProjectileEntity extends ThrownItemEntity implements WeaklyOwn
if (entity != null) { if (entity != null) {
float damage = getThrowDamage(); float damage = getThrowDamage();
if (damage > 0) { if (damage > 0 && !getWorld().isClient) {
entity.damage(getDamageSources().thrown(this, getOwner()), getThrowDamage()); entity.damage((ServerWorld)getWorld(), getDamageSources().thrown(this, getOwner()), getThrowDamage());
} }
forEachDelegates(effect -> effect.onImpact(this, hit), ProjectileDelegate.EntityHitListener.PREDICATE); forEachDelegates(effect -> effect.onImpact(this, hit), ProjectileDelegate.EntityHitListener.PREDICATE);
@ -232,7 +232,7 @@ public class MagicProjectileEntity extends ThrownItemEntity implements WeaklyOwn
public void knockback(LivingEntity target, DamageSource source, ItemStack weapon) { public void knockback(LivingEntity target, DamageSource source, ItemStack weapon) {
double d = weapon != null && getWorld() instanceof ServerWorld serverWorld ? EnchantmentHelper.modifyKnockback(serverWorld, weapon, target, source, 0) : 0; double d = weapon != null && getWorld() instanceof ServerWorld serverWorld ? EnchantmentHelper.modifyKnockback(serverWorld, weapon, target, source, 0) : 0;
if (d > 0) { if (d > 0) {
double e = Math.max(0, 1 - target.getAttributeValue(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)); double e = Math.max(0, 1 - target.getAttributeValue(EntityAttributes.KNOCKBACK_RESISTANCE));
Vec3d vec3d = this.getVelocity().multiply(1, 0, 1).normalize().multiply(d * 0.6 * e); Vec3d vec3d = this.getVelocity().multiply(1, 0, 1).normalize().multiply(d * 0.6 * e);
if (vec3d.lengthSquared() > 0) { if (vec3d.lengthSquared() > 0) {
target.addVelocity(vec3d.x, 0.1, vec3d.z); target.addVelocity(vec3d.x, 0.1, vec3d.z);

View file

@ -120,7 +120,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
if (inGround) { if (inGroundTime > 0) {
Vec3d vel = getVelocity(); Vec3d vel = getVelocity();
vel = vel.multiply(0, 1, 0); vel = vel.multiply(0, 1, 0);
@ -168,7 +168,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl
playSound(USounds.Vanilla.ENTITY_ITEM_BREAK, 1, 1); playSound(USounds.Vanilla.ENTITY_ITEM_BREAK, 1, 1);
}); });
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
dropStack(stack); dropStack(sw, stack);
} }
discard(); discard();
} }
@ -227,7 +227,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl
if (getVelocity().length() > 0.2F) { if (getVelocity().length() > 0.2F) {
boolean ownerCanModify = !getWorld().isClient && Caster.of(getOwner()).filter(pony -> pony.canModifyAt(hit.getBlockPos())).isPresent(); boolean ownerCanModify = !getWorld().isClient && Caster.of(getOwner()).filter(pony -> pony.canModifyAt(hit.getBlockPos())).isPresent();
if (ownerCanModify && getWorld().getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) { if (ownerCanModify && ((ServerWorld)getWorld()).getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) {
if ((!isBouncy() || getWorld().random.nextInt(200) == 0) && getWorld().getBlockState(hit.getBlockPos()).isIn(UTags.Blocks.FRAGILE)) { if ((!isBouncy() || getWorld().random.nextInt(200) == 0) && getWorld().getBlockState(hit.getBlockPos()).isIn(UTags.Blocks.FRAGILE)) {
getWorld().breakBlock(hit.getBlockPos(), true); getWorld().breakBlock(hit.getBlockPos(), true);
} }

View file

@ -16,8 +16,8 @@ import net.minecraft.item.ProjectileItem;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.stat.Stats; import net.minecraft.stat.Stats;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.Unit; import net.minecraft.util.Unit;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Position; import net.minecraft.util.math.Position;
@ -48,7 +48,7 @@ public interface Projectile extends ItemConvertible, ProjectileItem {
return SETTINGS; return SETTINGS;
} }
default TypedActionResult<ItemStack> triggerThrow(World world, PlayerEntity player, Hand hand) { default ActionResult triggerThrow(World world, PlayerEntity player, Hand hand) {
ItemStack stack = player.getStackInHand(hand); ItemStack stack = player.getStackInHand(hand);
if (!world.isClient) { if (!world.isClient) {
@ -71,7 +71,7 @@ public interface Projectile extends ItemConvertible, ProjectileItem {
stack.decrement(1); stack.decrement(1);
} }
return TypedActionResult.success(stack, world.isClient()); return ActionResult.SUCCESS_SERVER.withNewHandStack(stack);
} }
default ProjectileEntity createProjectile(ItemStack stack, World world, @Nullable PlayerEntity player) { default ProjectileEntity createProjectile(ItemStack stack, World world, @Nullable PlayerEntity player) {

View file

@ -26,7 +26,7 @@ class FeatureRegistry {
registries.getOptional(RegistryKeys.PLACED_FEATURE).ifPresent(registry -> { registries.getOptional(RegistryKeys.PLACED_FEATURE).ifPresent(registry -> {
var lookup = registries.getOptional(RegistryKeys.CONFIGURED_FEATURE).orElseThrow(); var lookup = registries.getOptional(RegistryKeys.CONFIGURED_FEATURE).orElseThrow();
PLACED_FEATURES.forEach(entry -> { PLACED_FEATURES.forEach(entry -> {
Registry.register(registry, entry.key(), entry.factory().apply(lookup.getEntry(entry.configuration()).orElseThrow())); Registry.register(registry, entry.key(), entry.factory().apply(lookup.getEntry(entry.configuration().getValue()).orElseThrow()));
}); });
}); });
}); });

View file

@ -42,7 +42,7 @@ public record Tree (
}); });
}); });
registries.getOptional(RegistryKeys.PLACED_FEATURE).ifPresent(registry -> { registries.getOptional(RegistryKeys.PLACED_FEATURE).ifPresent(registry -> {
var reg = registries.asDynamicRegistryManager().createRegistryLookup().getOrThrow(RegistryKeys.CONFIGURED_FEATURE); var reg = registries.asDynamicRegistryManager().getOrThrow(RegistryKeys.CONFIGURED_FEATURE);
REGISTRY.stream().forEach(tree -> { REGISTRY.stream().forEach(tree -> {
tree.placements().forEach(placement -> { tree.placements().forEach(placement -> {
Registry.register(registry, placement.id(), new PlacedFeature(reg.getOrThrow(tree.configuredFeatureId()), Registry.register(registry, placement.id(), new PlacedFeature(reg.getOrThrow(tree.configuredFeatureId()),
@ -131,7 +131,7 @@ public record Tree (
public Tree build() { public Tree build() {
RegistryKey<ConfiguredFeature<?, ?>> configuredFeatureId = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, id); RegistryKey<ConfiguredFeature<?, ?>> configuredFeatureId = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, id);
Optional<Block> sapling = saplingId.map(id -> UBlocks.register(id, saplingConstructor.apply(new SaplingGenerator(id.toString(), Optional.of(configuredFeatureId), Optional.empty(), Optional.empty()), Block.Settings.copy(Blocks.OAK_SAPLING)), ItemGroups.NATURAL)); Optional<Block> sapling = saplingId.map(id -> UBlocks.register(id, saplingConstructor.apply(new SaplingGenerator(id.toString(), Optional.of(configuredFeatureId), Optional.empty(), Optional.empty()), Block.Settings.copy(Blocks.OAK_SAPLING).registryKey(RegistryKey.of(RegistryKeys.BLOCK, id))), ItemGroups.NATURAL));
Tree tree = new Tree(id, configParameters.apply(new TreeFeatureConfig.Builder( Tree tree = new Tree(id, configParameters.apply(new TreeFeatureConfig.Builder(
BlockStateProvider.of(logType), BlockStateProvider.of(logType),
trunkPlacer, trunkPlacer,
@ -142,7 +142,8 @@ public record Tree (
.collect(Collectors.toUnmodifiableSet()), .collect(Collectors.toUnmodifiableSet()),
sapling, sapling,
sapling.map(saplingBlock -> { sapling.map(saplingBlock -> {
Block flowerPot = Registry.register(Registries.BLOCK, saplingId.get().withPrefixedPath("potted_"), Blocks.createFlowerPotBlock(saplingBlock)); RegistryKey<Block> flowerPotKey = RegistryKey.of(RegistryKeys.BLOCK, saplingId.get().withPrefixedPath("potted_"));
Block flowerPot = Registry.register(Registries.BLOCK, saplingId.get().withPrefixedPath("potted_"), new FlowerPotBlock(saplingBlock, Blocks.createFlowerPotSettings().registryKey(flowerPotKey)));
UBlocks.TRANSLUCENT_BLOCKS.add(flowerPot); UBlocks.TRANSLUCENT_BLOCKS.add(flowerPot);
return flowerPot; return flowerPot;
})); }));

View file

@ -149,7 +149,7 @@ public interface UWorldGen {
.or(BiomeSelectors.tag(BiomeTags.IS_RIVER)) .or(BiomeSelectors.tag(BiomeTags.IS_RIVER))
.or(BiomeSelectors.includeByKey(BiomeKeys.STONY_SHORE)) .or(BiomeSelectors.includeByKey(BiomeKeys.STONY_SHORE))
), GenerationStep.Feature.VEGETAL_DECORATION, SHELLS_PLACED_FEATURE); ), GenerationStep.Feature.VEGETAL_DECORATION, SHELLS_PLACED_FEATURE);
BiomeModifications.addCarver(BiomeSelectors.foundInOverworld(), GenerationStep.Carver.AIR, OVERWORLD_CLOUD_CARVER_CONFIG); BiomeModifications.addCarver(BiomeSelectors.foundInOverworld(), OVERWORLD_CLOUD_CARVER_CONFIG);
UTreeGen.bootstrap(); UTreeGen.bootstrap();
OverworldBiomeSelectionCallback.EVENT.register(context -> { OverworldBiomeSelectionCallback.EVENT.register(context -> {

View file

@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.util.Tickable;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.nbt.*; import net.minecraft.nbt.*;
import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs; import net.minecraft.network.codec.PacketCodecs;
@ -113,7 +114,7 @@ public class ZapAppleStageStore extends PersistentState implements Tickable {
StreamSupport.stream(BlockPos.iterateRandomly(world.random, 20, pos, 10).spliterator(), false) StreamSupport.stream(BlockPos.iterateRandomly(world.random, 20, pos, 10).spliterator(), false)
.filter(p -> world.isAir(p) && !world.isAir(p.down()) && world.isSkyVisible(p)) .filter(p -> world.isAir(p) && !world.isAir(p.down()) && world.isSkyVisible(p))
.findFirst().ifPresent(p -> { .findFirst().ifPresent(p -> {
LightningEntity bolt = EntityType.LIGHTNING_BOLT.create(world); LightningEntity bolt = EntityType.LIGHTNING_BOLT.create(world, SpawnReason.EVENT);
bolt.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos)); bolt.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos));
bolt.setCosmetic(true); bolt.setCosmetic(true);
world.spawnEntity(bolt); world.spawnEntity(bolt);

View file

@ -3,7 +3,8 @@ package com.minelittlepony.unicopia.util;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.SheepEntity; import net.minecraft.entity.passive.SheepEntity;
import net.minecraft.util.DyeColor; import net.minecraft.util.DyeColor;
import net.minecraft.util.math.ColorHelper.Argb;
import static net.minecraft.util.math.ColorHelper.*;
public interface ColorHelper { public interface ColorHelper {
static int getRainbowColor(Entity entity, int speed, float tickDelta) { static int getRainbowColor(Entity entity, int speed, float tickDelta) {
@ -14,7 +15,7 @@ public interface ColorHelper {
float r = (entity.age % speed + tickDelta) / 25.0f; float r = (entity.age % speed + tickDelta) / 25.0f;
int fs = SheepEntity.getRgbColor(DyeColor.byId(p)); int fs = SheepEntity.getRgbColor(DyeColor.byId(p));
int gs = SheepEntity.getRgbColor(DyeColor.byId(q)); int gs = SheepEntity.getRgbColor(DyeColor.byId(q));
return Argb.lerp(r, fs, gs); return lerp(r, fs, gs);
} }
static float[] changeSaturation(float red, float green, float blue, float intensity) { static float[] changeSaturation(float red, float green, float blue, float intensity) {
@ -43,10 +44,10 @@ public interface ColorHelper {
} }
static int saturate(int color, float intensity) { static int saturate(int color, float intensity) {
float a = Argb.getAlpha(color) / 255F, float a = getAlpha(color) / 255F,
red = Argb.getRed(color) / 255F, red = getRed(color) / 255F,
green = Argb.getGreen(color) / 255F, green = getGreen(color) / 255F,
blue = Argb.getBlue(color) / 255F; blue = getBlue(color) / 255F;
float avg = (red + green + blue) / 3F; float avg = (red + green + blue) / 3F;
float r = avg + (red - avg) * intensity, float r = avg + (red - avg) * intensity,
g = avg + (green - avg) * intensity, g = avg + (green - avg) * intensity,
@ -68,6 +69,6 @@ public interface ColorHelper {
b = 1; b = 1;
} }
return Argb.fromFloats(a, r, g, b); return fromFloats(a, r, g, b);
} }
} }

View file

@ -4,7 +4,6 @@ import net.minecraft.block.dispenser.DispenserBehavior;
import net.minecraft.block.dispenser.ItemDispenserBehavior; import net.minecraft.block.dispenser.ItemDispenserBehavior;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
@ -14,14 +13,13 @@ public interface Dispensable {
private ActionResult result; private ActionResult result;
@Override @Override
protected ItemStack dispenseSilently(BlockPointer source, ItemStack stack) { protected ItemStack dispenseSilently(BlockPointer source, ItemStack stack) {
TypedActionResult<ItemStack> result = dispenseStack(source, stack); result = dispenseStack(source, stack);
this.result = result.getResult();
if (!this.result.isAccepted()) { if (!result.isAccepted()) {
return super.dispenseSilently(source, stack); return super.dispenseSilently(source, stack);
} }
return result.getValue(); return result instanceof ActionResult.Success success ? success.getNewHandStack() : stack.split(1);
} }
@Override @Override
@ -43,5 +41,5 @@ public interface Dispensable {
/** /**
* Called to dispense this stack. * Called to dispense this stack.
*/ */
TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack); ActionResult dispenseStack(BlockPointer source, ItemStack stack);
} }

View file

@ -0,0 +1,17 @@
package com.minelittlepony.unicopia.util;
import net.minecraft.util.ActionResult;
public record TypedActionResult<T> (ActionResult result, T value) {
public static <T> TypedActionResult<T> success(T value) {
return new TypedActionResult<>(ActionResult.SUCCESS, value);
}
public static <T> TypedActionResult<T> pass(T value) {
return new TypedActionResult<>(ActionResult.PASS, value);
}
public static <T> TypedActionResult<T> fail(T value) {
return new TypedActionResult<>(ActionResult.FAIL, value);
}
}

View file

@ -28,7 +28,7 @@ public class DynamicRegistry<T> implements RegistryBuilder.BootstrapFunction<T>
if (added.getAndSet(true)) { if (added.getAndSet(true)) {
return; return;
} }
final WrapperLookup lookup = registries.asDynamicRegistryManager()::getWrapperOrThrow; final WrapperLookup lookup = registries.asDynamicRegistryManager()::getOrThrow;
keys.forEach((key, entry) -> { keys.forEach((key, entry) -> {
if (!r.contains(key)) { if (!r.contains(key)) {
Registry.register(r, key, entry.factory().apply(lookup, key)); Registry.register(r, key, entry.factory().apply(lookup, key));