Slime AI upgrase
This commit is contained in:
parent
3cefefc409
commit
5412a10204
3 changed files with 59 additions and 0 deletions
|
@ -4,16 +4,21 @@ import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
import net.minecraft.entity.EntityData;
|
import net.minecraft.entity.EntityData;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.entity.ItemEntity;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.SpawnReason;
|
import net.minecraft.entity.SpawnReason;
|
||||||
import net.minecraft.entity.attribute.DefaultAttributeContainer;
|
import net.minecraft.entity.attribute.DefaultAttributeContainer;
|
||||||
import net.minecraft.entity.attribute.EntityAttributes;
|
import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
|
import net.minecraft.entity.damage.DamageSource;
|
||||||
import net.minecraft.entity.data.DataTracker;
|
import net.minecraft.entity.data.DataTracker;
|
||||||
import net.minecraft.entity.data.TrackedData;
|
import net.minecraft.entity.data.TrackedData;
|
||||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
||||||
import net.minecraft.entity.mob.SlimeEntity;
|
import net.minecraft.entity.mob.SlimeEntity;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.particle.ParticleEffect;
|
import net.minecraft.particle.ParticleEffect;
|
||||||
import net.minecraft.particle.ParticleTypes;
|
import net.minecraft.particle.ParticleTypes;
|
||||||
|
@ -27,6 +32,7 @@ import net.minecraft.world.World;
|
||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
import ru.betterend.interfaces.ISlime;
|
import ru.betterend.interfaces.ISlime;
|
||||||
import ru.betterend.registry.BiomeRegistry;
|
import ru.betterend.registry.BiomeRegistry;
|
||||||
|
import ru.betterend.util.MHelper;
|
||||||
|
|
||||||
public class EntityEndSlime extends SlimeEntity {
|
public class EntityEndSlime extends SlimeEntity {
|
||||||
private static final TrackedData<Boolean> MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN);
|
private static final TrackedData<Boolean> MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN);
|
||||||
|
@ -97,6 +103,22 @@ public class EntityEndSlime extends SlimeEntity {
|
||||||
this.removed = true;
|
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) {
|
protected void setMossy(boolean mossy) {
|
||||||
this.dataTracker.set(MOSSY, mossy);
|
this.dataTracker.set(MOSSY, mossy);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<Boolean> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@
|
||||||
"ServerPlayNetworkHandlerMixin",
|
"ServerPlayNetworkHandlerMixin",
|
||||||
"CraftingScreenHandlerMixin",
|
"CraftingScreenHandlerMixin",
|
||||||
"GenerationSettingsAccessor",
|
"GenerationSettingsAccessor",
|
||||||
|
"SlimeEntityMoveGoalMixin",
|
||||||
"AnvilScreenHandlerMixin",
|
"AnvilScreenHandlerMixin",
|
||||||
"ServerPlayerEntityMixin",
|
"ServerPlayerEntityMixin",
|
||||||
"ChorusPlantFeatureMixin",
|
"ChorusPlantFeatureMixin",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue