Fixed earth ponies breaking blocks in adventure mode and protected regions. Fixes #434

This commit is contained in:
Sollace 2024-09-16 17:51:41 +01:00
parent 2046ca3029
commit 0ba3fd64a7
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
6 changed files with 29 additions and 17 deletions

View file

@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.recipe.TransformCropsRecipe; import com.minelittlepony.unicopia.recipe.TransformCropsRecipe;
import com.minelittlepony.unicopia.recipe.URecipes; import com.minelittlepony.unicopia.recipe.URecipes;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.TraceHelper;
import com.minelittlepony.unicopia.util.VecHelper; import com.minelittlepony.unicopia.util.VecHelper;
@ -70,7 +71,9 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
for (BlockPos pos : BlockPos.iterate( for (BlockPos pos : BlockPos.iterate(
data.pos().add(-2, -2, -2), data.pos().add(-2, -2, -2),
data.pos().add( 2, 2, 2))) { data.pos().add( 2, 2, 2))) {
count += applySingle(player, player.asWorld(), player.asWorld().getBlockState(pos), pos); if (player.canModifyAt(pos, ModificationType.PHYSICAL)) {
count += applySingle(player, player.asWorld(), player.asWorld().getBlockState(pos), pos);
}
} }
} else { } else {
count = 1; count = 1;

View file

@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.*; import com.minelittlepony.unicopia.util.*;
import net.minecraft.block.BeehiveBlock; import net.minecraft.block.BeehiveBlock;
@ -98,7 +99,7 @@ public class EarthPonyKickAbility implements Ability<Pos> {
} }
BlockPos pos = kickLocation.pos(); BlockPos pos = kickLocation.pos();
EarthPonyStompAbility.stompBlock(w, pos, 10 * (1 + player.getLevel().getScaled(5)) * w.getBlockState(pos).calcBlockBreakingDelta(player.asEntity(), w, pos)); EarthPonyStompAbility.stompBlock(player, w, pos, 10 * (1 + player.getLevel().getScaled(5)) * w.getBlockState(pos).calcBlockBreakingDelta(player.asEntity(), w, pos));
player.setAnimation(Animation.KICK, Animation.Recipient.ANYONE); player.setAnimation(Animation.KICK, Animation.Recipient.ANYONE);
}); });
} }
@ -165,10 +166,16 @@ public class EarthPonyKickAbility implements Ability<Pos> {
if (BlockDestructionManager.of(player.getWorld()).getBlockDestruction(pos) + 4 >= BlockDestructionManager.MAX_DAMAGE) { if (BlockDestructionManager.of(player.getWorld()).getBlockDestruction(pos) + 4 >= BlockDestructionManager.MAX_DAMAGE) {
if (player.getWorld().random.nextInt(30) == 0) { if (player.getWorld().random.nextInt(30) == 0) {
tree.logs().forEach(player.getWorld(), (w, state, p) -> w.breakBlock(p, true)); tree.logs().forEach(player.getWorld(), (w, state, p) -> {
if (iplayer.canModifyAt(p, ModificationType.PHYSICAL)) {
w.breakBlock(p, true);
}
});
tree.leaves().forEach(player.getWorld(), (w, state, p) -> { tree.leaves().forEach(player.getWorld(), (w, state, p) -> {
Block.dropStacks(w.getBlockState(p), w, p); if (iplayer.canModifyAt(p, ModificationType.PHYSICAL)) {
w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL); Block.dropStacks(w.getBlockState(p), w, p);
w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL);
}
}); });
} }

View file

@ -19,6 +19,7 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.PosHelper; import com.minelittlepony.unicopia.util.PosHelper;
import com.minelittlepony.unicopia.util.VecHelper; import com.minelittlepony.unicopia.util.VecHelper;
@ -166,7 +167,7 @@ public class EarthPonyStompAbility implements Ability<Hit> {
double radius = rad + heavyness * 0.3; double radius = rad + heavyness * 0.3;
spawnEffectAround(player, center, radius, rad); spawnEffectAround(iplayer, player, center, radius, rad);
ParticleUtils.spawnParticle(player.getWorld(), UParticles.GROUND_POUND, player.getX(), player.getY() - 1, player.getZ(), 0, 0, 0); ParticleUtils.spawnParticle(player.getWorld(), UParticles.GROUND_POUND, player.getX(), player.getY() - 1, player.getZ(), 0, 0, 0);
BlockState steppingState = player.getSteppingBlockState(); BlockState steppingState = player.getSteppingBlockState();
@ -198,17 +199,17 @@ public class EarthPonyStompAbility implements Ability<Hit> {
return true; return true;
} }
public static void spawnEffectAround(Entity source, BlockPos center, double radius, double range) { public static void spawnEffectAround(Pony pony, Entity source, BlockPos center, double radius, double range) {
BlockPos.stream(new BlockBox(center).expand(MathHelper.ceil(radius))).forEach(i -> { BlockPos.stream(new BlockBox(center).expand(MathHelper.ceil(radius))).forEach(i -> {
double dist = Math.sqrt(i.getSquaredDistance(source.getX(), source.getY(), source.getZ())); double dist = Math.sqrt(i.getSquaredDistance(source.getX(), source.getY(), source.getZ()));
if (dist <= radius) { if (dist <= radius) {
spawnEffect(source.getWorld(), i, dist, range); spawnEffect(pony, source.getWorld(), i, dist, range);
} }
}); });
} }
public static void spawnEffect(World w, BlockPos pos, double dist, double rad) { public static void spawnEffect(Pony pony, World w, BlockPos pos, double dist, double rad) {
if (w.getBlockState(pos.up()).isAir()) { if (w.getBlockState(pos.up()).isAir()) {
BlockState state = w.getBlockState(pos); BlockState state = w.getBlockState(pos);
@ -216,18 +217,18 @@ public class EarthPonyStompAbility implements Ability<Hit> {
float scaledHardness = (1 - hardness / 70); float scaledHardness = (1 - hardness / 70);
float damage = hardness < 0 ? 0 : MathHelper.clamp((int)((1 - dist / rad) * 9 * scaledHardness), 0, BlockDestructionManager.MAX_DAMAGE - 1); float damage = hardness < 0 ? 0 : MathHelper.clamp((int)((1 - dist / rad) * 9 * scaledHardness), 0, BlockDestructionManager.MAX_DAMAGE - 1);
stompBlock(w, pos, damage); stompBlock(pony, w, pos, damage);
} }
} }
public static void stompBlock(World w, BlockPos pos, float damage) { public static void stompBlock(Pony pony, World w, BlockPos pos, float damage) {
BlockState state = w.getBlockState(pos); BlockState state = w.getBlockState(pos);
if (state.isAir() || damage <= 0) { if (state.isAir() || damage <= 0) {
return; return;
} }
if (BlockDestructionManager.of(w).damageBlock(pos, damage) >= BlockDestructionManager.MAX_DAMAGE) { if (BlockDestructionManager.of(w).damageBlock(pos, damage) >= BlockDestructionManager.MAX_DAMAGE && pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
w.breakBlock(pos, true); w.breakBlock(pos, true);
if (w instanceof ServerWorld) { if (w instanceof ServerWorld) {

View file

@ -829,8 +829,8 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
.reduce(0, (u, pos) -> { .reduce(0, (u, pos) -> {
if (pony.canModifyAt(pos, ModificationType.PHYSICAL)) { if (pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
if (isEarthPonySmash) { if (isEarthPonySmash) {
BlockDestructionManager.of(entity.getWorld()).damageBlock(pos, (int)entity.getWorld().getRandom().nextTriangular(5, 3)); float destruction = BlockDestructionManager.of(entity.getWorld()).damageBlock(pos, (int)entity.getWorld().getRandom().nextTriangular(5, 3));
if (BlockDestructionManager.of(entity.getWorld()).getBlockDestruction(pos) >= 9) { if (destruction >= BlockDestructionManager.MAX_DAMAGE - 1 && pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
entity.getWorld().breakBlock(pos, true); entity.getWorld().breakBlock(pos, true);
} }
} else { } else {
@ -862,7 +862,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
if (isFlying()) { if (isFlying()) {
playSound(USounds.ENTITY_PLAYER_PEGASUS_DASH, 1, 1); playSound(USounds.ENTITY_PLAYER_PEGASUS_DASH, 1, 1);
} else { } else {
playSound(USounds.ENTITY_PLAYER_EARTHPONY_DASH, 2, 0.3F); playSound(USounds.ENTITY_PLAYER_EARTHPONY_DASH, 2, 1.3F);
} }
} }

View file

@ -703,7 +703,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
if (EffectUtils.hasExtraDefenses(entity)) { if (EffectUtils.hasExtraDefenses(entity)) {
double radius = distance / 10; double radius = distance / 10;
if (radius > 0) { if (radius > 0) {
EarthPonyStompAbility.spawnEffectAround(entity, entity.getSteppingPos(), radius, radius); EarthPonyStompAbility.spawnEffectAround(this, entity, entity.getSteppingPos(), radius, radius);
} }
} }

View file

@ -17,6 +17,7 @@ import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockDestructionManager implements Tickable { public class BlockDestructionManager implements Tickable {
@ -54,7 +55,7 @@ public class BlockDestructionManager implements Tickable {
if (amount == 0) { if (amount == 0) {
return getBlockDestruction(pos); return getBlockDestruction(pos);
} }
amount = Math.max(getBlockDestruction(pos), 0) + amount; amount = MathHelper.clamp(Math.max(getBlockDestruction(pos), 0) + amount, 0, MAX_DAMAGE);
setBlockDestruction(pos, amount); setBlockDestruction(pos, amount);
return amount; return amount;
} }