From 6ab694da3e14adce82c60b0195813a3ee35a9c01 Mon Sep 17 00:00:00 2001 From: Me <135455255+IcarussOne@users.noreply.github.com> Date: Sun, 19 May 2024 13:08:32 -0500 Subject: [PATCH] Taintacle Boss WIP --- .../CrimsonRevelations.java | 7 +- .../renderer/RenderOvergrownTaintacle.java | 25 +++ .../entity/boss/EntityOvergrownTaintacle.java | 170 ++++++++++++++++++ .../init/LootTableHandler.java | 5 +- .../init/RecipeHandler.java | 4 +- .../init/RegistryHandler.java | 31 ++++ .../init/RenderingHandler.java | 15 ++ .../init/ResearchHandler.java | 19 +- .../item/foci/FocusEffectPoison.java | 4 +- .../assets/crimsonrevelations/lang/en_us.lang | 5 + .../entities/boss/overgrown_taintacle.json | 83 +++++++++ .../research/compat/thaumic_augmentation.json | 29 +++ .../research/revelations.json | 4 + .../textures/entity/overgrown_taintacle.png | Bin 0 -> 12503 bytes .../research/r_overgrown_taintacle.png | Bin 0 -> 572 bytes 15 files changed, 392 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/mobiusflip/crimsonrevelations/client/renderer/RenderOvergrownTaintacle.java create mode 100644 src/main/java/com/mobiusflip/crimsonrevelations/entity/boss/EntityOvergrownTaintacle.java create mode 100644 src/main/java/com/mobiusflip/crimsonrevelations/init/RenderingHandler.java create mode 100644 src/main/resources/assets/crimsonrevelations/loot_tables/entities/boss/overgrown_taintacle.json create mode 100644 src/main/resources/assets/crimsonrevelations/research/compat/thaumic_augmentation.json create mode 100644 src/main/resources/assets/crimsonrevelations/textures/entity/overgrown_taintacle.png create mode 100644 src/main/resources/assets/crimsonrevelations/textures/research/r_overgrown_taintacle.png diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/CrimsonRevelations.java b/src/main/java/com/mobiusflip/crimsonrevelations/CrimsonRevelations.java index 0721b70..0839276 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/CrimsonRevelations.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/CrimsonRevelations.java @@ -9,6 +9,7 @@ import com.mobiusflip.crimsonrevelations.compat.CompatHandler; import com.mobiusflip.crimsonrevelations.init.CRCreativeTabs; +import com.mobiusflip.crimsonrevelations.init.RenderingHandler; import com.mobiusflip.crimsonrevelations.init.ResearchHandler; @Mod(modid = CrimsonRevelations.MODID, name = CrimsonRevelations.NAME, version = CrimsonRevelations.VERSION, dependencies = CrimsonRevelations.DEPENDENCIES) @@ -19,17 +20,21 @@ public class CrimsonRevelations { public static final String DEPENDENCIES = "required-after:thaumcraft@[1.12.2-6.1.BETA26,);after:thaumicaugmentation"; public static final CreativeTabs tabCR = new CRCreativeTabs(CreativeTabs.CREATIVE_TAB_ARRAY.length, "CrimsonRevelationsTab"); + @Mod.Instance + public static CrimsonRevelations instance; + @EventHandler public void preInit(FMLPreInitializationEvent event) { + RenderingHandler.preInit(); } @EventHandler public void init(FMLInitializationEvent event) { + CompatHandler.init(); ResearchHandler.init(); } @EventHandler public void postinit(FMLPostInitializationEvent event) { - CompatHandler.init(); } } diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/client/renderer/RenderOvergrownTaintacle.java b/src/main/java/com/mobiusflip/crimsonrevelations/client/renderer/RenderOvergrownTaintacle.java new file mode 100644 index 0000000..649f7ee --- /dev/null +++ b/src/main/java/com/mobiusflip/crimsonrevelations/client/renderer/RenderOvergrownTaintacle.java @@ -0,0 +1,25 @@ +package com.mobiusflip.crimsonrevelations.client.renderer; + +import com.mobiusflip.crimsonrevelations.CrimsonRevelations; +import com.mobiusflip.crimsonrevelations.entity.boss.EntityOvergrownTaintacle; + +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import thaumcraft.client.renderers.models.entity.ModelTaintacle; + +@SideOnly(Side.CLIENT) +public class RenderOvergrownTaintacle extends RenderLiving { + public static final ResourceLocation TEXTURES = new ResourceLocation(CrimsonRevelations.MODID, "textures/entity/overgrown_taintacle.png"); + + public RenderOvergrownTaintacle(RenderManager renderManager) { + super(renderManager, new ModelTaintacle(12, false), 0.8F); + } + + @Override + protected ResourceLocation getEntityTexture(EntityOvergrownTaintacle entity) { + return TEXTURES; + } +} diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/entity/boss/EntityOvergrownTaintacle.java b/src/main/java/com/mobiusflip/crimsonrevelations/entity/boss/EntityOvergrownTaintacle.java new file mode 100644 index 0000000..054165f --- /dev/null +++ b/src/main/java/com/mobiusflip/crimsonrevelations/entity/boss/EntityOvergrownTaintacle.java @@ -0,0 +1,170 @@ +package com.mobiusflip.crimsonrevelations.entity.boss; + +import net.minecraftforge.event.ForgeEventFactory; + +import javax.annotation.Nullable; + +import com.mobiusflip.crimsonrevelations.init.LootTableHandler; + +import net.minecraft.entity.IEntityLivingData; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.BossInfo; +import net.minecraft.world.BossInfoServer; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.entities.ITaintedMob; +import thaumcraft.client.fx.FXDispatcher; +import thaumcraft.common.entities.monster.mods.ChampionModifier; +import thaumcraft.common.entities.monster.tainted.EntityTaintacle; +import thaumcraft.common.lib.SoundsTC; +import thaumcraft.common.lib.utils.EntityUtils; + +public class EntityOvergrownTaintacle extends EntityTaintacle implements ITaintedMob { + protected final BossInfoServer bossInfo; + + public EntityOvergrownTaintacle(World world) { + super(world); + this.bossInfo = new BossInfoServer(this.getDisplayName(), BossInfo.Color.PINK, BossInfo.Overlay.PROGRESS); + this.setSize(1.0F, 5.5F); + this.experienceValue = 50; + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue(8.0D); + this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(9.0D); + this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(175.0D); + this.getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(1.0D); + } + + @Override + protected void updateAITasks() { + super.updateAITasks(); + this.bossInfo.setPercent(this.getHealth() / this.getMaxHealth()); + } + + @Override + public void removeTrackingPlayer(final EntityPlayerMP player) { + super.removeTrackingPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void addTrackingPlayer(final EntityPlayerMP player) { + super.addTrackingPlayer(player); + this.bossInfo.addPlayer(player); + } + + // Fixes it spawning with lower health + protected void makeChampion() { + if (getEntityAttribute(ThaumcraftApiHelper.CHAMPION_MOD).getAttributeValue() > -2.0) return; + + int type = rand.nextInt(ChampionModifier.mods.length); + IAttributeInstance mod = getEntityAttribute(ThaumcraftApiHelper.CHAMPION_MOD); + mod.removeModifier(ChampionModifier.mods[type].attributeMod); + mod.applyModifier(ChampionModifier.mods[type].attributeMod); + + IAttributeInstance health = getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH); + health.removeModifier(EntityUtils.CHAMPION_HEALTH); + health.applyModifier(EntityUtils.CHAMPION_HEALTH); + + IAttributeInstance attackDamage = getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE); + attackDamage.removeModifier(EntityUtils.CHAMPION_DAMAGE); + attackDamage.applyModifier(EntityUtils.CHAMPION_DAMAGE); + + setHealth(getMaxHealth()); + setCustomNameTag(ChampionModifier.mods[type].getModNameLocalized() + " " + getName()); + enablePersistence(); + switch (type) { + // Bold + case 0: { + IAttributeInstance movementSpeed = getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED); + movementSpeed.removeModifier(EntityUtils.BOLDBUFF); + movementSpeed.applyModifier(EntityUtils.BOLDBUFF); + break; + } + + // Mighty + case 3: { + attackDamage.removeModifier(EntityUtils.MIGHTYBUFF); + attackDamage.applyModifier(EntityUtils.MIGHTYBUFF); + break; + } + + // Warded + case 5: { + int warding = (int) (getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).getBaseValue() / 2.0); + setAbsorptionAmount(getAbsorptionAmount() + warding); + break; + } + + default: + break; + } + } + + @Override + public boolean canBreatheUnderwater() { + return true; + } + + @Override + public boolean canBePushed() { + return false; + } + + @Override + protected int decreaseAirSupply(int air) { + return air; + } + + @Override + public void setInWeb() { + } + + @Override + public IEntityLivingData onInitialSpawn(DifficultyInstance diff, @Nullable IEntityLivingData data) { + this.makeChampion(); + this.bossInfo.setName(this.getDisplayName()); + return super.onInitialSpawn(diff, data); + } + + public boolean isNonBoss() { + return false; + } + + // Special taint death animation + @Override + protected void onDeathUpdate() { + if (!this.world.isRemote && (this.isPlayer() || this.recentlyHit > 0 && this.canDropLoot() && this.world.getGameRules().getBoolean("doMobLoot"))) { + int i = this.getExperiencePoints(this.attackingPlayer); + i = ForgeEventFactory.getExperienceDrop(this, this.attackingPlayer, i); + + while (i > 0) { + int j = EntityXPOrb.getXPSplit(i); + i -= j; + this.world.spawnEntity(new EntityXPOrb(this.world, this.posX, this.posY, this.posZ, j)); + } + } + + this.setDead(); + this.playSound(SoundsTC.gore, 1.0F, 0.65F / (rand.nextFloat() * 0.4F + 0.8F)); + + for (int k = 0; k < 40; ++k) { + FXDispatcher.INSTANCE.splooshFX(this); + FXDispatcher.INSTANCE.taintsplosionFX(this); + } + } + + @Override + @Nullable + protected ResourceLocation getLootTable() { + return LootTableHandler.OVERGROWN_TAINTACLE; + } +} diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/init/LootTableHandler.java b/src/main/java/com/mobiusflip/crimsonrevelations/init/LootTableHandler.java index 5417431..c6f3e28 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/init/LootTableHandler.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/init/LootTableHandler.java @@ -13,7 +13,10 @@ @EventBusSubscriber(modid = CrimsonRevelations.MODID) public class LootTableHandler { public static final ResourceLocation CULTIST = new ResourceLocation(CrimsonRevelations.MODID, ("entities/cultist")); - + + // Bosses + public static final ResourceLocation OVERGROWN_TAINTACLE = new ResourceLocation(CrimsonRevelations.MODID, ("entities/boss/overgrown_taintacle")); + @SubscribeEvent(priority = EventPriority.LOWEST) public static void onLootTableLoad(LootTableLoadEvent event) { if (event.getName().equals(new ResourceLocation(Thaumcraft.MODID, "cultist"))) { diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/init/RecipeHandler.java b/src/main/java/com/mobiusflip/crimsonrevelations/init/RecipeHandler.java index e65929f..6b3556e 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/init/RecipeHandler.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/init/RecipeHandler.java @@ -16,7 +16,7 @@ public class RecipeHandler { public static void initArcaneCrafting() { - // defaultGroup is meant for recipe books and is not really needed here. + // defaultGroup is meant for recipe books and is not really needed here. ResourceLocation defaultGroup = new ResourceLocation(""); ThaumcraftApi.addArcaneCraftingRecipe(new ResourceLocation("crimsonrevelations", "crimsonbanner"), new ShapedArcaneRecipe( @@ -144,7 +144,7 @@ public static void initCrucible() { ThaumcraftApi.addCrucibleRecipe(new ResourceLocation("crimsonrevelations", "orderquartz"), new CrucibleRecipe("ORDERED_DECONSTRUCTION", new ItemStack(Items.QUARTZ, 4, 0), "blockQuartz", new AspectList().add(Aspect.ORDER, 25))); - + ThaumcraftApi.addCrucibleRecipe(new ResourceLocation("crimsonrevelations", "ordersandstone"), new CrucibleRecipe("ORDERED_DECONSTRUCTION", new ItemStack(Blocks.SAND, 4, 0), "sandstone", new AspectList().add(Aspect.ORDER, 25))); diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/init/RegistryHandler.java b/src/main/java/com/mobiusflip/crimsonrevelations/init/RegistryHandler.java index 47cbd3c..e7965e5 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/init/RegistryHandler.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/init/RegistryHandler.java @@ -4,11 +4,13 @@ import com.google.common.base.Preconditions; import com.mobiusflip.crimsonrevelations.CrimsonRevelations; +import com.mobiusflip.crimsonrevelations.entity.boss.EntityOvergrownTaintacle; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.BlockSlab; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.crafting.IRecipe; @@ -18,12 +20,19 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.registry.EntityEntry; +import net.minecraftforge.fml.common.registry.EntityRegistry; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; +import thaumcraft.api.ThaumcraftApi; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectEventProxy; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.AspectRegistryEvent; @SuppressWarnings("deprecation") @EventBusSubscriber(modid = CrimsonRevelations.MODID) @@ -49,6 +58,28 @@ public static void registerRecipes(RegistryEvent.Register event) { RecipeHandler.initInfusion(); } + @SubscribeEvent + public static void registerEntities(RegistryEvent.Register event) { + int id = 0; + + entityRegistryHelper("overgrown_taintacle", EntityOvergrownTaintacle.class, id++, 64, 3, true, 0x1C1A2F, 0x5649B4); + } + + @SubscribeEvent + public static void registerAspects(AspectRegistryEvent event) { + ThaumcraftApi.registerEntityTag(CrimsonRevelations.MODID + ".overgrown_taintacle", new AspectList().add(Aspect.FLUX, 30).add(Aspect.ELDRITCH, 30).add(Aspect.AVERSION, 30).add(Aspect.PLANT, 30)); + } + + public static void entityRegistryHelper(String name, Class clazz, int id, int trackingRange, int updateFrequency, boolean sendVelocityUpdates, int eggColor1, int eggColor2) { + EntityRegistry.registerModEntity(new ResourceLocation(CrimsonRevelations.MODID, name), clazz, CrimsonRevelations.MODID + "." + name, id, CrimsonRevelations.instance, trackingRange, + updateFrequency, sendVelocityUpdates, eggColor1, eggColor2); + } + + public static void egglessEntityRegistryHelper(String name, Class clazz, int id, int trackingRange, int updateFrequency, boolean sendVelocityUpdates) { + EntityRegistry.registerModEntity(new ResourceLocation(CrimsonRevelations.MODID, name), clazz, CrimsonRevelations.MODID + "." + name, id, CrimsonRevelations.instance, trackingRange, + updateFrequency, sendVelocityUpdates); + } + @SubscribeEvent public static void registerItemBlocks(RegistryEvent.Register event) { final IForgeRegistry registry = event.getRegistry(); diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/init/RenderingHandler.java b/src/main/java/com/mobiusflip/crimsonrevelations/init/RenderingHandler.java new file mode 100644 index 0000000..c33c5e0 --- /dev/null +++ b/src/main/java/com/mobiusflip/crimsonrevelations/init/RenderingHandler.java @@ -0,0 +1,15 @@ +package com.mobiusflip.crimsonrevelations.init; + +import com.mobiusflip.crimsonrevelations.client.renderer.RenderOvergrownTaintacle; +import com.mobiusflip.crimsonrevelations.entity.boss.EntityOvergrownTaintacle; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderingHandler { + public static void preInit() { + RenderingRegistry.registerEntityRenderingHandler(EntityOvergrownTaintacle.class, RenderOvergrownTaintacle::new); + } +} diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/init/ResearchHandler.java b/src/main/java/com/mobiusflip/crimsonrevelations/init/ResearchHandler.java index 1b51841..4096764 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/init/ResearchHandler.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/init/ResearchHandler.java @@ -1,21 +1,34 @@ package com.mobiusflip.crimsonrevelations.init; import com.mobiusflip.crimsonrevelations.CrimsonRevelations; +import com.mobiusflip.crimsonrevelations.entity.boss.EntityOvergrownTaintacle; import com.mobiusflip.crimsonrevelations.item.foci.FocusEffectPoison; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.Loader; import thaumcraft.Thaumcraft; import thaumcraft.api.ThaumcraftApi; import thaumcraft.api.aspects.AspectList; import thaumcraft.api.casters.FocusEngine; import thaumcraft.api.research.ResearchCategories; +import thaumcraft.api.research.ScanEntity; +import thaumcraft.api.research.ScanningManager; public class ResearchHandler { public static void init() { + // Focus Effects + FocusEngine.registerElement(FocusEffectPoison.class, new ResourceLocation(CrimsonRevelations.MODID, "textures/foci/poison.png"), 9039872); + + // Research Categories ResearchCategories.registerCategory("REVELATIONS", "CrimsonRites", new AspectList(), new ResourceLocation(Thaumcraft.MODID, "textures/items/crimson_rites.png"), new ResourceLocation(CrimsonRevelations.MODID, "textures/gui/research_background.jpg"), new ResourceLocation(Thaumcraft.MODID, "textures/gui/gui_research_back_over.png")); + + // Researches ThaumcraftApi.registerResearchLocation(new ResourceLocation(CrimsonRevelations.MODID, "research/revelations")); - - // Focus Effects - FocusEngine.registerElement(FocusEffectPoison.class, new ResourceLocation(CrimsonRevelations.MODID, "textures/foci/poison.png"), 9039872); + if (Loader.isModLoaded("thaumicaugmentation")) + ThaumcraftApi.registerResearchLocation(new ResourceLocation(CrimsonRevelations.MODID, "research/compat/thaumic_augmentation")); + + // Scanning + if (Loader.isModLoaded("thaumicaugmentation")) + ScanningManager.addScannableThing(new ScanEntity("!OVERGROWN_TAINTACLE", EntityOvergrownTaintacle.class, true)); } } diff --git a/src/main/java/com/mobiusflip/crimsonrevelations/item/foci/FocusEffectPoison.java b/src/main/java/com/mobiusflip/crimsonrevelations/item/foci/FocusEffectPoison.java index 775966b..eca761d 100644 --- a/src/main/java/com/mobiusflip/crimsonrevelations/item/foci/FocusEffectPoison.java +++ b/src/main/java/com/mobiusflip/crimsonrevelations/item/foci/FocusEffectPoison.java @@ -88,8 +88,8 @@ public void renderParticleFX(World world, double posX, double posY, double posZ, pp.setGravity(-0.2F); pp.setMaxAge(7 + world.rand.nextInt(5)); pp.setAlphaF(0.7F); - pp.setSlowDown(0.75); - pp.setScale(new float[]{(float)(0.1F + world.rand.nextGaussian() * 0.2F), 2.0F}); + pp.setSlowDown(0.75D); + pp.setScale(new float[]{(float) (0.1F + world.rand.nextGaussian() * 0.2F), 2.0F}); pp.setParticles(575, 8, 8); pp.setRBGColorF(((color >> 16) & 0xFF) / 255.0F, ((color >> 8) & 0xFF) / 255.0F, (color & 0xFF) / 255.0F); ParticleEngine.addEffect(world, pp); diff --git a/src/main/resources/assets/crimsonrevelations/lang/en_us.lang b/src/main/resources/assets/crimsonrevelations/lang/en_us.lang index 352d198..7f6b0e1 100644 --- a/src/main/resources/assets/crimsonrevelations/lang/en_us.lang +++ b/src/main/resources/assets/crimsonrevelations/lang/en_us.lang @@ -1,5 +1,7 @@ itemGroup.CrimsonRevelationsTab=New Crimson Revelations +entity.crimsonrevelations.overgrown_taintacle.name=Overgrown Taintacle + item.crimsonrevelations.crimson_fabric.name=Crimson Fabric item.crimsonrevelations.crimson_plate.name=Crimson Plate @@ -41,6 +43,9 @@ crimsonrevelations.research.QUARTZ_PURIFICATION.text.stage.2=The key insight pro crimsonrevelations.research.FOCUS_POISON.title=Focus Effect: Poison crimsonrevelations.research.FOCUS_POISON.stage.0=The poison inflicted from this blast of noxious goo lasts twice as long when compared to other effects.
I must be wary however that a fair amount of monsters are resistant to being poisoned, such as the undead, spiders, and other rather fearsome opponents. +crimsonrevelations.research.OVERGROWN_TAINTACLE.title=Overgrown Taintacle +crimsonrevelations.research.OVERGROWN_TAINTACLE.stage.0=During one of my treks in the Emptiness, I have discovered a significantly stronger and more aggressive Taintacle variant. It seems to have a symbiotic relationship with the environment, which would explain the main source of its power.
Hunting these larger Taintacles would be ideal, I should be able to harvest whatever congealed energy it leaves off for my own purposes. + focus.crimsonrevelations.poison.name=Poison focus.crimsonrevelations.poison.text=Summons a blob of goo at your target and poisons it for double the usual duration. diff --git a/src/main/resources/assets/crimsonrevelations/loot_tables/entities/boss/overgrown_taintacle.json b/src/main/resources/assets/crimsonrevelations/loot_tables/entities/boss/overgrown_taintacle.json new file mode 100644 index 0000000..1693577 --- /dev/null +++ b/src/main/resources/assets/crimsonrevelations/loot_tables/entities/boss/overgrown_taintacle.json @@ -0,0 +1,83 @@ +{ + "pools": [ + { + "name": "loot_bag", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "thaumcraft:loot_bag", + "weight": 1, + "functions": [ + { + "function": "set_data", + "data": 1 + } + ] + } + ] + }, + { + "name": "primordial_pearl", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "thaumcraft:primordial_pearl", + "entryName": "pearl_very_damaged", + "weight": 5, + "functions": [ + { + "function": "minecraft:set_damage", + "damage": 0.125 + } + ] + }, + { + "type": "item", + "name": "thaumcraft:primordial_pearl", + "entryName": "pearl_damaged", + "weight": 1, + "functions": [ + { + "function": "minecraft:set_damage", + "damage": 0.25 + } + ] + } + ] + }, + { + "name": "void_seed", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "thaumcraft:void_seed", + "weight": 1, + "conditions": [ + { + "condition": "killed_by_player" + } + ], + "functions": [ + { + "function": "set_count", + "count": { + "min": 1, + "max": 4 + } + }, + { + "function": "looting_enchant", + "count": { + "min": 0, + "max": 2 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/crimsonrevelations/research/compat/thaumic_augmentation.json b/src/main/resources/assets/crimsonrevelations/research/compat/thaumic_augmentation.json new file mode 100644 index 0000000..9e3c7cb --- /dev/null +++ b/src/main/resources/assets/crimsonrevelations/research/compat/thaumic_augmentation.json @@ -0,0 +1,29 @@ +{ + "entries": [ + { + "key": "!OVERGROWN_TAINTACLE", + "name": "crimsonrevelations.research.OVERGROWN_TAINTACLE.title", + "icons": [ + "crimsonrevelations:textures/research/r_overgrown_taintacle.png" + ], + "category": "REVELATIONS", + "parents": [], + "siblings": [], + "meta": [ + "HEX", + "HIDDEN" + ], + "location": [ + -1, + -1 + ], + "reward_item": [], + "reward_knowledge": [], + "stages": [ + { + "text": "crimsonrevelations.research.OVERGROWN_TAINTACLE.stage.0" + } + ] + } + ] +} diff --git a/src/main/resources/assets/crimsonrevelations/research/revelations.json b/src/main/resources/assets/crimsonrevelations/research/revelations.json index b417b93..6d920a1 100644 --- a/src/main/resources/assets/crimsonrevelations/research/revelations.json +++ b/src/main/resources/assets/crimsonrevelations/research/revelations.json @@ -367,10 +367,14 @@ "CRIMSON_REVELATIONS", "FOCUSELEMENTAL" ], + "siblings": [], + "meta": [], "location": [ 0, -2 ], + "reward_item": [], + "reward_knowledge": [], "stages": [ { "text": "crimsonrevelations.research.FOCUS_POISON.stage.0", diff --git a/src/main/resources/assets/crimsonrevelations/textures/entity/overgrown_taintacle.png b/src/main/resources/assets/crimsonrevelations/textures/entity/overgrown_taintacle.png new file mode 100644 index 0000000000000000000000000000000000000000..b573d35cfe3ac3dd353468ad9095dd11ad961bf9 GIT binary patch literal 12503 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

92wR E2jGVosQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crimsonrevelations/textures/research/r_overgrown_taintacle.png b/src/main/resources/assets/crimsonrevelations/textures/research/r_overgrown_taintacle.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eede09b6043a455ada22021c07856e9fc79f92 GIT binary patch literal 572 zcmV-C0>k}@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGyzyJUqzyT31wzmKP0ntfBK~y+Tg_Fxm z0#OvkkB>^nCyd(riIhY9&$vCa~4&AJIGva=Yn+?pAESi}?x&fxi5`@wb@F zw?{xaU%Qrqb;&rZ32@?Qm;qy>fMqX$#mCsW)W)AMRmL8<1Dw;HB{DfXky<^AN5{ps zZ7G`%QZ)-}h~I-IP;wiv!Lfo=Q{`qPX1C!rD3$UR|P7hdm49sa^T}XH=A&tg6lXnom10TSXOt}q`@yO(9 zz40b?yD1eTFP8nyXY5`X3?x&YQy3Z1u;-Qpd;y6@GGf+W_7LWt=`@f`IRpz zSz;1Qfms-xU{tcKPu#@fGNySj)PUmJxz5gKtO3dZZ@~3Ai~Im=Adx+R%kF{z0000< KMNUMnLSTaFI{+yF literal 0 HcmV?d00001