Merge branch 'PotionRegistry2' of https://github.com/bonii-xx/MinecraftForge into bonii-xx-PotionRegistry2

This commit is contained in:
cpw committed 2015-11-29 22:43:23 -05:00
commit 0af45cbf25
6 files changed
+176 -1

No files matched your search

@@ -19,6 +19,7 @@ import com.google.common.collect.Maps;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.Item;
import net.minecraft.potion.Potion;
import net.minecraft.util.ObjectIntIdentityMap;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.FMLLog;
@@ -31,6 +32,8 @@ public class GameData
static final int MAX_BLOCK_ID = 4095;
static final int MIN_ITEM_ID = 4096;
static final int MAX_ITEM_ID = 31999;
public static final int MIN_POTION_ID = 32; // 0-31 are vanilla, forge start at 32
public static final int MAX_POTION_ID = 255; // S1DPacketEntityEffect sends bytes, we can only use 255
private static final GameData mainData = new GameData();
// public api
@@ -55,6 +58,16 @@ public class GameData
return getMain().iItemRegistry;
}
/**
* Get the currently active potion registry.
*
* @return Potion Registry.
*/
public static FMLControlledNamespacedRegistry<Potion> getPotionRegistry() {
return getMain().iPotionRegistry;
}
/***************************************************
* INTERNAL CODE FROM HERE ON DO NOT USE!
***************************************************/
@@ -98,6 +111,7 @@ public class GameData
// internal registry objects
private final FMLControlledNamespacedRegistry<Block> iBlockRegistry = PersistentRegistryManager.createRegistry(PersistentRegistryManager.BLOCKS, Block.class, new ResourceLocation("minecraft:air"), MAX_BLOCK_ID, MIN_BLOCK_ID, true, BlockStateCapture.INSTANCE);
private final FMLControlledNamespacedRegistry<Item> iItemRegistry = PersistentRegistryManager.createRegistry(PersistentRegistryManager.ITEMS, Item.class, null, MAX_ITEM_ID, MIN_ITEM_ID, true);
private final FMLControlledNamespacedRegistry<Potion> iPotionRegistry = PersistentRegistryManager.createRegistry(PersistentRegistryManager.POTIONS, Potion.class, null, MAX_POTION_ID, MIN_POTION_ID, false, PotionArrayCapture.INSTANCE);
int registerItem(Item item, String name) // from GameRegistry
{
@@ -133,6 +147,13 @@ public class GameData
return iBlockRegistry.add(idHint, name, block);
}
/**
* Called from GameRegistry, which is called from Potion-Constructor
*/
int registerPotion(Potion potion, ResourceLocation name, int id) {
return iPotionRegistry.add(id, name, potion);
}
/**
* Prefix the supplied name with the current mod id.
* <p/>
@@ -228,4 +249,16 @@ public class GameData
}
}
}
private static class PotionArrayCapture implements FMLControlledNamespacedRegistry.AddCallback<Potion>
{
static final PotionArrayCapture INSTANCE = new PotionArrayCapture();
@Override
public void onAdd(Potion potion, int id) {
// fix the data in the potion and the potions-array
potion.id = id;
Potion.potionTypes[id] = potion;
}
}
}
@@ -47,6 +47,7 @@ import net.minecraft.nbt.JsonToNBT;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTException;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
@@ -235,6 +236,11 @@ public class GameRegistry
}
}
/** Called from Potion Constructor */
public static int registerPotion(Potion potion, ResourceLocation name, int potionID) {
return GameData.getMain().registerPotion(potion, name, potionID);
}
public static void addRecipe(ItemStack output, Object... params)
{
addShapedRecipe(output, params);
@@ -1,6 +1,7 @@
package net.minecraftforge.fml.common.registry;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -20,6 +21,7 @@ import com.google.common.collect.Sets.SetView;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.potion.Potion;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.FMLLog;
@@ -122,6 +124,7 @@ public class PersistentRegistryManager
public static final ResourceLocation BLOCKS = new ResourceLocation("minecraft:blocks");
public static final ResourceLocation ITEMS = new ResourceLocation("minecraft:items");
public static final ResourceLocation POTIONS = new ResourceLocation("minecraft:potions");
public static <T> FMLControlledNamespacedRegistry<T> createRegistry(ResourceLocation registryName, Class<T> registryType, ResourceLocation optionalDefaultKey, int maxId, int minId, boolean hasDelegates, FMLControlledNamespacedRegistry.AddCallback<T> addCallback)
{
@@ -145,6 +148,8 @@ public class PersistentRegistryManager
// Empty the blockstate map before loading
GameData.getBlockStateIDMap().clear();
// Clean up potion array before reloading it from the snapshot
Arrays.fill(Potion.potionTypes, null);
// Load the snapshot into the "STAGING" registry
for (Map.Entry<ResourceLocation, GameDataSnapshot.Entry> snapshotEntry : snapshot.entries.entrySet())
+2
View File
@@ -25,6 +25,8 @@ public net.minecraft.block.BlockFire func_176534_d(Lnet/minecraft/block/Block;)I
public net.minecraft.item.Item func_77656_e(I)Lnet.minecraft.item.Item; #setMaxDamage
public net.minecraft.item.Item func_77627_a(Z)Lnet.minecraft.item.Item; #setHasSubtypes
public net.minecraft.item.Item func_77631_c(Ljava.lang.String;)Lnet.minecraft.item.Item; #setPotionEffect
# Potion
public-f net.minecraft.potion.Potion field_76415_H #id
# EntityPlayer
public net.minecraft.entity.player.EntityPlayer func_71012_a(Lnet/minecraft/entity/item/EntityItem;)V #joinEntityItemWithWorld
public net.minecraft.client.entity.EntityPlayerSP func_71012_a(Lnet/minecraft/entity/item/EntityItem;)V #joinEntityItemWithWorld
@@ -0,0 +1,88 @@
package net.minecraftforge.debug;
import gnu.trove.set.TIntSet;
import gnu.trove.set.hash.TIntHashSet;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import java.util.Random;
@Mod(modid=PotionRegistryDebug.MODID)
public class PotionRegistryDebug {
public static final String MODID = "ForgePotionRegistry";
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
new PotionForge(new ResourceLocation("forge", "forge"), false, 0xff00ff); // test automatic id distribution
new PotionForge(200, new ResourceLocation("forge", "forgy"), true, 0x00ff00); // test that ids above 127 work
Random rand = new Random();
TIntSet taken = new TIntHashSet(100);
int ra = rand.nextInt(100) + 100;
taken.add(ra);
// a new potion with a random id so that forge has to remap it
new PotionForge(ra, new ResourceLocation("forge", "realRandomPotion"), false, 0x0000ff);
for(int i = 0; i < 20; i++) {
int r = rand.nextInt(200) + 35;
while(taken.contains(r))
r = rand.nextInt(200) + 35;
//r = 32+i;
taken.add(r);
// this potions will most likely not have the same IDs between server and client.
// The forge handshake on connect should fix this.
new PotionForge(r, new ResourceLocation("forge", "randomPotion" + r), false, 0xff00ff);
}
}
protected class PotionForge extends Potion {
public PotionForge(int potionID, ResourceLocation location, boolean badEffect, int potionColor) {
super(potionID, location, badEffect, potionColor);
setPotionName("potion." + location.getResourcePath());
}
protected PotionForge(ResourceLocation location, boolean badEffect, int potionColor) {
super(location, badEffect, potionColor);
setPotionName("potion." + location.getResourcePath());
}
@Override
public void renderInventoryEffect(int x, int y, PotionEffect effect, Minecraft mc) {
Potion potion = Potion.potionTypes[effect.getPotionID()];
mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite("minecraft:blocks/fire_layer_0");
x += 6;
y += 7;
int width = 18;
int height = width;
/*
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
worldrenderer.startDrawingQuads();
worldrenderer.setColorOpaque_I(potion.getLiquidColor());
worldrenderer.addVertexWithUV((double) x, (double) (y + height), 0.0D, sprite.getMinU(), sprite.getMaxV());
worldrenderer.addVertexWithUV((double)(x + width), (double)(y + height), 0.0D, sprite.getMaxU(), sprite.getMaxV());
worldrenderer.addVertexWithUV((double)(x + width), (double)y, 0.0D, sprite.getMaxU(), sprite.getMinV());
worldrenderer.addVertexWithUV((double)x, (double)y, 0.0D, sprite.getMinU(), sprite.getMinV());
tessellator.draw();*/
}
}
}