From 5412a10204048f9a32f37c8c430c5011e3bdc2c8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 24 Oct 2020 12:05:19 +0300 Subject: [PATCH] Slime AI upgrase --- .../ru/betterend/entity/EntityEndSlime.java | 22 ++++++++++++ .../common/SlimeEntityMoveGoalMixin.java | 36 +++++++++++++++++++ .../resources/betterend.mixins.common.json | 1 + 3 files changed, 59 insertions(+) create mode 100644 src/main/java/ru/betterend/mixin/common/SlimeEntityMoveGoalMixin.java diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index e1698bce..dbddbed9 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -4,16 +4,21 @@ import java.util.List; import java.util.Random; import net.minecraft.block.Blocks; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityData; import net.minecraft.entity.EntityType; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SpawnReason; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; @@ -27,6 +32,7 @@ import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.BiomeRegistry; +import ru.betterend.util.MHelper; public class EntityEndSlime extends SlimeEntity { private static final TrackedData MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN); @@ -97,6 +103,22 @@ public class EntityEndSlime extends SlimeEntity { this.removed = true; } + @Override + protected void dropLoot(DamageSource source, boolean causedByPlayer) { + int maxCount = this.getSize(); + int minCount = maxCount >> 1; + if (minCount < 1) { + minCount = 1; + } + if (causedByPlayer && this.attackingPlayer != null) { + int looting = EnchantmentHelper.getLooting(this.attackingPlayer); + minCount += looting; + } + int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; + ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); + this.world.spawnEntity(drop); + } + protected void setMossy(boolean mossy) { this.dataTracker.set(MOSSY, mossy); } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMoveGoalMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeEntityMoveGoalMixin.java new file mode 100644 index 00000000..219895bc --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/SlimeEntityMoveGoalMixin.java @@ -0,0 +1,36 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import ru.betterend.entity.EntityEndSlime; +import ru.betterend.util.BlocksHelper; + +@Mixin(targets = "net.minecraft.entity.mob.SlimeEntity$MoveGoal") +public class SlimeEntityMoveGoalMixin { + @Shadow + @Final + private SlimeEntity slime; + + @Inject(method = "canStart", at = @At("HEAD"), cancellable = true) + private void canStart(CallbackInfoReturnable info) { + if (!slime.hasVehicle() && slime instanceof EntityEndSlime) { + float yaw = slime.getHeadYaw(); + float speed = slime.getMovementSpeed(); + if (speed > 0.1) { + Vec3d dir = Vec3d.fromPolar(0, yaw); + BlockPos pos = slime.getBlockPos().add(dir.getX() * speed * 4, 0, dir.getZ() * speed * 4); + int down = BlocksHelper.downRay(slime.getEntityWorld(), pos, 16); + info.setReturnValue(down < 5); + info.cancel(); + } + } + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 46a6421f..183ae421 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -7,6 +7,7 @@ "ServerPlayNetworkHandlerMixin", "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", + "SlimeEntityMoveGoalMixin", "AnvilScreenHandlerMixin", "ServerPlayerEntityMixin", "ChorusPlantFeatureMixin",