use of com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection in project Create by Creators-of-Create.
the class BlueprintRenderer method render.
@Override
public void render(BlueprintEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) {
PartialModel partialModel = entity.size == 3 ? AllBlockPartials.CRAFTING_BLUEPRINT_3x3 : entity.size == 2 ? AllBlockPartials.CRAFTING_BLUEPRINT_2x2 : AllBlockPartials.CRAFTING_BLUEPRINT_1x1;
SuperByteBuffer sbb = CachedBufferer.partial(partialModel, Blocks.AIR.defaultBlockState());
sbb.rotateY(-yaw).rotateX(90.0F + entity.getXRot()).translate(-.5, -1 / 32f, -.5);
if (entity.size == 2)
sbb.translate(.5, 0, -.5);
sbb.forEntityRender().light(light).renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet()));
super.render(entity, yaw, pt, ms, buffer, light);
ms.pushPose();
float fakeNormalXRotation = -15;
int bl = light >> 4 & 0xf;
int sl = light >> 20 & 0xf;
boolean vertical = entity.getXRot() != 0;
if (entity.getXRot() == -90)
fakeNormalXRotation = -45;
else if (entity.getXRot() == 90 || yaw % 180 != 0) {
bl /= 1.35;
sl /= 1.35;
}
int itemLight = Mth.floor(sl + .5) << 20 | (Mth.floor(bl + .5) & 0xf) << 4;
TransformStack.cast(ms).rotateY(vertical ? 0 : -yaw).rotateX(fakeNormalXRotation);
Matrix3f copy = ms.last().normal().copy();
ms.popPose();
ms.pushPose();
TransformStack.cast(ms).rotateY(-yaw).rotateX(entity.getXRot()).translate(0, 0, 1 / 32f + .001);
if (entity.size == 3)
ms.translate(-1, -1, 0);
PoseStack squashedMS = new PoseStack();
squashedMS.last().pose().multiply(ms.last().pose());
for (int x = 0; x < entity.size; x++) {
squashedMS.pushPose();
for (int y = 0; y < entity.size; y++) {
BlueprintSection section = entity.getSection(x * entity.size + y);
Couple<ItemStack> displayItems = section.getDisplayItems();
squashedMS.pushPose();
squashedMS.scale(.5f, .5f, 1 / 1024f);
displayItems.forEachWithContext((stack, primary) -> {
if (stack.isEmpty())
return;
squashedMS.pushPose();
if (!primary) {
squashedMS.translate(0.325f, -0.325f, 1);
squashedMS.scale(.625f, .625f, 1);
}
squashedMS.last().normal().load(copy);
Minecraft.getInstance().getItemRenderer().renderStatic(stack, TransformType.GUI, itemLight, OverlayTexture.NO_OVERLAY, squashedMS, buffer, 0);
squashedMS.popPose();
});
squashedMS.popPose();
squashedMS.translate(1, 0, 0);
}
squashedMS.popPose();
squashedMS.translate(0, 1, 0);
}
ms.popPose();
}
use of com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection in project Create by Creators-of-Create.
the class BlueprintContainer method createOnClient.
@Override
@OnlyIn(Dist.CLIENT)
protected BlueprintSection createOnClient(FriendlyByteBuf extraData) {
int entityID = extraData.readVarInt();
int section = extraData.readVarInt();
Entity entityByID = Minecraft.getInstance().level.getEntity(entityID);
if (!(entityByID instanceof BlueprintEntity))
return null;
BlueprintEntity blueprintEntity = (BlueprintEntity) entityByID;
BlueprintSection blueprintSection = blueprintEntity.getSection(section);
return blueprintSection;
}
use of com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection in project Create by Creators-of-Create.
the class BlueprintOverlayRenderer method tick.
public static void tick() {
Minecraft mc = Minecraft.getInstance();
HitResult mouseOver = mc.hitResult;
BlueprintSection last = lastTargetedSection;
boolean sneak = mc.player.isShiftKeyDown();
lastTargetedSection = null;
active = false;
if (mouseOver == null)
return;
if (mouseOver.getType() != Type.ENTITY)
return;
EntityHitResult entityRay = (EntityHitResult) mouseOver;
if (!(entityRay.getEntity() instanceof BlueprintEntity))
return;
BlueprintEntity blueprintEntity = (BlueprintEntity) entityRay.getEntity();
BlueprintSection sectionAt = blueprintEntity.getSectionAt(entityRay.getLocation().subtract(blueprintEntity.position()));
lastTargetedSection = last;
active = true;
if (sectionAt != lastTargetedSection || AnimationTickHolder.getTicks() % 10 == 0 || lastSneakState != sneak)
rebuild(sectionAt, sneak);
lastTargetedSection = sectionAt;
lastSneakState = sneak;
}
use of com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection in project Create by Creators-of-Create.
the class BlueprintOverlayRenderer method rebuild.
public static void rebuild(BlueprintSection sectionAt, boolean sneak) {
cachedRenderedFilters.clear();
ItemStackHandler items = sectionAt.getItems();
boolean empty = true;
for (int i = 0; i < 9; i++) {
if (!items.getStackInSlot(i).isEmpty()) {
empty = false;
break;
}
}
BlueprintOverlayRenderer.empty = empty;
BlueprintOverlayRenderer.result = ItemStack.EMPTY;
if (empty)
return;
boolean firstPass = true;
boolean success = true;
Minecraft mc = Minecraft.getInstance();
ItemStackHandler playerInv = new ItemStackHandler(mc.player.getInventory().getContainerSize());
for (int i = 0; i < playerInv.getSlots(); i++) playerInv.setStackInSlot(i, mc.player.getInventory().getItem(i).copy());
int amountCrafted = 0;
Optional<CraftingRecipe> recipe = Optional.empty();
Map<Integer, ItemStack> craftingGrid = new HashMap<>();
ingredients.clear();
ItemStackHandler missingItems = new ItemStackHandler(64);
ItemStackHandler availableItems = new ItemStackHandler(64);
List<ItemStack> newlyAdded = new ArrayList<>();
List<ItemStack> newlyMissing = new ArrayList<>();
boolean invalid = false;
do {
craftingGrid.clear();
newlyAdded.clear();
newlyMissing.clear();
Search: for (int i = 0; i < 9; i++) {
ItemStack requestedItem = items.getStackInSlot(i);
if (requestedItem.isEmpty()) {
craftingGrid.put(i, ItemStack.EMPTY);
continue;
}
for (int slot = 0; slot < playerInv.getSlots(); slot++) {
if (!FilterItem.test(mc.level, playerInv.getStackInSlot(slot), requestedItem))
continue;
ItemStack currentItem = playerInv.extractItem(slot, 1, false);
craftingGrid.put(i, currentItem);
newlyAdded.add(currentItem);
continue Search;
}
success = false;
newlyMissing.add(requestedItem);
}
if (success) {
CraftingContainer craftingInventory = new BlueprintCraftingInventory(craftingGrid);
if (!recipe.isPresent())
recipe = mc.level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, mc.level);
ItemStack resultFromRecipe = recipe.filter(r -> r.matches(craftingInventory, mc.level)).map(r -> r.assemble(craftingInventory)).orElse(ItemStack.EMPTY);
if (resultFromRecipe.isEmpty()) {
if (!recipe.isPresent())
invalid = true;
success = false;
} else if (resultFromRecipe.getCount() + amountCrafted > 64) {
success = false;
} else {
amountCrafted += resultFromRecipe.getCount();
if (result.isEmpty())
result = resultFromRecipe.copy();
else
result.grow(resultFromRecipe.getCount());
resultCraftable = true;
firstPass = false;
}
}
if (success || firstPass) {
newlyAdded.forEach(s -> ItemHandlerHelper.insertItemStacked(availableItems, s, false));
newlyMissing.forEach(s -> ItemHandlerHelper.insertItemStacked(missingItems, s, false));
}
if (!success) {
if (firstPass) {
result = invalid ? ItemStack.EMPTY : items.getStackInSlot(9);
resultCraftable = false;
}
break;
}
if (!sneak)
break;
} while (success);
for (int i = 0; i < 9; i++) {
ItemStack available = availableItems.getStackInSlot(i);
if (available.isEmpty())
continue;
ingredients.add(Pair.of(available, true));
}
for (int i = 0; i < 9; i++) {
ItemStack missing = missingItems.getStackInSlot(i);
if (missing.isEmpty())
continue;
ingredients.add(Pair.of(missing, false));
}
}
Aggregations