diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 6b069fb4..a5601c97 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -1,15 +1,26 @@ package ru.betterend.entity; +import net.minecraft.entity.EntityData; import net.minecraft.entity.EntityType; 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.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.nbt.CompoundTag; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.LocalDifficulty; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; +import ru.betterend.registry.BiomeRegistry; public class EntityEndSlime extends SlimeEntity { + private static final TrackedData MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN); + public EntityEndSlime(EntityType entityType, World world) { super(entityType, world); } @@ -21,9 +32,32 @@ public class EntityEndSlime extends SlimeEntity { .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15D); } + + @Override + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { + EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); + if (world.getRandom().nextBoolean() && BiomeRegistry.getFromBiome(world.getBiome(getBlockPos())) == BiomeRegistry.FOGGY_MUSHROOMLAND) { + this.setMossy(true); + } + return data; + } + + @Override + protected void initDataTracker() { + super.initDataTracker(); + this.dataTracker.startTracking(MOSSY, false); + } @Override protected ParticleEffect getParticles() { return ParticleTypes.PORTAL; } + + protected void setMossy(boolean mossy) { + this.dataTracker.set(MOSSY, mossy); + } + + public boolean isMossy() { + return this.dataTracker.get(MOSSY); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 60b72ccd..bdf2229a 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -8,9 +8,11 @@ import net.minecraft.client.render.entity.model.SlimeEntityModel; import net.minecraft.entity.mob.SlimeEntity; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; +import ru.betterend.entity.EntityEndSlime; public class RendererEntityEndSlime extends SlimeEntityRenderer { private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/end_slime.png"); + private static final Identifier TEXTURE_MOSSY = BetterEnd.makeID("textures/entity/end_slime_mossy.png"); private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime_glow.png")); public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { @@ -25,6 +27,6 @@ public class RendererEntityEndSlime extends SlimeEntityRenderer { @Override public Identifier getTexture(SlimeEntity entity) { - return TEXTURE; + return ((EntityEndSlime) entity).isMossy() ? TEXTURE_MOSSY : TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/registry/EntityRegistry.java b/src/main/java/ru/betterend/registry/EntityRegistry.java index f7d4ddba..62893fe2 100644 --- a/src/main/java/ru/betterend/registry/EntityRegistry.java +++ b/src/main/java/ru/betterend/registry/EntityRegistry.java @@ -12,11 +12,12 @@ import net.minecraft.entity.attribute.DefaultAttributeContainer.Builder; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.entity.EntityEndSlime; +import ru.betterend.util.MHelper; import ru.betterend.entity.EntityDragonfly; public class EntityRegistry { - public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityDragonfly::new, EntityDragonfly.createMobAttributes()); - public static final EntityType END_SLIME = register("end_slime", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityEndSlime::new, EntityEndSlime.createMobAttributes()); + public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityDragonfly::new, EntityDragonfly.createMobAttributes(), MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); + public static final EntityType END_SLIME = register("end_slime", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityEndSlime::new, EntityEndSlime.createMobAttributes(), MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); public static void register() {} @@ -25,9 +26,10 @@ public class EntityRegistry { return type; } - private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes) { + private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes, int eggColor, int dotsColor) { EntityType type = Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build()); FabricDefaultAttributeRegistry.register(type, attributes); + ItemRegistry.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); return type; } } diff --git a/src/main/java/ru/betterend/registry/ItemRegistry.java b/src/main/java/ru/betterend/registry/ItemRegistry.java index 1877ac1e..b07cf8b2 100644 --- a/src/main/java/ru/betterend/registry/ItemRegistry.java +++ b/src/main/java/ru/betterend/registry/ItemRegistry.java @@ -5,16 +5,25 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.ItemDispenserBehavior; +import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.SpawnReason; import net.minecraft.item.ArmorItem; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; +import net.minecraft.item.Item.Settings; +import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.ShovelItem; +import net.minecraft.item.SpawnEggItem; import net.minecraft.item.SwordItem; import net.minecraft.item.ToolItem; import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.item.EndArmorMaterial; @@ -31,37 +40,37 @@ public class ItemRegistry { private static final List MOD_ITEMS = Lists.newArrayList(); //Materials - public final static Item ENDER_DUST = registerItem("ender_dust", new Item(new Item.Settings().group(CreativeTab.END_TAB))); - public final static Item TERMINITE_INGOT = registerItem("terminite_ingot", new Item(new Item.Settings().group(CreativeTab.END_TAB))); - public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot", new Item(new Item.Settings().group(CreativeTab.END_TAB))); + public final static Item ENDER_DUST = registerItem("ender_dust", new Item(makeSettings())); + public final static Item TERMINITE_INGOT = registerItem("terminite_ingot", new Item(makeSettings())); + public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot", new Item(makeSettings())); //Armor - public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD,new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item TERMINITE_CHESTPLATE = registerItem("terminite_chestplate", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.CHEST, new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item TERMINITE_LEGGINGS = registerItem("terminite_leggings", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.LEGS, new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item TERMINITE_BOOTS = registerItem("terminite_boots", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.FEET, new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD,new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, new Item.Settings().group(CreativeTab.END_TAB))); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, new Item.Settings().group(CreativeTab.END_TAB))); + public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeSettings())); + public static final Item TERMINITE_CHESTPLATE = registerItem("terminite_chestplate", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.CHEST, makeSettings())); + public static final Item TERMINITE_LEGGINGS = registerItem("terminite_leggings", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.LEGS, makeSettings())); + public static final Item TERMINITE_BOOTS = registerItem("terminite_boots", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.FEET, makeSettings())); + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeSettings())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeSettings())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeSettings())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeSettings())); //Tools - public static ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new SwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxe(EndToolMaterial.TERMINITE, 1, -2.8F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxe(EndToolMaterial.TERMINITE, 6.0F, -3.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoe(EndToolMaterial.TERMINITE, -3, 0.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammer(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new ShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new SwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxe(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoe(EndToolMaterial.AETERNIUM, -3, 0.0F, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammer(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammer(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammer(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammer(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, new Item.Settings().group(CreativeTab.END_TAB))); - public static ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammer(ToolMaterials.DIAMOND, 6.0F, -3.0F, 0.2D, new Item.Settings().group(CreativeTab.END_TAB))); + public static ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeSettings())); + public static ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new SwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeSettings())); + public static ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxe(EndToolMaterial.TERMINITE, 1, -2.8F, makeSettings())); + public static ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxe(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeSettings())); + public static ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoe(EndToolMaterial.TERMINITE, -3, 0.0F, makeSettings())); + public static ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammer(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeSettings())); + public static ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new ShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeSettings())); + public static ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new SwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeSettings())); + public static ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, makeSettings())); + public static ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxe(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeSettings())); + public static ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoe(EndToolMaterial.AETERNIUM, -3, 0.0F, makeSettings())); + public static ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammer(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeSettings())); + public static ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammer(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeSettings())); + public static ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammer(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeSettings())); + public static ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammer(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeSettings())); + public static ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammer(ToolMaterials.DIAMOND, 6.0F, -3.0F, 0.2D, makeSettings())); protected static Item registerItem(String name, Item item) { if (item != Items.AIR) { @@ -94,6 +103,25 @@ public class ItemRegistry { return item; } + + public static Item registerEgg(String name, EntityType type, int background, int dots) { + SpawnEggItem item = new SpawnEggItem(type, background, dots, makeSettings()); + ItemDispenserBehavior behavior = new ItemDispenserBehavior() { + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem) stack.getItem()).getEntityType(stack.getTag()); + entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnReason.DISPENSER, direction != Direction.UP, false); + stack.decrement(1); + return stack; + } + }; + DispenserBlock.registerBehavior(item, behavior); + return registerItem(name, item); + } + + private static Settings makeSettings() { + return new Item.Settings().group(CreativeTab.END_TAB); + } public static void register() {} diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime_mossy.png b/src/main/resources/assets/betterend/textures/entity/end_slime_mossy.png new file mode 100644 index 00000000..819beac4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime_mossy.png differ