mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-17 10:24:23 +01:00
Specters can now spawn with and carry equipment
This commit is contained in:
parent
a42aaeefc0
commit
a1ed8e5319
3 changed files with 101 additions and 11 deletions
|
@ -56,7 +56,6 @@ import net.minecraft.client.particle.SpriteProvider;
|
||||||
import net.minecraft.client.render.*;
|
import net.minecraft.client.render.*;
|
||||||
import net.minecraft.client.render.VertexConsumerProvider.Immediate;
|
import net.minecraft.client.render.VertexConsumerProvider.Immediate;
|
||||||
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
|
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
|
||||||
import net.minecraft.client.render.entity.EmptyEntityRenderer;
|
|
||||||
import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
|
import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
|
||||||
import net.minecraft.client.render.item.ItemRenderer;
|
import net.minecraft.client.render.item.ItemRenderer;
|
||||||
import net.minecraft.client.render.model.json.ModelTransformationMode;
|
import net.minecraft.client.render.model.json.ModelTransformationMode;
|
||||||
|
@ -115,7 +114,7 @@ public interface URenderers {
|
||||||
EntityRendererRegistry.register(UEntities.LOOT_BUG, LootBugEntityRenderer::new);
|
EntityRendererRegistry.register(UEntities.LOOT_BUG, LootBugEntityRenderer::new);
|
||||||
EntityRendererRegistry.register(UEntities.TENTACLE, TentacleEntityRenderer::new);
|
EntityRendererRegistry.register(UEntities.TENTACLE, TentacleEntityRenderer::new);
|
||||||
EntityRendererRegistry.register(UEntities.IGNOMINIOUS_BULB, IgnominiousBulbEntityRenderer::new);
|
EntityRendererRegistry.register(UEntities.IGNOMINIOUS_BULB, IgnominiousBulbEntityRenderer::new);
|
||||||
EntityRendererRegistry.register(UEntities.SPECTER, EmptyEntityRenderer::new);
|
EntityRendererRegistry.register(UEntities.SPECTER, SpecterEntityRenderer::new);
|
||||||
EntityRendererRegistry.register(UEntities.MIMIC, MimicEntityRenderer::new);
|
EntityRendererRegistry.register(UEntities.MIMIC, MimicEntityRenderer::new);
|
||||||
|
|
||||||
BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new);
|
BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new);
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.minelittlepony.unicopia.client.render.entity;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.entity.mob.SpecterEntity;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.ModelPart;
|
||||||
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
|
import net.minecraft.client.render.entity.BipedEntityRenderer;
|
||||||
|
import net.minecraft.client.render.entity.EntityRendererFactory.Context;
|
||||||
|
import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer;
|
||||||
|
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||||
|
import net.minecraft.client.render.entity.model.EntityModelLayers;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.screen.PlayerScreenHandler;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
public class SpecterEntityRenderer extends BipedEntityRenderer<SpecterEntity, SpecterEntityRenderer.SpecterEntityModel> {
|
||||||
|
|
||||||
|
public SpecterEntityRenderer(Context context) {
|
||||||
|
super(context, new SpecterEntityModel(context.getPart(EntityModelLayers.PLAYER)), 0);
|
||||||
|
addFeature(new ArmorFeatureRenderer<>(this,
|
||||||
|
new BipedEntityModel<>(context.getPart(EntityModelLayers.PLAYER_INNER_ARMOR)),
|
||||||
|
new BipedEntityModel<>(context.getPart(EntityModelLayers.PLAYER_OUTER_ARMOR)),
|
||||||
|
context.getModelManager()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Identifier getTexture(SpecterEntity entity) {
|
||||||
|
return PlayerScreenHandler.BLOCK_ATLAS_TEXTURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class SpecterEntityModel extends BipedEntityModel<SpecterEntity> {
|
||||||
|
public SpecterEntityModel(ModelPart root) {
|
||||||
|
super(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,11 +2,15 @@ package com.minelittlepony.unicopia.entity.mob;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.USounds;
|
||||||
import com.minelittlepony.unicopia.particle.FootprintParticleEffect;
|
import com.minelittlepony.unicopia.particle.FootprintParticleEffect;
|
||||||
import com.minelittlepony.unicopia.particle.ParticleUtils;
|
import com.minelittlepony.unicopia.particle.ParticleUtils;
|
||||||
|
|
||||||
|
import net.minecraft.entity.EntityData;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.entity.EquipmentSlot;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.entity.SpawnReason;
|
||||||
import net.minecraft.entity.ai.goal.ActiveTargetGoal;
|
import net.minecraft.entity.ai.goal.ActiveTargetGoal;
|
||||||
import net.minecraft.entity.ai.goal.LookAroundGoal;
|
import net.minecraft.entity.ai.goal.LookAroundGoal;
|
||||||
import net.minecraft.entity.ai.goal.LookAtEntityGoal;
|
import net.minecraft.entity.ai.goal.LookAtEntityGoal;
|
||||||
|
@ -19,12 +23,18 @@ import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
import net.minecraft.entity.damage.DamageSource;
|
import net.minecraft.entity.damage.DamageSource;
|
||||||
import net.minecraft.entity.mob.HostileEntity;
|
import net.minecraft.entity.mob.HostileEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.particle.BlockStateParticleEffect;
|
import net.minecraft.particle.BlockStateParticleEffect;
|
||||||
import net.minecraft.particle.ParticleTypes;
|
import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.registry.tag.BlockTags;
|
import net.minecraft.registry.tag.BlockTags;
|
||||||
import net.minecraft.sound.SoundEvent;
|
import net.minecraft.sound.SoundEvent;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.util.math.random.Random;
|
||||||
|
import net.minecraft.world.Difficulty;
|
||||||
import net.minecraft.world.GameRules;
|
import net.minecraft.world.GameRules;
|
||||||
|
import net.minecraft.world.LocalDifficulty;
|
||||||
|
import net.minecraft.world.ServerWorldAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class SpecterEntity extends HostileEntity {
|
public class SpecterEntity extends HostileEntity {
|
||||||
|
@ -44,21 +54,21 @@ public class SpecterEntity extends HostileEntity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initGoals() {
|
protected void initGoals() {
|
||||||
this.goalSelector.add(1, new SwimGoal(this));
|
goalSelector.add(1, new SwimGoal(this));
|
||||||
this.goalSelector.add(4, new MeleeAttackGoal(this, 1.0, true));
|
goalSelector.add(4, new MeleeAttackGoal(this, 1.0, true));
|
||||||
this.goalSelector.add(5, new WanderAroundFarGoal(this, 0.8));
|
goalSelector.add(5, new WanderAroundFarGoal(this, 0.8));
|
||||||
this.goalSelector.add(6, new LookAtEntityGoal(this, PlayerEntity.class, 8.0f));
|
goalSelector.add(6, new LookAtEntityGoal(this, PlayerEntity.class, 8.0f));
|
||||||
this.goalSelector.add(6, new LookAroundGoal(this));
|
goalSelector.add(6, new LookAroundGoal(this));
|
||||||
this.targetSelector.add(1, new RevengeGoal(this));
|
targetSelector.add(1, new RevengeGoal(this));
|
||||||
this.targetSelector.add(2, new TargetGoal<>(this, PlayerEntity.class));
|
//this.targetSelector.add(2, new TargetGoal<>(this, PlayerEntity.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
Vec3d prevPosition = getPos();
|
Vec3d prevPosition = getPos();
|
||||||
super.tick();
|
super.tick();
|
||||||
if (getBrightnessAtEyes() < 0.5F || getTarget() != null) {
|
|
||||||
|
if (getTarget() != null) {
|
||||||
ParticleUtils.spawnParticles(ParticleTypes.AMBIENT_ENTITY_EFFECT, this, 6);
|
ParticleUtils.spawnParticles(ParticleTypes.AMBIENT_ENTITY_EFFECT, this, 6);
|
||||||
|
|
||||||
if (getWorld().getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) {
|
if (getWorld().getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) {
|
||||||
|
@ -66,6 +76,8 @@ public class SpecterEntity extends HostileEntity {
|
||||||
getWorld().breakBlock(getBlockPos(), true);
|
getWorld().breakBlock(getBlockPos(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasVehicle() && isOnGround()) {
|
if (!hasVehicle() && isOnGround()) {
|
||||||
|
@ -83,6 +95,23 @@ public class SpecterEntity extends HostileEntity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAttacker(@Nullable LivingEntity attacker) {
|
||||||
|
if (!getWorld().isClient && attacker != null) {
|
||||||
|
getWorld().getEntitiesByClass(SpecterEntity.class, this.getBoundingBox().expand(5), e -> e != this && e.getTarget() == null).forEach(specter -> {
|
||||||
|
specter.notifyPartyAttacker(this, attacker);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
super.setAttacker(attacker);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyPartyAttacker(SpecterEntity sender, @Nullable LivingEntity attacker) {
|
||||||
|
super.setAttacker(attacker);
|
||||||
|
getNavigation().stop();
|
||||||
|
getNavigation().startMovingTo(sender, 3);
|
||||||
|
playSound(USounds.Vanilla.ENTITY_VEX_HURT, 1, 0.5F);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getSoundPitch() {
|
public float getSoundPitch() {
|
||||||
return super.getSoundPitch() * 0.3F;
|
return super.getSoundPitch() * 0.3F;
|
||||||
|
@ -104,6 +133,27 @@ public class SpecterEntity extends HostileEntity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData data, @Nullable NbtCompound entityNbt) {
|
||||||
|
data = super.initialize(world, difficulty, spawnReason, data, entityNbt);
|
||||||
|
Random random = world.getRandom();
|
||||||
|
float diff = difficulty.getClampedLocalDifficulty();
|
||||||
|
setCanPickUpLoot(random.nextFloat() < 0.55F * diff);
|
||||||
|
initEquipment(random, difficulty);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initEquipment(Random random, LocalDifficulty localDifficulty) {
|
||||||
|
if (random.nextFloat() < (getWorld().getDifficulty() == Difficulty.HARD ? 0.05F : 0.01F)) {
|
||||||
|
if (random.nextFloat() < (getWorld().getDifficulty() == Difficulty.HARD ? 0.5F : 0.1F)) {
|
||||||
|
super.initEquipment(random, localDifficulty);
|
||||||
|
}
|
||||||
|
equipStack(EquipmentSlot.MAINHAND, (random.nextInt(3) == 0 ? Items.STONE_SWORD : Items.WOODEN_SWORD).getDefaultStack());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class TargetGoal<T extends LivingEntity> extends ActiveTargetGoal<T> {
|
static class TargetGoal<T extends LivingEntity> extends ActiveTargetGoal<T> {
|
||||||
public TargetGoal(SpecterEntity specter, Class<T> targetEntityClass) {
|
public TargetGoal(SpecterEntity specter, Class<T> targetEntityClass) {
|
||||||
super(specter, targetEntityClass, true);
|
super(specter, targetEntityClass, true);
|
||||||
|
|
Loading…
Reference in a new issue