-
Posts
60 -
Joined
-
Last visited
Everything posted by Mekelaina
-
So I'm trying to have my block store experience. and using buttons in the gui of the block you should be able to deposit levels to the block or take them out. while the buttons work and will alter both the players xp levels and the xp stored in the block, if you close the gui it reverts to what it was before using the buttons and if the players xp was changed via the buttons in the gui, upon saving and reloading the world it will be set back to what it was before. I'm really confused because the block can also "gain" xp by placing items in its slot, and this works fine. and the button code i took from that. and i use methods in the EntityPlayer class to alter the xp values. My guess is its something to do with the server not getting the memo things have changed, but i dont know why using the fuel to xp mechanic works then because they both use similar means. Id really appreciate some help here. My Screen package com.mekelaina.gramarye.gui.screens; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.gui.containers.ObeliskContainer; import com.mekelaina.gramarye.blocks.tiles.ObeliskTile; import com.mekelaina.gramarye.gui.element.CustomButton; import com.mekelaina.gramarye.gui.element.WidgetWrapper; import com.mekelaina.gramarye.util.XPMathUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.widget.button.Button; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import java.awt.*; public class ObeliskScreen extends ContainerScreen<ObeliskContainer> { private ResourceLocation GUI ; private ObeliskTile obeliskTile; private Rectangle xp; private CustomButton depositLvl; private CustomButton retrieveLvl; public ObeliskScreen(ObeliskContainer screenContainer, PlayerInventory inv, ITextComponent titleIn) { super(screenContainer, inv, titleIn); this.obeliskTile = screenContainer.getTileEntity(); xp = new Rectangle(135, 5, 36, 68); } @Override public void render(int mouseX, int mouseY, float partialTicks) { super.render(mouseX, mouseY, partialTicks); this.renderHoveredToolTip(mouseX, mouseY); } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { // this.font.drawString(this.title.getFormattedText(), 8.0f, 6.0f, 4210752); //this.font.drawString(this.playerInventory.getDisplayName().getFormattedText(), 8.0f, (float)(this.ySize - 94), 4210752); // drawString(Minecraft.getInstance().fontRenderer, "Energy: " + container.getEnergy(), this.xSize - (this.xSize / 2), 6, 0x4AEDD9); //renderHoveredToolTip(mouseX - this.xSize - (this.xSize / 2), mouseY); String toDraw = "Xp: " + this.container.getEnergy() + " Lvl: " + XPMathUtils.getClosestLevelByXp(this.container.getEnergy()); // Gramarye.LOGGER.debug(font.getStringWidth(toDraw)); this.font.drawString(toDraw, (float)(this.xSize - (font.getStringWidth(toDraw) + 4)), (float)(this.ySize - 92), 0xF5FF8F); /*//Gramarye.LOGGER.debug("mouse x: " + mouseX + "mouse y: " + mouseY); if(isOverXpBar(mouseX, mouseY)) { blit(mouseX, mouseY, 129, 166, 32, 20); drawString(Minecraft.getInstance().fontRenderer, toDraw, mouseX , mouseY, 0x4AEDD9); }*/ } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { // GlStateManager.color4f(1f, 1f, 1f, 1f); this.minecraft.getTextureManager().bindTexture(GUI); int relX = (this.width - this.xSize) / 2; int relY = (this.height - this.ySize) / 2; this.blit(relX, relY, 0, 0, this.xSize, this.ySize); int k = this.getExperienceStoredScaled(64); // Gramarye.LOGGER.debug(64); //k += (k-64) ; blit(this.guiLeft + 71, this.guiTop + 7 + (64-k), 176, 1+(64-k), 32, k); } private int getExperienceStoredScaled(int pixels) { int i = this.container.getEnergy(); int j = this.obeliskTile.getCapacity(); return i != 0 && j != 0 ? i * pixels / j : 0; } private boolean isOverXpBar(int mouseX, int mouseY) { return mouseX >= this.guiLeft + this.xp.x && mouseY >= this.guiTop + xp.y && mouseX < xp.x + xp.width && mouseY < xp.y + xp.height; } @Override protected void init() { super.init(); GUI = new ResourceLocation(Gramarye.MODID, "textures/gui/test_gui2.png"); WidgetWrapper[] temp = new WidgetWrapper[] {new WidgetWrapper(176, 65, 20, 20), new WidgetWrapper(176, 85, 20, 20), new WidgetWrapper(176, 105, 20, 20), new WidgetWrapper(176, 125, 20, 20)}; depositLvl = new CustomButton(this.guiLeft + 118, this.guiTop + 5, 20, 20, temp, p_onPress_1_ -> insertOneLevel()); depositLvl.setTexture(GUI); this.addButton(depositLvl); temp = new WidgetWrapper[] {new WidgetWrapper(176, 65, 20, 20), new WidgetWrapper(176, 85, 20, 20), new WidgetWrapper(176, 105, 20, 20), new WidgetWrapper(176, 145, 20, 20)}; retrieveLvl = depositLvl = new CustomButton(this.guiLeft + 145, this.guiTop + 5, 20, 20, temp, p_onPress_1_ -> retrieveOneLevel()); retrieveLvl.setTexture(GUI); this.addButton(retrieveLvl); } private void initButtons() { //this.addButton(new Button(this.guiLeft + 84, this.guiTop + 5, 20, 20, "Boop", p_onPress_1_ -> sendMessage())); } private void sendMessage(){ this.container.getPlayer().sendStatusMessage(new StringTextComponent("test"), false); //this.container.getPlayer().e } private void insertOneLevel(){ PlayerEntity player = container.getPlayer(); Gramarye.LOGGER.debug("player"); if(!player.isCreative()) { int playerLvl = player.experienceLevel; int playerTotal = player.experienceTotal; if(playerTotal > 0 && playerLvl > 0) { int currentLvlsWorth = XPMathUtils.getXpToLevelUp(playerLvl-1); this.obeliskTile.insertXp(currentLvlsWorth); player.giveExperiencePoints(-currentLvlsWorth); } else if(playerTotal > 0 && playerLvl <= 0) { this.obeliskTile.insertXp(playerTotal); player.giveExperiencePoints(-playerTotal); } } else { int currentLvl = XPMathUtils.getClosestLevelByXp(this.obeliskTile.getEnergy()); int toAdd = XPMathUtils.totalXpByLevel(currentLvl+1) - this.obeliskTile.getEnergy(); this.obeliskTile.insertXp(toAdd); } } public void retrieveOneLevel() { PlayerEntity player = container.getPlayer(); Gramarye.LOGGER.debug("player"); if(!player.isCreative()) { int obeliskTotal = this.container.getEnergy(); int obeliskLvl = XPMathUtils.getClosestLevelByXp(obeliskTotal); if(obeliskTotal > 0 && obeliskLvl > 0) { int currentLvlsWorth = XPMathUtils.getXpToLevelUp(obeliskLvl-1); this.obeliskTile.removeXp(currentLvlsWorth); player.giveExperiencePoints(currentLvlsWorth); } else if(obeliskTotal > 0 && obeliskLvl <= 0) { this.obeliskTile.removeXp(obeliskTotal); player.giveExperiencePoints(obeliskTotal); } } else { int currentLvl = XPMathUtils.getClosestLevelByXp(this.obeliskTile.getEnergy()); int toRemove = this.obeliskTile.getEnergy() - XPMathUtils.totalXpByLevel(currentLvl-1); this.obeliskTile.removeXp(toRemove); } } } container package com.mekelaina.gramarye.gui.containers; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.blocks.ModBlocks; import com.mekelaina.gramarye.blocks.tiles.ObeliskTile; import com.mekelaina.gramarye.items.ModItems; import com.mekelaina.gramarye.util.CustomEnergyStorage; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.IWorldPosCallable; import net.minecraft.util.IntReferenceHolder; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.wrapper.InvWrapper; public class ObeliskContainer extends ExtendedContainer { public ObeliskContainer(int windowId, World world, BlockPos pos, PlayerInventory playerInventory, PlayerEntity player) { super(ModContainers.OBELISK_CONTAINER.get(), windowId); tileEntity = world.getTileEntity(pos); this.playerEntity = player; this.playerInventory = new InvWrapper(playerInventory); tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).ifPresent(handler -> { addSlot(new SlotItemHandler(handler, 0, 24, 45)); }); layoutPlayerInventorySlots(8, 84); trackInt(new IntReferenceHolder() { @Override public int get() { return getEnergy(); } @Override public void set(int value) { tileEntity.getCapability(CapabilityEnergy.ENERGY).ifPresent(h -> ((CustomEnergyStorage)h).setEnergy(value)); } }); } public int getEnergy() { return tileEntity.getCapability(CapabilityEnergy.ENERGY).map(IEnergyStorage::getEnergyStored).orElse(0); } @Override public boolean canInteractWith(PlayerEntity playerIn) { return isWithinUsableDistance(IWorldPosCallable.of(tileEntity.getWorld(), tileEntity.getPos()), playerIn, ModBlocks.OBELISK.get()); } @Override public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { ItemStack itemStack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if(slot != null && slot.getHasStack()) { ItemStack stack = slot.getStack(); itemStack = stack.copy(); if(index == 0) { if(!this.mergeItemStack(stack, 1, 37, true)) { return ItemStack.EMPTY; } slot.onSlotChange(stack, itemStack); } else { if(stack.getItem() == Items.EXPERIENCE_BOTTLE || stack.getItem() == ModItems.CRYSTAL.get() || stack.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { if(!this.mergeItemStack(stack, 0, 1, false)) { return ItemStack.EMPTY; } } else if(index < 28) { if(!this.mergeItemStack(stack, 28, 37, false)) { return ItemStack.EMPTY; } } else if(index < 37 && !this.mergeItemStack(stack, 1, 28, false)) { return ItemStack.EMPTY; } } if(stack.isEmpty()) { slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } if(stack.getCount() == itemStack.getCount()) { return ItemStack.EMPTY; } slot.onTake(playerIn, stack); } return itemStack; } public ObeliskTile getTileEntity() { return (ObeliskTile)this.tileEntity; } private boolean isItemValid(ItemStack stack) { Gramarye.LOGGER.debug(stack); if(stack.getItem() == Items.EXPERIENCE_BOTTLE || stack.getItem() == ModItems.CRYSTAL.get() || stack.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { return true; } return false; } public PlayerEntity getPlayer(){ return this.playerEntity; } } tile entity package com.mekelaina.gramarye.blocks.tiles; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.blocks.ModBlocks; import com.mekelaina.gramarye.gui.containers.ObeliskContainer; import com.mekelaina.gramarye.items.ModItems; import com.mekelaina.gramarye.util.CustomEnergyStorage; import com.mekelaina.gramarye.util.XPMathUtils; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class ObeliskTile extends TileEntity implements ITickableTileEntity, INamedContainerProvider { private LazyOptional<IItemHandler> handler = LazyOptional.of(this::createHandler); private LazyOptional<IEnergyStorage> energy = LazyOptional.of(this::createEnergy); private ArrayList<InputWrapper> toProcess = new ArrayList<>(); private int counter; private int inputType=0; private ItemStack lastItem; private double speed = 2; private double translation = 0; private double lastTranslation = 0; public ObeliskTile() { super(ModTileEntities.OBELISK_TILE.get()); } @Override public void tick() { if(world.isRemote()) { return; } if(counter > 0) { counter--; if(counter <= 0) { energy.ifPresent(e -> ((CustomEnergyStorage)e).addEnergy(getXpPerInput())); inputType = 0; } markDirty(); } if(counter <=0) { handler.ifPresent(handler1 -> { ItemStack stack = handler1.getStackInSlot(0); if(stack.getItem() == Items.EXPERIENCE_BOTTLE || stack.getItem() == ModItems.CRYSTAL.get() || stack.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { lastItem = stack.copy(); handler1.extractItem(0, 1, false); counter = 20; markDirty(); } }); } /*for (InputWrapper i : toProcess) { Gramarye.LOGGER.debug("DOOOOOOOOO"); if(i.isAdd()){ energy.ifPresent(iEnergyStorage -> { ((CustomEnergyStorage)iEnergyStorage).addEnergy(XPMathUtils.getXpToInsert(iEnergyStorage.getEnergyStored(), iEnergyStorage.getMaxEnergyStored(), i.getAmount())); }); } else { energy.ifPresent(iEnergyStorage -> { ((CustomEnergyStorage)iEnergyStorage).consumeEnergy(XPMathUtils.getXpToInsert(iEnergyStorage.getEnergyStored(), iEnergyStorage.getMaxEnergyStored(), i.getAmount())); }); } //toProcess.remove(i); markDirty(); } toProcess.clear();*/ sendOutPower(); } private void sendOutPower() { energy.ifPresent(e -> { AtomicInteger capacity = new AtomicInteger(e.getEnergyStored()); if(capacity.get() > 0) { for (Direction direction : Direction.values()) { TileEntity tileEntity = world.getTileEntity(pos.offset(direction)); if(tileEntity != null) { boolean doContinue = tileEntity.getCapability(CapabilityEnergy.ENERGY, direction).map(handler -> { if(handler.canReceive()) { int received = handler.receiveEnergy(Math.min(capacity.get(), 100), false); capacity.addAndGet(-received); ((CustomEnergyStorage)e).consumeEnergy(received); markDirty(); return capacity.get() > 0; } else { return true; } }).orElse(true); if(!doContinue) { return; } } } } }); } @Override public void read(CompoundNBT compound) { CompoundNBT invTag = compound.getCompound("inv"); handler.ifPresent(handler1 -> ((INBTSerializable<CompoundNBT>)handler1).deserializeNBT(invTag)); CompoundNBT energyTag = compound.getCompound("experion"); energy.ifPresent(energy1 -> ((CustomEnergyStorage)energy1).setEnergy(energyTag.getInt("experion"))); CompoundNBT speedTag = compound.getCompound("speed"); this.speed = speedTag.getDouble("speed"); super.read(compound); } @Override public CompoundNBT write(CompoundNBT compound) { handler.ifPresent(h -> { CompoundNBT compoundNBT = ((INBTSerializable<CompoundNBT>)h).serializeNBT(); compound.put("inv", compoundNBT); }); energy.ifPresent(h -> { CompoundNBT compoundNBT = ((INBTSerializable<CompoundNBT>)h).serializeNBT(); compound.put("experion", compoundNBT); }); compound.putDouble("speed", this.speed); return super.write(compound); } private ItemStackHandler createHandler() { return new ItemStackHandler(1){ @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { if(stack.getItem() == Items.EXPERIENCE_BOTTLE || stack.getItem() == ModItems.CRYSTAL.get() || stack.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { return true; } return false; } @Override protected void onContentsChanged(int slot) { markDirty(); } @Nonnull @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if(stack.getItem() != ModItems.CRYSTAL.get() && stack.getItem() != Items.EXPERIENCE_BOTTLE && stack.getItem() != ModBlocks.CRYSTALBLOCK.get().asItem()){ return stack; } return super.insertItem(slot, stack, simulate); } }; } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return handler.cast(); } if(cap == CapabilityEnergy.ENERGY) { return energy.cast(); } return super.getCapability(cap, side); } @Override public ITextComponent getDisplayName() { return new TranslationTextComponent("block.gramarye.obelisk"); } @Nullable @Override public Container createMenu(int i, PlayerInventory playerInventory, PlayerEntity playerEntity) { return new ObeliskContainer(i, world, pos, playerInventory, playerEntity); } private IEnergyStorage createEnergy() { return new CustomEnergyStorage(2048, 0); } private int getXpPerInput() { if(lastItem != null) { if(lastItem.getItem() == Items.EXPERIENCE_BOTTLE) { lastItem = ItemStack.EMPTY; return 3 + this.world.rand.nextInt(5) + this.world.rand.nextInt(5); } if(lastItem.getItem() == ModItems.CRYSTAL.get()) { lastItem = ItemStack.EMPTY; return 20; } if(lastItem.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { lastItem = ItemStack.EMPTY; return 100; } } return 0; } public boolean insertXp(int amount) { AtomicBoolean rtn = new AtomicBoolean(false); energy.ifPresent(iEnergyStorage -> { int temp = XPMathUtils.getXpToInsert(iEnergyStorage.getEnergyStored(), iEnergyStorage.getMaxEnergyStored(), amount); ((CustomEnergyStorage)iEnergyStorage).addEnergy(temp); rtn.set(true); markDirty(); }); //markDirty(); return rtn.get(); /*toProcess.add(new InputWrapper(amount, true)); return true;*/ } public boolean removeXp(int amount) { AtomicBoolean rtn = new AtomicBoolean(false); energy.ifPresent(iEnergyStorage -> { int temp = XPMathUtils.getXpToInsert(iEnergyStorage.getEnergyStored(), iEnergyStorage.getMaxEnergyStored(), amount); ((CustomEnergyStorage)iEnergyStorage).consumeEnergy(temp); rtn.set(true); markDirty(); }); return rtn.get(); /*toProcess.add(new InputWrapper(amount, false)); return true;*/ } private void calculateTranslation() { this.lastTranslation = this.translation; this.translation += (float)(Math.sin(speed * counter)); } public double getTranslation() { return translation; } public int getCapacity() { AtomicInteger temp = new AtomicInteger(); energy.ifPresent(e -> { temp.set(e.getMaxEnergyStored());}); return temp.get(); } public int getEnergy() { AtomicInteger temp = new AtomicInteger(); energy.ifPresent(e -> { temp.set(e.getEnergyStored()); }); return temp.get(); } private boolean isItemValid(ItemStack stack) { //Gramarye.LOGGER.debug("called from is item valid"); if(stack.getItem() == Items.EXPERIENCE_BOTTLE) { inputType = 1; Gramarye.LOGGER.debug("xp bottle " + inputType); return true; } else if(stack.getItem() == ModItems.CRYSTAL.get()) { inputType = 2; Gramarye.LOGGER.debug("crystal " + inputType); return true; } else if(stack.getItem() == ModBlocks.CRYSTALBLOCK.get().asItem()) { inputType = 3; Gramarye.LOGGER.debug("cryatal blcok " + inputType); return true; } return false; } } class InputWrapper { private int amount; private boolean add; public InputWrapper(int amount, boolean add) { this.amount = amount; this.add = add; } public int getAmount() { return amount; } public boolean isAdd() { return add; } } the energy capability extension package com.mekelaina.gramarye.util; import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.energy.EnergyStorage; public class CustomEnergyStorage extends EnergyStorage implements INBTSerializable<CompoundNBT> { public CustomEnergyStorage(int capacity, int maxTransfer) { super(capacity, maxTransfer); } public void setEnergy(int energy){ this.energy = energy; } public void addEnergy(int energy) { this.energy += energy; if(this.energy > getMaxEnergyStored()){ this.energy = getEnergyStored(); } } public void consumeEnergy(int energy) { this.energy -= energy; if(this.energy < 0){ this.energy = 0; } } @Override public CompoundNBT serializeNBT() { CompoundNBT tag = new CompoundNBT(); tag.putInt("experion", getEnergyStored()); return tag; } @Override public void deserializeNBT(CompoundNBT nbt) { setEnergy(nbt.getInt("experion")); } }
-
[1.14-1.15] How to render an item using a TileEntityRenderer (TER)
Mekelaina replied to Mekelaina's topic in Modder Support
Note this topic was posted multiple times, this was in error. I guess refreshing the error screen reposed it idk. -
So Ive been trying to get my block to render whatever item its given, but Im having trouble with the rendering part. I was trying to reuse/update code from a tutorial i followed back for 1.12 from shadowfacts with limited success. I haven't found a better example tho. The item renders as a weirdly textured square and only when observed from certain angles (as shown below) what am i doing wrong and if anyone has a good example of how to render stuff properly in 1.14-1.15 it would be greatly appreciated. This is the code of my TER: package com.mekelaina.gramarye.client.render; import com.mekelaina.gramarye.blocks.tiles.ChargerTile; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.Texture; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraftforge.client.ForgeHooksClient; import org.lwjgl.opengl.GL11; public class ChargerTileEntityRenderer extends TileEntityRenderer<ChargerTile> { public ChargerTileEntityRenderer() { } @Override public void render(ChargerTile tileEntityIn, double x, double y, double z, float partialTicks, int destroyStage) { ItemStack stack = new ItemStack(Items.DIAMOND); if(!stack.isEmpty()){ GlStateManager.enableRescaleNormal(); GlStateManager.alphaFunc(GL11.GL_GREATER, 0.1f); GlStateManager.enableBlend(); RenderHelper.enableStandardItemLighting(); GlStateManager.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); GlStateManager.pushMatrix(); //double offset = Math.sin((tileEntityIn.getWorld().getT)) GlStateManager.translated(x + 0.5, y + 0.6, z + 0.5); GlStateManager.rotated((tileEntityIn.getWorld().getGameTime() + partialTicks) * 1.5, 0, 1, 0); IBakedModel model = Minecraft.getInstance().getItemRenderer().getItemModelWithOverrides(stack, tileEntityIn.getWorld(), null); model = ForgeHooksClient.handleCameraTransforms(model, ItemCameraTransforms.TransformType.GROUND, false); Minecraft.getInstance().getItemRenderer().renderItem(stack, model); GlStateManager.popMatrix(); GlStateManager.disableRescaleNormal(); GlStateManager.disableBlend(); } super.render(tileEntityIn, x, y, z, partialTicks, destroyStage); } private void renderItem(ItemStack stack){ } } and this is the result: https://imgur.com/z2PgRVm
-
@TheGreyGhost the what now? I didnt see a get property function. unless you mean the get(propetyname)PropertyOverride method you used for your lamda function. in my case that just returns the float value private static float getElementPropertyOverride(ItemStack stack, @Nullable World world, @Nullable LivingEntity entity){ return boundSpell.getSpellElement().getValue(); } private static float getLevelPropertyOverride(ItemStack stack, @Nullable World world, @Nullable LivingEntity entity){ return boundSpell.getSpellLevel().getValue(); }
-
So Im trying to make it so the textures used for my item depends on values that are passed in from a spell object upon creation. so ideally I can just define a new spell with an element and a level and the model will override with the right textures. this probably isnt how the system is supposed to be used, but I was trying to get out of assigning each model manually and could just have each spellbook use the base model with the predicates and such. But idk if mt custom addPropertiesOverride predicates arent registered right or what because they arent working. is there something im missing, do they require a capability or? any help is appreciated. The Item class package com.mekelaina.gramarye.items; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.Spell.Spell; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.LivingEntity; import net.minecraft.item.IItemPropertyGetter; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ActionResultType; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import javax.annotation.Nullable; import java.util.List; public class GenericSpellBook extends Item{ private final Spell boundSpell; public GenericSpellBook(Spell spellToBind) { super(new Properties() .maxStackSize(1) .group(Gramarye.setup.itemGroup) ); this.boundSpell = spellToBind; this.addPropertyOverride(new ResourceLocation("gramarye:element"), new IItemPropertyGetter() { @Override public float call(ItemStack stack, @Nullable World world, @Nullable LivingEntity entity) { return boundSpell.getSpellElement().getValue(); } }); this.addPropertyOverride(new ResourceLocation("gramarye:level"), new IItemPropertyGetter() { @Override public float call(ItemStack stack, @Nullable World world, @Nullable LivingEntity entity) { return boundSpell.getSpellLevel().getValue(); } }); } @Override public boolean updateItemStackNBT(CompoundNBT nbt) { return super.updateItemStackNBT(nbt); } @Nullable @Override public CompoundNBT getShareTag(ItemStack stack) { CompoundNBT compoundNBT = stack.getOrCreateTag(); compoundNBT.putFloat("spellElement", boundSpell.getSpellElement().getValue()); compoundNBT.putFloat("spellLevel", boundSpell.getSpellLevel().getValue()); return compoundNBT; } @Override public void readShareTag(ItemStack stack, @Nullable CompoundNBT nbt) { super.readShareTag(stack, nbt); } @Override public ActionResultType onItemUse(ItemUseContext context) { context.getPlayer().sendStatusMessage(new StringTextComponent(boundSpell.getSpellElement().toString()), false); context.getPlayer().sendStatusMessage(new StringTextComponent(boundSpell.getSpellLevel().toString()), false); return boundSpell.onSpellCast(context); } } { "parent": "item/generated", "textures": { "layer0": "gramarye:item/book/loot_spellbook" }, "overrides": [ { "predicate": { "gramarye:element": 0, "gramarye:level": 0 }, "model": "gramarye:item/book/spellbook_fire_novice" } ] } { "parent": "gramarye:item/book/spellbook_base", "textures": { "layer0": "gramarye:item/book/loot_spellbook", "layer1": "gramarye:item/book/fire", "layer2": "gramarye/item/book/novice" } }
-
the 2s were just a constant acceleration for the entity. Most of the actual code for the projectile entity was taken from vanillas fireball code. They are used to calculate how quickly the entity should accelerate.
-
the entity wont render, and most of the time im not even sure if my wand item is actually creating the entity. and occasionally ill get the message in chat of it hitting a certain block but not consistently.
-
heres the log
-
@Ugdhar sorry, its been a day. here is a link to my repository all of the entity code is in the entities package, and the ClientSetup class is where client side stuff is registered
-
@Ugdhar But its not working, if you look at my source code i did what you said
-
@poopoodice do you have an example of how to use IRenderFactory?
-
what new registerEntityRenderingHandler? im using this one "RenderingRegistry.registerEntityRenderingHandler" in my client setup class. is there another one?
-
Ive been trying to create a custom projectile entity, and the entity kinda works, but i cant get it to render properly. It wont render at all. My Classes: Note, most of the entity code comes from the vanilla fireball Abstract projectile package com.mekelaina.gramarye.entities; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.projectile.ProjectileHelper; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.network.IPacket; import net.minecraft.network.play.server.SSpawnObjectPacket; import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.DamageSource; import net.minecraft.util.math.*; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public abstract class AbstractBoltEntity extends Entity { public LivingEntity shootingEntity; private int ticksAlive; private int ticksInAir; public double accelerationX; public double accelerationY; public double accelerationZ; protected AbstractBoltEntity(EntityType<? extends AbstractBoltEntity> entityType, World world) { super(entityType, world); } public AbstractBoltEntity(EntityType<? extends AbstractBoltEntity> EntityType, double x, double y, double z, double xAccIn, double yAccIn, double zAccIn, World world) { this(EntityType, world); this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); this.setPosition(x, y, z); double d0 = (double) MathHelper.sqrt(xAccIn * xAccIn + yAccIn * yAccIn + zAccIn * zAccIn); this.accelerationX = xAccIn / d0 * 0.1D; this.accelerationY = yAccIn / d0 * 0.1D; this.accelerationZ = zAccIn / d0 * 0.1D; } public AbstractBoltEntity(EntityType<? extends AbstractBoltEntity> entityType, LivingEntity shootingEntityIn, double xAccIn, double yAccIn, double zAccIn, World world) { this(entityType, world); this.shootingEntity = shootingEntityIn; this.setLocationAndAngles(shootingEntityIn.posX, shootingEntityIn.posY, shootingEntityIn.posZ, shootingEntityIn.rotationYaw, shootingEntityIn.rotationPitch); this.setPosition(this.posX, this.posY, this.posZ); this.setMotion(Vec3d.ZERO); xAccIn = xAccIn + this.rand.nextGaussian() * 0.4D; yAccIn = yAccIn + this.rand.nextGaussian() * 0.4D; zAccIn = zAccIn + this.rand.nextGaussian() * 0.4D; double d0 = (double) MathHelper.sqrt(xAccIn * xAccIn + yAccIn * yAccIn + zAccIn * zAccIn); this.accelerationX = xAccIn / d0 * 0.1D; this.accelerationY = yAccIn / d0 * 0.1D; this.accelerationZ = zAccIn / d0 * 0.1D; } @OnlyIn(Dist.CLIENT) public boolean isInRangeToRenderDist(double distance) { double d0 = this.getBoundingBox().getAverageEdgeLength() * 4.0D; if (Double.isNaN(d0)) { d0 = 4.0D; } d0 = d0 * 64.0D; return distance < d0 * d0; } /** * Called to update the entity's position/logic. */ public void tick() { if (this.world.isRemote || (this.shootingEntity == null || !this.shootingEntity.removed) && this.world.isBlockLoaded(new BlockPos(this))) { super.tick(); ++this.ticksInAir; RayTraceResult raytraceresult = ProjectileHelper.func_221266_a(this, true, this.ticksInAir >= 25, this.shootingEntity, RayTraceContext.BlockMode.COLLIDER); if (raytraceresult.getType() != RayTraceResult.Type.MISS && !net.minecraftforge.event.ForgeEventFactory.onProjectileImpact(this, raytraceresult)) { this.onImpact(raytraceresult); } Vec3d vec3d = this.getMotion(); this.posX += vec3d.x; this.posY += vec3d.y; this.posZ += vec3d.z; ProjectileHelper.rotateTowardsMovement(this, 0.2F); float f = this.getMotionFactor(); if (this.isInWater()) { for(int i = 0; i < 4; ++i) { float f1 = 0.25F; this.world.addParticle(ParticleTypes.BUBBLE, this.posX - vec3d.x * 0.25D, this.posY - vec3d.y * 0.25D, this.posZ - vec3d.z * 0.25D, vec3d.x, vec3d.y, vec3d.z); } f = 0.8F; } this.setMotion(vec3d.add(this.accelerationX, this.accelerationY, this.accelerationZ).scale((double)f)); this.world.addParticle(this.getParticle(), this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); this.setPosition(this.posX, this.posY, this.posZ); } else { this.remove(); } } protected IParticleData getParticle() { return ParticleTypes.SMOKE; } /** * Return the motion factor for this projectile. The factor is multiplied by the original motion. */ protected float getMotionFactor() { return 0.95F; } /** * Called when this EntityFireball hits a block or entity. */ protected abstract void onImpact(RayTraceResult result); public void writeAdditional(CompoundNBT compound) { Vec3d vec3d = this.getMotion(); compound.put("direction", this.newDoubleNBTList(new double[]{vec3d.x, vec3d.y, vec3d.z})); compound.put("power", this.newDoubleNBTList(new double[]{this.accelerationX, this.accelerationY, this.accelerationZ})); compound.putInt("life", this.ticksAlive); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readAdditional(CompoundNBT compound) { if (compound.contains("power", 9)) { ListNBT listnbt = compound.getList("power", 6); if (listnbt.size() == 3) { this.accelerationX = listnbt.getDouble(0); this.accelerationY = listnbt.getDouble(1); this.accelerationZ = listnbt.getDouble(2); } } this.ticksAlive = compound.getInt("life"); if (compound.contains("direction", 9) && compound.getList("direction", 6).size() == 3) { ListNBT listnbt1 = compound.getList("direction", 6); this.setMotion(listnbt1.getDouble(0), listnbt1.getDouble(1), listnbt1.getDouble(2)); } else { this.remove(); } } /** * Returns true if other Entities should be prevented from moving through this Entity. */ public boolean canBeCollidedWith() { return true; } public float getCollisionBorderSize() { return 1.0F; } /** * Called when the entity is attacked. */ public boolean attackEntityFrom(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; } else { this.markVelocityChanged(); if (source.getTrueSource() != null) { Vec3d vec3d = source.getTrueSource().getLookVec(); this.setMotion(vec3d); this.accelerationX = vec3d.x * 0.1D; this.accelerationY = vec3d.y * 0.1D; this.accelerationZ = vec3d.z * 0.1D; if (source.getTrueSource() instanceof LivingEntity) { this.shootingEntity = (LivingEntity)source.getTrueSource(); } return true; } else { return false; } } } /** * Gets how bright this entity is. */ public float getBrightness() { return 1.0F; } @OnlyIn(Dist.CLIENT) public int getBrightnessForRender() { return 15728880; } public IPacket<?> createSpawnPacket() { int i = this.shootingEntity == null ? 0 : this.shootingEntity.getEntityId(); return new SSpawnObjectPacket(this.getEntityId(), this.getUniqueID(), this.posX, this.posY, this.posZ, this.rotationPitch, this.rotationYaw, this.getType(), i, new Vec3d(this.accelerationX, this.accelerationY, this.accelerationZ)); } } Actual entity package com.mekelaina.gramarye.entities; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.IPacket; import net.minecraft.util.DamageSource; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; public class SpellBoltEntity extends AbstractBoltEntity{ protected boolean doesDamage = false; protected float damageAmt = 0f; protected DamageSource damageSource = DamageSource.GENERIC; public SpellBoltEntity(EntityType<? extends AbstractBoltEntity> entityType, World world) { super(entityType, world); } /* @Override public IPacket<?> createSpawnPacket() { return NetworkHooks.getEntitySpawningPacket(this); }*/ public SpellBoltEntity(EntityType<? extends AbstractBoltEntity> entityType, LivingEntity shootingEntityIn, double xAccIn, double yAccIn, double zAccIn, World world) { super(entityType, shootingEntityIn, xAccIn, yAccIn, zAccIn, world); } @Override protected void onImpact(RayTraceResult result) { BlockPos pos = new BlockPos(result.getHitVec().x, result.getHitVec().y, result.getHitVec().z); if(shootingEntity instanceof PlayerEntity) { ((PlayerEntity) shootingEntity).sendStatusMessage(this.world.getBlockState(pos).getBlock().getNameTextComponent(), false); } this.remove(); } @Override protected void registerData() { } public boolean isDoesDamage() { return doesDamage; } public void setDoesDamage() { this.doesDamage = true; } public float getDamageAmt() { return damageAmt; } public void setDamageAmt(float damageAmt) { this.damageAmt = damageAmt; } public DamageSource getDamageSource() { return damageSource; } public void setDamageSource(DamageSource damageSource) { this.damageSource = damageSource; } } Renderer package com.mekelaina.gramarye.entities; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.entities.SpellBoltEntity; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.ResourceLocation; import javax.annotation.Nullable; public class DefaultSpellBoltRenderer extends EntityRenderer<SpellBoltEntity> { private static final ResourceLocation TEXTURE = new ResourceLocation(Gramarye.MODID, "textures/entity/entitybolt2.png"); //private static final DefaultSpellBoltModel MODEL = new DefaultSpellBoltModel(); public DefaultSpellBoltRenderer(EntityRendererManager renderManager) { super(renderManager); bindTexture(TEXTURE); } @Nullable @Override protected ResourceLocation getEntityTexture(SpellBoltEntity entity) { return TEXTURE; } @Override public void doRender(SpellBoltEntity entity, double x, double y, double z, float entityYaw, float partialTicks) { super.doRender(entity, x, y, z, entityYaw, partialTicks); renderManager.renderEntity(entity, x, y, z, entityYaw, partialTicks, false); // MODEL.render(entity, 0f, 0f, 0f, entityYaw, e); } } Where its registered package com.mekelaina.gramarye.setup; import com.mekelaina.gramarye.Gramarye; import com.mekelaina.gramarye.entities.DefaultSpellBoltRenderer; import com.mekelaina.gramarye.entities.SpellBoltEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @Mod.EventBusSubscriber(modid = Gramarye.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ClientSetup { public static void init(final FMLClientSetupEvent event) { } @SubscribeEvent public static void onClientSetupEvent(FMLClientSetupEvent event) { RenderingRegistry.registerEntityRenderingHandler(SpellBoltEntity.class, DefaultSpellBoltRenderer::new); } }
-
[1.14-1.15] How to create a custom projectile entity
Mekelaina replied to Mekelaina's topic in Modder Support
@Ugdhar thanks for the tip. what do you mean by update mappings? -
I havent been able to find a good resource for this and all the vanilla code here is obfuscated. I want to create a generic projectile entity i can use for my mod. most likely one that i will make sub classes of for more specific things. what I need to know about the entity is where its coming from (who or what shot it) and what direction its going, and when it hits something. Im not asking for someone to do the work for me, im just having trouble wrapping my mind around how it works and am looking for any good resources/tutorials/tips.
-
So I was following a tutorial by mcjty and on his baked model code I ran into an issue where the block would render fine in the inventory but the game would crash when trying to render it as a block. I'm really confused cause I dont know where the problem could be. Here are the relevant classes. Note that the code is messy and was to be cleaned up at a later point. FancyBlock.java package com.mekelaina.mytutorial.blocks; import com.mekelaina.mytutorial.blocks.tiles.FancyBlockTile; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import javax.annotation.Nullable; public class FancyBlock extends Block { private final VoxelShape shape = VoxelShapes.create(.2,.2,.2,.8,.8,.8); public FancyBlock() { super(Properties.create(Material.IRON) .sound(SoundType.METAL) .hardnessAndResistance(2f)); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { return shape; } @Override public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new FancyBlockTile(); } @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { ItemStack item = player.getHeldItem(handIn); if(!item.isEmpty() && item.getItem() instanceof BlockItem) { if(!worldIn.isRemote) { TileEntity te = worldIn.getTileEntity(pos); if(te instanceof FancyBlockTile) { BlockState mimicState = ((BlockItem) item.getItem()).getBlock().getDefaultState(); ((FancyBlockTile) te).setMimic(mimicState); } } return true; } return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); } } FancyBlockTile.java package com.mekelaina.mytutorial.blocks.tiles; import com.mekelaina.mytutorial.blocks.ModBlocks; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.model.ModelDataManager; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.common.util.Constants; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Objects; public class FancyBlockTile extends TileEntity { public static final ModelProperty<BlockState> MIMIC = new ModelProperty<>(); private BlockState mimic; public FancyBlockTile() { super(ModBlocks.FANCYBLOCK_TILE.get()); } public void setMimic(BlockState mimic) { this.mimic = mimic; markDirty(); world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), Constants.BlockFlags.BLOCK_UPDATE + Constants.BlockFlags.NOTIFY_NEIGHBORS); } @Nullable @Override public SUpdateTileEntityPacket getUpdatePacket() { CompoundNBT tag = new CompoundNBT(); if(mimic != null) { tag.put("mimic", NBTUtil.writeBlockState(mimic)); } return new SUpdateTileEntityPacket(pos, 1, tag); } @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { BlockState oldMimic = mimic; CompoundNBT tag = pkt.getNbtCompound(); if(tag.contains("mimic")) { mimic = NBTUtil.readBlockState(tag.getCompound("mimic")); if(!Objects.equals(oldMimic, mimic)) { ModelDataManager.requestModelDataRefresh(this); world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), Constants.BlockFlags.BLOCK_UPDATE + Constants.BlockFlags.NOTIFY_NEIGHBORS); } } } @Nonnull @Override public IModelData getModelData() { return new ModelDataMap.Builder().withInitial(MIMIC, mimic).build(); } @Override public void read(CompoundNBT compound) { super.read(compound); if(compound.contains("mimic")) { mimic = NBTUtil.readBlockState(compound.getCompound("mimic")); } } @Override public CompoundNBT write(CompoundNBT compound) { if(mimic != null) { compound.put("mimic", NBTUtil.writeBlockState(mimic)); } return super.write(compound); } } FancyBakedModel.java package com.mekelaina.mytutorial.blocks.bakedmodels; import com.mekelaina.mytutorial.MyTutorial; import com.mekelaina.mytutorial.blocks.tiles.FancyBlockTile; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; import net.minecraftforge.client.model.data.IDynamicBakedModel; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class FancyBakedModel implements IDynamicBakedModel { private final VertexFormat format; private final ItemCameraTransforms transforms = getAllTransforms(); public FancyBakedModel(VertexFormat format) { this.format = format; } private TextureAtlasSprite getTexture() { String name = MyTutorial.MODID + ":block/fancyblock"; return Minecraft.getInstance().getTextureMap().getAtlasSprite(name); } private void putVertex(UnpackedBakedQuad.Builder builder, Vec3d normal, double x, double y, double z, float u, float v, TextureAtlasSprite sprite, float r, float g, float b) { for(int e = 0; e < format.getElementCount(); e++) { switch(format.getElement(e).getUsage()) { case POSITION: builder.put(e, (float)x, (float)y, (float)z, 1.0f); break; case COLOR: builder.put(e, r, g, b, 1.0f); break; case UV: if(format.getElement(e).getIndex() == 0) { u = sprite.getInterpolatedU(u); v = sprite.getInterpolatedV(v); builder.put(e, u, v, 0f, 1f); } break; case NORMAL: builder.put(e, (float)normal.x, (float)normal.y, (float)normal.z, 0f); break; default: builder.put(e); break; } } } private BakedQuad createQuad(Vec3d v1, Vec3d v2, Vec3d v3, Vec3d v4, TextureAtlasSprite sprite) { Vec3d normal = v3.subtract(v2).crossProduct(v1.subtract(v2)).normalize(); UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format); builder.setTexture(sprite); putVertex(builder, normal, v1.x, v1.y, v1.z, 0, 0, sprite, 1f, 1f, 1f); putVertex(builder, normal, v2.x, v2.y, v2.z, 0, 16, sprite, 1f, 1f, 1f); putVertex(builder, normal, v3.x, v3.y, v3.z, 16, 16, sprite, 1f, 1f, 1f); putVertex(builder, normal, v4.x, v4.y, v4.z, 16, 0, sprite, 1f, 1f, 1f); return builder.build(); } private static Vec3d v(double x, double y, double z) { return new Vec3d(x, y, z); } @Nonnull @Override public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { BlockState mimic = extraData.getData(FancyBlockTile.MIMIC); if (mimic != null) { ModelResourceLocation location = BlockModelShapes.getModelLocation(mimic); if (location != null) { IBakedModel model = Minecraft.getInstance().getModelManager().getModel(location); if (model != null) { return model.getQuads(mimic, side, rand, extraData); } } } if (side != null) { return Collections.emptyList(); } TextureAtlasSprite texture = getTexture(); List<BakedQuad> quads = new ArrayList<>(); double l = .2; double r = 1-.2; quads.add(createQuad(v(l, r, l), v(l, r, r), v(r, r, r), v(r, r, l), texture)); quads.add(createQuad(v(l, l, l), v(r, l, l), v(r, l, r), v(l, l, r), texture)); quads.add(createQuad(v(r, r, r), v(r, l, r), v(r, l, l), v(r, r, l), texture)); quads.add(createQuad(v(l, r, l), v(l, l, l), v(l, l, r), v(l, r, r), texture)); quads.add(createQuad(v(r, r, l), v(r, l, l), v(l, l, l), v(l, r, l), texture)); quads.add(createQuad(v(l, r, r), v(l, l, r), v(r, l, r), v(r, r, r), texture)); return quads; } @Override public boolean isAmbientOcclusion() { return true; } @Override public boolean isGui3d() { return false; } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getParticleTexture() { return getTexture(); } @Override public ItemOverrideList getOverrides() { return ItemOverrideList.EMPTY; } @Override public ItemCameraTransforms getItemCameraTransforms() { return transforms; } public ItemCameraTransforms getAllTransforms() { ItemTransformVec3f tpLeft = this.getTransform(ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND); ItemTransformVec3f tpRight = this.getTransform(ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND); ItemTransformVec3f fpLeft = this.getTransform(ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND); ItemTransformVec3f fpRight = this.getTransform(ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND); ItemTransformVec3f head = this.getTransform(ItemCameraTransforms.TransformType.HEAD); ItemTransformVec3f gui = this.getTransform(ItemCameraTransforms.TransformType.GUI); ItemTransformVec3f ground = this.getTransform(ItemCameraTransforms.TransformType.GROUND); ItemTransformVec3f fixed = this.getTransform(ItemCameraTransforms.TransformType.FIXED); return new ItemCameraTransforms(tpLeft, tpRight, fpLeft, fpRight, head, gui, ground, fixed); } private ItemTransformVec3f getTransform(ItemCameraTransforms.TransformType type) { if (type.equals(ItemCameraTransforms.TransformType.GUI)) { return new ItemTransformVec3f(new Vector3f(200, 50, 100), new Vector3f(), new Vector3f(1.0F, 1.0F, 1.0F)); } return ItemTransformVec3f.DEFAULT; } } ModBlocks.class package com.mekelaina.mytutorial.blocks; import com.mekelaina.mytutorial.MyTutorial; import com.mekelaina.mytutorial.blocks.screens.FirstBlockContainer; import com.mekelaina.mytutorial.blocks.tiles.FancyBlockTile; import com.mekelaina.mytutorial.blocks.tiles.FirstBlockTile; import net.minecraft.block.Block; import net.minecraft.inventory.container.ContainerType; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.extensions.IForgeContainerType; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ObjectHolder; public class ModBlocks { public static final String FIRSTBLOCK_NAME = "firstblock"; public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, MyTutorial.MODID); public static final DeferredRegister<TileEntityType<?>> TILE_ENTITYS = new DeferredRegister<>(ForgeRegistries.TILE_ENTITIES, MyTutorial.MODID); public static final DeferredRegister<ContainerType<?>> CONTAINERS = new DeferredRegister<>(ForgeRegistries.CONTAINERS, MyTutorial.MODID); public static final RegistryObject<Block> FIRSTBLOCK = BLOCKS.register("firstblock", () -> new FirstBlock()); public static final RegistryObject<Block> FANCYBLOCK = BLOCKS.register("fancyblock", FancyBlock::new); public static final RegistryObject<TileEntityType<FirstBlockTile>> FIRSTBLOCK_TILE = TILE_ENTITYS.register("firstblock", () -> TileEntityType.Builder.create(FirstBlockTile::new, FIRSTBLOCK.get()).build(null)); public static final RegistryObject<TileEntityType<FancyBlockTile>> FANCYBLOCK_TILE = TILE_ENTITYS.register("fancyblock", () -> TileEntityType.Builder.create(FancyBlockTile::new, FANCYBLOCK.get()).build(null)); public static final RegistryObject<ContainerType<FirstBlockContainer>> FIRSTBLOCK_CONTAINER = CONTAINERS.register("firstblock", () -> IForgeContainerType.create(((windowId, inv, data) -> { BlockPos pos = data.readBlockPos(); return new FirstBlockContainer(windowId, MyTutorial.proxy.getClientWorld(), pos, inv, MyTutorial.proxy.getClientPlayer()); }))); } ClientRegistration.java package com.mekelaina.mytutorial.setup; import com.mekelaina.mytutorial.MyTutorial; import com.mekelaina.mytutorial.blocks.ModBlocks; import com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel; import com.mekelaina.mytutorial.items.ModItems; import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ColorHandlerEvent; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(modid = MyTutorial.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ClientRegistration { @SubscribeEvent public static void onTextureStitch(TextureStitchEvent.Pre event) { if(!event.getMap().getBasePath().equals("textures")) { return; } event.addSprite(new ResourceLocation(MyTutorial.MODID, "block/fancyblock")); } @SubscribeEvent public static void onModelBake(ModelBakeEvent event) { event.getModelRegistry().put(new ModelResourceLocation(ModBlocks.FANCYBLOCK.get().getRegistryName(), ""), new FancyBakedModel(DefaultVertexFormats.BLOCK)); event.getModelRegistry().put(new ModelResourceLocation(ModBlocks.FANCYBLOCK.get().getRegistryName(), "inventory"), new FancyBakedModel(DefaultVertexFormats.ITEM)); } } Error Log [05Jun2020 23:57:04.823] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--gameDir, ., --launchTarget, fmluserdevclient, --fml.mcpVersion, 20190829.143755, --fml.mcVersion, 1.14.4, --fml.forgeGroup, net.minecraftforge, --fml.forgeVersion, 28.2.16, --version, MOD_DEV, --assetIndex, 1.14, --assetsDir, C:\Users\ChloeRae\.gradle\caches\forge_gradle\assets, --username, Dev, --accessToken, ❄❄❄❄❄❄❄❄, --userProperties, {}] [05Jun2020 23:57:04.826] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 4.1.0+62+5bfa59b starting: java version 1.8.0_171 by Oracle Corporation [05Jun2020 23:57:06.312] [main/INFO] [net.minecraftforge.fml.loading.FixSSL/CORE]: Added Lets Encrypt root certificates as additional trust [05Jun2020 23:57:07.553] [main/INFO] [cpw.mods.modlauncher.LaunchServiceHandler/MODLAUNCHER]: Launching target 'fmluserdevclient' with arguments [--version, MOD_DEV, --gameDir, ., --assetsDir, C:\Users\ChloeRae\.gradle\caches\forge_gradle\assets, --assetIndex, 1.14, --username, Dev, --accessToken, ❄❄❄❄❄❄❄❄, --userProperties, {}] [05Jun2020 23:57:10.757] [Client thread/INFO] [net.minecraft.client.Minecraft/]: Setting user: Dev [05Jun2020 23:57:22.742] [Client thread/WARN] [net.minecraft.client.GameSettings/]: Skipping bad option: lastServer: [05Jun2020 23:57:22.781] [Client thread/INFO] [net.minecraft.client.Minecraft/]: LWJGL Version: 3.2.2 build 10 [05Jun2020 23:57:23.808] [modloading-worker-1/INFO] [net.minecraftforge.common.ForgeMod/FORGEMOD]: Forge mod loading, version 28.2.16, for MC 1.14.4 with MCP 20190829.143755 [05Jun2020 23:57:23.808] [modloading-worker-1/INFO] [net.minecraftforge.common.MinecraftForge/FORGE]: MinecraftForge v28.2.16 Initialized [05Jun2020 23:57:24.210] [Client thread/WARN] [net.minecraft.entity.EntityType/]: No data fixer registered for entity mytutorial:weirdmob [05Jun2020 23:57:26.866] [Client thread/INFO] [com.mojang.text2speech.NarratorWindows/]: Narrator library for x64 successfully loaded [05Jun2020 23:57:28.304] [Forge Version Check/INFO] [net.minecraftforge.fml.VersionChecker/]: [forge] Starting version check at https://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json [05Jun2020 23:57:28.731] [Forge Version Check/INFO] [net.minecraftforge.fml.VersionChecker/]: [forge] Found status: OUTDATED Current: 28.2.16 Target: 28.2.18 [05Jun2020 23:57:28.732] [Forge Version Check/INFO] [net.minecraftforge.fml.VersionChecker/]: [mytutorial] Starting version check at http://myurl.me/ [05Jun2020 23:57:28.978] [Forge Version Check/WARN] [net.minecraftforge.fml.VersionChecker/]: Failed to process update information java.io.IOException: Server returned HTTP response code: 400 for URL: http://myurl.me/ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_171] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_171] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_171] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1944) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1939) ~[?:1.8.0_171] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1938) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1508) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) ~[?:1.8.0_171] at net.minecraftforge.fml.VersionChecker$1.openUrlStream(VersionChecker.java:189) ~[?:?] at net.minecraftforge.fml.VersionChecker$1.process(VersionChecker.java:206) ~[?:?] at java.lang.Iterable.forEach(Iterable.java:75) [?:1.8.0_171] at net.minecraftforge.fml.VersionChecker$1.run(VersionChecker.java:157) [?:?] Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://myurl.me/ at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894) ~[?:1.8.0_171] at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) ~[?:1.8.0_171] at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) ~[?:1.8.0_171] at net.minecraftforge.fml.VersionChecker$1.openUrlStream(VersionChecker.java:173) ~[?:?] ... 3 more [05Jun2020 23:57:30.856] [Server-Worker-5/WARN] [net.minecraft.client.renderer.model.ModelBakery/]: Unable to load model: 'mytutorial:block/fancyblock' referenced from: mytutorial:fancyblock#: java.io.FileNotFoundException: mytutorial:models/block/fancyblock.json [05Jun2020 23:57:31.534] [Server-Worker-5/WARN] [net.minecraft.client.renderer.model.ModelBakery/]: Unable to load model: 'mytutorial:fancyblock#inventory' referenced from: mytutorial:fancyblock#inventory: java.io.FileNotFoundException: mytutorial:models/item/fancyblock.json [05Jun2020 23:57:32.690] [Client thread/WARN] [net.minecraft.client.GameSettings/]: Skipping bad option: lastServer: [05Jun2020 23:57:32.786] [Client thread/INFO] [net.minecraft.client.audio.SoundSystem/]: OpenAL initialized. [05Jun2020 23:57:32.787] [Client thread/INFO] [net.minecraft.client.audio.SoundEngine/SOUNDS]: Sound engine started [05Jun2020 23:57:32.919] [Client thread/INFO] [net.minecraft.client.renderer.texture.AtlasTexture/]: Created: 512x512 textures-atlas [05Jun2020 23:57:33.513] [Client thread/INFO] [net.minecraft.client.renderer.texture.AtlasTexture/]: Created: 256x256 textures/particle-atlas [05Jun2020 23:57:33.514] [Client thread/INFO] [net.minecraft.client.renderer.texture.AtlasTexture/]: Created: 256x256 textures/painting-atlas [05Jun2020 23:57:33.515] [Client thread/INFO] [net.minecraft.client.renderer.texture.AtlasTexture/]: Created: 128x128 textures/mob_effect-atlas [05Jun2020 23:57:37.314] [Client thread/WARN] [net.minecraft.command.Commands/]: Ambiguity between arguments [teleport, destination] and [teleport, targets] with inputs: [Player, 0123, @e, dd12be42-52a9-4a91-a8a1-11c01849e498] [05Jun2020 23:57:37.315] [Client thread/WARN] [net.minecraft.command.Commands/]: Ambiguity between arguments [teleport, location] and [teleport, destination] with inputs: [0.1 -0.5 .9, 0 0 0] [05Jun2020 23:57:37.315] [Client thread/WARN] [net.minecraft.command.Commands/]: Ambiguity between arguments [teleport, location] and [teleport, targets] with inputs: [0.1 -0.5 .9, 0 0 0] [05Jun2020 23:57:37.316] [Client thread/WARN] [net.minecraft.command.Commands/]: Ambiguity between arguments [teleport, targets] and [teleport, destination] with inputs: [Player, 0123, dd12be42-52a9-4a91-a8a1-11c01849e498] [05Jun2020 23:57:37.316] [Client thread/WARN] [net.minecraft.command.Commands/]: Ambiguity between arguments [teleport, targets, location] and [teleport, targets, destination] with inputs: [0.1 -0.5 .9, 0 0 0] [05Jun2020 23:57:37.476] [Server thread/INFO] [net.minecraft.server.integrated.IntegratedServer/]: Starting integrated minecraft server version 1.14.4 [05Jun2020 23:57:37.476] [Server thread/INFO] [net.minecraft.server.integrated.IntegratedServer/]: Generating keypair [05Jun2020 23:57:37.561] [Thread-1/FATAL] [net.minecraftforge.common.ForgeConfig/CORE]: Forge config just got changed on the file system! [05Jun2020 23:57:37.640] [Server thread/INFO] [net.minecraftforge.registries.GameData/REGISTRIES]: Injecting existing registry data into this SERVER instance [05Jun2020 23:57:37.843] [Server thread/INFO] [net.minecraft.resources.SimpleReloadableResourceManager/]: Reloading ResourceManager: Default, forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar, main [05Jun2020 23:57:39.066] [Server thread/INFO] [net.minecraft.item.crafting.RecipeManager/]: Loaded 6 recipes [05Jun2020 23:57:40.206] [Server thread/INFO] [net.minecraft.advancements.AdvancementList/]: Loaded 812 advancements [05Jun2020 23:57:40.209] [Server thread/ERROR] [net.minecraftforge.common.loot.LootModifierManager/]: Couldn't read global loot modifier list from forge:loot_modifiers/global_loot_modifiers.json java.io.FileNotFoundException: forge:loot_modifiers/global_loot_modifiers.json at net.minecraft.resources.FallbackResourceManager.getAllResources(FallbackResourceManager.java:102) ~[?:?] at net.minecraft.resources.SimpleReloadableResourceManager.getAllResources(SimpleReloadableResourceManager.java:72) ~[?:?] at net.minecraftforge.common.loot.LootModifierManager.apply(LootModifierManager.java:90) ~[?:?] at net.minecraftforge.common.loot.LootModifierManager.apply(LootModifierManager.java:57) ~[?:?] at net.minecraft.client.resources.ReloadListener.lambda$reload$1(ReloadListener.java:14) ~[?:?] at java.util.concurrent.CompletableFuture.uniAccept(CompletableFuture.java:656) ~[?:1.8.0_171] at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:632) ~[?:1.8.0_171] at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:442) ~[?:1.8.0_171] at net.minecraft.resources.AsyncReloader.lambda$null$3(AsyncReloader.java:66) ~[?:?] at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:17) [?:?] at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:137) [?:?] at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) [?:?] at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:110) [?:?] at net.minecraft.server.MinecraftServer.func_213205_aW(MinecraftServer.java:701) [?:?] at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:695) [?:?] at net.minecraft.util.concurrent.ThreadTaskExecutor.driveUntil(ThreadTaskExecutor.java:120) [?:?] at net.minecraft.server.MinecraftServer.loadDataPacks(MinecraftServer.java:1438) [?:?] at net.minecraft.server.MinecraftServer.loadDataPacks(MinecraftServer.java:438) [?:?] at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:75) [?:?] at net.minecraft.server.integrated.IntegratedServer.init(IntegratedServer.java:94) [?:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:600) [?:?] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171] [05Jun2020 23:57:40.834] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Preparing start region for dimension minecraft:overworld [05Jun2020 23:57:41.590] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 0% [05Jun2020 23:57:41.591] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 0% [05Jun2020 23:57:43.623] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 83% [05Jun2020 23:57:43.623] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 83% [05Jun2020 23:57:43.623] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 83% [05Jun2020 23:57:43.623] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 83% [05Jun2020 23:57:43.888] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 95% [05Jun2020 23:57:44.388] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Preparing spawn area: 96% [05Jun2020 23:57:44.888] [Client thread/INFO] [net.minecraft.world.chunk.listener.LoggingChunkStatusListener/]: Time elapsed: 4033 ms [05Jun2020 23:57:45.353] [Server thread/INFO] [net.minecraft.world.server.ChunkManager/]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved [05Jun2020 23:57:45.353] [Server thread/INFO] [net.minecraft.world.server.ChunkManager/]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved [05Jun2020 23:57:48.663] [Netty Local Client IO #0/INFO] [net.minecraftforge.fml.network.NetworkHooks/]: Connected to a modded server. [05Jun2020 23:57:48.745] [Server thread/INFO] [net.minecraftforge.common.AdvancementLoadFix/]: Using new advancement loading for net.minecraft.advancements.PlayerAdvancements@4e051296 [05Jun2020 23:57:48.830] [Server thread/INFO] [net.minecraft.server.management.PlayerList/]: Dev[local:E:79a12c84] logged in with entity id 272 at (100.47880956651221, 64.0, 206.04085553757596) [05Jun2020 23:57:48.860] [Client thread/ERROR] [net.minecraftforge.fml.network.simple.IndexedMessageCodec/SIMPLENET]: Received empty payload on channel fml:handshake [05Jun2020 23:57:48.861] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Dev joined the game [05Jun2020 23:57:49.234] [Server thread/ERROR] [net.minecraftforge.fml.network.simple.IndexedMessageCodec/SIMPLENET]: Received empty payload on channel fml:handshake [05Jun2020 23:57:49.234] [Server thread/INFO] [net.minecraft.server.integrated.IntegratedServer/]: Saving and pausing game... [05Jun2020 23:57:49.243] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Saving chunks for level 'New World'/minecraft:overworld [05Jun2020 23:57:49.416] [Client thread/INFO] [net.minecraft.advancements.AdvancementList/]: Loaded 21 advancements [05Jun2020 23:57:50.498] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Stopping server [05Jun2020 23:57:50.499] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Saving players [05Jun2020 23:57:50.504] [Server thread/INFO] [net.minecraft.network.play.ServerPlayNetHandler/]: Dev lost connection: Disconnected [05Jun2020 23:57:50.504] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Dev left the game [05Jun2020 23:57:50.514] [Server thread/INFO] [net.minecraft.network.play.ServerPlayNetHandler/]: Stopping singleplayer server as player logged out [05Jun2020 23:57:50.514] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Saving worlds [05Jun2020 23:57:50.514] [Server thread/INFO] [net.minecraft.server.MinecraftServer/]: Saving chunks for level 'New World'/minecraft:overworld [05Jun2020 23:57:50.559] [Server thread/INFO] [net.minecraft.world.server.ChunkManager/]: ThreadedAnvilChunkStorage (New World (1)): All chunks are saved [05Jun2020 23:57:50.573] [Server thread/INFO] [net.minecraft.world.server.ChunkManager/]: ThreadedAnvilChunkStorage (New World (1)): All chunks are saved [05Jun2020 23:57:51.144] [Client thread/FATAL] [net.minecraft.client.Minecraft/]: Reported exception thrown! net.minecraft.crash.ReportedException: Tesselating block model at net.minecraft.client.renderer.BlockRendererDispatcher.renderBlock(BlockRendererDispatcher.java:71) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.chunk.ChunkRender.rebuildChunk(ChunkRender.java:190) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.chunk.ChunkRenderWorker.processTask(ChunkRenderWorker.java:90) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.updateChunkNow(ChunkRenderDispatcher.java:174) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.WorldRenderer.setupTerrain(WorldRenderer.java:789) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:691) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:640) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:494) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:890) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.Minecraft.run(Minecraft.java:384) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.main.Main.main(Main.java:128) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171] at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-4.1.0.jar:?] at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-4.1.0.jar:?] at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-4.1.0.jar:?] at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-4.1.0.jar:?] at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-4.1.0.jar:?] at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] Caused by: java.lang.IllegalStateException: not enough data at net.minecraftforge.client.model.pipeline.UnpackedBakedQuad$Builder.build(UnpackedBakedQuad.java:175) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.createQuad(FancyBakedModel.java:77) ~[main/:?] at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.getQuads(FancyBakedModel.java:106) ~[main/:?] at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.render(ForgeBlockModelRenderer.java:99) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.renderModelSmooth(ForgeBlockModelRenderer.java:84) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:50) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] at net.minecraft.client.renderer.BlockRendererDispatcher.renderBlock(BlockRendererDispatcher.java:60) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] ... 21 more [05Jun2020 23:57:51.170] [Client thread/INFO] [STDOUT/]: [net.minecraft.util.registry.Bootstrap:printToSYSOUT:100]: ---- Minecraft Crash Report ---- // Uh... Did I do that? Time: 6/5/20 11:57 PM Description: Tesselating block model java.lang.IllegalStateException: not enough data at net.minecraftforge.client.model.pipeline.UnpackedBakedQuad$Builder.build(UnpackedBakedQuad.java:175) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading} at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.createQuad(FancyBakedModel.java:77) ~[main/:?] {re:classloading} at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.getQuads(FancyBakedModel.java:106) ~[main/:?] {re:classloading} at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.render(ForgeBlockModelRenderer.java:99) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading} at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.renderModelSmooth(ForgeBlockModelRenderer.java:84) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading} at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:50) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.BlockRendererDispatcher.renderBlock(BlockRendererDispatcher.java:60) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.chunk.ChunkRender.rebuildChunk(ChunkRender.java:190) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.chunk.ChunkRenderWorker.processTask(ChunkRenderWorker.java:90) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.updateChunkNow(ChunkRenderDispatcher.java:174) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.WorldRenderer.setupTerrain(WorldRenderer.java:789) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:691) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:640) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:494) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:890) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:384) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:128) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171] {} at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171] {} at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171] {} at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171] {} at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-4.1.0.jar:?] {} at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar:?] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at net.minecraftforge.client.model.pipeline.UnpackedBakedQuad$Builder.build(UnpackedBakedQuad.java:175) at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.createQuad(FancyBakedModel.java:77) at com.mekelaina.mytutorial.blocks.bakedmodels.FancyBakedModel.getQuads(FancyBakedModel.java:106) at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.render(ForgeBlockModelRenderer.java:99) at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.renderModelSmooth(ForgeBlockModelRenderer.java:84) -- Block model being tesselated -- Details: Block: Block{mytutorial:fancyblock} Block location: World: (103,64,205), Chunk: (at 7,4,13 in 6,12; contains blocks 96,0,192 to 111,255,207), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Using AO: true Stacktrace: at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:50) -- Block being tesselated -- Details: Block: Block{mytutorial:fancyblock} Block location: World: (103,64,205), Chunk: (at 7,4,13 in 6,12; contains blocks 96,0,192 to 111,255,207), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Stacktrace: at net.minecraft.client.renderer.BlockRendererDispatcher.renderBlock(BlockRendererDispatcher.java:60) at net.minecraft.client.renderer.chunk.ChunkRender.rebuildChunk(ChunkRender.java:190) at net.minecraft.client.renderer.chunk.ChunkRenderWorker.processTask(ChunkRenderWorker.java:90) at net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.updateChunkNow(ChunkRenderDispatcher.java:174) at net.minecraft.client.renderer.WorldRenderer.setupTerrain(WorldRenderer.java:789) at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:691) at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:640) -- Affected level -- Details: All players: 1 total; [ClientPlayerEntity['Dev'/272, l='MpServer', x=100.48, y=64.00, z=206.04]] Chunk stats: Client Chunk Cache: 729, 441 Level dimension: DimensionType{minecraft:overworld} Level name: MpServer Level seed: 0 Level generator: ID 00 - default, ver 1. Features enabled: false Level generator options: {} Level spawn location: World: (112,63,210), Chunk: (at 0,3,2 in 7,13; contains blocks 112,0,208 to 127,255,223), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 140813 game time, 8350 day time Level storage version: 0x00000 - Unknown? Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false Server brand: forge Server type: Integrated singleplayer server Stacktrace: at net.minecraft.client.world.ClientWorld.fillCrashReport(ClientWorld.java:410) at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:1750) at net.minecraft.client.Minecraft.run(Minecraft.java:400) at net.minecraft.client.main.Main.main(Main.java:128) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) -- System Details -- Details: Minecraft Version: 1.14.4 Minecraft Version ID: 1.14.4 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_171, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 455419792 bytes (434 MB) / 2124414976 bytes (2026 MB) up to 3810525184 bytes (3634 MB) CPUs: 8 JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump ModLauncher: 4.1.0+62+5bfa59b ModLauncher launch target: fmluserdevclient ModLauncher naming: mcp ModLauncher services: /eventbus-1.0.0-service.jar eventbus PLUGINSERVICE /forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-launcher.jar object_holder_definalize PLUGINSERVICE /forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-launcher.jar runtime_enum_extender PLUGINSERVICE /accesstransformers-1.0.5-shadowed.jar accesstransformer PLUGINSERVICE /forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-launcher.jar capability_inject_definalize PLUGINSERVICE /forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-launcher.jar runtimedistcleaner PLUGINSERVICE /forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-launcher.jar fml TRANSFORMATIONSERVICE FML: 28.2 Forge: net.minecraftforge:28.2.16 FML Language Providers: javafml@28.2 minecraft@1 Mod List: client-extra.jar Minecraft {minecraft@1.14.4 DONE} forge-1.14.4-28.2.16_mapped_stable_58-1.14.4-recomp.jar Forge {forge@28.2.16 DONE} main My Tutorial {mytutorial@NONE DONE} Launched Version: MOD_DEV LWJGL: 3.2.2 build 10 OpenGL: GeForce GTX 1050 Ti/PCIe/SSE2 GL version 4.6.0 NVIDIA 446.14, NVIDIA Corporation GL Caps: Using GL 1.3 multitexturing. Using GL 1.3 texture combiners. Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported. Shaders are available because OpenGL 2.1 is supported. VBOs are available because OpenGL 1.5 is supported. Using VBOs: Yes Is Modded: Definitely; Client brand changed to 'forge' Type: Client (map_client.txt) Resource Packs: Current Language: English (US) CPU: 8x Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz [05Jun2020 23:57:51.172] [Client thread/INFO] [STDOUT/]: [net.minecraft.util.registry.Bootstrap:printToSYSOUT:100]: #@!@# Game crashed! Crash report saved to: #@!@# C:\Users\ChloeRae\Desktop\All modern minecraft modding shiz\gramarye and beyon\tutorial\run\.\crash-reports\crash-2020-06-05_23.57.51-client.txt This is all a lot to wrap ones head around and I dont fully understand it all myself, so any help would be appreciated
-
Sorry if this is a dumb question, but i was following mcjty's tutorial for 1.14-1.15 and he went the route of creating a custom item that would act as a spawnegg, as opposed to using the vanilla item. claiming that in order to use the vanilla system, you'd have to register the entities before items because the EntityType<?> variable in the SpawnEggItem class is final. At least that's how I understood it, I could be wrong. It just seems weird to me to circumvent the vanilla system in this case. like since its something basically every modder is gonna use (if they add entities) you'd think there would either be a forge spawn item or you'd just use the vanilla. I just wanted to get some opinions on what way would be better/nicer. Is it bad practice to register entities before items? or is there another reason that I'm just not familiar with? I'm basically a novice here.
-
Nevermind, I accidentally used the old method that doesn't pass in the block state. so use hasTileEntity(BlockState state) and it works fine
-
So I was playing around with making a block with a tile entity and noticed that the method hasTileEntity() is deprecated. What's up with that? Looking at the block class it says this in the annotation: //Forge: New State sensitive version. Is this just something forge is still working on atm? I'm using the 1.14.4 version 28.0.45
-
@V0idWa1k3r Wow, I'm sorry it gave you such a hard time. All of my stuff is self-taught so I didn't know that they were bad. Those files aren't useless tho. Each one is a card that is to be implemented, I just shortened the amount actually loaded to speed up launching while I worked on the rest. Granted I should probably remove them when not in use, but I didn't exactly plan to upload it to GitHub yet, lol. Do you have a list somewhere of good practices to do? Or could you maybe list what I did that was bad? All of the framework stuff was cobbled together from outdated tutorials, as there wasn't really any better options for someone new to modding. That's why I didn't mess with GitHub until now tbh because my code is ugly and gross as I was trying to figure out how things work. (here's to hoping that the 1.14 tutorials will be better)
-
@V0idWa1k3r right, sorry. Yeah if you could take a look that would be great. Imtrying to switch from Eclipse to IntelliJ since I recently got my school license. (that has lead to its own, unrelated issues.) my eclipse debugger just wouldn't work, so yeah... sorry. Here is the repo: https://github.com/Mekelaina/Duelcraft