А почему бы вам не взять и не начать заполнять эту статью как статью с модлоадером! А то она как бы пустая немного...
С вашим руководством для 1.6.4 я сделал свой первый мод - RecipesPlus.
На 1.7.2 я уже сам портировал :)
С уважением, тот самый DragonX24 (обсуждение) 11:03, 1 марта 2014 (UTC)
Я один не понимаю, зачем писать туториал для 1.6+ когда уже можно создавать туториалы для 1.7+? --C уважением, PlatonCrafter. 17:54, 4 августа 2014 (UTC)
proxy.registerModels; //метод назови как хочешь
В CommonProxy добавь пустой абстрактный не возвращающий ничего метод (я назвал его registerModels) В ClientProxy добавь метод registerModels, объяви статичное числовое поле и добавь такой код
Поле = RenderingRegistry.getNextAvailableRenderId(); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ФайлМода.блок), new ItemRendererКласс()); //для блока в руках ClientRegistry.bindTileEntitySpecialRenderer(TileEntityБлок.class, new TileEntityRendererБлок()); //для блока в мире. Обязателен Tile Entity
Создай новый класс ModelБлок и сделай классу аннотацию @SideOnly(Side.CLIENT) и этот код
private IModelCustom modelБлок; public static final ResourceLocation БЛОК = ResourceLocationHelper.getResourceLocation("models/файл.obj"); //obj файл должен находиться в assets/idмода/models (не textures!) public ModelБлок() { modelБлок = AdvancedModelLoader.loadModel(БЛОК); } public void render() { modelБлок.renderPart("Base"); }
Проверяй. Я расчитывал, что ты хочешь специальный рендер для блока в руке или в мире. Если для предмета, скажи. Извини, что на "ты". Dеlеted User 07:19, 6 августа 2014 (UTC) Забыл код для рендера в мире :0 Создай класс TileEntityRenderБлок и сделай его суперкласс TileEntitySpecialRenderer и добавь классу аннотацию @SideOnly(Side.CLIENT). Вот сам код:
private final ModelAludel modelAludel = new ModelAludel(); private final RenderItem customRenderItem; public TileEntityRendererAludel() { customRenderItem = new RenderItem() { @Override public boolean shouldBob() { return false; } }; customRenderItem.setRenderManager(RenderManager.instance); } @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float tick) { if (tileEntity instanceof TileEntityAludel) { TileEntityAludel tileEntityAludel = (TileEntityAludel) tileEntity; GL11.glPushMatrix(); // Scale, Translate, Rotate scaleTranslateRotate(x, y, z, tileEntityAludel.getOrientation()); // Текстура this.bindTexture(Textures.Model.ALUDEL); // Рендер modelAludel.render(); GL11.glPopMatrix(); /** * Render the ghost item inside of the Aludel, slowly spinning */ GL11.glPushMatrix(); TileEntity tileGlassBell = tileEntityAludel.getWorldObj().getTileEntity(tileEntityAludel.xCoord, tileEntityAludel.yCoord + 1, tileEntityAludel.zCoord); if (tileGlassBell instanceof TileEntityGlassBell) { if (tileEntityAludel.outputItemStack != null) { float scaleFactor = getGhostItemScaleFactor(tileEntityAludel.outputItemStack); float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); EntityItem ghostEntityItem = new EntityItem(tileEntityAludel.getWorldObj()); ghostEntityItem.hoverStart = 0.0F; ghostEntityItem.setEntityItemStack(tileEntityAludel.outputItemStack); GL11.glTranslatef((float) x + 0.5F, (float) y + 1.25F, (float) z + 0.5F); GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F); customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0); } } GL11.glPopMatrix(); } } private void scaleTranslateRotate(double x, double y, double z, ForgeDirection orientation) //Тут всё с OpenGL { if (orientation == ForgeDirection.NORTH) { GL11.glTranslated(x + 1, y, z); GL11.glRotatef(180F, 0F, 1F, 0F); GL11.glRotatef(-90F, 1F, 0F, 0F); } else if (orientation == ForgeDirection.EAST) { GL11.glTranslated(x + 1, y, z + 1); GL11.glRotatef(90F, 0F, 1F, 0F); GL11.glRotatef(-90F, 1F, 0F, 0F); } else if (orientation == ForgeDirection.SOUTH) { GL11.glTranslated(x, y, z + 1); GL11.glRotatef(0F, 0F, 1F, 0F); GL11.glRotatef(-90F, 1F, 0F, 0F); } else if (orientation == ForgeDirection.WEST) { GL11.glTranslated(x, y, z); GL11.glRotatef(-90F, 0F, 1F, 0F); GL11.glRotatef(-90F, 1F, 0F, 0F); } } private float getGhostItemScaleFactor(ItemStack itemStack) { float scaleFactor = 1.0F; if (itemStack != null) { byte numBlocks = 1; if (itemStack.stackSize > 1) { numBlocks = 2; } else if (itemStack.stackSize > 5) { numBlocks = 3; } else if (itemStack.stackSize > 20) { numBlocks = 4; } else if (itemStack.stackSize > 40) { numBlocks = 5; } if (itemStack.getItem() instanceof ItemBlock) { switch (numBlocks) { case 1: return 0.90F; case 2: return 0.90F; case 3: return 0.90F; case 4: return 0.90F; case 5: return 0.80F; default: return 0.90F; } } else { switch (numBlocks) { case 1: return 0.65F; case 2: return 0.65F; case 3: return 0.65F; case 4: return 0.65F; default: return 0.65F; } } } return scaleFactor;
Мне поля заменять лень, думаю сам догадаешься. Ещё раз извини за "ты". −Надеясь, что у вас всё получится,Dеlеted User 07:39, 6 августа 2014 (UTC)
Кто нибудь собирается создавать новые руководства? Всегда ваш, Ivan 111 Vasilyevich (обс. | вклад) 07:15, 19 июня 2017 (UTC)
Здравствуйте начал недавно писать моды для майнкрафт в программе Eclipse, написал основной код для начала, но когда пытаюсь запустить игру через eclipse у меня выдаёт ошибку: couldn't create java virtual machine a fatal exception. Что делать?