From 56e7270deee147719062ebcc9dfd220e9bd75edc Mon Sep 17 00:00:00 2001 From: Christian Weeks Date: Mon, 7 May 2012 01:26:21 -0400 Subject: [PATCH] Separate sprite handling, fix worldtype --- .../cpw/mods/fml/client/SpriteHelper.java | 111 ++++++++++++++++ fml/client/net/minecraft/src/ModLoader.java | 118 +++--------------- .../net/minecraft/src/WorldType.java.patch | 53 +++++++- .../net/minecraft/src/WorldType.java.patch | 12 +- 4 files changed, 184 insertions(+), 110 deletions(-) create mode 100644 fml/client/cpw/mods/fml/client/SpriteHelper.java diff --git a/fml/client/cpw/mods/fml/client/SpriteHelper.java b/fml/client/cpw/mods/fml/client/SpriteHelper.java new file mode 100644 index 000000000..423d98ca1 --- /dev/null +++ b/fml/client/cpw/mods/fml/client/SpriteHelper.java @@ -0,0 +1,111 @@ +/* + * The FML Forge Mod Loader suite. + * Copyright (C) 2012 cpw + * + * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package cpw.mods.fml.client; + +import java.util.BitSet; +import java.util.HashMap; + +import net.minecraft.src.ModLoader; +import cpw.mods.fml.common.Loader; + +/** + * @author cpw + * + */ +public class SpriteHelper +{ + private static HashMap spriteInfo = new HashMap(); + + public static int getUniqueSpriteIndex(String path) + { + BitSet slots = spriteInfo.get(path); + if (slots == null) + { + if (path.equals("/terrain.png")) + { + slots = SpriteHelper.toBitSet( + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000011111100" + + "0000000011111111" + + "0000000011111000" + + "0000000111111100" + + "0000000111111000" + + "0000000000000000"); + spriteInfo.put("/terrain.png", slots); + } + else if (path.equals("/gui/items.png")) + { + slots = SpriteHelper.toBitSet( + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000000000000000" + + "0000001000000000" + + "0000001110000000" + + "0000001000000000" + + "1111111010000000" + + "1111111010100000" + + "1111111111111100" + + "1111111111111111" + + "1111111111111111" + + "1111111111111111" + + "0000000000000000"); + spriteInfo.put("/gui/items.png", slots); + } + else + { + Exception ex = new Exception(String.format("Invalid getUniqueSpriteIndex call for texture: %s", path)); + Loader.log.throwing("ModLoader", "getUniqueSpriteIndex", ex); + ModLoader.throwException(ex); + return 0; + } + } + int ret = SpriteHelper.getFreeSlot(slots); + if (ret == -1) + { + Exception ex = new Exception(String.format("No more sprite indicies left for: %s", path)); + Loader.log.throwing("ModLoader", "getUniqueSpriteIndex", ex); + ModLoader.throwException(ex); + } + return ret; + } + + public static BitSet toBitSet(String data) + { + BitSet ret = new BitSet(data.length()); + for (int x = 0; x < data.length(); x++) + { + ret.set(x, data.charAt(x) == '1'); + } + return ret; + } + + public static int getFreeSlot(BitSet slots) + { + return slots.nextSetBit(0); + } + +} diff --git a/fml/client/net/minecraft/src/ModLoader.java b/fml/client/net/minecraft/src/ModLoader.java index 59d5a63b6..ec88cc20a 100644 --- a/fml/client/net/minecraft/src/ModLoader.java +++ b/fml/client/net/minecraft/src/ModLoader.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import net.minecraft.client.Minecraft; import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.SpriteHelper; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer.TickType; @@ -39,7 +40,6 @@ public class ModLoader public String override; public int index; } - private static HashMap spriteInfo = new HashMap(); private static HashMap> overrideInfo = new HashMap>(); /** @@ -72,11 +72,11 @@ public class ModLoader return 0; } - static void addAllRenderers(Map, Render> renderers) + public static void addAllRenderers(Map, Render> renderers) { } - static void addAnimation(TextureFX anim) + public static void addAnimation(TextureFX anim) { } @@ -169,7 +169,7 @@ public class ModLoader */ public static int addOverride(String fileToOverride, String fileToAdd) { - int idx = getUniqueSpriteIndex(fileToOverride); + int idx = SpriteHelper.getUniqueSpriteIndex(fileToOverride); addOverride(fileToOverride, fileToAdd, idx); return idx; } @@ -387,7 +387,7 @@ public class ModLoader return FMLCommonHandler.instance().getFMLLogger(); } - static Minecraft getMinecraftInstance() + public static Minecraft getMinecraftInstance() { return FMLClientHandler.instance().getClient(); } @@ -453,93 +453,9 @@ public class ModLoader public static int getUniqueSpriteIndex(String path) { - boolean[] slots = spriteInfo.get(path); - if (slots == null) - { - if (path.equals("/terrain.png")) - { - slots = toBooleanArray( - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000011111100" + - "0000000011111111" + - "0000000011111000" + - "0000000111111100" + - "0000000111111000" + - "0000000000000000"); - spriteInfo.put("/terrain.png", slots); - } - else if (path.equals("/gui/items.png")) - { - slots = toBooleanArray( - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000000000000000" + - "0000001000000000" + - "0000001110000000" + - "0000001000000000" + - "1111111010000000" + - "1111111010100000" + - "1111111111111100" + - "1111111111111111" + - "1111111111111111" + - "1111111111111111" + - "0000000000000000"); - spriteInfo.put("/gui/items.png", slots); - } - else - { - Exception ex = new Exception(String.format("Invalid getUniqueSpriteIndex call for texture: %s", path)); - Loader.log.throwing("ModLoader", "getUniqueSpriteIndex", ex); - throwException(ex); - return 0; - } - } - int ret = getFreeSlot(slots); - if (ret == -1) - { - Exception ex = new Exception(String.format("No more sprite indicies left for: %s", path)); - Loader.log.throwing("ModLoader", "getUniqueSpriteIndex", ex); - throwException(ex); - return 0; - } - return ret; + return SpriteHelper.getUniqueSpriteIndex(path); } - private static boolean[] toBooleanArray(String data) - { - boolean[] ret = new boolean[data.length()]; - for (int x = 0; x < data.length(); x++) - { - ret[x] = data.charAt(x) == '1'; - } - return ret; - } - - private static int getFreeSlot(boolean[] slots) - { - for (int x = 0; x < slots.length; x++) - { - if (slots[x]) - { - slots[x] = false; - return x; - } - } - return -1; - } - /** * To properly implement packet 250 protocol you should always check your * channel is active prior to sending the packet @@ -553,7 +469,7 @@ public class ModLoader return FMLCommonHandler.instance().isChannelActive(channel, player); } - static boolean isGUIOpen(Class gui) + public static boolean isGUIOpen(Class gui) { //TODO return false; @@ -574,11 +490,11 @@ public class ModLoader * Implemented elsewhere */ @Deprecated - static void loadConfig() + public static void loadConfig() { } - static BufferedImage loadImage(RenderEngine texCache, String path) + public static BufferedImage loadImage(RenderEngine texCache, String path) { //TODO return null; @@ -590,16 +506,18 @@ public class ModLoader * @param item */ @Deprecated - static void onItemPickup(EntityPlayer player, ItemStack item) + public static void onItemPickup(EntityPlayer player, ItemStack item) + { + } + /** + * Call in from elsewhere. Unimplemented here. + */ + @Deprecated + public static void onTick(float tick, Minecraft game) { } - static void onTick(float tick, Minecraft game) - { - //TODO - } - - static void openGUI(EntityPlayer player, GuiScreen gui) + public static void openGUI(EntityPlayer player, GuiScreen gui) { //TODO } diff --git a/fml/patches/minecraft/net/minecraft/src/WorldType.java.patch b/fml/patches/minecraft/net/minecraft/src/WorldType.java.patch index 906f633dd..7694510a7 100644 --- a/fml/patches/minecraft/net/minecraft/src/WorldType.java.patch +++ b/fml/patches/minecraft/net/minecraft/src/WorldType.java.patch @@ -1,14 +1,55 @@ --- ../src-base/minecraft/net/minecraft/src/WorldType.java 0000-00-00 00:00:00.000000000 -0000 +++ ../src-work/minecraft/net/minecraft/src/WorldType.java 0000-00-00 00:00:00.000000000 -0000 -@@ -78,4 +78,11 @@ +@@ -1,5 +1,8 @@ + package net.minecraft.src; + ++import java.util.Arrays; ++import java.util.List; ++ + public class WorldType + { + public static final WorldType[] field_48637_a = new WorldType[16]; +@@ -11,6 +14,8 @@ + private boolean field_48633_g; + private boolean field_48638_h; + ++ private BiomeGenBase[] biomesForWorldType; ++ + private WorldType(int p_i1080_1_, String p_i1080_2_) + { + this(p_i1080_1_, p_i1080_2_, 0); +@@ -22,6 +27,13 @@ + this.field_48632_f = p_i1081_3_; + this.field_48633_g = true; + field_48637_a[p_i1081_1_] = this; ++ switch (p_i1081_1_) { ++ case 8: ++ biomesForWorldType = new BiomeGenBase[] {BiomeGenBase.field_4249_h, BiomeGenBase.field_4253_d, BiomeGenBase.field_35483_e, BiomeGenBase.field_4255_b, BiomeGenBase.field_35485_c, BiomeGenBase.field_4250_g}; ++ break; ++ default: ++ biomesForWorldType = new BiomeGenBase[] {BiomeGenBase.field_4249_h, BiomeGenBase.field_4253_d, BiomeGenBase.field_35483_e, BiomeGenBase.field_4255_b, BiomeGenBase.field_35485_c, BiomeGenBase.field_4250_g, BiomeGenBase.field_48416_w}; ++ } + } + + public String func_48628_a() +@@ -78,4 +90,20 @@ return null; } + -+ /** -+ * @param biome -+ */ -+ public void addNewBiome(BiomeGenBase biome) -+ { ++ public BiomeGenBase[] getBiomesForWorldType() { ++ return biomesForWorldType; ++ } ++ ++ public void addNewBiome(BiomeGenBase biome) { ++ List biomes=Arrays.asList(biomesForWorldType); ++ biomes.add(biome); ++ biomesForWorldType=biomes.toArray(new BiomeGenBase[0]); ++ } ++ ++ public void removeBiome(BiomeGenBase biome) { ++ List biomes=Arrays.asList(biomesForWorldType); ++ biomes.remove(biome); ++ biomesForWorldType=biomes.toArray(new BiomeGenBase[0]); + } } diff --git a/fml/patches/minecraft_server/net/minecraft/src/WorldType.java.patch b/fml/patches/minecraft_server/net/minecraft/src/WorldType.java.patch index a7ead3624..74153e3bf 100644 --- a/fml/patches/minecraft_server/net/minecraft/src/WorldType.java.patch +++ b/fml/patches/minecraft_server/net/minecraft/src/WorldType.java.patch @@ -9,7 +9,7 @@ public class WorldType { public static final WorldType[] field_48459_a = new WorldType[16]; -@@ -11,9 +14,20 @@ +@@ -11,6 +14,8 @@ private boolean field_48455_g; private boolean field_48460_h; @@ -18,7 +18,11 @@ private WorldType(int p_i1025_1_, String p_i1025_2_) { this(p_i1025_1_, p_i1025_2_, 0); -+ switch (p_i1025_1_) { +@@ -22,6 +27,15 @@ + this.field_48454_f = p_i1026_3_; + this.field_48455_g = true; + field_48459_a[p_i1026_1_] = this; ++ switch (p_i1026_1_) { + case 8: + biomesForWorldType = new BiomeGenBase[] { BiomeGenBase.field_4293_h, BiomeGenBase.field_4297_d, BiomeGenBase.field_35518_e, + BiomeGenBase.field_4299_b, BiomeGenBase.field_35520_c, BiomeGenBase.field_4294_g }; @@ -26,10 +30,10 @@ + default: + biomesForWorldType = new BiomeGenBase[] { BiomeGenBase.field_4293_h, BiomeGenBase.field_4297_d, BiomeGenBase.field_35518_e, + BiomeGenBase.field_4299_b, BiomeGenBase.field_35520_c, BiomeGenBase.field_4294_g, BiomeGenBase.field_48443_w }; -+ } ++ } } - private WorldType(int p_i1026_1_, String p_i1026_2_, int p_i1026_3_) + public String func_48449_a() @@ -68,4 +82,14 @@ return null;