/**
Copyright (C) <2017> <coolAlias>
This file is part of coolAlias' Zelda Sword Skills Minecraft Mod; as such,
you can redistribute it and/or modify it under the terms of the GNU
General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package zeldaswordskills;
import java.lang.reflect.Field;
import java.util.Map;
import com.google.common.collect.Maps;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.client.particle.IParticleFactory;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.util.IThreadListener;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
import zeldaswordskills.block.ICustomStateMapper;
import zeldaswordskills.block.ISpecialRenderer;
import zeldaswordskills.block.ZSSBlocks;
import zeldaswordskills.client.ISwapModel;
import zeldaswordskills.client.TargetingTickHandler;
import zeldaswordskills.client.ZSSClientEvents;
import zeldaswordskills.client.ZSSKeyHandler;
import zeldaswordskills.entity.ZSSEntities;
import zeldaswordskills.item.IModItem;
import zeldaswordskills.item.ZSSItems;
import zeldaswordskills.network.client.UnpressKeyPacket;
import zeldaswordskills.ref.ModInfo;
import zeldaswordskills.world.gen.AntiqueAtlasHelper;
public class ClientProxy extends CommonProxy
{
private final Minecraft mc = Minecraft.getMinecraft();
/** Stores all models which need to be replaced during {@link ModelBakeEvent} */
public static final Map<ModelResourceLocation, Class<? extends net.minecraft.client.resources.model.IBakedModel>> smartModels = Maps.newHashMap();
/** Accessible version of EffectRenderer's IParticleFactory map */
public static Map<Integer, IParticleFactory> particleFactoryMap;
/**
* All item / block variants must be registered at this time
*/
@Override
public void preInit() {
super.preInit();
registerRenderers();
ZSSEntities.registerRenderers();
MinecraftForge.EVENT_BUS.register(new ZSSClientEvents());
MinecraftForge.EVENT_BUS.register(new TargetingTickHandler());
MinecraftForge.EVENT_BUS.register(new ZSSKeyHandler());
UnpressKeyPacket.init();
}
@Override
public void init() {
AntiqueAtlasHelper.registerTextures();
Object o = ReflectionHelper.getPrivateValue(EffectRenderer.class, Minecraft.getMinecraft().effectRenderer, 6);
if (o instanceof Map) {
particleFactoryMap = (Map<Integer, IParticleFactory>) o;
}
}
@Override
public int addArmor(String armor) {
return 0;// TODO is this even necessary any longer? RenderingRegistry.addNewArmourRendererPrefix(armor);
}
/**
* Automated block and item renderer registration using {@link IModItem#registerRenderers}
*/
private void registerRenderers() {
try {
for (Field f: ZSSBlocks.class.getFields()) {
if (Block.class.isAssignableFrom(f.getType())) {
Block block = (Block) f.get(null);
if (block != null) {
if (block instanceof ICustomStateMapper) {
ZSSMain.logger.debug("Setting custom state mapper for " + block.getUnlocalizedName());
ModelLoader.setCustomStateMapper(block, ((ICustomStateMapper) block).getCustomStateMap());
}
String name = block.getUnlocalizedName();
Item item = GameRegistry.findItem(ModInfo.ID, name.substring(name.lastIndexOf(".") + 1));
if (item instanceof IModItem) {
((IModItem) item).registerResources();
}
if (block instanceof ISpecialRenderer) {
((ISpecialRenderer) block).registerSpecialRenderer();
}
if (block instanceof ISwapModel) {
addModelToSwap((ISwapModel) block);
}
if (item instanceof ISwapModel) {
addModelToSwap((ISwapModel) item);
}
}
}
}
} catch(Exception e) {
ZSSMain.logger.warn("Caught exception while registering block renderers: " + e.toString());
e.printStackTrace();
}
try {
for (Field f: ZSSItems.class.getFields()) {
if (Item.class.isAssignableFrom(f.getType())) {
Item item = (Item) f.get(null);
if (item instanceof IModItem) {
((IModItem) item).registerResources();
}
if (item instanceof ISwapModel) {
addModelToSwap((ISwapModel) item);
}
}
}
} catch(Exception e) {
ZSSMain.logger.warn("Caught exception while registering item renderers: " + e.toString());
e.printStackTrace();
}
}
/**
* Adds the model swap information to the map
*/
private void addModelToSwap(ISwapModel swap) {
for (ModelResourceLocation resource : swap.getDefaultResources()) {
if (smartModels.containsKey(resource)) {
if (smartModels.get(resource) != swap.getNewModel()) {
ZSSMain.logger.warn("Conflicting models for resource " + resource.toString() + ": models=[old: " + smartModels.get(resource).getSimpleName() + ", new: " + swap.getNewModel().getSimpleName());
}
} else {
ZSSMain.logger.debug("Swapping model for " + resource.toString() + " to class " + swap.getNewModel().getSimpleName());
smartModels.put(resource, swap.getNewModel());
}
}
}
@Override
public EntityPlayer getPlayerEntity(MessageContext ctx) {
return (ctx.side.isClient() ? mc.thePlayer : super.getPlayerEntity(ctx));
}
@Override
public IThreadListener getThreadFromContext(MessageContext ctx) {
return (ctx.side.isClient() ? mc : super.getThreadFromContext(ctx));
}
}