Skip to content

Commit

Permalink
Added sturdy bee cage
Browse files Browse the repository at this point in the history
Moved render stuff away from bee ingredient class
  • Loading branch information
Jais Djurhuus-Kempel committed Feb 6, 2021
1 parent e9f366d commit ce59e8e
Show file tree
Hide file tree
Showing 16 changed files with 375 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ public ItemStack dispenseStack(IBlockSource source, ItemStack stack) {
BlockPos spawnPos = source.getBlockPos().offset(direction);

entity.setPositionAndRotation(spawnPos.getX() + 0.5, spawnPos.getY(), spawnPos.getZ() + 0.5, 0, 0);
if (source.getWorld().addEntity(entity)) {

if (source.getWorld().addEntity(entity) && stack.getItem().equals(ModItems.BEE_CAGE.get())) {
stack.shrink(1);
}
return stack;
Expand All @@ -137,6 +138,7 @@ public ItemStack dispenseStack(IBlockSource source, ItemStack stack) {
}
};
DispenserBlock.registerDispenseBehavior(ModItems.BEE_CAGE.get(), cageDispensebehavior);
DispenserBlock.registerDispenseBehavior(ModItems.STURDY_BEE_CAGE.get(), cageDispensebehavior);

this.fixPOI(event);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
package cy.jdkdigital.productivebees.client.render.ingredient;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import cy.jdkdigital.productivebees.ProductiveBeesConfig;
import cy.jdkdigital.productivebees.common.entity.bee.ConfigurableBeeEntity;
import cy.jdkdigital.productivebees.common.entity.bee.ProductiveBeeEntity;
import cy.jdkdigital.productivebees.integrations.jei.ingredients.BeeIngredient;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.BeeEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

import javax.annotation.Nonnull;
import java.util.HashMap;
import java.util.Map;

public class BeeRenderer
{
public static void render(int xPosition, int yPosition, BeeIngredient beeIngredient, Minecraft minecraft) {
if (ProductiveBeesConfig.CLIENT.renderBeeIngredientAsEntity.get()) {
BeeEntity bee = beeIngredient.getCachedEntity(minecraft.world);

if (minecraft.player != null && bee != null) {
if (bee instanceof ConfigurableBeeEntity) {
((ConfigurableBeeEntity) bee).setBeeType(beeIngredient.getBeeType().toString());
}

if (bee instanceof ProductiveBeeEntity) {
((ProductiveBeeEntity) bee).setRenderStatic();
}

bee.ticksExisted = minecraft.player.ticksExisted;
bee.renderYawOffset = -20;

float scaledSize = 18;

MatrixStack matrixStack = new MatrixStack();
matrixStack.push();
matrixStack.translate(7 + xPosition, 12 + yPosition, 1.5);
matrixStack.rotate(Vector3f.ZP.rotationDegrees(190.0F));
matrixStack.rotate(Vector3f.YP.rotationDegrees(20.0F));
matrixStack.rotate(Vector3f.XP.rotationDegrees(20.0F));
matrixStack.translate(0.0F, -0.2F, 1);
matrixStack.scale(scaledSize, scaledSize, scaledSize);

EntityRendererManager entityrenderermanager = minecraft.getRenderManager();
IRenderTypeBuffer.Impl buffer = minecraft.getRenderTypeBuffers().getBufferSource();
entityrenderermanager.renderEntityStatic(bee, 0, 0, 0.0D, minecraft.getRenderPartialTicks(), 1, matrixStack, buffer, 15728880);
buffer.finish();
matrixStack.pop();
}
} else {
renderBeeFace(xPosition, yPosition, beeIngredient, minecraft.world);
}
}

private static final Map<Integer, Map<String, Integer>> renderSettings = new HashMap<Integer, Map<String, Integer>>()
{{
put(0, new HashMap<String, Integer>()
{{
put("scale", 128);
put("iconX", 14);
put("iconY", 14);
put("iconU", 20);
put("iconV", 20);
}});
put(1, new HashMap<String, Integer>()
{{
put("scale", 128);
put("iconX", 12);
put("iconY", 12);
put("iconU", 20);
put("iconV", 20);
}});
}};
private static void renderBeeFace(int xPosition, int yPosition, BeeIngredient beeIngredient, World world) {
RenderSystem.enableBlend();
RenderSystem.enableAlphaTest();
ResourceLocation resLocation = getBeeTexture(beeIngredient, world);
Minecraft.getInstance().getTextureManager().bindTexture(resLocation);

Map<String, Integer> iconSettings = renderSettings.get(beeIngredient.getRenderType());
float[] color = colorCache.get(beeIngredient.getBeeType().toString());

float scale = (float) 1 / iconSettings.get("scale");
int iconX = iconSettings.get("iconX");
int iconY = iconSettings.get("iconY");
int iconU = iconSettings.get("iconU");
int iconV = iconSettings.get("iconV");

if (color == null) {
color = new float[] {1.0f, 1.0f, 1.0f};
}
RenderSystem.color4f(color[0], color[1], color[2], 1.0f);
BufferBuilder renderBuffer = Tessellator.getInstance().getBuffer();

renderBuffer.begin(7, DefaultVertexFormats.POSITION_TEX);
renderBuffer.pos(xPosition, yPosition + iconY, 0D).tex((iconU) * scale, (iconV + iconY) * scale).color(color[0], color[1], color[2], 1.0f).endVertex();
renderBuffer.pos(xPosition + iconX, yPosition + iconY, 0D).tex((iconU + iconX) * scale, (iconV + iconY) * scale).color(color[0], color[1], color[2], 1.0f).endVertex();
renderBuffer.pos(xPosition + iconX, yPosition, 0D).tex((iconU + iconX) * scale, (iconV) * scale).color(color[0], color[1], color[2], 1.0f).endVertex();
renderBuffer.pos(xPosition, yPosition, 0D).tex((iconU) * scale, (iconV) * scale).color(color[0], color[1], color[2], 1.0f).endVertex();

Tessellator.getInstance().draw();

RenderSystem.color4f(1.0f, 1.0f, 1.0f, 1.0f);
RenderSystem.disableAlphaTest();
RenderSystem.disableBlend();
}

private static HashMap<String, ResourceLocation> beeTextureLocations = new HashMap<>();
private static HashMap<String, float[]> colorCache = new HashMap<>();
public static ResourceLocation getBeeTexture(@Nonnull BeeIngredient ingredient, World world) {
String beeId = ingredient.getBeeType().toString();
if (beeTextureLocations.get(beeId) != null) {
return beeTextureLocations.get(beeId);
}

Entity bee = ingredient.getBeeEntity().create(world);
if (bee instanceof ConfigurableBeeEntity) {
((ConfigurableBeeEntity) bee).setBeeType(ingredient.getBeeType().toString());
colorCache.put(beeId, ((ConfigurableBeeEntity) bee).getColor(0).getComponents(null));
}

EntityRendererManager manager = Minecraft.getInstance().getRenderManager();
EntityRenderer renderer = manager.getRenderer(bee);

ResourceLocation resource = renderer.getEntityTexture(bee);
beeTextureLocations.put(beeId, resource);

return beeTextureLocations.get(beeId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import cy.jdkdigital.productivebees.common.entity.bee.ProductiveBeeEntity;
import cy.jdkdigital.productivebees.init.ModAdvancements;
import cy.jdkdigital.productivebees.init.ModItems;
import cy.jdkdigital.productivebees.util.BeeAttributes;
import cy.jdkdigital.productivebees.util.BeeHelper;
import net.minecraft.client.gui.screen.Screen;
Expand Down Expand Up @@ -70,13 +69,17 @@ public ActionResultType onItemUse(ItemUseContext context) {
entity.setPositionAndRotation(blockPos.getX() + 0.5, blockPos.getY(), blockPos.getZ() + 0.5, 0, 0);
worldIn.addEntity(entity);

// Delete stack
context.getPlayer().inventory.deleteStack(stack);
postItemUse(context);
}

return ActionResultType.SUCCESS;
}

protected void postItemUse(ItemUseContext context) {
// Delete stack
context.getPlayer().inventory.deleteStack(context.getItem());
}

@Override
public boolean itemInteractionForEntity(ItemStack itemStack, PlayerEntity player, LivingEntity targetIn, Hand hand) {
if (targetIn.getEntityWorld().isRemote() || (!(targetIn instanceof BeeEntity) || !targetIn.isAlive()) || (isFilled(itemStack))) {
Expand All @@ -85,9 +88,12 @@ public boolean itemInteractionForEntity(ItemStack itemStack, PlayerEntity player

BeeEntity target = (BeeEntity) targetIn;

ItemStack cageStack = captureEntity(target);
ItemStack cageStack = captureEntity(target, itemStack.getItem());

if (!player.inventory.addItemStackToInventory(cageStack)) {
if (itemStack.getCount() == 1) {
int slot = player.inventory.getSlotFor(itemStack);
player.inventory.add(slot, cageStack);
} else if (!player.inventory.addItemStackToInventory(cageStack)) {
player.dropItem(cageStack, false);
}

Expand All @@ -103,13 +109,12 @@ public boolean itemInteractionForEntity(ItemStack itemStack, PlayerEntity player
return true;
}

public static ItemStack captureEntity(BeeEntity target) {
public static ItemStack captureEntity(BeeEntity target, Item cageItem) {
CompoundNBT nbt = new CompoundNBT();
nbt.putString("entity", EntityType.getKey(target.getType()).toString());
if (target.hasCustomName()) {
nbt.putString("name", target.getCustomName().getFormattedText());
}
else {
} else {
nbt.putString("name", target.getName().getFormattedText());
}
target.writeWithoutTypeId(nbt);
Expand All @@ -124,7 +129,7 @@ public static ItemStack captureEntity(BeeEntity target) {
}
nbt.putString("mod", modName);

ItemStack cageStack = new ItemStack(ModItems.BEE_CAGE.get());
ItemStack cageStack = new ItemStack(cageItem);
cageStack.setTag(nbt);

return cageStack;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package cy.jdkdigital.productivebees.common.item;

import net.minecraft.item.ItemUseContext;

public class SturdyBeeCage extends BeeCage
{
public SturdyBeeCage(Properties properties) {
super(properties);
}

@Override
protected void postItemUse(ItemUseContext context) {
context.getItem().setTag(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void tick() {
if (babeeUpgrades > 0 && !bee.isChild()) {
continue;
}
ItemStack cageStack = BeeCage.captureEntity(bee);
ItemStack cageStack = BeeCage.captureEntity(bee, invItem.getItem());
if (((InventoryHandlerHelper.ItemHandler) invHandler).addOutput(cageStack)) {
bee.remove(true);
invItem.shrink(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.blaze3d.systems.RenderSystem;
import cy.jdkdigital.productivebees.ProductiveBees;
import cy.jdkdigital.productivebees.client.render.ingredient.BeeRenderer;
import cy.jdkdigital.productivebees.common.block.AdvancedBeehive;
import cy.jdkdigital.productivebees.common.tileentity.AdvancedBeehiveTileEntityAbstract;
import cy.jdkdigital.productivebees.common.tileentity.DragonEggHiveTileEntity;
Expand Down Expand Up @@ -109,7 +110,7 @@ protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, i
BeeIngredient beeIngredient = BeeIngredientFactory.getIngredient(type).get();

if (beeIngredient != null) {
BeeIngredient.render(getGuiLeft() + positions.get(i).get(0) - (expanded ? 13 : 0), getGuiTop() + positions.get(i).get(1), beeIngredient, minecraft);
BeeRenderer.render(getGuiLeft() + positions.get(i).get(0) - (expanded ? 13 : 0), getGuiTop() + positions.get(i).get(1), beeIngredient, minecraft);
}
}
i++;
Expand Down
14 changes: 12 additions & 2 deletions src/main/java/cy/jdkdigital/productivebees/event/EventHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import cy.jdkdigital.productivebees.ProductiveBees;
import cy.jdkdigital.productivebees.common.entity.bee.ConfigurableBeeEntity;
import cy.jdkdigital.productivebees.init.ModEntities;
import cy.jdkdigital.productivebees.init.ModItems;
import cy.jdkdigital.productivebees.network.PacketHandler;
import cy.jdkdigital.productivebees.network.packets.Messages;
import cy.jdkdigital.productivebees.setup.BeeReloadListener;
Expand All @@ -24,6 +25,8 @@
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.storage.loot.ItemLootEntry;
import net.minecraftforge.event.LootTableLoadEvent;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
Expand Down Expand Up @@ -116,12 +119,19 @@ public static void onEntityJoinWorld(EntityJoinWorldEvent event) {
Map<String, CompoundNBT> data = BeeReloadListener.INSTANCE.getData();

List<String> beeTypes = new ArrayList<>(data.keySet());


if (!beeTypes.isEmpty()) {
((ConfigurableBeeEntity) entity).setBeeType(beeTypes.get(ProductiveBees.rand.nextInt(beeTypes.size())));
}
}
}
}

@SubscribeEvent
public static void onLootSetup(LootTableLoadEvent event) {
if (event.getName().toString().contains("chests/village")) {
event.getTable().getPool("main").lootEntries.add(
ItemLootEntry.builder(ModItems.STURDY_BEE_CAGE.get()).weight(10).build()
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class ModItems

public static final RegistryObject<Item> HONEY_BUCKET = createItem("honey_bucket", () -> new BucketItem(ModFluids.HONEY, new Item.Properties().maxStackSize(1).group(ModItemGroups.PRODUCTIVE_BEES)));
public static final RegistryObject<Item> BEE_CAGE = createItem("bee_cage", () -> new BeeCage(new Item.Properties().group(ModItemGroups.PRODUCTIVE_BEES)));
public static final RegistryObject<Item> STURDY_BEE_CAGE = createItem("sturdy_bee_cage", () -> new SturdyBeeCage(new Item.Properties().maxStackSize(1).group(ModItemGroups.PRODUCTIVE_BEES)));
public static final RegistryObject<Item> HONEY_TREAT = createItem("honey_treat", () -> new HoneyTreat(new Item.Properties().group(ModItemGroups.PRODUCTIVE_BEES)));
public static final RegistryObject<Item> GENE_BOTTLE = createItem("gene_bottle", () -> new GeneBottle(new Item.Properties().group(ModItemGroups.PRODUCTIVE_BEES)));
public static final RegistryObject<Item> GENE = createItem("gene", () -> new Gene(new Item.Properties().group(ModItemGroups.PRODUCTIVE_BEES)));
Expand Down
Loading

0 comments on commit ce59e8e

Please sign in to comment.