From b4ca7420f59f3afe728b13f3e0a08e3544a2bcff Mon Sep 17 00:00:00 2001 From: Waterpicker Date: Sat, 20 Jan 2024 23:54:33 -0600 Subject: [PATCH] Woven world thread armor will degrade to protect from the monolith's gaze. --- .../dimdoors/entity/MonolithEntity.java | 7 ++-- .../dimdoors/entity/ai/MonolithAggroGoal.java | 39 +++++++++++++------ .../org/dimdev/dimdoors/tag/ModItemTags.java | 2 + .../dimdev/dimdoors/world/ModDimensions.java | 5 +++ .../dimdoors/datagen/ItemTagProvider.java | 2 + 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java b/common/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java index 7ea8690d..d7b8c2c5 100644 --- a/common/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java +++ b/common/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java @@ -2,10 +2,8 @@ package org.dimdev.dimdoors.entity; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; 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.sounds.SoundSource; import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; 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.setNoGravity(true); this.lookControl = new LookControl(this) { + @Override + protected float rotateTowards(float from, float to, float maxDelta) { + return to; + } @Override protected boolean resetXRotOnTick() { diff --git a/common/src/main/java/org/dimdev/dimdoors/entity/ai/MonolithAggroGoal.java b/common/src/main/java/org/dimdev/dimdoors/entity/ai/MonolithAggroGoal.java index 6444b588..4b0265c9 100644 --- a/common/src/main/java/org/dimdev/dimdoors/entity/ai/MonolithAggroGoal.java +++ b/common/src/main/java/org/dimdev/dimdoors/entity/ai/MonolithAggroGoal.java @@ -6,6 +6,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; 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.targeting.TargetingConditions; 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.MonolithTeleportParticlesPacket; import org.dimdev.dimdoors.sound.ModSoundEvents; +import org.dimdev.dimdoors.tag.ModItemTags; import java.util.EnumSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.dimdev.dimdoors.entity.MonolithEntity.MAX_AGGRO; @@ -57,23 +61,36 @@ public class MonolithAggroGoal extends Goal { } 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(); 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)) { - RandomSource random = RandomSource.create(); - int i = random.nextInt(64); - if (this.target instanceof ServerPlayer) { - if (i < 4) { - this.target.getInventory().armor.get(0).hurt(i, random, (ServerPlayer) this.target); - this.target.getInventory().armor.get(1).hurt(i, random, (ServerPlayer) this.target); - this.target.getInventory().armor.get(2).hurt(i, random, (ServerPlayer) this.target); - this.target.getInventory().armor.get(3).hurt(i, random, (ServerPlayer) this.target); + if (this.target != null) { + var slots = Stream.of(EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET).filter(a -> target.getItemBySlot(a).is(ModItemTags.LIMBO_GAZE_DEFYING)).toList(); + + if (!slots.isEmpty()) { + RandomSource random = RandomSource.create(); + + int i = random.nextInt((64 + 16 * (slots.size() / 4))); + if (this.target instanceof ServerPlayer) { + 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; diff --git a/common/src/main/java/org/dimdev/dimdoors/tag/ModItemTags.java b/common/src/main/java/org/dimdev/dimdoors/tag/ModItemTags.java index 00067e57..eaf15c32 100644 --- a/common/src/main/java/org/dimdev/dimdoors/tag/ModItemTags.java +++ b/common/src/main/java/org/dimdev/dimdoors/tag/ModItemTags.java @@ -12,6 +12,8 @@ public class ModItemTags { public static final TagKey GOLD_INGOTS = of("gold_ingots"); public static final TagKey IRON_INGOTS = of("iron_ingots"); + public static final TagKey LIMBO_GAZE_DEFYING = of("limbo_gaze_defying"); + private static TagKey of(String id) { return TagKey.create(Registries.ITEM, DimensionalDoors.id(id)); } diff --git a/common/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java b/common/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java index b1be1b01..c4bd2c5a 100644 --- a/common/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java +++ b/common/src/main/java/org/dimdev/dimdoors/world/ModDimensions.java @@ -41,6 +41,11 @@ public final class ModDimensions { return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON); } + + public static boolean isDungeonDimension(ResourceKey type) { + return Objects.equals(type, PERSONAL) || Objects.equals(type, PUBLIC) || Objects.equals(type, DUNGEON); + } + public static boolean isLimboDimension(Level world) { return world != null && world.dimension().equals(LIMBO); } diff --git a/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/ItemTagProvider.java b/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/ItemTagProvider.java index 4d7e823f..e2e2a244 100644 --- a/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/ItemTagProvider.java +++ b/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/ItemTagProvider.java @@ -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.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.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()); } }