mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Fixed earth ponies breaking blocks in adventure mode and protected regions. Fixes #434
This commit is contained in:
parent
2046ca3029
commit
0ba3fd64a7
6 changed files with 29 additions and 17 deletions
|
@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.particle.ParticleUtils;
|
|||
import com.minelittlepony.unicopia.recipe.TransformCropsRecipe;
|
||||
import com.minelittlepony.unicopia.recipe.URecipes;
|
||||
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.VecHelper;
|
||||
|
||||
|
@ -70,7 +71,9 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
|
|||
for (BlockPos pos : BlockPos.iterate(
|
||||
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 {
|
||||
count = 1;
|
||||
|
|
|
@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.entity.player.Pony;
|
|||
import com.minelittlepony.unicopia.particle.ParticleUtils;
|
||||
import com.minelittlepony.unicopia.particle.UParticles;
|
||||
import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
|
||||
import com.minelittlepony.unicopia.server.world.ModificationType;
|
||||
import com.minelittlepony.unicopia.util.*;
|
||||
|
||||
import net.minecraft.block.BeehiveBlock;
|
||||
|
@ -98,7 +99,7 @@ public class EarthPonyKickAbility implements Ability<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);
|
||||
});
|
||||
}
|
||||
|
@ -165,10 +166,16 @@ public class EarthPonyKickAbility implements Ability<Pos> {
|
|||
|
||||
if (BlockDestructionManager.of(player.getWorld()).getBlockDestruction(pos) + 4 >= BlockDestructionManager.MAX_DAMAGE) {
|
||||
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) -> {
|
||||
Block.dropStacks(w.getBlockState(p), w, p);
|
||||
w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL);
|
||||
if (iplayer.canModifyAt(p, ModificationType.PHYSICAL)) {
|
||||
Block.dropStacks(w.getBlockState(p), w, p);
|
||||
w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
|
|||
import com.minelittlepony.unicopia.particle.ParticleUtils;
|
||||
import com.minelittlepony.unicopia.particle.UParticles;
|
||||
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.VecHelper;
|
||||
|
||||
|
@ -166,7 +167,7 @@ public class EarthPonyStompAbility implements Ability<Hit> {
|
|||
|
||||
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);
|
||||
BlockState steppingState = player.getSteppingBlockState();
|
||||
|
@ -198,17 +199,17 @@ public class EarthPonyStompAbility implements Ability<Hit> {
|
|||
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 -> {
|
||||
double dist = Math.sqrt(i.getSquaredDistance(source.getX(), source.getY(), source.getZ()));
|
||||
|
||||
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()) {
|
||||
BlockState state = w.getBlockState(pos);
|
||||
|
||||
|
@ -216,18 +217,18 @@ public class EarthPonyStompAbility implements Ability<Hit> {
|
|||
float scaledHardness = (1 - hardness / 70);
|
||||
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);
|
||||
|
||||
if (state.isAir() || damage <= 0) {
|
||||
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);
|
||||
|
||||
if (w instanceof ServerWorld) {
|
||||
|
|
|
@ -829,8 +829,8 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
|
|||
.reduce(0, (u, pos) -> {
|
||||
if (pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
|
||||
if (isEarthPonySmash) {
|
||||
BlockDestructionManager.of(entity.getWorld()).damageBlock(pos, (int)entity.getWorld().getRandom().nextTriangular(5, 3));
|
||||
if (BlockDestructionManager.of(entity.getWorld()).getBlockDestruction(pos) >= 9) {
|
||||
float destruction = BlockDestructionManager.of(entity.getWorld()).damageBlock(pos, (int)entity.getWorld().getRandom().nextTriangular(5, 3));
|
||||
if (destruction >= BlockDestructionManager.MAX_DAMAGE - 1 && pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
|
||||
entity.getWorld().breakBlock(pos, true);
|
||||
}
|
||||
} else {
|
||||
|
@ -862,7 +862,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
|
|||
if (isFlying()) {
|
||||
playSound(USounds.ENTITY_PLAYER_PEGASUS_DASH, 1, 1);
|
||||
} else {
|
||||
playSound(USounds.ENTITY_PLAYER_EARTHPONY_DASH, 2, 0.3F);
|
||||
playSound(USounds.ENTITY_PLAYER_EARTHPONY_DASH, 2, 1.3F);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -703,7 +703,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
|||
if (EffectUtils.hasExtraDefenses(entity)) {
|
||||
double radius = distance / 10;
|
||||
if (radius > 0) {
|
||||
EarthPonyStompAbility.spawnEffectAround(entity, entity.getSteppingPos(), radius, radius);
|
||||
EarthPonyStompAbility.spawnEffectAround(this, entity, entity.getSteppingPos(), radius, radius);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ import net.minecraft.nbt.NbtCompound;
|
|||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockDestructionManager implements Tickable {
|
||||
|
@ -54,7 +55,7 @@ public class BlockDestructionManager implements Tickable {
|
|||
if (amount == 0) {
|
||||
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);
|
||||
return amount;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue