Skip to content

Instantly share code, notes, and snippets.

@StillManic
Last active August 29, 2015 14:27
Show Gist options
  • Save StillManic/d279739b91dad4f6e90d to your computer and use it in GitHub Desktop.
Save StillManic/d279739b91dad4f6e90d to your computer and use it in GitHub Desktop.
package rcteam.rc2.proxy;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.item.Item;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import rcteam.rc2.RC2;
import rcteam.rc2.block.BlockTrack;
import rcteam.rc2.block.RC2Blocks;
import rcteam.rc2.client.gui.GuiThemeParkOverlay;
import rcteam.rc2.item.RC2Items;
import rcteam.rc2.rollercoaster.CategoryEnum;
import rcteam.rc2.rollercoaster.ThemeParkLogo;
import rcteam.rc2.util.FileManager;
import rcteam.rc2.util.OBJLoader;
import rcteam.rc2.util.TrackStateMapper;
import java.io.File;
import java.util.Map;
public class ClientProxy extends CommonProxy {
public static int trackRenderId = -1;
@Override
public void preInit() {
ModelLoaderRegistry.registerLoader(OBJLoader.instance);
OBJLoader.instance.addDomain(RC2.MODID.toLowerCase());
}
@Override
public void init() {
RC2Items.init(Side.CLIENT);
RC2Blocks.init(Side.CLIENT);
initRenderers();
}
@Override
public void initRenderers() {
ThemeParkLogo.init();
MinecraftForge.EVENT_BUS.register(new GuiThemeParkOverlay(Minecraft.getMinecraft()));
}
}
package rcteam.rc2.proxy;
import net.minecraftforge.fml.relauncher.Side;
import rcteam.rc2.block.RC2Blocks;
import rcteam.rc2.item.RC2Items;
public class CommonProxy {
public void preInit() {
// initRenderers();
}
public void init() {
RC2Items.init(Side.SERVER);
RC2Blocks.init(Side.SERVER);
initRenderers();
}
public void initRenderers() {
}
}
{
"forge_marker": 1,
"defaults": {
"textures": {},
"model": "rc2:tracks/hyper_twister/straight.obj"
},
"variants": {
"normal": [{}],
"inventory": [{
"transform": "forge:default-block"
}],
"facing": {
"north": {},
"south": {"y": 180},
"west": {"y": 270},
"east": {"y": 90}
},
"piece": {
"straight": {"model": "rc2:tracks/hyper_twister/straight.obj"},
"small_corner": {"model": "rc2:tracks/hyper_twister/small_corner.obj"},
"medium_corner": {"model": "rc2:tracks/hyper_twister/medium_corner.obj"},
"large_corner_left": {"model": "rc2:tracks/hyper_twister/large_corner_left.obj"},
"large_corner_right": {"model": "rc2:tracks/hyper_twister/large_corner_right.obj"}
}
},
"style_info": {
"display_name": "Hyper Twister Coaster",
"category": "steel",
"train_cars": ["default"]
}
}
package rcteam.rc2.item;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.launchwrapper.Launch;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import rcteam.rc2.block.BlockTrack;
import rcteam.rc2.rollercoaster.TrackPiece;
import rcteam.rc2.util.Reference;
import rcteam.rc2.util.TrackStateMapper;
public class ItemTrack extends ItemBlock {
private BlockTrack track;
public ItemTrack(Block track) {
super(track);
this.track = (BlockTrack) track;
}
public BlockTrack getTrack() {
return this.track;
}
@Override
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) {
if ((Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { //this makes tracks placeable by hand when run in a dev env
//TODO!
if (!stack.hasTagCompound()) {
NBTTagCompound compound = new NBTTagCompound();
compound.setTag("current_piece", track.getInfo().getCurrentPiece().writeToNBT());
stack.setTagCompound(compound);
}
// TrackPiece piece = TrackPiece.readFromNBT(stack.getSubCompound("current_piece", true));
TrackPiece piece = this.track.getInfo().getNextPiece();
this.track.getInfo().setCurrentPiece(piece);
// world.setBlockState(pos, track.getStateFromMeta(Utils.getFacingFromEntity(world, pos, player, false, false).getHorizontalIndex()), 3);
world.setBlockState(pos, newState.withProperty(BlockTrack.PIECE_PROPERTY, piece), 3);
return true;
}
return false;
}
public static class ItemTrackMeshDefinition implements ItemMeshDefinition {
public static final ItemTrackMeshDefinition INSTANCE = new ItemTrackMeshDefinition();
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
ModelResourceLocation location = new ModelResourceLocation(Reference.RESOURCE_PREFIX + "tracks/hyper_twister", "inventory");
return location;
}
}
}
package rcteam.rc2;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.IResource;
import net.minecraft.command.CommandHandler;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.apache.logging.log4j.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import rcteam.rc2.block.RC2Blocks;
import rcteam.rc2.client.gui.GuiHandler;
import rcteam.rc2.command.GiveThemeParkCommand;
import rcteam.rc2.item.RC2Items;
import rcteam.rc2.network.packets.PacketPipeline;
import rcteam.rc2.proxy.CommonProxy;
import rcteam.rc2.rollercoaster.CoasterStyle;
import rcteam.rc2.rollercoaster.StyleRegistry;
import rcteam.rc2.rollercoaster.TrackPieceRegistry;
import rcteam.rc2.util.CoasterPack;
import rcteam.rc2.util.FileManager;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashMap;
import rcteam.rc2.util.JsonParser;
import rcteam.rc2.util.Reference;
@Mod(modid = RC2.MODID, name = RC2.NAME, version = RC2.VERSION)
public class RC2 {
public static final String MODID = "rc2";
public static final String NAME = "Roller Coaster 2";
public static final String VERSION = "v0.1";
public static HashMap<String, CoasterPack> packs = new HashMap<>();
@Instance
public static RC2 instance;
@SidedProxy(clientSide="rcteam.rc2.proxy.ClientProxy", serverSide="rcteam.rc2.proxy.CommonProxy")
public static CommonProxy proxy;
public static String srcDir;
public static String packsDir;
public static Logger logger;
public static CreativeTabs tab;
public static final PacketPipeline packetPipeline = new PacketPipeline();
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
proxy.preInit();
srcDir = event.getSourceFile().getAbsolutePath();
packsDir = srcDir + "\\assets\\" + MODID + "\\packs\\";
logger = LogManager.getLogger(NAME);
tab = new CreativeTabs(NAME) {
@Override
@SideOnly(Side.CLIENT)
public Item getTabIconItem() {
return null;
}
@Override
@SideOnly(Side.CLIENT)
public ItemStack getIconItemStack() {
return new ItemStack(RC2Items.hammer);
}
};
TrackPieceRegistry.INSTANCE.registerDefaultPieces();
// if (event.getSide() == Side.CLIENT) {
// readPackFolder();
// }
// readPackFolder();
// getListPacks().stream().forEach(CoasterPack::registerStyles);
// StyleRegistry.INSTANCE.registerBlocks();
RC2Items.preInit();
RC2Blocks.preInit(event.getSide());
}
@EventHandler
public void init(FMLInitializationEvent event) {
packetPipeline.initalise();
proxy.init();
NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
// readPackFolder();
// getListPacks().stream().forEach(CoasterPack::registerStyles);
// StyleRegistry.INSTANCE.registerBlocks();
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
packetPipeline.postInitialise();
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event) {
((CommandHandler) event.getServer().getCommandManager()).registerCommand(new GiveThemeParkCommand());
// event.registerServerCommand(new GiveThemeParkCommand());
}
public static void readPackFolder() {
// logger.info("reading pack folder");
// logger.info(srcDir + "\\assets\\rc2\\packs\\");
File packsFolder = new File(packsDir);
for (File pack : packsFolder.listFiles()) {
CoasterPack coasterPack = FileManager.readPack(pack);
if (coasterPack != null) register(coasterPack);
}
}
public static Collection<CoasterPack> getListPacks() {
return packs.values();
}
public static void register(CoasterPack pack) {
logger.info("Registering pack: " + pack.getName());
if (packs.get(pack.getName()) == null) RC2.packs.put(pack.getName(), pack);
else logger.error("A coaster pack has already been registered with name {}", pack.getName());
}
public static CoasterPack getPack(String name) {
return packs.get(name);
}
public static CoasterPack getPackContainingStyle(CoasterStyle style) {
return packs.values().stream().filter(pack -> pack.getStyles().containsKey(style.getName())).findFirst().get();
}
}
package rcteam.rc2.block;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fml.relauncher.Side;
import org.apache.commons.lang3.tuple.Pair;
import rcteam.rc2.block.te.*;
import rcteam.rc2.item.ItemTrack;
import rcteam.rc2.rollercoaster.CategoryEnum;
import rcteam.rc2.rollercoaster.TrackPieceInfo;
import rcteam.rc2.rollercoaster.TrackPieceRegistry;
import rcteam.rc2.util.Reference;
import rcteam.rc2.util.TrackStateMapper;
import java.util.List;
import java.util.Map;
public class RC2Blocks {
public static final Map<Block, Pair<String, ModelResourceLocation>> modelMap = Maps.newHashMap();
public static final Map<CategoryEnum, TrackPieceInfo> infoMap = Maps.newEnumMap(CategoryEnum.class);
public static Block entrance;
public static Block track_steel;
public static Block track_wood;
public static Block track_inverted;
public static Block track_water;
public static void preInit(Side side) {
entrance = new BlockEntrance();
// TrackPieceInfo steelInfo = new TrackPieceInfo(CategoryEnum.STEEL, TrackPieceRegistry.INSTANCE.getPieces()); //TODO: distinguish between different category pieces and different Style pieces!
// TrackPieceInfo woodInfo = new TrackPieceInfo(CategoryEnum.WOODEN, TrackPieceRegistry.INSTANCE.getPieces());
// TrackPieceInfo invertedInfo = new TrackPieceInfo(CategoryEnum.INVERTED, TrackPieceRegistry.INSTANCE.getPieces());
// TrackPieceInfo waterInfo = new TrackPieceInfo(CategoryEnum.WATER, TrackPieceRegistry.INSTANCE.getPieces());
infoMap.put(CategoryEnum.STEEL, new TrackPieceInfo(CategoryEnum.STEEL, TrackPieceRegistry.INSTANCE.getPieces()));
infoMap.put(CategoryEnum.WOODEN, new TrackPieceInfo(CategoryEnum.WOODEN, TrackPieceRegistry.INSTANCE.getPieces()));
infoMap.put(CategoryEnum.INVERTED, new TrackPieceInfo(CategoryEnum.INVERTED, TrackPieceRegistry.INSTANCE.getPieces()));
infoMap.put(CategoryEnum.WATER, new TrackPieceInfo(CategoryEnum.WATER, TrackPieceRegistry.INSTANCE.getPieces()));
// track_steel = new BlockTrackSteel(steelInfo);
// track_wood = new BlockTrackWood(woodInfo);
// track_inverted = new BlockTrackInverted(invertedInfo);
// track_water = new BlockTrackWater(waterInfo);
BlockTrack.PIECE_PROPERTY.setAllowedValues(infoMap.get(CategoryEnum.STEEL).getPieces());
track_steel = new BlockTrack(infoMap.get(CategoryEnum.STEEL));
BlockTrack.PIECE_PROPERTY.setAllowedValues(infoMap.get(CategoryEnum.WOODEN).getPieces());
track_wood = new BlockTrack(infoMap.get(CategoryEnum.WOODEN));
BlockTrack.PIECE_PROPERTY.setAllowedValues(infoMap.get(CategoryEnum.INVERTED).getPieces());
track_inverted = new BlockTrack(infoMap.get(CategoryEnum.INVERTED));
BlockTrack.PIECE_PROPERTY.setAllowedValues(infoMap.get(CategoryEnum.WATER).getPieces());
track_water = new BlockTrack(infoMap.get(CategoryEnum.WATER));
registerBlock(entrance, "entrance");
registerBlock(track_steel, ItemTrack.class, "track_steel", side);
registerBlock(track_wood, ItemTrack.class, "track_wooden", side);
registerBlock(track_inverted, ItemTrack.class, "track_inverted", side);
registerBlock(track_water, ItemTrack.class, "track_water", side);
registerTE(TileEntityEntrance.class, entrance);
// registerTE(TileEntityTrackSteel.class, track_steel);
// registerTE(TileEntityTrackWood.class, track_wood);
// registerTE(TileEntityTrackInverted.class, track_inverted);
// registerTE(TileEntityTrackWater.class, track_water);
registerTE(TileEntityTrack.class, track_steel);
registerTE(TileEntityTrack.class, track_wood);
registerTE(TileEntityTrack.class, track_inverted);
registerTE(TileEntityTrack.class, track_water);
}
private static void registerBlock(Block block, String name) {
GameRegistry.registerBlock(block, name);
modelMap.put(block, Pair.of(name, null));
}
private static void registerBlock(Block block, Class<? extends ItemBlock> itemClass, String name, Side side) {
if (block instanceof BlockTrack && side == Side.CLIENT) {
ModelLoader.setCustomStateMapper(block, TrackStateMapper.INSTANCE);
// ItemTrack track = new ItemTrack(block);
//// ModelLoader.setCustomMeshDefinition(track, ItemTrack.ItemTrackMeshDefinition.INSTANCE);
// ModelLoader.setCustomModelResourceLocation(track, 0, ItemTrack.ItemTrackMeshDefinition.INSTANCE.getModelLocation(new ItemStack(track)));
}
GameRegistry.registerBlock(block, itemClass, name);
modelMap.put(block, Pair.of(name, null));
}
private static void registerTE(Class<? extends TileEntity> te, Block block) {
GameRegistry.registerTileEntity(te, modelMap.get(block).getLeft());
}
public static void init(Side side) {
List<Block> blocks = Lists.newArrayList(modelMap.keySet());
for (Block block : blocks) {
ModelResourceLocation location = new ModelResourceLocation(Reference.RESOURCE_PREFIX + modelMap.get(block).getLeft(), "inventory");
modelMap.put(block, Pair.of(modelMap.get(block).getLeft(), location));
if (side == Side.CLIENT) {
if (block instanceof BlockTrack) {
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), ItemTrack.ItemTrackMeshDefinition.INSTANCE);
// Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, ItemTrack.ItemTrackMeshDefinition.INSTANCE.getModelLocation(new ItemStack(Item.getItemFromBlock(block))));
// ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, ItemTrack.ItemTrackMeshDefinition.INSTANCE.getModelLocation(new ItemStack(Item.getItemFromBlock(block))));
} else {
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, location);
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment