/*
* 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.player.accessories;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.ChatColor;
import net.minecraft.src.Minecraft;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ModelBiped;
import net.minecraft.src.RenderManager;
import net.minecraft.src.RenderPlayer;
import net.minecraft.src.TextureManager;
import net.minecraft.src.ResourceLocation;
import net.minecraft.src.ThreadDownloadImageData;
import net.minecraft.src.TextureObject;
import org.spoutcraft.client.HDImageBufferDownload;
import org.spoutcraft.client.special.Resources;
import org.spoutcraft.client.special.VIP;
public class AccessoryHandler {
private static Map<String, Set<Pair<Accessory, String>>> sacs = new HashMap<String, Set<Pair<Accessory, String>>>();
private static Set<String> downloaded = new HashSet<String>();
private static RenderPlayer renderer = (RenderPlayer) RenderManager.instance.entityRenderMap.get(EntityPlayer.class);
private static ModelBiped modelBipedMain = ((RenderPlayer) RenderManager.instance.entityRenderMap.get(EntityPlayer.class)).modelBipedMain;
private AccessoryHandler() {
}
public static void addAccessory(String player, Accessory n, String url) {
TextureManager tm= Minecraft.getMinecraft().getTextureManager();
Object texture = new ThreadDownloadImageData(url, (ResourceLocation)null, new HDImageBufferDownload());
tm.loadTexture(new ResourceLocation("accessories/" + n.getType().toString()), (TextureObject)texture);
Set<Pair<Accessory, String>> acs = sacs.get(player);
if (acs == null) {
acs = new HashSet<Pair<Accessory, String>>();
}
Set<Pair<Accessory, String>> toRemove = new HashSet<Pair<Accessory, String>>();
for (Pair<Accessory, String> pr : acs) {
if (pr.getLeft().getType().equals(n.getType())) {
toRemove.add(pr);
}
}
acs.removeAll(toRemove);
acs.add(Pair.of(n, url));
sacs.put(player, acs);
}
public static void renderAllAccessories(EntityPlayer player, float f, float par2) {
Set<Pair<Accessory, String>> acs = sacs.get(player.username);
if (acs == null) {
return;
}
for (Pair<Accessory, String> a : acs) {
RenderManager.instance.renderEngine.bindTexture(new ResourceLocation("accessories/" + a.getLeft().getType().toString()));
a.getLeft().render(player, f, par2);
}
}
public static void addVIPAccessoriesFor(EntityPlayer player) {
String cleanUserName = ChatColor.stripColor(player.username);
VIP vip = Resources.getVIP(cleanUserName);
if (vip == null) {
return;
}
Map<String, String> vAcs = vip.Accessories();
if (vAcs == null) {
return;
}
String that = vAcs.get("tophat");
String nhat = vAcs.get("notchhat");
String brace = vAcs.get("bracelet");
String wings = vAcs.get("wings");
String ears = vAcs.get("ears");
String glasses = vAcs.get("sunglasses");
String tail = vAcs.get("tail");
if (that != null) {
addAccessory(player.username, new TopHat(modelBipedMain), that);
}
if (nhat != null) {
addAccessory(player.username, new NotchHat(modelBipedMain), nhat);
}
if (brace != null) {
addAccessory(player.username, new Bracelet(modelBipedMain), brace);
}
if (wings != null) {
addAccessory(player.username, new Wings(modelBipedMain), wings);
}
if (ears != null) {
addAccessory(player.username, new Ears(modelBipedMain), ears);
}
if (glasses != null) {
addAccessory(player.username, new Sunglasses(modelBipedMain), glasses);
}
if (tail != null) {
addAccessory(player.username, new Tail(modelBipedMain), tail);
}
}
public static void addAccessoryType(String player, AccessoryType type, String url) {
Set<Pair<Accessory, String>> acs = sacs.get(player);
if (acs == null) {
acs = new HashSet<Pair<Accessory, String>>();
sacs.put(player, acs);
}
Accessory toCreate;
switch (type) {
case BRACELET:
toCreate = new Bracelet(modelBipedMain);
break;
case EARS:
toCreate = new Ears(modelBipedMain);
break;
case NOTCHHAT:
toCreate = new NotchHat(modelBipedMain);
break;
case SUNGLASSES:
toCreate = new Sunglasses(modelBipedMain);
break;
case TAIL:
toCreate = new Tail(modelBipedMain);
break;
case TOPHAT:
toCreate = new TopHat(modelBipedMain);
break;
case WINGS:
toCreate = new Wings(modelBipedMain);
break;
default:
toCreate = null;
break;
}
if (toCreate != null) {
addAccessory(player, toCreate, url);
}
}
public static void removeAccessoryType(String player, AccessoryType type) {
Set<Pair<Accessory, String>> acs = sacs.get(player);
if (acs == null) {
return;
}
Pair<Accessory, String> toRemove = null;
for (Pair<Accessory, String> accessory : acs) {
if (accessory.getLeft().getType().equals(type)) {
toRemove = accessory;
break;
}
}
acs.remove(toRemove);
}
public static boolean isHandled(String username) {
return sacs.containsKey(username);
}
public static boolean hasAccessory(String username, AccessoryType type) {
if (!sacs.containsKey(username)) {
return false;
}
for (Pair<Accessory, String> accessory : sacs.get(username)) {
if (accessory.getLeft().getType().equals(type)) {
return true;
}
}
return false;
}
}