mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Fixed altar detection for the alicorn amulet and make it more efficient by saving the centers of active altars
This commit is contained in:
parent
543adefd6d
commit
cadad49aab
3 changed files with 35 additions and 14 deletions
|
@ -15,7 +15,7 @@ import com.minelittlepony.unicopia.entity.player.*;
|
||||||
import com.minelittlepony.unicopia.particle.FollowingParticleEffect;
|
import com.minelittlepony.unicopia.particle.FollowingParticleEffect;
|
||||||
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.Altar;
|
import com.minelittlepony.unicopia.server.world.UnicopiaWorldProperties;
|
||||||
import com.minelittlepony.unicopia.trinkets.TrinketsDelegate;
|
import com.minelittlepony.unicopia.trinkets.TrinketsDelegate;
|
||||||
import com.minelittlepony.unicopia.util.VecHelper;
|
import com.minelittlepony.unicopia.util.VecHelper;
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ import net.minecraft.particle.ParticleEffect;
|
||||||
import net.minecraft.particle.ParticleTypes;
|
import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.predicate.entity.EntityPredicates;
|
import net.minecraft.predicate.entity.EntityPredicates;
|
||||||
import net.minecraft.registry.tag.DamageTypeTags;
|
import net.minecraft.registry.tag.DamageTypeTags;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.*;
|
import net.minecraft.util.*;
|
||||||
|
@ -192,7 +193,8 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab
|
||||||
|
|
||||||
if (entity instanceof PlayerEntity) {
|
if (entity instanceof PlayerEntity) {
|
||||||
if (entity.isOnFire() && world.getBlockState(entity.getBlockPos().up()).isOf(Blocks.SOUL_FIRE)) {
|
if (entity.isOnFire() && world.getBlockState(entity.getBlockPos().up()).isOf(Blocks.SOUL_FIRE)) {
|
||||||
if (Altar.of(entity.getBlockPos().up()).isValid(world)) {
|
if (UnicopiaWorldProperties.forWorld((ServerWorld)world).isActiveAltar(entity.getBlockPos())
|
||||||
|
|| UnicopiaWorldProperties.forWorld((ServerWorld)world).isActiveAltar(entity.getBlockPos().up())) {
|
||||||
if (living.asEntity().getHealth() < 2) {
|
if (living.asEntity().getHealth() < 2) {
|
||||||
entity.setFireTicks(0);
|
entity.setFireTicks(0);
|
||||||
world.removeBlock(entity.getBlockPos().up(), false);
|
world.removeBlock(entity.getBlockPos().up(), false);
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
package com.minelittlepony.unicopia.server.world;
|
package com.minelittlepony.unicopia.server.world;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.entity.mob.FloatingArtefactEntity;
|
import com.minelittlepony.unicopia.entity.mob.FloatingArtefactEntity;
|
||||||
|
@ -26,6 +22,7 @@ import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.nbt.NbtElement;
|
import net.minecraft.nbt.NbtElement;
|
||||||
import net.minecraft.predicate.entity.EntityPredicates;
|
import net.minecraft.predicate.entity.EntityPredicates;
|
||||||
import net.minecraft.registry.tag.BlockTags;
|
import net.minecraft.registry.tag.BlockTags;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.util.BlockRotation;
|
import net.minecraft.util.BlockRotation;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Box;
|
import net.minecraft.util.math.Box;
|
||||||
|
@ -54,10 +51,6 @@ public record Altar(BlockPos origin, Set<BlockPos> pillars) {
|
||||||
private static final BlockPos PILLAR_A = new BlockPos(INNER_RADIUS, 0, PILLAR_OFFSET_FROM_CENTER);
|
private static final BlockPos PILLAR_A = new BlockPos(INNER_RADIUS, 0, PILLAR_OFFSET_FROM_CENTER);
|
||||||
private static final BlockPos PILLAR_B = new BlockPos(INNER_RADIUS, 0, -PILLAR_OFFSET_FROM_CENTER);
|
private static final BlockPos PILLAR_B = new BlockPos(INNER_RADIUS, 0, -PILLAR_OFFSET_FROM_CENTER);
|
||||||
|
|
||||||
private static final List<BlockPos> PILLAR_OFFSETS = Arrays.stream(BlockRotation.values()).flatMap(rotation -> {
|
|
||||||
return Stream.of(PILLAR_A.rotate(rotation), PILLAR_B.rotate(rotation));
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
public static Optional<Altar> locateAltar(World world, BlockPos startingPoint) {
|
public static Optional<Altar> locateAltar(World world, BlockPos startingPoint) {
|
||||||
|
|
||||||
BlockPos.Mutable mutable = startingPoint.mutableCopy();
|
BlockPos.Mutable mutable = startingPoint.mutableCopy();
|
||||||
|
@ -103,10 +96,6 @@ public record Altar(BlockPos origin, Set<BlockPos> pillars) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Altar of(BlockPos center) {
|
|
||||||
return new Altar(center, new HashSet<>(PILLAR_OFFSETS.stream().map(p -> p.add(center).up()).toList()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean checkSlab(World world, BlockPos pos) {
|
private static boolean checkSlab(World world, BlockPos pos) {
|
||||||
return !PosHelper.any(pos, p -> !isObsidian(world, p), HORIZONTALS);
|
return !PosHelper.any(pos, p -> !isObsidian(world, p), HORIZONTALS);
|
||||||
}
|
}
|
||||||
|
@ -154,9 +143,15 @@ public record Altar(BlockPos origin, Set<BlockPos> pillars) {
|
||||||
removeExisting(null, world, pillar);
|
removeExisting(null, world, pillar);
|
||||||
world.spawnEntity(artefact);
|
world.spawnEntity(artefact);
|
||||||
});
|
});
|
||||||
|
if (!world.isClient) {
|
||||||
|
UnicopiaWorldProperties.forWorld((ServerWorld)world).addAltar(origin());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void tearDown(@Nullable Entity except, World world) {
|
public void tearDown(@Nullable Entity except, World world) {
|
||||||
|
if (!world.isClient) {
|
||||||
|
UnicopiaWorldProperties.forWorld((ServerWorld)world).removeAltar(origin());
|
||||||
|
}
|
||||||
pillars.forEach(pillar -> removeExisting(except, world, pillar));
|
pillars.forEach(pillar -> removeExisting(except, world, pillar));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
package com.minelittlepony.unicopia.server.world;
|
package com.minelittlepony.unicopia.server.world;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.Race;
|
import com.minelittlepony.unicopia.Race;
|
||||||
import com.minelittlepony.unicopia.network.Channel;
|
import com.minelittlepony.unicopia.network.Channel;
|
||||||
import com.minelittlepony.unicopia.network.MsgSkyAngle;
|
import com.minelittlepony.unicopia.network.MsgSkyAngle;
|
||||||
|
import com.minelittlepony.unicopia.util.NbtSerialisable;
|
||||||
|
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
import net.minecraft.nbt.NbtElement;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.world.PersistentState;
|
import net.minecraft.world.PersistentState;
|
||||||
|
|
||||||
|
@ -16,6 +22,8 @@ public class UnicopiaWorldProperties extends PersistentState {
|
||||||
private Race defaultRace = Race.UNSET;
|
private Race defaultRace = Race.UNSET;
|
||||||
private float tangentalSkyAngle;
|
private float tangentalSkyAngle;
|
||||||
|
|
||||||
|
private final Set<BlockPos> activeAltarPositions = new HashSet<>();
|
||||||
|
|
||||||
public UnicopiaWorldProperties(ServerWorld world) {
|
public UnicopiaWorldProperties(ServerWorld world) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +32,7 @@ public class UnicopiaWorldProperties extends PersistentState {
|
||||||
this(world);
|
this(world);
|
||||||
defaultRace = Race.fromName(tag.getString("defaultRace"), Race.HUMAN);
|
defaultRace = Race.fromName(tag.getString("defaultRace"), Race.HUMAN);
|
||||||
tangentalSkyAngle = tag.getFloat("tangentalSkyAngle");
|
tangentalSkyAngle = tag.getFloat("tangentalSkyAngle");
|
||||||
|
activeAltarPositions.addAll(NbtSerialisable.BLOCK_POS.readAll(tag.getList("activeAltars", NbtElement.COMPOUND_TYPE)).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Race getDefaultRace() {
|
public Race getDefaultRace() {
|
||||||
|
@ -46,10 +55,25 @@ public class UnicopiaWorldProperties extends PersistentState {
|
||||||
Channel.SERVER_SKY_ANGLE.sendToAllPlayers(new MsgSkyAngle(tangentalSkyAngle), world);
|
Channel.SERVER_SKY_ANGLE.sendToAllPlayers(new MsgSkyAngle(tangentalSkyAngle), world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeAltar(BlockPos center) {
|
||||||
|
activeAltarPositions.remove(center);
|
||||||
|
markDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAltar(BlockPos center) {
|
||||||
|
activeAltarPositions.add(center);
|
||||||
|
markDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isActiveAltar(BlockPos center) {
|
||||||
|
return activeAltarPositions.contains(center);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NbtCompound writeNbt(NbtCompound tag) {
|
public NbtCompound writeNbt(NbtCompound tag) {
|
||||||
tag.putString("defaultRace", Race.REGISTRY.getId(defaultRace).toString());
|
tag.putString("defaultRace", Race.REGISTRY.getId(defaultRace).toString());
|
||||||
tag.putFloat("tangentalSkyAngle", tangentalSkyAngle);
|
tag.putFloat("tangentalSkyAngle", tangentalSkyAngle);
|
||||||
|
tag.put("activeAltars", NbtSerialisable.BLOCK_POS.writeAll(activeAltarPositions));
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue