diff --git a/src/main/java/fathertoast/specialmobs/common/core/register/SMItems.java b/src/main/java/fathertoast/specialmobs/common/core/register/SMItems.java index 16e7e0f..089ccf4 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/register/SMItems.java +++ b/src/main/java/fathertoast/specialmobs/common/core/register/SMItems.java @@ -1,6 +1,7 @@ package fathertoast.specialmobs.common.core.register; import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.item.SyringeItem; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.item.Item; @@ -10,9 +11,18 @@ import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + public class SMItems { public static final DeferredRegister REGISTRY = DeferredRegister.create( ForgeRegistries.ITEMS, SpecialMobs.MOD_ID ); + public static final List> SIMPLE_ITEMS = new ArrayList<>(); + + + public static final RegistryObject SYRINGE = registerSimpleItem("syringe", SyringeItem::new); + /** Registers an entity type's spawn egg item to the deferred register. */ public static RegistryObject registerSpawnEgg( @@ -22,4 +32,10 @@ public class SMItems { new ForgeSpawnEggItem( entityType, eggBaseColor, eggSpotsColor, new Item.Properties().tab( ItemGroup.TAB_MISC ) ) ); } + + public static RegistryObject registerSimpleItem(String name, Supplier itemSupplier) { + RegistryObject regObject = REGISTRY.register(name, itemSupplier); + SIMPLE_ITEMS.add(regObject); + return regObject; + } } \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/item/SyringeItem.java b/src/main/java/fathertoast/specialmobs/common/item/SyringeItem.java new file mode 100644 index 0000000..74a5887 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/item/SyringeItem.java @@ -0,0 +1,46 @@ +package fathertoast.specialmobs.common.item; + +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.util.References; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Rarity; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; +import net.minecraft.util.*; +import net.minecraft.world.World; + +public class SyringeItem extends Item { + + public SyringeItem() { + super(new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON).defaultDurability(10).setNoRepair()); + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Syringe", + "", "", "", "", "", "" );//TODO + } + + @Override + public ActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack usedItem = player.getItemInHand(hand); + + if (!world.isClientSide) { + if (player.hasEffect(Effects.MOVEMENT_SPEED)) { + return ActionResult.pass(usedItem); + } + else { + player.addEffect(new EffectInstance(Effects.MOVEMENT_SPEED, 300, 2)); + player.addEffect(new EffectInstance(Effects.CONFUSION, 400)); + world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BEE_STING, SoundCategory.PLAYERS, 0.9F, 1.0F); + usedItem.hurtAndBreak(1, player, (entity) -> { + entity.broadcastBreakEvent(hand); + }); + return ActionResult.success(usedItem); + } + } + return ActionResult.fail(usedItem); + } +} diff --git a/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java b/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java index 5023ae9..30d9a7f 100644 --- a/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java +++ b/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java @@ -7,6 +7,7 @@ import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.item.Item; import javax.annotation.ParametersAreNonnullByDefault; import java.lang.annotation.Annotation; @@ -80,7 +81,18 @@ public final class AnnotationHelper { throw new RuntimeException( "Entity class for " + species.name + " has invalid language provider method", ex ); } } - + + /** Gets the translations from a mod item. Throws an exception if anything goes wrong. */ + public static String[] getTranslations(Item item) { + try { + return (String[]) getMethod( item.getClass(), SpecialMob.LanguageProvider.class ) + .invoke( null, item.getDescriptionId() ); + } + catch( NoSuchMethodException | InvocationTargetException | IllegalAccessException ex ) { + throw new RuntimeException( "Item class for " + item.getRegistryName() + " has invalid language provider method", ex ); + } + } + /** Builds a loot table from a special mob species. Throws an exception if anything goes wrong. */ public static LootTableBuilder buildLootTable( MobFamily.Species species ) { try { diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java index 33804f9..9828350 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java +++ b/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java @@ -2,10 +2,15 @@ package fathertoast.specialmobs.datagen; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.core.register.SMItems; import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ItemModelProvider; import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.fml.RegistryObject; + +import java.util.Objects; public class SMItemModelProvider extends ItemModelProvider { @@ -19,5 +24,13 @@ public class SMItemModelProvider extends ItemModelProvider { final ResourceLocation spawnEggParent = modLoc( ITEM_FOLDER + "/template_sm_spawn_egg" ); for( MobFamily.Species species : MobFamily.getAllSpecies() ) withExistingParent( species.spawnEgg.getId().getPath(), spawnEggParent ); + + // Simple items + for(RegistryObject regObject : SMItems.SIMPLE_ITEMS) { + String name = Objects.requireNonNull(regObject.getId()).getPath(); + + withExistingParent(name, mcLoc("item/generated")) + .texture("layer0", modLoc(ITEM_FOLDER + "/" + name)); + } } } \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java index 9f4705c..47a00a2 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java +++ b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java @@ -2,10 +2,14 @@ package fathertoast.specialmobs.datagen; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.core.register.SMItems; import fathertoast.specialmobs.common.util.AnnotationHelper; import fathertoast.specialmobs.common.util.References; import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.common.data.LanguageProvider; +import net.minecraftforge.fml.RegistryObject; import java.util.ArrayList; import java.util.HashMap; @@ -51,7 +55,19 @@ public class SMLanguageProvider extends LanguageProvider { translationList.add( speciesTranslations ); translationList.add( spawnEggTranslations ); } - + + // Items + for (RegistryObject regObject : SMItems.REGISTRY.getEntries()) { + Item item = regObject.get(); + + // Lazy method of avoiding duplicate entries for now + if (item instanceof ForgeSpawnEggItem) { + continue; + } + final String[] itemTranslations = AnnotationHelper.getTranslations(regObject.get()); + translationList.add(itemTranslations); + } + TRANSLATIONS = translationList.toArray( new String[0][0] ); // Assign all specific locales to the translation we want to use diff --git a/src/main/resources/assets/specialmobs/textures/item/syringe.png b/src/main/resources/assets/specialmobs/textures/item/syringe.png new file mode 100644 index 0000000..009d3c8 Binary files /dev/null and b/src/main/resources/assets/specialmobs/textures/item/syringe.png differ