Woven world thread armor will degrade to protect from the monolith's gaze.
This commit is contained in:
parent
c0ef07beb1
commit
b4ca7420f5
5 changed files with 41 additions and 14 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue