Added config option to use enderpearls in crafting recipes and disable stable fabric when doing so.

This commit is contained in:
Waterpicker 2018-05-22 04:35:54 -05:00
parent bd805a4965
commit e63ae52823
6 changed files with 221 additions and 17 deletions

View file

@ -50,6 +50,10 @@ public final class ModConfig {
@Name("depthSpreadFactor")
@LangKey("dimdoors.general.depthSpreadFactor")
public int depthSpreadFactor = 20;
@Name("useEnderPearlsInCrafting")
@LangKey("dimdoors.general.useEnderPearlsInCrafting")
public boolean useEnderPearlsInCrafting = false;
}
public static class Pockets {

View file

@ -3,6 +3,7 @@ package org.dimdev.dimdoors.shared;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.*;
import net.minecraft.util.NonNullList;
@ -57,60 +58,62 @@ public final class ModRecipes {
@SubscribeEvent
public static void registerRecipes(RegistryEvent.Register<IRecipe> event) {
Item usedItem = ModConfig.general.useEnderPearlsInCrafting ? Items.ENDER_PEARL : ModItems.STABLE_FABRIC;
IForgeRegistry<IRecipe> registry = event.getRegistry();
registry.register(makeShapedRecipe(new ItemStack(ModItems.STABLE_FABRIC),
"yxy", 'x', Items.ENDER_PEARL, 'y', ModItems.WORLD_THREAD));
if(!ModConfig.general.useEnderPearlsInCrafting) {
registry.register(makeShapedRecipe(new ItemStack(ModItems.STABLE_FABRIC),
"yxy", 'x', Items.ENDER_PEARL, 'y', ModItems.WORLD_THREAD));
}
registry.register(makeShapedRecipe(new ItemStack(ModItems.IRON_DIMENSIONAL_DOOR),
"yxy", 'x', ModItems.STABLE_FABRIC, 'y', Items.IRON_DOOR));
"yxy", 'x',usedItem, 'y', Items.IRON_DOOR));
registry.register(makeShapedRecipe(new ItemStack(ModItems.UNSTABLE_DIMENSIONAL_DOOR),
"xyx", 'x', Items.ENDER_EYE, 'y', Items.IRON_DOOR));
registry.register(makeShapedRecipe(new ItemStack(ModItems.WOOD_DIMENSIONAL_DOOR),
"yxy", 'x', Items.ENDER_PEARL, 'y', Items.OAK_DOOR));
"yxy", 'x', usedItem, 'y', Items.OAK_DOOR));
registry.register(makeShapedRecipe(new ItemStack(ModBlocks.WOOD_DIMENSIONAL_TRAPDOOR),
"yx", 'x', Items.ENDER_PEARL, 'y', Blocks.TRAPDOOR));
"yx", 'x', usedItem, 'y', Blocks.TRAPDOOR));
registry.register(makeShapedRecipe(new ItemStack(ModItems.GOLD_DIMENSIONAL_DOOR),
"yxy", 'x', ModItems.STABLE_FABRIC, 'y', ModItems.GOLD_DOOR));
"yxy", 'x', usedItem, 'y', ModItems.GOLD_DOOR));
registry.register(makeShapedRecipe(new ItemStack(ModItems.GOLD_DOOR),
"yy", "yy", "yy", 'y', Items.GOLD_INGOT));
registry.register(makeShapedRecipe(new ItemStack(ModItems.QUARTZ_DIMENSIONAL_DOOR),
"yx", 'x', ModItems.STABLE_FABRIC, 'y', ModItems.QUARTZ_DOOR));
"yx", 'x', usedItem, 'y', ModItems.QUARTZ_DOOR));
registry.register(makeShapedRecipe(new ItemStack(ModItems.QUARTZ_DOOR), "yy", "yy", "yy", 'y', Items.QUARTZ));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_BLADE),
"y", "y", "x", 'y', ModItems.STABLE_FABRIC, 'x', Items.IRON_SWORD));
"y", "y", "x", 'y', usedItem, 'x', Items.IRON_SWORD));
//should not be craftable
/*registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_CONFIGURATION_TOOL),
" w ", "xyx", "xzx", 'z', Items.DIAMOND_SHOVEL, 'y', ModItems.STABLE_FABRIC, 'x', ModItems.WORLD_THREAD, 'w', Items.DIAMOND));*/
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_REMOVER),
"xxx", "xyx", "xxx", 'x', Items.GOLD_INGOT, 'y', Items.ENDER_PEARL));
"xxx", "xyx", "xxx", 'x', Items.GOLD_INGOT, 'y', usedItem));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_REMOVER),
"x x", " y ", "x x", 'x', Items.GOLD_INGOT, 'y', ModItems.STABLE_FABRIC));
"x x", " y ", "x x", 'x', Items.GOLD_INGOT, 'y', usedItem));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_SIGNATURE),
"xxx", "xyx", "xxx", 'x', Items.IRON_INGOT, 'y', Items.ENDER_PEARL));
"xxx", "xyx", "xxx", 'x', Items.IRON_INGOT, 'y', usedItem));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_SIGNATURE),
"x x", " y ", "x x", 'x', Items.IRON_INGOT, 'y', ModItems.STABLE_FABRIC));
"x x", " y ", "x x", 'x', Items.IRON_INGOT, 'y', usedItem));
registry.register(makeShapedRecipe(new ItemStack(ModItems.STABILIZED_RIFT_SIGNATURE),
"x x", " y ", "x x", 'x', ModItems.STABLE_FABRIC, 'y', ModItems.RIFT_SIGNATURE));
"x x", " y ", "x x", 'x', usedItem, 'y', ModItems.RIFT_SIGNATURE));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_STABILIZER),
"xxx", "xyx", "xxx", 'x', Items.DIAMOND, 'y', Items.ENDER_PEARL));
registry.register(makeShapedRecipe(new ItemStack(ModItems.RIFT_STABILIZER),
"x x", " y ", "x x", 'x', Items.DIAMOND, 'y', ModItems.STABLE_FABRIC));
"x x", " y ", "x x", 'x', Items.DIAMOND, 'y', usedItem));
registry.register(makeShapedRecipe(new ItemStack(ModItems.WOVEN_WORLD_THREAD_HELMET),
"xxx", "x x", 'x', ModItems.WORLD_THREAD));

