Commit of all existing code.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package dev.bigduckie.simplehammers;
|
||||
|
||||
import dev.bigduckie.staticcontent.StaticContent;
|
||||
import dev.draylar.magna.api.optional.MagnaOptionals;
|
||||
import draylar.omegaconfig.OmegaConfig;
|
||||
import dev.bigduckie.simplehammers.config.SimpleHammersConfig;
|
||||
import dev.bigduckie.simplehammers.data.HammerData;
|
||||
import dev.bigduckie.simplehammers.item.ExtendedHammerItem;
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
|
||||
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
||||
import net.minecraft.item.ItemGroup;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.RegistryKeys;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class SimpleHammers implements ModInitializer {
|
||||
|
||||
public static String MODID = "simple-hammers";
|
||||
public static SimpleHammersConfig CONFIG = OmegaConfig.register(SimpleHammersConfig.class);
|
||||
private static final RegistryKey<ItemGroup> ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, id("group"));
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
MagnaOptionals.optInForCurse();
|
||||
StaticContent.load(id("hammers"), HammerData.class);
|
||||
Registry.register(Registries.ITEM_GROUP, ITEM_GROUP, FabricItemGroup.builder()
|
||||
.displayName(Text.translatable("itemGroup.simple-hammers.group"))
|
||||
.icon(() -> new ItemStack(Registries.ITEM.get(id("diamond_hammer"))))
|
||||
.entries((context, entries) -> entries.addAll(HammerData.ENTRY_SET))
|
||||
.build()
|
||||
);
|
||||
registerCallbackHandlers();
|
||||
}
|
||||
|
||||
private void registerCallbackHandlers() {
|
||||
AttackEntityCallback.EVENT.register((playerEntity, world, hand, entity, entityHitResult) -> {
|
||||
ItemStack handStack = playerEntity.getMainHandStack();
|
||||
if (handStack.getItem() instanceof ExtendedHammerItem extendedHammerItem) {
|
||||
// set entity on fire if this hammer smelts blocks
|
||||
if (extendedHammerItem.getData().canSmelt()) {
|
||||
entity.setOnFireFor(4);
|
||||
}
|
||||
}
|
||||
|
||||
return ActionResult.PASS;
|
||||
});
|
||||
}
|
||||
|
||||
public static Identifier id(String name) {
|
||||
return new Identifier(MODID, name);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package dev.bigduckie.simplehammers.config;
|
||||
|
||||
import draylar.omegaconfig.api.Config;
|
||||
|
||||
public class SimpleHammersConfig implements Config {
|
||||
|
||||
public boolean enableExtraMaterials = true;
|
||||
public int durabilityModifier = 5;
|
||||
public double breakSpeedMultiplier = 1.0;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "simple-hammers";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
package dev.bigduckie.simplehammers.data;
|
||||
|
||||
import dev.bigduckie.simplehammers.item.ExtendedHammerItem;
|
||||
import dev.bigduckie.simplehammers.material.CustomToolMaterial;
|
||||
import dev.bigduckie.staticcontent.api.ContentData;
|
||||
import net.fabricmc.fabric.api.registry.FuelRegistry;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class HammerData implements ContentData {
|
||||
|
||||
private final String id;
|
||||
private final int miningLevel;
|
||||
private final int durability;
|
||||
private final float blockBreakSpeed;
|
||||
private final float attackDamage;
|
||||
private final float attackSpeed;
|
||||
private final int enchantability;
|
||||
private final Identifier repairIngredient;
|
||||
private final boolean isFireImmune;
|
||||
private final boolean smelts;
|
||||
private final int breakRadius;
|
||||
private final boolean isExtra;
|
||||
private final int burnTime;
|
||||
private final boolean hasExtraKnockback;
|
||||
|
||||
public static final Set<ItemStack> ENTRY_SET = ItemStackSet.create();
|
||||
|
||||
public HammerData(String id, int miningLevel, int durability, float blockBreakSpeed, float attackDamage, float attackSpeed, int enchantability, Identifier repairIngredient, boolean isFireImmune, boolean smelts, int breakRadius, boolean isExtra, int burnTime, boolean hasExtraKnockback, String group) {
|
||||
this.id = id;
|
||||
this.miningLevel = miningLevel;
|
||||
this.durability = durability;
|
||||
this.blockBreakSpeed = blockBreakSpeed;
|
||||
this.attackDamage = attackDamage;
|
||||
this.attackSpeed = attackSpeed;
|
||||
this.enchantability = enchantability;
|
||||
this.repairIngredient = repairIngredient;
|
||||
this.isFireImmune = isFireImmune;
|
||||
this.smelts = smelts;
|
||||
this.breakRadius = breakRadius;
|
||||
this.isExtra = isExtra;
|
||||
this.burnTime = burnTime;
|
||||
this.hasExtraKnockback = hasExtraKnockback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(Identifier identifier) {
|
||||
// only register if the hammer is not extra (wood -> diamond), or if it is extra (lapis, emerald, ...) and the option is enabled
|
||||
if (!isExtra() || isExtra() && dev.bigduckie.simplehammers.SimpleHammers.CONFIG.enableExtraMaterials) {
|
||||
|
||||
// setup settings
|
||||
Item.Settings settings = new Item.Settings();
|
||||
if (isFireImmune()) {
|
||||
settings.fireproof();
|
||||
}
|
||||
|
||||
// check for hammer autosmelt
|
||||
// create hammer with settings
|
||||
ExtendedHammerItem hammerItem = new ExtendedHammerItem(
|
||||
CustomToolMaterial.from(this),
|
||||
0,
|
||||
getAttackSpeed() == 0 ? -2.4f : getAttackSpeed(),
|
||||
settings,
|
||||
getBreakRadius() == 0 ? 1 : getBreakRadius(),
|
||||
this
|
||||
);
|
||||
|
||||
// burn time for furnace fuel
|
||||
if (getBurnTime() > 0) {
|
||||
FuelRegistry.INSTANCE.add(hammerItem, getBurnTime());
|
||||
}
|
||||
|
||||
// add hammer to tag
|
||||
String path = getId() + "_hammer";
|
||||
Identifier registryID = path.contains(":") ? new Identifier(path) : dev.bigduckie.simplehammers.SimpleHammers.id(path);
|
||||
Registry.register(Registries.ITEM, registryID, hammerItem);
|
||||
|
||||
// add hammer to item group
|
||||
ENTRY_SET.add(hammerItem.getDefaultStack());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasExtraKnockback() {
|
||||
return hasExtraKnockback;
|
||||
}
|
||||
|
||||
public boolean canSmelt() {
|
||||
return smelts;
|
||||
}
|
||||
|
||||
public int getBurnTime() {
|
||||
return burnTime;
|
||||
}
|
||||
|
||||
public boolean isExtra() {
|
||||
return isExtra;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getBreakRadius() {
|
||||
return breakRadius;
|
||||
}
|
||||
|
||||
public float getAttackSpeed() {
|
||||
return attackSpeed;
|
||||
}
|
||||
|
||||
public int getMiningLevel() {
|
||||
return miningLevel;
|
||||
}
|
||||
|
||||
public int getDurability() {
|
||||
return durability;
|
||||
}
|
||||
|
||||
public float getBlockBreakSpeed() {
|
||||
return blockBreakSpeed * (float) dev.bigduckie.simplehammers.SimpleHammers.CONFIG.breakSpeedMultiplier;
|
||||
}
|
||||
|
||||
public float getAttackDamage() {
|
||||
return attackDamage;
|
||||
}
|
||||
|
||||
public int getEnchantability() {
|
||||
return enchantability;
|
||||
}
|
||||
|
||||
public Identifier getRepairIngredient() {
|
||||
return repairIngredient;
|
||||
}
|
||||
|
||||
public boolean isFireImmune() {
|
||||
return isFireImmune;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package dev.bigduckie.simplehammers.item;
|
||||
|
||||
import dev.draylar.magna.api.BlockProcessor;
|
||||
import dev.draylar.magna.item.HammerItem;
|
||||
import dev.bigduckie.simplehammers.data.HammerData;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.SimpleInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ToolMaterial;
|
||||
import net.minecraft.recipe.RecipeType;
|
||||
import net.minecraft.recipe.SmeltingRecipe;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class ExtendedHammerItem extends HammerItem {
|
||||
|
||||
private final HammerData data;
|
||||
|
||||
public ExtendedHammerItem(ToolMaterial toolMaterial, int attackDamage, float attackSpeed, Settings settings, int breakRadius, HammerData data) {
|
||||
super(toolMaterial, attackDamage, attackSpeed, settings, breakRadius);
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public HammerData getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockProcessor getProcessor(World world, PlayerEntity player, BlockPos pos, ItemStack heldStack) {
|
||||
if (data.canSmelt()) {
|
||||
return (tool, input) -> {
|
||||
Optional<SmeltingRecipe> cooked = world.getRecipeManager().getFirstMatch(
|
||||
RecipeType.SMELTING,
|
||||
new SimpleInventory(input),
|
||||
world
|
||||
);
|
||||
|
||||
if (cooked.isPresent()) {
|
||||
return cooked.get().getOutput(world.getRegistryManager()).copy();
|
||||
}
|
||||
|
||||
return input;
|
||||
};
|
||||
} else {
|
||||
return super.getProcessor(world, player, pos, heldStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package dev.bigduckie.simplehammers.material;
|
||||
|
||||
import dev.bigduckie.simplehammers.data.HammerData;
|
||||
import net.minecraft.item.ToolMaterial;
|
||||
import net.minecraft.recipe.Ingredient;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class CustomToolMaterial implements ToolMaterial {
|
||||
|
||||
private final int enchantability;
|
||||
private final float miningSpeedMultiplier;
|
||||
private final int durability;
|
||||
private final float attackDamage;
|
||||
private final int miningLevel;
|
||||
private final Ingredient ingredient;
|
||||
|
||||
public CustomToolMaterial(int enchantability, float miningSpeedMultiplier, int durability, float attackDamage, int miningLevel, Ingredient ingredient) {
|
||||
this.enchantability = enchantability;
|
||||
this.miningSpeedMultiplier = miningSpeedMultiplier;
|
||||
this.durability = durability;
|
||||
this.attackDamage = attackDamage;
|
||||
this.miningLevel = miningLevel;
|
||||
this.ingredient = ingredient;
|
||||
}
|
||||
|
||||
public static CustomToolMaterial from(HammerData data) {
|
||||
return new CustomToolMaterial(
|
||||
data.getEnchantability() == 0 ? 15 : data.getEnchantability(),
|
||||
data.getBlockBreakSpeed() == 0 ? 1 : data.getBlockBreakSpeed(),
|
||||
(data.getDurability() == 0 ? 500 : data.getDurability()) * dev.bigduckie.simplehammers.SimpleHammers.CONFIG.durabilityModifier,
|
||||
data.getAttackDamage() == 0 ? 4 : data.getAttackDamage(),
|
||||
data.getMiningLevel(),
|
||||
Ingredient.ofItems(Registries.ITEM.get(data.getRepairIngredient() == null ? new Identifier("iron_ingot") : data.getRepairIngredient()))
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDurability() {
|
||||
return durability;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMiningSpeedMultiplier() {
|
||||
return miningSpeedMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAttackDamage() {
|
||||
return attackDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMiningLevel() {
|
||||
return miningLevel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEnchantability() {
|
||||
return enchantability;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Ingredient getRepairIngredient() {
|
||||
return ingredient;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package dev.bigduckie.simplehammers.mixin;
|
||||
|
||||
import dev.bigduckie.simplehammers.item.ExtendedHammerItem;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(EnchantmentHelper.class)
|
||||
public class HammerKnockbackMixin {
|
||||
|
||||
private static final int SLIME_KNOCKBACK_MODIFIER = 3;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "getKnockback", cancellable = true)
|
||||
private static void getKnockback(LivingEntity livingEntity, CallbackInfoReturnable<Integer> info) {
|
||||
ItemStack heldStack = livingEntity.getMainHandStack();
|
||||
if(heldStack.getItem() instanceof ExtendedHammerItem hammerItem) {
|
||||
// check data associated with hammer item for extra kb
|
||||
if(hammerItem.getData().hasExtraKnockback()) {
|
||||
info.setReturnValue(SLIME_KNOCKBACK_MODIFIER);
|
||||
info.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package dev.bigduckie.simplehammers.mixin;
|
||||
|
||||
import dev.bigduckie.simplehammers.item.ExtendedHammerItem;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.EnchantmentTarget;
|
||||
import net.minecraft.enchantment.SilkTouchEnchantment;
|
||||
import net.minecraft.entity.EquipmentSlot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
||||
@Mixin(SilkTouchEnchantment.class)
|
||||
public class SilkTouchEnchantmentMixin extends Enchantment {
|
||||
|
||||
public SilkTouchEnchantmentMixin(Rarity weight, EnchantmentTarget type, EquipmentSlot[] slotTypes) {
|
||||
super(weight, type, slotTypes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptableItem(ItemStack stack) {
|
||||
if (stack.getItem() instanceof ExtendedHammerItem item) {
|
||||
return !item.getData().canSmelt();
|
||||
}
|
||||
|
||||
return super.isAcceptableItem(stack);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user