/* * This file is part of Spoutcraft. * * Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/> * Spoutcraft is licensed under the GNU Lesser General Public License. * * Spoutcraft 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 3 of the License, or * (at your option) any later version. * * Spoutcraft 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 program. If not, see <http://www.gnu.org/licenses/>. */ package org.spoutcraft.client.inventory; import java.util.ArrayList; import java.util.List; import gnu.trove.map.hash.TIntByteHashMap; import gnu.trove.map.hash.TIntIntHashMap; import net.minecraft.src.Minecraft; import net.minecraft.src.Item; import org.spoutcraft.api.inventory.ItemStack; import org.spoutcraft.api.inventory.MaterialManager; import org.spoutcraft.api.inventory.Recipe; import org.spoutcraft.api.inventory.ShapedRecipe; import org.spoutcraft.api.inventory.ShapelessRecipe; import org.spoutcraft.api.material.CustomBlock; import org.spoutcraft.api.material.Material; import org.spoutcraft.api.material.MaterialData; import org.spoutcraft.api.util.map.TIntPairFloatHashMap; import org.spoutcraft.api.util.map.TIntPairObjectHashMap; public class SimpleMaterialManager implements MaterialManager { private final TIntPairFloatHashMap originalHardness = new TIntPairFloatHashMap(); private final TIntPairFloatHashMap originalFriction = new TIntPairFloatHashMap(); private final TIntByteHashMap originalOpacity = new TIntByteHashMap(); private final TIntIntHashMap originalLight = new TIntIntHashMap(); private final TIntPairObjectHashMap<String> customNames = new TIntPairObjectHashMap<String>(100); private final TIntPairObjectHashMap<String> customTextures = new TIntPairObjectHashMap<String>(100); private final TIntPairObjectHashMap<String> customTexturesPlugin = new TIntPairObjectHashMap<String>(100); public float getFriction(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } return net.minecraft.src.Block.blocksList[id].slipperiness; } public void setFriction(org.spoutcraft.api.material.Block block, float friction) { int id = block.getRawId(); int data = block.getRawData(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (!originalFriction.containsKey(id, data)) { originalFriction.put(id, data, getFriction(block)); } net.minecraft.src.Block.blocksList[id].slipperiness = friction; } public void resetFriction(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); int data = block.getRawData(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (originalFriction.containsKey(id, data)) { setFriction(block, originalFriction.get(id, data)); originalFriction.remove(id, data); } } public float getHardness(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } return net.minecraft.src.Block.blocksList[id].getHardness(); } public void setHardness(org.spoutcraft.api.material.Block block, float hardness) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } net.minecraft.src.Block.blocksList[id].blockHardness = hardness; } public void resetHardness(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); int data = block.getRawData(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (originalHardness.containsKey(id, data)) { setHardness(block, originalHardness.get(id, data)); originalHardness.remove(id, data); } } public boolean isOpaque(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } return net.minecraft.src.Block.opaqueCubeLookup[id]; } public void setOpaque(org.spoutcraft.api.material.Block block, boolean opacity) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (!originalOpacity.containsKey(id)) { originalOpacity.put(id, (byte) (isOpaque(block) ? 1 : 0)); } net.minecraft.src.Block.opaqueCubeLookup[id] = opacity; } public void resetOpacity(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (originalOpacity.containsKey(id)) { setOpaque(block, originalOpacity.get(id) != 0); originalOpacity.remove(id); } } public int getLightLevel(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } return net.minecraft.src.Block.lightValue[id]; } public void setLightLevel(org.spoutcraft.api.material.Block block, int level) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (!originalLight.containsKey(id)) { originalLight.put(id, getLightLevel(block)); } net.minecraft.src.Block.lightValue[id] = level; } public void resetLightLevel(org.spoutcraft.api.material.Block block) { int id = block.getRawId(); if (block instanceof CustomBlock) { id = ((CustomBlock) block).getBlockId(); } if (originalLight.containsKey(id)) { setLightLevel(block, originalLight.get(id)); originalLight.remove(id); } } public void setItemName(Material item, String name) { customNames.put(item.getRawId(), item.getRawData(), name); } public void resetName(Material item) { int id = item.getRawId(); int data = item.getRawData(); if (customNames.containsKey(id, data)) { customNames.remove(id, data); } } public void setItemTexture(Material item, String addon, String texture) { int id = item.getRawId(); int data = item.getRawData(); String addonName = addon; customTextures.put(id, data, texture); if (addonName == null) { customTexturesPlugin.remove(id, data); } else { customTexturesPlugin.put(id, data, addonName); } } public String getCustomItemTexture(Material item) { if (item == null) return null; int id = item.getRawId(); int data = item.getRawData(); if (customTextures.containsKey(id, data)) { return (String) customTextures.get(id, data); } return null; } public String getCustomItemTextureAddon(Material item) { if (item == null) return null; int id = item.getRawId(); int data = item.getRawData(); if (customTexturesPlugin.containsKey(id, data)) { return (String) customTexturesPlugin.get(id, data); } return null; } public void resetTexture(Material item) { int id = item.getRawId(); int data = item.getRawData(); if (customTextures.containsKey(id, data)) { customTextures.remove(id, data); } } public void reset() { for (Material next : MaterialData.getMaterials()) { if (next instanceof org.spoutcraft.api.material.Block) { org.spoutcraft.api.material.Block block = (org.spoutcraft.api.material.Block)next; resetFriction(block); resetHardness(block); resetOpacity(block); resetLightLevel(block); } } } public boolean registerRecipe(Recipe recipe) { SpoutcraftRecipe toAdd; if (recipe instanceof ShapedRecipe) { toAdd = SimpleShapedRecipe.fromSpoutRecipe((ShapedRecipe) recipe); } else if (recipe instanceof ShapelessRecipe) { toAdd = SimpleShapelessRecipe.fromSpoutRecipe((ShapelessRecipe) recipe); } else { return false; } toAdd.addToCraftingManager(); return true; } @SuppressWarnings("unchecked") @Override public String getToolTip(ItemStack is) { net.minecraft.src.ItemStack itemstack = null; if (is instanceof CraftItemStack) { itemstack = ((CraftItemStack)is).item; } else { itemstack = is.asNMSItenStack(); } Item rawItem = Item.itemsList[itemstack.itemID]; List<String> list; if (rawItem != null) { list = itemstack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips); } else { list = new ArrayList<String>(); } if (itemstack.itemID == MaterialData.flint.getRawId()) { Material item = MaterialData.getMaterial(is.getTypeId(), is.getDurability()); String custom = item != null ? String.format(item.getName(), String.valueOf(is.getDurability())) : null; if (custom != null && is.getTypeId() != Item.potion.itemID) { if (list.size() > 0) { list.set(0, custom); } else { list.add(custom); } } } if (list.size() > 0) { String tooltip = ""; int lines = 0; for (int i = 0; i < list.size(); i++) { String s = (String)list.get(i); if (i == 0 && rawItem!=null) { if (itemstack != null && itemstack.hasDisplayName()) { s = "\u00a7o" + itemstack.getDisplayName() + "\u00a7r"; } s = (new StringBuilder()).append("\247").append(Integer.toHexString(itemstack.getRarity().rarityColor)).append(s).toString(); } else { s = (new StringBuilder()).append("\2477").append(s).toString(); } tooltip += s + "\n"; lines++; } tooltip = tooltip.trim(); return tooltip; } return ""; } }