From baa7f4f8106d4137edf658646c05f486b7570ae3 Mon Sep 17 00:00:00 2001 From: lordlogo2002 Date: Thu, 18 Dec 2025 23:46:01 +0100 Subject: [PATCH] stuff --- .gitignore | 3 + .../java/net/Chipperfluff/chipi/ChipiMod.java | 30 ++++-- .../chipi/client/ChipiClient.java | 13 +-- .../chipi/client/entity/MepRenderer.java | 26 +++++ .../client/entity/ModEntityRenderers.java | 14 +++ .../chipi/effect/ChipiBlessingEffect.java | 25 +++++ .../chipi/effect/ChipiBlessingEvents.java | 27 +++++ .../chipi/effect/ChipiHungerHandler.java | 20 ++++ .../Chipperfluff/chipi/effect/ModEffects.java | 21 ++++ .../chipi/entity/ModEntities.java | 26 +++++ .../chipi/entity/custom/MepEntity.java | 94 ++++++++++++++++++ .../chipi/item/ModItemGroups.java | 7 ++ .../net/Chipperfluff/chipi/item/ModItems.java | 41 ++++++++ .../item/armor/ChipperArmorMaterial.java | 66 ++++++++++++ .../resources/assets/chipi/lang/en_us.json | 28 +++++- .../chipi/models/item/chipper_boots.json | 6 ++ .../chipi/models/item/chipper_chestplate.json | 6 ++ .../chipi/models/item/chipper_helmet.json | 6 ++ .../chipi/models/item/chipper_leggings.json | 6 ++ .../chipi/models/item/mep_spawn_egg.json | 3 + .../assets/chipi/textures/entity/mep.png | Bin 0 -> 4679 bytes .../textures/item/armor/chipper_boots.png | Bin 0 -> 234 bytes .../item/armor/chipper_chestplate.png | Bin 0 -> 299 bytes .../textures/item/armor/chipper_helmet.png | Bin 0 -> 236 bytes .../textures/item/armor/chipper_leggings.png | Bin 0 -> 246 bytes .../textures/mob_effect/chipi_blessing.png | Bin 0 -> 294 bytes .../textures/models/armor/chipper_layer_1.png | Bin 0 -> 3210 bytes .../textures/models/armor/chipper_layer_2.png | Bin 0 -> 1890 bytes .../progression/mine_chipper_ore.json | 8 +- .../progression/place_alloy_block.json | 7 +- 30 files changed, 466 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/Chipperfluff/chipi/client/entity/MepRenderer.java create mode 100644 src/main/java/net/Chipperfluff/chipi/client/entity/ModEntityRenderers.java create mode 100644 src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEffect.java create mode 100644 src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEvents.java create mode 100644 src/main/java/net/Chipperfluff/chipi/effect/ChipiHungerHandler.java create mode 100644 src/main/java/net/Chipperfluff/chipi/effect/ModEffects.java create mode 100644 src/main/java/net/Chipperfluff/chipi/entity/ModEntities.java create mode 100644 src/main/java/net/Chipperfluff/chipi/entity/custom/MepEntity.java create mode 100644 src/main/java/net/Chipperfluff/chipi/item/armor/ChipperArmorMaterial.java create mode 100644 src/main/resources/assets/chipi/models/item/chipper_boots.json create mode 100644 src/main/resources/assets/chipi/models/item/chipper_chestplate.json create mode 100644 src/main/resources/assets/chipi/models/item/chipper_helmet.json create mode 100644 src/main/resources/assets/chipi/models/item/chipper_leggings.json create mode 100644 src/main/resources/assets/chipi/models/item/mep_spawn_egg.json create mode 100644 src/main/resources/assets/chipi/textures/entity/mep.png create mode 100644 src/main/resources/assets/chipi/textures/item/armor/chipper_boots.png create mode 100644 src/main/resources/assets/chipi/textures/item/armor/chipper_chestplate.png create mode 100644 src/main/resources/assets/chipi/textures/item/armor/chipper_helmet.png create mode 100644 src/main/resources/assets/chipi/textures/item/armor/chipper_leggings.png create mode 100644 src/main/resources/assets/chipi/textures/mob_effect/chipi_blessing.png create mode 100644 src/main/resources/assets/chipi/textures/models/armor/chipper_layer_1.png create mode 100644 src/main/resources/assets/chipi/textures/models/armor/chipper_layer_2.png diff --git a/.gitignore b/.gitignore index dd63380..6ed18b3 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ loom-cache/ # ===== Misc ===== *.tmp *.bak + +__pycache__/ +*.pyc \ No newline at end of file diff --git a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java index fd6190e..bf7d155 100644 --- a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java +++ b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java @@ -1,16 +1,10 @@ package net.Chipperfluff.chipi; -import net.Chipperfluff.chipi.command.ChpCommand; -import net.Chipperfluff.chipi.item.ModItems; -import net.Chipperfluff.chipi.block.ModBlocks; -import net.Chipperfluff.chipi.world.gen.ChipiDungeonGenerator; -import net.Chipperfluff.chipi.block.ChipperPortalBlock; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; - import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructurePlacementData; import net.minecraft.structure.StructureTemplate; @@ -18,15 +12,27 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.GameRules; -import net.Chipperfluff.chipi.item.ModItemGroups; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.world.gen.GenerationStep; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; +import net.Chipperfluff.chipi.effect.ModEffects; +import net.Chipperfluff.chipi.effect.ChipiBlessingEvents; +import net.Chipperfluff.chipi.effect.ChipiHungerHandler; +import net.Chipperfluff.chipi.item.ModItems; +import net.Chipperfluff.chipi.block.ModBlocks; +import net.Chipperfluff.chipi.entity.ModEntities; +import net.Chipperfluff.chipi.item.ModItemGroups; import net.Chipperfluff.chipi.advancement.ModCriteria; +import net.Chipperfluff.chipi.world.gen.ChipiDungeonGenerator; +import net.Chipperfluff.chipi.block.ChipperPortalBlock; +import net.Chipperfluff.chipi.command.ChpCommand; +import net.Chipperfluff.chipi.entity.custom.MepEntity; + public class ChipiMod implements ModInitializer { public static final String MOD_ID = "chipi"; @@ -44,6 +50,16 @@ public class ChipiMod implements ModInitializer { ModItems.register(); ModItemGroups.register(); ModCriteria.register(); + ModEntities.register(); + ModEffects.register(); + ChipiBlessingEvents.register(); + ChipiHungerHandler.register(); + + FabricDefaultAttributeRegistry.register( + ModEntities.MEP, + MepEntity.createMepAttributes() + ); + BiomeModifications.addFeature( BiomeSelectors.foundInOverworld(), diff --git a/src/main/java/net/Chipperfluff/chipi/client/ChipiClient.java b/src/main/java/net/Chipperfluff/chipi/client/ChipiClient.java index a2923cb..87a49de 100644 --- a/src/main/java/net/Chipperfluff/chipi/client/ChipiClient.java +++ b/src/main/java/net/Chipperfluff/chipi/client/ChipiClient.java @@ -1,20 +1,21 @@ package net.Chipperfluff.chipi.client; +import net.Chipperfluff.chipi.block.ModBlocks; +import net.Chipperfluff.chipi.client.entity.ModEntityRenderers; import net.fabricmc.api.ClientModInitializer; -import net.minecraft.client.render.DimensionEffects; -import net.minecraft.util.Identifier; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.render.RenderLayer; -import net.Chipperfluff.chipi.block.ModBlocks; - public class ChipiClient implements ClientModInitializer { @Override public void onInitializeClient() { + BlockRenderLayerMap.INSTANCE.putBlock( - ModBlocks.CHIPPER_PORTAL, - RenderLayer.getTranslucent() + ModBlocks.CHIPPER_PORTAL, + RenderLayer.getTranslucent() ); + + ModEntityRenderers.register(); } } diff --git a/src/main/java/net/Chipperfluff/chipi/client/entity/MepRenderer.java b/src/main/java/net/Chipperfluff/chipi/client/entity/MepRenderer.java new file mode 100644 index 0000000..a69534f --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/client/entity/MepRenderer.java @@ -0,0 +1,26 @@ +package net.Chipperfluff.chipi.client.entity; + +import net.Chipperfluff.chipi.ChipiMod; +import net.Chipperfluff.chipi.entity.custom.MepEntity; +import net.minecraft.client.render.entity.BipedEntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.render.entity.model.EntityModelLayers; +import net.minecraft.util.Identifier; + +public class MepRenderer extends BipedEntityRenderer> { + + private static final Identifier TEXTURE = + new Identifier(ChipiMod.MOD_ID, "textures/entity/mep.png"); + + public MepRenderer(EntityRendererFactory.Context ctx) { + super(ctx, + new BipedEntityModel<>(ctx.getPart(EntityModelLayers.PLAYER)), + 0.5f); + } + + @Override + public Identifier getTexture(MepEntity entity) { + return TEXTURE; + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/client/entity/ModEntityRenderers.java b/src/main/java/net/Chipperfluff/chipi/client/entity/ModEntityRenderers.java new file mode 100644 index 0000000..e71be10 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/client/entity/ModEntityRenderers.java @@ -0,0 +1,14 @@ +package net.Chipperfluff.chipi.client.entity; + +import net.Chipperfluff.chipi.entity.ModEntities; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; + +public class ModEntityRenderers { + + public static void register() { + EntityRendererRegistry.register( + ModEntities.MEP, + MepRenderer::new + ); + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEffect.java b/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEffect.java new file mode 100644 index 0000000..875e671 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEffect.java @@ -0,0 +1,25 @@ +package net.Chipperfluff.chipi.effect; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectCategory; +import net.minecraft.entity.player.PlayerEntity; + +public class ChipiBlessingEffect extends StatusEffect { + + public ChipiBlessingEffect() { + super(StatusEffectCategory.BENEFICIAL, 0xFF8000); + } + + @Override + public boolean canApplyUpdateEffect(int duration, int amplifier) { + return true; // run every tick + } + + @Override + public void applyUpdateEffect(LivingEntity entity, int amplifier) { + if (entity.getHealth() < entity.getMaxHealth()) { + entity.heal(0.05f * (amplifier + 1)); + } + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEvents.java b/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEvents.java new file mode 100644 index 0000000..485acbe --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/effect/ChipiBlessingEvents.java @@ -0,0 +1,27 @@ +package net.Chipperfluff.chipi.effect; + +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.damage.DamageTypes; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; + +public class ChipiBlessingEvents { + + public static void register() { + ServerTickEvents.END_SERVER_TICK.register(ChipiBlessingEvents::onServerTick); + } + + private static void onServerTick(MinecraftServer server) { + for (ServerPlayerEntity player : server.getPlayerManager().getPlayerList()) { + if (player.hasStatusEffect(ModEffects.CHIPI_BLESSING)) { + player.getHungerManager().setExhaustion(0.0f); + } + } + } + + public static boolean cancelFallDamage(ServerPlayerEntity player, DamageSource source) { + return source.isOf(DamageTypes.FALL) + && player.hasStatusEffect(ModEffects.CHIPI_BLESSING); + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/effect/ChipiHungerHandler.java b/src/main/java/net/Chipperfluff/chipi/effect/ChipiHungerHandler.java new file mode 100644 index 0000000..3a5014c --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/effect/ChipiHungerHandler.java @@ -0,0 +1,20 @@ +package net.Chipperfluff.chipi.effect; + +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; + +public class ChipiHungerHandler { + + public static void register() { + ServerTickEvents.END_SERVER_TICK.register(ChipiHungerHandler::onServerTick); + } + + private static void onServerTick(MinecraftServer server) { + for (ServerPlayerEntity player : server.getPlayerManager().getPlayerList()) { + if (player.hasStatusEffect(ModEffects.CHIPI_BLESSING)) { + player.getHungerManager().setExhaustion(0.0f); + } + } + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/effect/ModEffects.java b/src/main/java/net/Chipperfluff/chipi/effect/ModEffects.java new file mode 100644 index 0000000..bf7d776 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/effect/ModEffects.java @@ -0,0 +1,21 @@ +package net.Chipperfluff.chipi.effect; + +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; +import net.Chipperfluff.chipi.ChipiMod; + +public class ModEffects { + + public static final StatusEffect CHIPI_BLESSING = + new ChipiBlessingEffect(); + + public static void register() { + Registry.register( + Registries.STATUS_EFFECT, + new Identifier(ChipiMod.MOD_ID, "chipi_blessing"), + CHIPI_BLESSING + ); + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/entity/ModEntities.java b/src/main/java/net/Chipperfluff/chipi/entity/ModEntities.java new file mode 100644 index 0000000..45d8f1c --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/entity/ModEntities.java @@ -0,0 +1,26 @@ +package net.Chipperfluff.chipi.entity; + +import net.Chipperfluff.chipi.ChipiMod; +import net.Chipperfluff.chipi.entity.custom.MepEntity; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.minecraft.entity.EntityDimensions; +import net.minecraft.entity.EntityType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class ModEntities { + + public static final EntityType MEP = Registry.register( + Registries.ENTITY_TYPE, + new Identifier(ChipiMod.MOD_ID, "mep"), + FabricEntityTypeBuilder.createMob() + .entityFactory(MepEntity::new) + .dimensions(EntityDimensions.fixed(0.6f, 1.95f)) + .build() + ); + + public static void register() { + // called from mod init + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/entity/custom/MepEntity.java b/src/main/java/net/Chipperfluff/chipi/entity/custom/MepEntity.java new file mode 100644 index 0000000..799be66 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/entity/custom/MepEntity.java @@ -0,0 +1,94 @@ +package net.Chipperfluff.chipi.entity.custom; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SlabBlock; +import net.minecraft.block.StairsBlock; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.ActiveTargetGoal; +import net.minecraft.entity.ai.goal.LookAroundGoal; +import net.minecraft.entity.ai.goal.LookAtEntityGoal; +import net.minecraft.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.WanderAroundFarGoal; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.mob.PathAwareEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class MepEntity extends PathAwareEntity { + + private boolean angryAtPlayer = false; + + public MepEntity(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + protected void initGoals() { + this.goalSelector.add(1, new SwimGoal(this)); + this.goalSelector.add(2, new MeleeAttackGoal(this, 1.2D, true)); + this.goalSelector.add(3, new WanderAroundFarGoal(this, 1.0D)); + this.goalSelector.add(4, new LookAtEntityGoal(this, PlayerEntity.class, 8.0F)); + this.goalSelector.add(5, new LookAroundGoal(this)); + + this.targetSelector.add(1, new ActiveTargetGoal<>( + this, + PlayerEntity.class, + true, + target -> target instanceof PlayerEntity player + && (angryAtPlayer || !isPlayerProtected(player)) + )); + } + + public static DefaultAttributeContainer.Builder createMepAttributes() { + return PathAwareEntity.createMobAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 20.0) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.0) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25); + } + + @Override + public boolean damage(DamageSource source, float amount) { + if (source.getAttacker() instanceof PlayerEntity) { + angryAtPlayer = true; + } + return super.damage(source, amount); + } + + @Override + public void tick() { + super.tick(); + + LivingEntity target = this.getTarget(); + + if (angryAtPlayer) { + if (!(target instanceof PlayerEntity) || !this.canSee(target)) { + angryAtPlayer = false; + this.setTarget(null); + } + return; + } + + if (target instanceof PlayerEntity player && isPlayerProtected(player)) { + this.setTarget(null); + this.getNavigation().stop(); + } + } + + private static boolean isPlayerProtected(PlayerEntity player) { + BlockPos pos = player.getBlockPos(); + BlockState state = player.getWorld().getBlockState(pos); + + if (!state.contains(Properties.WATERLOGGED) || !state.get(Properties.WATERLOGGED)) { + return false; + } + + return state.getBlock() instanceof StairsBlock + || state.getBlock() instanceof SlabBlock; + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/item/ModItemGroups.java b/src/main/java/net/Chipperfluff/chipi/item/ModItemGroups.java index 5210538..a8d1d2c 100644 --- a/src/main/java/net/Chipperfluff/chipi/item/ModItemGroups.java +++ b/src/main/java/net/Chipperfluff/chipi/item/ModItemGroups.java @@ -33,6 +33,13 @@ public class ModItemGroups { entries.add(ModItems.RAW_CHIPPER_ORE); entries.add(ModItems.CHIPPER_INGOT); entries.add(ModItems.CHIPPER_ALLOY); + entries.add(ModItems.MEP_SPAWN_EGG); + + // Armor + entries.add(ModItems.CHIPPER_HELMET); + entries.add(ModItems.CHIPPER_CHESTPLATE); + entries.add(ModItems.CHIPPER_LEGGINGS); + entries.add(ModItems.CHIPPER_BOOTS); }) .build() ); diff --git a/src/main/java/net/Chipperfluff/chipi/item/ModItems.java b/src/main/java/net/Chipperfluff/chipi/item/ModItems.java index 316d3a4..d7552f9 100644 --- a/src/main/java/net/Chipperfluff/chipi/item/ModItems.java +++ b/src/main/java/net/Chipperfluff/chipi/item/ModItems.java @@ -8,6 +8,11 @@ import net.minecraft.util.Identifier; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.Chipperfluff.chipi.ChipiMod; import net.Chipperfluff.chipi.block.ModBlocks; +import net.minecraft.item.SpawnEggItem; +import net.Chipperfluff.chipi.entity.ModEntities; +import net.minecraft.item.ArmorItem; +import net.Chipperfluff.chipi.item.armor.ChipperArmorMaterial; + public class ModItems { @@ -43,6 +48,17 @@ public class ModItems { new BlockItem(ModBlocks.CHIPPER_ALLOY_BLOCK, new FabricItemSettings()) ); + public static final Item MEP_SPAWN_EGG = Registry.register( + Registries.ITEM, + new Identifier(ChipiMod.MOD_ID, "mep_spawn_egg"), + new SpawnEggItem( + ModEntities.MEP, + 0x1E3A5F, + 0x6BB6FF, + new Item.Settings() + ) + ); + // ===== NORMAL ITEMS ===== public static final Item NUT = Registry.register( Registries.ITEM, @@ -70,5 +86,30 @@ public class ModItems { new Item(new FabricItemSettings()) ); + public static final Item CHIPPER_HELMET = Registry.register( + Registries.ITEM, + new Identifier("chipi", "chipper_helmet"), + new ArmorItem(ChipperArmorMaterial.INSTANCE, ArmorItem.Type.HELMET, new Item.Settings()) + ); + + public static final Item CHIPPER_CHESTPLATE = Registry.register( + Registries.ITEM, + new Identifier("chipi", "chipper_chestplate"), + new ArmorItem(ChipperArmorMaterial.INSTANCE, ArmorItem.Type.CHESTPLATE, new Item.Settings()) + ); + + public static final Item CHIPPER_LEGGINGS = Registry.register( + Registries.ITEM, + new Identifier("chipi", "chipper_leggings"), + new ArmorItem(ChipperArmorMaterial.INSTANCE, ArmorItem.Type.LEGGINGS, new Item.Settings()) + ); + + public static final Item CHIPPER_BOOTS = Registry.register( + Registries.ITEM, + new Identifier("chipi", "chipper_boots"), + new ArmorItem(ChipperArmorMaterial.INSTANCE, ArmorItem.Type.BOOTS, new Item.Settings()) + ); + + public static void register() {} } diff --git a/src/main/java/net/Chipperfluff/chipi/item/armor/ChipperArmorMaterial.java b/src/main/java/net/Chipperfluff/chipi/item/armor/ChipperArmorMaterial.java new file mode 100644 index 0000000..ed94e5e --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/item/armor/ChipperArmorMaterial.java @@ -0,0 +1,66 @@ +package net.Chipperfluff.chipi.item.armor; + +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.recipe.Ingredient; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Util; + +import java.util.EnumMap; +import java.util.Map; + +public class ChipperArmorMaterial implements ArmorMaterial { + + public static final ChipperArmorMaterial INSTANCE = new ChipperArmorMaterial(); + + private static final Map PROTECTION = Util.make( + new EnumMap<>(ArmorItem.Type.class), + map -> { + map.put(ArmorItem.Type.HELMET, 2); + map.put(ArmorItem.Type.CHESTPLATE, 5); + map.put(ArmorItem.Type.LEGGINGS, 4); + map.put(ArmorItem.Type.BOOTS, 2); + } + ); + + @Override + public int getDurability(ArmorItem.Type type) { + return 3 * type.getEquipmentSlot().getEntitySlotId(); + } + + @Override + public int getProtection(ArmorItem.Type type) { + return PROTECTION.get(type); + } + + @Override + public int getEnchantability() { + return 10; + } + + @Override + public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_IRON; + } + + @Override + public Ingredient getRepairIngredient() { + return Ingredient.ofItems(net.Chipperfluff.chipi.item.ModItems.CHIPPER_INGOT); + } + + @Override + public String getName() { + return "chipi:chipper"; + } + + @Override + public float getToughness() { + return 2.0f; + } + + @Override + public float getKnockbackResistance() { + return 0.4f; + } +} diff --git a/src/main/resources/assets/chipi/lang/en_us.json b/src/main/resources/assets/chipi/lang/en_us.json index 4281a9d..e049bd6 100644 --- a/src/main/resources/assets/chipi/lang/en_us.json +++ b/src/main/resources/assets/chipi/lang/en_us.json @@ -4,6 +4,8 @@ "itemGroup.chipi.chipi": "Chipi", + "effect.chipi.chipi_blessing": "Chipi's Blessing", + "block.chipi.void_block": "Void Block", "block.chipi.chipper_frame": "Chipper Frame", "block.chipi.chipper_portal": "Chipper Portal", @@ -18,5 +20,29 @@ "item.chipi.nut": "Nut", "item.chipi.raw_chipper_ore": "Raw Chipper Ore", "item.chipi.chipper_ingot": "Chipper Ingot", - "item.chipi.chipper_alloy": "Chipper Alloy" + "item.chipi.chipper_alloy": "Chipper Alloy", + "item.chipi.mep_spawn_egg": "Mep Spawn Egg", + + "item.chipi.chipper_helmet": "Chipper Helmet", + "item.chipi.chipper_chestplate": "Chipper Chestplate", + "item.chipi.chipper_leggings": "Chipper Leggings", + "item.chipi.chipper_boots": "Chipper Boots", + + "tooltip.chipi.void_block": "§8It hums quietly.§r §7Do not listen.", + "tooltip.chipi.chipper_frame": "§7Built to hold a mistake in place.", + "tooltip.chipi.chipper_portal": "§5Something on the other side is already aware of you.", + "tooltip.chipi.chipper_ore": "§7Common.§r §8Uncomfortably so.", + "tooltip.chipi.chipper_alloy_block": "§7Pressed together until it stopped screaming.", + + "tooltip.chipi.nut": "§7Probably edible.§r §8Probably.", + "tooltip.chipi.raw_chipper_ore": "§7Still warm to the touch.", + "tooltip.chipi.chipper_ingot": "§7Dense.§r §8Too dense.", + "tooltip.chipi.chipper_alloy": "§7Stronger than it looks.§r §8Worse than it feels.", + + "tooltip.chipi.mep_spawn_egg": "§8It knows where you are.§r §7It always did.", + + "tooltip.chipi.chipper_helmet": "§7Soaks the hit.§r §8Cracks immediately.", + "tooltip.chipi.chipper_chestplate": "§7Lets you stand your ground.§r §8Once.", + "tooltip.chipi.chipper_leggings": "§7Heavy steps.§r §8Short lifespan.", + "tooltip.chipi.chipper_boots": "§7You won’t be moved.§r §8You will be broken." } diff --git a/src/main/resources/assets/chipi/models/item/chipper_boots.json b/src/main/resources/assets/chipi/models/item/chipper_boots.json new file mode 100644 index 0000000..43ac46f --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/chipper_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "chipi:item/armor/chipper_boots" + } +} diff --git a/src/main/resources/assets/chipi/models/item/chipper_chestplate.json b/src/main/resources/assets/chipi/models/item/chipper_chestplate.json new file mode 100644 index 0000000..e1cedae --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/chipper_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "chipi:item/armor/chipper_chestplate" + } +} diff --git a/src/main/resources/assets/chipi/models/item/chipper_helmet.json b/src/main/resources/assets/chipi/models/item/chipper_helmet.json new file mode 100644 index 0000000..2b6b924 --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/chipper_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "chipi:item/armor/chipper_helmet" + } +} diff --git a/src/main/resources/assets/chipi/models/item/chipper_leggings.json b/src/main/resources/assets/chipi/models/item/chipper_leggings.json new file mode 100644 index 0000000..1ba66d5 --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/chipper_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "chipi:item/armor/chipper_leggings" + } +} diff --git a/src/main/resources/assets/chipi/models/item/mep_spawn_egg.json b/src/main/resources/assets/chipi/models/item/mep_spawn_egg.json new file mode 100644 index 0000000..ddd1559 --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/mep_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} diff --git a/src/main/resources/assets/chipi/textures/entity/mep.png b/src/main/resources/assets/chipi/textures/entity/mep.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4abd7b2693ea481a83cae38bc49e86bd9f6fd3 GIT binary patch literal 4679 zcmeHKdsGu=79WHH#<$kv8?w>*qLa+zotPk+1c(x#KrNtdolGWifILV73A9SY2ZG8j z^|5MokyTJB;G+joEE2^Rl`8eI-BJY$D=Oj^pR^)&zX|Wtp0meuw*QfwWHR^u?(e(z zcklO|OlEj!&@{a1Ee7-k#vQkW8!xm$Ru+(bfpeMmL#_S~7v4TT@H~ zov@Qy2(s7d!@2PZYU?Tv0OHFl~i%f_G17;XD{+vdzdR)CZi z&T;b^_UdHJp<~sU*7xa8xg(tu8Y*MPpUnEj8-m={kuq7hQYPyu29&U8RgN^cDq!M< zhJq}{_-~U(CteQU+xibib}3D9Xms5ACDTHfooi=~P-bn~e>c|DraRVhx3TDpwO`P^ z-#AVV3(aCiG}@GTip{pE?QQk#XKt_Z^4>zbQB)$__wdB7(3$5G3?H_pD7h^!m4N;{k^E_%h8->1jz%^!V(Y&ke$C|idj=LOFep%-&PozVcT2ZX{i(`%cZew}z zoKKwhMk22@mkU}KEr?y12Yr?Mt>B)c4X!O~eo>s1eZz|`t5|dg^2%`9bB=$vs{YOo z->v) z(jaC0bh?s3CpA*WM?4jxGRcUQWN@mPh)fNQ!c*gMk%lqfpC+-30fC;dVsyJc!C(>F zr3@FZ82qNpEC$^LvBpao(W-E|%xEU)Tqc)^zzRE=%x3u0=n}I=D~^x{c2j^mDPyJ8 zY7(XbdOn?)x8pky-SIEO*wFXCFwTOct z7{cdp_-YrG1{Vh!&3X*9lhk86f@L!3TnqcK6spi-h!k-cse*iIVEipeo60Z0)xPmHp~s4$9+h!K&P&GSQ0G13oj z)R5Yg|AnSD4_(sL@?g>e)=zPnx^`3~k=S+Db(=uCwi2E0+7x08?<&E9B@-G~o`9>% zg|Ea6Is%*?-Q(J0Cx2%Ygd&ZQiwaR#!_k2L@d*^hL^vDf;zC@+)$n*)4nC0GV$@n~ zn3-6h13Ch&z<9c}qR)0UYR*8kZ6!f<0SE@8Y`9M_LAPM6?t)p=nbA|Rg!LOuBrZU| zLk7fk*}&li&O%o2Vc4x1b?p3sukK#_fhz#&!A0Im-$A(s<$5ax-U>W8U4wGHl>%=C z9-OZKn_RTM$0@=9{sq~r0LcYCIkFNm_&J&s1rRrJvw7uR=uN?)G!{O_5I%BtgU z&hTvux&B~I$+jhgq{&|)PIFew%Re{W&$(t4#6`-o%dGZ7q+N(l+G3Jo2f(I#PdaYkbh>agVlG;QX{B9^5OjHxD-7E(zPRa!0A) zYU#E&%G5Wlxg9^Augj|r`MIiPYpF*>$4Bbsz?lKY*}Ip>%BP)n&$Pg$X)MomC8tm- zqWVS3Bf>PMaYYscplC}%^~tOcbc-*(S9WzrcGFa6@t65cafbNSo3HF73gyenTMDWV ztyNT}Jr>1Bl=vSoF0X9vFil!Gb{wSn!{l?rN{kTRM^8rB1#?&@wx+JRdbeB2ft~5cD>%{#AG{NCHj?}D@ey>XZ`{bK z>ofNw&!J@*InV>QTK9ck0izr~kQ7RVp7%32&lvy4_xTQ+0i`uKQ2BDTFQf2ZudcnB a{d(A~pqNb($#&3w2vRCS(Aep*pV!8 z;J|@~P(?GtHEa)pI=B-`4=y&}?`aM)p?(Ulydp5p#;=bd-oYVIMgt&#|Re5=Y a85rKMCjMt$y!{i<@eH1>elF{r5}E)sU19sjHmoaHJi&4dfapy)fxT0;YLknimuW zZBwF$E-<=)@oFUC^ljFO+gBAn$<=r@ZhyE3DdU>%E4oOJAb$d4DUZ%~{z0lSRTF^w xaIE6?-F>q^K!7avH@>$;u=h@YP!#YV{Q^m&a+X3kCG7wJ002ovPDHLkV1jhQfA|0Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/chipi/textures/item/armor/chipper_helmet.png b/src/main/resources/assets/chipi/textures/item/armor/chipper_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdb4f414597dff97a6a8282e2051174c6ef6c4b GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n>}3|Ln`LHouDXm$UwkVp2yVC z@T#e)>0Zaa%gPG`ZCSWt&ngx%^DI-dO7rz`4bYvkghR&o&&-ZJe}9`x|EPRhw87l! z*^iT6kNh3-OH6tfX?2Tk|K1?WJUu$%>zm@Uxr)78&qol`;+05Qi}%K!iX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/chipi/textures/item/armor/chipper_leggings.png b/src/main/resources/assets/chipi/textures/item/armor/chipper_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5fa2342e4e6d39a30375b219e5411e4e9437aa GIT binary patch literal 246 zcmV8Bv1O{DGgNcrb!5~tV8A7rQGl;JIlmGYc z-%XZrtWF2{oYz3BN+&(mcINe&0@Hy&t4eooE>z7E0P}tTV9f+T|D6EbQY3QViJr8q zy2@b;v1A6Gtj&xzvow+Hz>~Yd0-&x1>Q?L%@ZGz?E(3FtKyrk&?Yhh*qsQ+c5=e!n wtsLgA5w`F^V5^gaM_cH}_<*+X?C-zv2gTk|bCh1ZlmGw#07*qoM6N<$f@KkF^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/chipi/textures/mob_effect/chipi_blessing.png b/src/main/resources/assets/chipi/textures/mob_effect/chipi_blessing.png new file mode 100644 index 0000000000000000000000000000000000000000..91f101acc29be1abec036cce9bd81fadfcb2ff97 GIT binary patch literal 294 zcmV+>0oneEP)Px#-$_J4R5(wqlrav1KoCX$CM0faXX&kMDD(uDwzQU>Knog6Z)9m_?4}^W%))Gj zU4&Ja1_(2c|K~FpWIBxIv=!RRK8?IR0j7fQ_ZJLlHWtN|l1Nf3FbC3*=3tXR#gU+4 z4s?E^WvL8t1?sG+;WNG;DAFKqtcg%QVwUJ**$sb&z*bhm^VSJclcw5jcg>W?6K z6Bmjyr?OWf_GT4n5bp3PvMsDTJEC;bS_HZ+0D8HEeg^$zEgWbRzY1d3TE6(d_#g-I sXIqhQ-%^%sbZMnA%Wot_#Z=83*#Ghqf%7ZW00000NkvXXu0mjf0Fga+&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/chipi/textures/models/armor/chipper_layer_1.png b/src/main/resources/assets/chipi/textures/models/armor/chipper_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d86a71fe509c1aa667a07b726e009bb5be09035 GIT binary patch literal 3210 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 l@0W$o!zG4DWyyQiz4%Q~loCIF4?A7KCh literal 0 HcmV?d00001 diff --git a/src/main/resources/data/chipi/advancements/progression/mine_chipper_ore.json b/src/main/resources/data/chipi/advancements/progression/mine_chipper_ore.json index d093ef4..85b8663 100644 --- a/src/main/resources/data/chipi/advancements/progression/mine_chipper_ore.json +++ b/src/main/resources/data/chipi/advancements/progression/mine_chipper_ore.json @@ -8,9 +8,13 @@ }, "criteria": { "mine": { - "trigger": "minecraft:mined_block", + "trigger": "minecraft:inventory_changed", "conditions": { - "block": "chipi:chipper_ore" + "items": [ + { + "items": ["chipi:raw_chipper_ore"] + } + ] } } } diff --git a/src/main/resources/data/chipi/advancements/progression/place_alloy_block.json b/src/main/resources/data/chipi/advancements/progression/place_alloy_block.json index 0aaf625..2c1d190 100644 --- a/src/main/resources/data/chipi/advancements/progression/place_alloy_block.json +++ b/src/main/resources/data/chipi/advancements/progression/place_alloy_block.json @@ -10,7 +10,12 @@ "place": { "trigger": "minecraft:placed_block", "conditions": { - "block": "chipi:chipper_alloy_block" + "location": [ + { + "condition": "minecraft:block_state_property", + "block": "chipi:chipper_alloy_block" + } + ] } } }