View file

@ -0,0 +1,4 @@
package org.dimdev.dimdoors.shared.world.fortresses;
public class ComponentNetherGateway {
}

View file

@ -0,0 +1,25 @@
package org.dimdev.dimdoors.shared.world.fortresses;
import net.minecraft.world.gen.structure.MapGenNetherBridge;
import net.minecraft.world.gen.structure.MapGenStructureIO;
import net.minecraft.world.gen.structure.StructureStart;
public class DDNetherFortressGenerator extends MapGenNetherBridge
{
public DDNetherFortressGenerator()
{
super();
// Register our custom StructureStart class with MapGenStructureIO
// If we don't do this, Minecraft will crash when a fortress tries to generate.
// Moreover, use Fortress as our structure identifier so that if DD is removed,
// fortresses will generate properly using Vanilla code.
//MapGenStructureIO.registerStructureComponent(DDStructureNetherBridgeStart.class, "Fortress");
}
@Override
protected StructureStart getStructureStart(int chunkX, int chunkZ)
{
return new DDStructureNetherBridgeStart(this.world, this.rand, chunkX, chunkZ);
}
}

View file

@ -0,0 +1,144 @@
package org.dimdev.dimdoors.shared.world.fortresses;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
import net.minecraft.world.gen.structure.StructureComponent;
import net.minecraft.world.gen.structure.StructureNetherBridgePieces;
import net.minecraft.world.gen.structure.StructureStart;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
public class DDStructureNetherBridgeStart extends StructureStart
{
public static final int MAX_GATEWAY_GENERATION_CHANCE = 100;
private boolean hasGateway;
private int minX;
private int minY;
private int minZ;
public DDStructureNetherBridgeStart() { }
public DDStructureNetherBridgeStart(World world, Random random, int chunkX, int chunkZ, DDProperties properties)
{
// StructureNetherBridgeStart handles designing the fortress for us
super(chunkX, chunkZ);
Iterator componentIterator;
StructureComponent component;
StructureBoundingBox bounds;
ArrayList<StructureNetherBridgePieces.Throne> spawnerRooms;
hasGateway = false;
// Randomly decide whether to build a gateway in this fortress
if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.FortressGatewayGenerationChance)
{
// Search for all the blaze spawners in a fortress
spawnerRooms = new ArrayList<StructureNetherBridgePieces.Throne>();
componentIterator = this.components.iterator();
while (componentIterator.hasNext())
{
component = (StructureComponent) componentIterator.next();
if (component instanceof StructureNetherBridgePieces.Throne)
{
spawnerRooms.add((StructureNetherBridgePieces.Throne) component);
}
}
// If any spawner rooms were found, choose one to randomly replace
if (!spawnerRooms.isEmpty())
{
hasGateway = true;
component = spawnerRooms.get(random.nextInt(spawnerRooms.size()));
// Store enough data to identify the room when it's going to be built later
bounds = component.getBoundingBox();
minX = bounds.minX;
minY = bounds.minY;
minZ = bounds.minZ;
}
}
}
@Override
public NBTTagCompound writeStructureComponentsToNBT(int chunkX, int chunkZ) {
// We override the function for writing NBT data to add our own gateway data
NBTTagCompound fortressTag = super.writeStructureComponentsToNBT(chunkX, chunkZ);
// Add a compound tag with our data
NBTTagCompound dimensionalTag = new NBTTagCompound();
dimensionalTag.setBoolean("HasGateway", this.hasGateway);
if (hasGateway) {
dimensionalTag.setInteger("GatewayMinX", this.minX);
dimensionalTag.setInteger("GatewayMinY", this.minY);
dimensionalTag.setInteger("GatewayMinZ", this.minZ);
}
fortressTag.setTag("DimensionalDoors", dimensionalTag);
return fortressTag;
}
@Override
public void func_143020_a(World world, NBTTagCompound fortressTag)
{
// We override the function for reading NBT data to load gateway data
super.func_143020_a(world, fortressTag);
NBTTagCompound dimensionalTag = fortressTag.getCompoundTag("DimensionalDoors");
if (dimensionalTag != null)
{
this.hasGateway = dimensionalTag.getBoolean("HasGateway");
if (hasGateway)
{
minX = dimensionalTag.getInteger("GatewayMinX");
minY = dimensionalTag.getInteger("GatewayMinY");
minZ = dimensionalTag.getInteger("GatewayMinZ");
}
}
}
/**
* Keeps iterating Structure Pieces and spawning them until the checks tell it to stop
*/
@Override
public void generateStructure(World world, Random random, StructureBoundingBox generationBounds)
{
if (hasGateway)
{
// Use a modified version of Vanilla's fortress generation code
// Try to detect the room that we intend to replace with our gateway
Iterator iterator = this.components.iterator();
while (iterator.hasNext())
{
StructureComponent component = (StructureComponent)iterator.next();
StructureBoundingBox bounds = component.getBoundingBox();
if (bounds.intersectsWith(generationBounds))
{
// Check if this is our replacement target
// Checking the location is enough because structures aren't allowed to have
// intersecting bounding boxes - nothing else can have these min coordinates.
if (bounds.minX == this.minX && bounds.minY == this.minY && bounds.minZ == this.minZ)
{
component = ComponentNetherGateway.createFromComponent(component, random);
}
// Now for the last bit of Vanilla's generation code
if (!component.addComponentParts(world, random, generationBounds))
{
iterator.remove();
}
}
}
}
else
{
// Just run the usual structure generation
super.generateStructure(world, random, generationBounds);
}
}
}

View file

@ -0,0 +1,24 @@
{
"display": {
"icon": {
"item": "dimdoors:unravelled_fabric"
},
"title": {
"translate": "Space between Spaces"
},
"description": {
"translate": "advancements.end.root.description"
},
"background": "minecraft:textures/gui/advancements/backgrounds/end.png",
"show_toast": true,
"announce_to_chat": true
},
"criteria": {
"entered_end": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"to": "private_pockets"
}
}
}
}