Woven world thread armor will degrade to protect from the monolith's gaze.

This commit is contained in:
Waterpicker 2024-01-20 23:54:33 -06:00
parent c0ef07beb1
commit b4ca7420f5
5 changed files with 41 additions and 14 deletions

View file

@ -2,10 +2,8 @@ package org.dimdev.dimdoors.entity;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataAccessor;
@ -13,7 +11,6 @@ import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.*; import net.minecraft.world.entity.*;
@ -56,6 +53,10 @@ public class MonolithEntity extends Mob {
this.aggroCap = Mth.nextInt(this.getRandom(), MIN_AGGRO_CAP, MAX_AGGRO_CAP); this.aggroCap = Mth.nextInt(this.getRandom(), MIN_AGGRO_CAP, MAX_AGGRO_CAP);
this.setNoGravity(true); this.setNoGravity(true);
this.lookControl = new LookControl(this) { this.lookControl = new LookControl(this) {
@Override
protected float rotateTowards(float from, float to, float maxDelta) {
return to;
}
@Override @Override
protected boolean resetXRotOnTick() { protected boolean resetXRotOnTick() {

View file

@ -6,6 +6,7 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.EntitySelector;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.ai.targeting.TargetingConditions; import net.minecraft.world.entity.ai.targeting.TargetingConditions;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@ -17,8 +18,11 @@ import org.dimdev.dimdoors.network.ServerPacketHandler;
import org.dimdev.dimdoors.network.packet.s2c.MonolithAggroParticlesPacket; import org.dimdev.dimdoors.network.packet.s2c.MonolithAggroParticlesPacket;
import org.dimdev.dimdoors.network.packet.s2c.MonolithTeleportParticlesPacket; import org.dimdev.dimdoors.network.packet.s2c.MonolithTeleportParticlesPacket;
import org.dimdev.dimdoors.sound.ModSoundEvents; import org.dimdev.dimdoors.sound.ModSoundEvents;
import org.dimdev.dimdoors.tag.ModItemTags;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.dimdev.dimdoors.entity.MonolithEntity.MAX_AGGRO; import static org.dimdev.dimdoors.entity.MonolithEntity.MAX_AGGRO;
@ -57,23 +61,36 @@ public class MonolithAggroGoal extends Goal {
} }
public void tick() { public void tick() {
if (this.target != null && this.target.distanceTo(this.mob) > 70) { if (this.target != null && this.target.distanceTo(this.mob) > 70 && this.mob.getAggro() == 0) {
this.stop(); this.stop();
return; return;
} }
if (this.target != null && (this.target.getInventory().armor.get(0).getItem() == ModItems.WORLD_THREAD_HELMET && this.target.getInventory().armor.get(1).getItem() == ModItems.WORLD_THREAD_CHESTPLATE && this.target.getInventory().armor.get(2).getItem() == ModItems.WORLD_THREAD_LEGGINGS && this.target.getInventory().armor.get(3).getItem() == ModItems.WORLD_THREAD_BOOTS)) { if (this.target != null) {
RandomSource random = RandomSource.create(); var slots = Stream.of(EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET).filter(a -> target.getItemBySlot(a).is(ModItemTags.LIMBO_GAZE_DEFYING)).toList();
int i = random.nextInt(64);
if (this.target instanceof ServerPlayer) { if (!slots.isEmpty()) {
if (i < 4) { RandomSource random = RandomSource.create();
this.target.getInventory().armor.get(0).hurt(i, random, (ServerPlayer) this.target);
this.target.getInventory().armor.get(1).hurt(i, random, (ServerPlayer) this.target); int i = random.nextInt((64 + 16 * (slots.size() / 4)));
this.target.getInventory().armor.get(2).hurt(i, random, (ServerPlayer) this.target); if (this.target instanceof ServerPlayer) {
this.target.getInventory().armor.get(3).hurt(i, random, (ServerPlayer) this.target); if (i < 4) {
var slot = random.nextIntBetweenInclusive(0, slots.size() - 1);
var equip = slots.get(slot);
var item = this.target.getItemBySlot(equip);
item.hurtAndBreak(i, target, livingEntity -> livingEntity.broadcastBreakEvent(equip));
}
this.mob.updateAggroLevel(this.target, false);
} }
return;
} }
return;
} }
boolean visibility = this.target != null; boolean visibility = this.target != null;

View file

@ -12,6 +12,8 @@ public class ModItemTags {
public static final TagKey<Item> GOLD_INGOTS = of("gold_ingots"); public static final TagKey<Item> GOLD_INGOTS = of("gold_ingots");
public static final TagKey<Item> IRON_INGOTS = of("iron_ingots"); public static final TagKey<Item> IRON_INGOTS = of("iron_ingots");
public static final TagKey<Item> LIMBO_GAZE_DEFYING = of("limbo_gaze_defying");
private static TagKey<Item> of(String id) { private static TagKey<Item> of(String id) {
return TagKey.create(Registries.ITEM, DimensionalDoors.id(id)); return TagKey.create(Registries.ITEM, DimensionalDoors.id(id));
} }

View file

@ -41,6 +41,11 @@ public final class ModDimensions {
return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON); return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON);
} }
public static boolean isDungeonDimension(ResourceKey<Level> type) {
return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON);
}
public static boolean isLimboDimension(Level world) { public static boolean isLimboDimension(Level world) {
return world != null && world.dimension().equals(LIMBO); return world != null && world.dimension().equals(LIMBO);
} }

View file

@ -27,5 +27,7 @@ public class ItemTagProvider extends FabricTagProvider.ItemTagProvider {
this.tag(ModItemTags.DIAMONDS)/*.add(Items.DIAMOND.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "diamonds")).addOptionalTag(new ResourceLocation("forge", "gems/diamond")); this.tag(ModItemTags.DIAMONDS)/*.add(Items.DIAMOND.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "diamonds")).addOptionalTag(new ResourceLocation("forge", "gems/diamond"));
this.tag(ModItemTags.GOLD_INGOTS)/*.add(Items.IRON_INGOT.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "gold_ingots")).addOptionalTag(new ResourceLocation("forge", "ingots/gold")); this.tag(ModItemTags.GOLD_INGOTS)/*.add(Items.IRON_INGOT.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "gold_ingots")).addOptionalTag(new ResourceLocation("forge", "ingots/gold"));
this.tag(ModItemTags.IRON_INGOTS)/*.add(Items.DIAMOND.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "iron_ingots")).addOptionalTag(new ResourceLocation("forge", "ingots/iron")); this.tag(ModItemTags.IRON_INGOTS)/*.add(Items.DIAMOND.builtInRegistryHolder().key())*/.addOptionalTag(new ResourceLocation("c", "iron_ingots")).addOptionalTag(new ResourceLocation("forge", "ingots/iron"));
this.tag(ModItemTags.LIMBO_GAZE_DEFYING).add(ModItems.WORLD_THREAD_BOOTS.getKey(), ModItems.WORLD_THREAD_CHESTPLATE.getKey(), ModItems.WORLD_THREAD_HELMET.getKey(), ModItems.WORLD_THREAD_LEGGINGS.getKey(), ModItems.GARMENT_OF_REALITY_CHESTPLATE.getKey(), ModItems.GARMENT_OF_REALITY_BOOTS.getKey(), ModItems.GARMENT_OF_REALITY_HELMET.getKey(), ModItems.GARMENT_OF_REALITY_LEGGINGS.getKey());
} }
} }