diff --git a/gradle.properties b/gradle.properties index e2305b0..4d53a36 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,7 +36,7 @@ mod_name=Stalinium # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=0.3.0 +mod_version=1.0.0 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -44,4 +44,4 @@ mod_group_id=net.krituximon.stalinium # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. mod_authors=Kris HD, Fretux, Gianimon # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Adds Stalinium +mod_description=A mod that adds the strongest material known to man. diff --git a/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java b/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java index bc80aed..5360813 100644 --- a/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java +++ b/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java @@ -26,5 +26,6 @@ public class ModItemModelProvider extends ItemModelProvider { handheldItem(ModItems.STALINIUM_SHOVEL.get()); handheldItem(ModItems.STALINIUM_HOE.get()); handheldItem(ModItems.STALINIUM_PICKAXE.get()); + handheldItem(ModItems.STALINIUM_MACE.get()); } } diff --git a/src/main/java/net/krituximon/stalinium/datagen/ModItemTagProvider.java b/src/main/java/net/krituximon/stalinium/datagen/ModItemTagProvider.java index 6100ffd..8e20784 100644 --- a/src/main/java/net/krituximon/stalinium/datagen/ModItemTagProvider.java +++ b/src/main/java/net/krituximon/stalinium/datagen/ModItemTagProvider.java @@ -36,6 +36,8 @@ public class ModItemTagProvider extends ItemTagsProvider { .add(ModItems.STALINIUM_HOE.get()); this.tag(ItemTags.PICKAXES) .add(ModItems.STALINIUM_PICKAXE.get()); + this.tag(ItemTags.MACE_ENCHANTABLE) + .add(ModItems.STALINIUM_MACE.get()); this.tag(ItemTags.HEAD_ARMOR) .add(ModItems.STALINIUM_HELMET.get()); this.tag(ItemTags.CHEST_ARMOR) diff --git a/src/main/java/net/krituximon/stalinium/datagen/ModRecipeProvider.java b/src/main/java/net/krituximon/stalinium/datagen/ModRecipeProvider.java index e5a1dfc..6f8f1c2 100644 --- a/src/main/java/net/krituximon/stalinium/datagen/ModRecipeProvider.java +++ b/src/main/java/net/krituximon/stalinium/datagen/ModRecipeProvider.java @@ -169,5 +169,16 @@ public class ModRecipeProvider extends RecipeProvider implements IConditionBuild .unlocks("has_netherite", has(Items.NETHERITE_BOOTS)) .save(recipeOutput, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, "smithing/stalinium_boots")); + + SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.STALINIUM_SMITHING_TEMPLATE.get()), + Ingredient.of(Items.MACE), + Ingredient.of(ModBlocks.STALINIUM_BLOCK.get()), + RecipeCategory.COMBAT, + ModItems.STALINIUM_MACE.get() + ) + .unlocks("has_netherite", has(Items.NETHERITE_BOOTS)) + .save(recipeOutput, + ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, "smithing/stalinium_mace")); } } diff --git a/src/main/java/net/krituximon/stalinium/item/ModCreativeModeTabs.java b/src/main/java/net/krituximon/stalinium/item/ModCreativeModeTabs.java index d83e9e2..843275c 100644 --- a/src/main/java/net/krituximon/stalinium/item/ModCreativeModeTabs.java +++ b/src/main/java/net/krituximon/stalinium/item/ModCreativeModeTabs.java @@ -26,6 +26,7 @@ public class ModCreativeModeTabs { output.accept(ModBlocks.STALINIUM_ORE.get()); output.accept(ModBlocks.COMPRESSED_BEDROCK.get()); output.accept(ModBlocks.STALINIUM_PRESS.get()); + output.accept(ModItems.STALINIUM_MACE.get()); output.accept(ModItems.STALINIUM_SWORD.get()); output.accept(ModItems.STALINIUM_AXE.get()); output.accept(ModItems.STALINIUM_PICKAXE.get()); diff --git a/src/main/java/net/krituximon/stalinium/item/ModItems.java b/src/main/java/net/krituximon/stalinium/item/ModItems.java index 2ec06c7..9643569 100644 --- a/src/main/java/net/krituximon/stalinium/item/ModItems.java +++ b/src/main/java/net/krituximon/stalinium/item/ModItems.java @@ -6,6 +6,10 @@ import net.krituximon.stalinium.sound.ModSounds; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.*; import net.minecraft.world.item.component.Unbreakable; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; @@ -63,6 +67,11 @@ public class ModItems { () -> new StaliniumBootsItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Properties().component(DataComponents.UNBREAKABLE, new Unbreakable(true)).stacksTo(1))); + public static final DeferredItem STALINIUM_MACE = ITEMS.register("stalinium_mace", + () -> new StaliniumMaceItem(new Item.Properties() + .component(DataComponents.UNBREAKABLE, new Unbreakable(true)) + .attributes(StaliniumMaceItem.createAttributes()))); + public static final DeferredItem STALINIUM_SMITHING_TEMPLATE = ITEMS.register("stalinium_smithing_template", () -> new Item(new Item.Properties())); diff --git a/src/main/java/net/krituximon/stalinium/item/custom/StaliniumMaceItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumMaceItem.java new file mode 100644 index 0000000..b9a133d --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumMaceItem.java @@ -0,0 +1,150 @@ +package net.krituximon.stalinium.item.custom; + +import net.krituximon.stalinium.item.ModItems; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.windcharge.WindCharge; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MaceItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import java.util.List; + +public class StaliniumMaceItem extends MaceItem { + public StaliniumMaceItem(Properties properties) { + super(properties); + } + + @Override + public boolean isDamageable(ItemStack stack) { + return false; + } + + @Override + public boolean isDamaged(ItemStack stack) { + return false; + } + + @Override + public int getEnchantmentValue() { + return 25; + } + + public static ItemAttributeModifiers createAttributes() { + return ItemAttributeModifiers.builder().add(Attributes.ATTACK_DAMAGE, new AttributeModifier( + BASE_ATTACK_DAMAGE_ID, (double) 9.0F, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND).add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, + (double) -3F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + if (!level.isClientSide && player.isCrouching()) { + smash(player); + } else if (!level.isClientSide && !player.isCrouching()) { + WindCharge windCharge = new WindCharge(EntityType.WIND_CHARGE, level); + Vec3 direction = player.getLookAngle(); + + windCharge.setPos( + player.getX() + direction.x * 1.2, + player.getEyeY() - 0.1, + player.getZ() + direction.z * 1.2 + ); + + windCharge.shoot(direction.x, direction.y, direction.z, 1.5F, 0.0F); + + level.addFreshEntity(windCharge); + + level.playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.BREEZE_CHARGE, SoundSource.PLAYERS, 1.0F, 1.0F); + + player.getCooldowns().addCooldown(this, 15); + } + + return InteractionResultHolder.success(player.getItemInHand(usedHand)); + } + + public static void smash(Player player) { + if (player.level().isClientSide) return; + + double radius = 5.0; + double angle = 60.0; + float damage = 4.0f; + ServerLevel level = (ServerLevel) player.level(); + Vec3 playerPos = player.position(); + Vec3 direction = new Vec3(player.getLookAngle().x, 0, player.getLookAngle().z); + List targets = level.getEntities(player, player.getBoundingBox().inflate(radius)); + + for (Entity entity : targets) { + if (!(entity instanceof LivingEntity) || entity == player) continue; + Vec3 target = entity.position().subtract(playerPos).normalize(); + double dot = direction.dot(target); + if (dot > Math.cos(Math.toRadians(angle / 2))) { + entity.hurt(player.damageSources().playerAttack(player), damage); + Vec3 knockback = entity.position().subtract(playerPos).normalize().scale(0.2); + entity.push(knockback.x, 0.2, knockback.z); + } + } + + BlockState block = level.getBlockState(player.blockPosition().below()); + for (int i = 0; i < 8; i++) { + double distance = (radius / 8) * (i + 1); + for (int j = 0; j < 25; j++) { + double angleOffset = (level.random.nextDouble() - 0.5) * angle; + double radOffset = Math.toRadians(angleOffset); + + Vec3 rotated = rotateY(direction, radOffset); + + Vec3 particlePos = playerPos.add(rotated.scale(distance).add(0, 1.0 + (level.random.nextDouble() - 0.5) * 0.5, 0)); + level.sendParticles( + new BlockParticleOption(ParticleTypes.BLOCK, block), + particlePos.x, particlePos.y, particlePos.z, + 3, 0.1, 0.1, 0.1, 0.1 + ); + } + } + + level.playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.EVOKER_FANGS_ATTACK, SoundSource.PLAYERS, 1.0F, 1.0F); + player.getCooldowns().addCooldown(ModItems.STALINIUM_MACE.get(), 100); + } + + private static Vec3 rotateY(Vec3 vec, double radians) { + double cos = Math.cos(radians); + double sin = Math.sin(radians); + double x = vec.x * cos - vec.z * sin; + double z = vec.x * sin + vec.z * cos; + return new Vec3(x, vec.y, z); + } + + @Override + public void appendHoverText(ItemStack stack, + TooltipContext context, + List tooltipComponents, + TooltipFlag tooltipFlag) { + if (Screen.hasShiftDown()) { + tooltipComponents.add(Component.translatable("item.stalinium_mace.tooltip_shift")); + } else { + tooltipComponents.add(Component.translatable("item.stalinium_mace.tooltip")); + } + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + } +} diff --git a/src/main/resources/assets/stalinium/lang/en_us.json b/src/main/resources/assets/stalinium/lang/en_us.json index a66a27a..0a2b418 100644 --- a/src/main/resources/assets/stalinium/lang/en_us.json +++ b/src/main/resources/assets/stalinium/lang/en_us.json @@ -6,6 +6,7 @@ "item.stalinium.stalinium_shovel": "Stalinium Shovel", "item.stalinium.stalinium_hoe": "Stalinium Hoe", "item.stalinium.stalinium_pickaxe": "Stalinium Pickaxe", + "item.stalinium.stalinium_mace": "Stalinium Mace", "advancements.stalinium.stalinium.root.title": "The Start of the Revolution", "advancements.stalinium.stalinium.root.desc": "Welcome to Stalinium", @@ -41,7 +42,9 @@ "advancements.stalinium.stalinium.boots_bloc.desc": "Obtain the Stalinium Boots", "advancements.stalinium.stalinium.comrade_prime.title": "Comrade Prime", "advancements.stalinium.stalinium.comrade_prime.desc": "Wear a full set of Stalinium Armor", - + "advancements.stalinium.stalinium.amacing_hammer.title": "Amacing Hammer", + "advancements.stalinium.stalinium.amacing_hammer.desc": "Obtain the Stalinium Mace", + "item.stalinium.stalinium_helmet": "Stalinium Helmet", "item.stalinium.stalinium_chestplate": "Stalinium Chestplate", @@ -75,7 +78,7 @@ "item.stalinium_pickaxe.tooltip": "Pickaxe made out of §cStalinium§0\n\n§l§cVein of Unity§0\n\n§l§cOre for All\n\n§f(Shift to expand)", "item.stalinium_pickaxe.tooltip_shift": "Pickaxe made out of §cStalinium\n\n§l§cVein of Unity:§f\nInstantly mines all connected ore blocks.\n\n§l§cOre for all:§f\n50% chance nearby comrades also receive your ore drops.", - + "item.stalinium_boots.tooltip": "Boots made out of §cStalinium\n\n§l§cMarch of Progress\n\n§fFull Armor Set Bonus:\n§l§cPower of the Many\n\n§f(Shift to expand)", "item.stalinium_boots.tooltip_shift": "Boots made out of §cStalinium\n\n§l§cMarch of Progress:§f\nSprinting gives you and everyone nearby Speed I.\n\n§fFull Armor Set Bonus:\n§l§cPower of the Many: Gain more hearts the more allies are nearby.", @@ -87,7 +90,10 @@ "item.stalinium_leggings.tooltip": "Leggings made out of §cStalinium\n\n§l§cIron Will of the Collective\n\n§fFull Armor Set Bonus:\n§l§cPower of the Many\n\n§f(Shift to expand)", "item.stalinium_leggings.tooltip_shift": "Leggings made out of §cStalinium\n\n§l§cIron Will of the Collective:§f\nWhen wearing the chestplate alongside the leggings, gain Resistance I.\n\n§fFull Armor Set Bonus:\n§l§cPower of the Many: Gain more hearts the more allies are nearby.", - + + "item.stalinium_mace.tooltip": "Mace made out of §cStalinium\n\n§l§cWinds of Revolution§0\n\n§l§cCrush the Bourgeoisie\n\n§f(Shift to expand)", + "item.stalinium_mace.tooltip_shift": "Mace made out of §cStalinium\n\n§l§cWinds of Revolution§f\nShoots a Wind Charge on regular right-click.\n\n§l§cCrush the Bourgeoisie§f\nWhen right-clicking while sneaking, do a smash attack launching enemies away and dealing damage.", + "item.minecraft.potion.effect.vodka": "Bottle of Vodka", "item.minecraft.splash_potion.effect.vodka": "Throwable Bottle of Vodka", "item.minecraft.lingering_potion.effect.vodka": "Lingering Bottle of Vodka", diff --git a/src/main/resources/data/stalinium/advancement/stalinium/amacing_hammer.json b/src/main/resources/data/stalinium/advancement/stalinium/amacing_hammer.json new file mode 100644 index 0000000..5629b84 --- /dev/null +++ b/src/main/resources/data/stalinium/advancement/stalinium/amacing_hammer.json @@ -0,0 +1,34 @@ +{ + "parent": "stalinium:stalinium/strike_state", + "criteria": { + "stalinium_mace": { + "conditions": { + "items": [ + { + "items": "stalinium:stalinium_mace" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "background": "minecraft:textures/gui/advancements/backgrounds/stone.png", + "description": { + "translate": "advancements.stalinium.stalinium.amacing_hammer.desc" + }, + "icon": { + "count": 1, + "id": "stalinium:stalinium_mace" + }, + "title": { + "translate": "advancements.stalinium.stalinium.amacing_hammer.title" + } + }, + "requirements": [ + [ + "stalinium_mace" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/main/resources/data/stalinium/advancement/stalinium/means_revolution.json b/src/main/resources/data/stalinium/advancement/stalinium/means_revolution.json index 47d4c08..0110514 100644 --- a/src/main/resources/data/stalinium/advancement/stalinium/means_revolution.json +++ b/src/main/resources/data/stalinium/advancement/stalinium/means_revolution.json @@ -50,6 +50,16 @@ ] }, "trigger": "minecraft:inventory_changed" + }, + "stalinium_mace": { + "conditions": { + "items": [ + { + "items": "stalinium:stalinium_mace" + } + ] + }, + "trigger": "minecraft:inventory_changed" } }, "display": { @@ -71,7 +81,8 @@ "stalinium_pickaxe", "stalinium_shovel", "stalinium_hoe", - "stalinium_sword" + "stalinium_sword", + "stalinium_mace" ] ], "sends_telemetry_event": true diff --git a/src/main/resources/data/stalinium/recipe/stalinium_trim_from_stalinium_press.json b/src/main/resources/data/stalinium/recipe/stalinium_trim_from_stalinium_press.json new file mode 100644 index 0000000..890d863 --- /dev/null +++ b/src/main/resources/data/stalinium/recipe/stalinium_trim_from_stalinium_press.json @@ -0,0 +1,9 @@ +{ + "type": "stalinium:stalinium_press", + "nugget": { + "item": "stalinium:compressed_bedrock" + }, + "result": { + "id": "stalinium:stalinium_ingot" + } +} \ No newline at end of file