VeniVidiVici
Санта Барбарис
- 327
- 15
- 198
Добрый день, столкнулся с небольшим тупняком, просьба помочь разобраться. Есть необходимость отрисовать obj предмет по игроку обычным вызовом, без использования брони. Не могу составить сам метод/вызов.
У меня есть класс рендера предмета из Obj, который как и нужно обрисовывает его в игре:
И есть вот такой класс рендера, в котором мне как-то нужно вызвать рендер этого предмета, имея лишь сущность и сам стак.
Сам вызов идёт вот из этого хэндлера:
Т.е. по факту мне надо вызвать нестандартный рендер этого предмета на персонаже, но не могу понять, каким именно методом это правильно сделать. Помогите, пожалуйста, разобраться. Либо подскажите как это сделать корректней, если такие варианты есть, так как за идеальность моей реализации не кичусь.
У меня есть класс рендера предмета из Obj, который как и нужно обрисовывает его в игре:
Java:
public class ItemCustomRender implements IItemRenderer
{
private IModelCustom model;
private ResourceLocation texture;
private int slotType;
public ItemCustomRender(String setNumber, IModelCustom model, int slotType)
{
texture = new ResourceLocation(ModInfo.MODID, "textures/" + getTypeName(slotType) + "/" + setNumber + ".png");
this.model = model;
this.slotType = slotType;
}
public String getTypeName(int type)
{
/*так надо*/
return "type_name";
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
switch (type)
{
case ENTITY: return true;
case EQUIPPED: return true;
case EQUIPPED_FIRST_PERSON: return true;
case INVENTORY: return true;
default: return false;
}
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return false;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
switch (type)
{
case ENTITY:
{
if (slotType == 0)
{
GL11.glPushMatrix();
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
GL11.glRotatef(1.0F, 0.0F, 0.0F, 1.0F);
model.renderAll();
GL11.glPopMatrix();
}
break;
}
case EQUIPPED:
{
if (slotType == 0)
{
GL11.glPushMatrix();
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
GL11.glRotatef(30.0F, 0.0F, 0.0F, 1.0F);
model.renderAll();
GL11.glPopMatrix();
}
break;
}
case EQUIPPED_FIRST_PERSON:
{
if (slotType == 0)
{
GL11.glPushMatrix();
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F);
model.renderAll();
GL11.glPopMatrix();
}
break;
}
case INVENTORY:
if (slotType == 0)
{
GL11.glPushMatrix();
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
GL11.glRotatef(45.0F, 0.0F, 1.0F, 1.0F);
GL11.glRotatef(-135.0F, 1.0F, 0.0F, 0.0F);
GL11.glScalef(1, 1, 1);
model.renderAll();
GL11.glPopMatrix();
}
break;
default:
break;
}
}
}
И есть вот такой класс рендера, в котором мне как-то нужно вызвать рендер этого предмета, имея лишь сущность и сам стак.
RenderCustomLayer:
public class RenderCustomLayer {
public RenderCustomLayer(){
}
public void render(EntityLivingBase entity, ItemStack item) {
this.doRender(entity, item);
}
public void doRender(EntityLivingBase entity, ItemStack item){
float entityTranslateY = entity instanceof EntityPlayer ? 0F : -1.5F;
GL11.glPushMatrix();
if (!entity.isSneaking()){
GL11.glTranslatef(0F, 0.2F + entityTranslateY + 0.0F, 0.5F);
}
else{
GL11.glTranslatef(0F, 0.2F + entityTranslateY - 0.1F, 0.6F);
GL11.glRotatef(20F, 1F, 0F, 0F);
}
GL11.glScalef(0.8F, 0.8F, 0.8F);
GL11.glRotatef(180, 0F, 0F, 1F);
if(item != null)
{
if(item.getItem() instanceof ItemClothes)
// Как вызвать рендер?
}
GL11.glPopMatrix();
}
}
Сам вызов идёт вот из этого хэндлера:
PlayerRenderHandler:
public class PlayerRenderHandler {
public static final RenderCustomLayer RENDER = new RenderCustomLayer();
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onPlayerRenderTick(RenderPlayerEvent.Specials.Pre e) {
EntityLivingBase entity = e.entityLiving;
if(entity instanceof EntityPlayer){
ExtendedPlayer exp = ExtendedPlayer.get((EntityPlayer)entity);
ItemStack item = exp.inventory.getStackInSlot(InventoryCustomPlayer.SLOT_TYPE1);
if(item != null)
RENDER.render(entity, item);
}
}
}
Т.е. по факту мне надо вызвать нестандартный рендер этого предмета на персонаже, но не могу понять, каким именно методом это правильно сделать. Помогите, пожалуйста, разобраться. Либо подскажите как это сделать корректней, если такие варианты есть, так как за идеальность моей реализации не кичусь.