Skip to content

Instantly share code, notes, and snippets.

@Lanse505
Created May 31, 2020 20:42
Show Gist options
  • Save Lanse505/8c582492cd76c6cb03babf5615e54b72 to your computer and use it in GitHub Desktop.
Save Lanse505/8c582492cd76c6cb03babf5615e54b72 to your computer and use it in GitHub Desktop.
---- Minecraft Crash Report ----
// Hey, that tickles! Hehehe!
Time: 2020-05-31 22:42
Description: mouseReleased event handler
java.lang.NullPointerException: mouseReleased event handler
at com.teamacronymcoders.quantumquarry.block.QuarryHelper.lambda$getMinerEntriesByLens$1(QuarryHelper.java:142) ~[classes/:?] {re:classloading}
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) ~[?:1.8.0_242] {}
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[?:1.8.0_242] {}
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[?:1.8.0_242] {}
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[?:1.8.0_242] {}
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[?:1.8.0_242] {}
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_242] {}
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566) ~[?:1.8.0_242] {}
at com.teamacronymcoders.quantumquarry.block.QuarryHelper.getMinerEntriesByLens(QuarryHelper.java:146) ~[classes/:?] {re:classloading}
at com.teamacronymcoders.quantumquarry.block.QuarryTile.getRecipesForCache(QuarryTile.java:150) ~[classes/:?] {re:classloading}
at com.teamacronymcoders.quantumquarry.block.QuarryTile.lambda$new$2(QuarryTile.java:64) ~[classes/:?] {re:classloading}
at com.hrznstudio.titanium.component.inventory.InventoryComponent.onContentsChanged(InventoryComponent.java:152) ~[titanium-1.15.2-2.4.0_mapped_snapshot_20200528-1.15.1.jar:2.4.0] {re:classloading}
at net.minecraftforge.items.ItemStackHandler.setStackInSlot(ItemStackHandler.java:60) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading}
at net.minecraftforge.items.SlotItemHandler.putStack(SlotItemHandler.java:61) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading}
at net.minecraft.inventory.container.Container.slotClick(Container.java:273) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.client.multiplayer.PlayerController.windowClick(PlayerController.java:404) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.gui.screen.inventory.ContainerScreen.handleMouseClick(ContainerScreen.java:531) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.gui.screen.inventory.ContainerScreen.mouseReleased(ContainerScreen.java:498) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.MouseHelper.lambda$mouseButtonCallback$1(MouseHelper.java:93) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.gui.screen.Screen.wrapScreenError(Screen.java:446) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.MouseHelper.mouseButtonCallback(MouseHelper.java:91) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.MouseHelper.lambda$null$4(MouseHelper.java:173) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.util.concurrent.ThreadTaskExecutor.execute(ThreadTaskExecutor.java:86) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.client.MouseHelper.lambda$registerCallbacks$5(MouseHelper.java:172) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:36) ~[lwjgl-glfw-3.2.2.jar:build 10] {}
at org.lwjgl.system.JNI.invokeV(Native Method) ~[lwjgl-3.2.2.jar:build 10] {}
at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3101) ~[lwjgl-glfw-3.2.2.jar:build 10] {}
at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:85) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.MainWindow.flipFrame(MainWindow.java:296) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:983) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.run(Minecraft.java:558) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(Main.java:177) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_242] {}
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_242] {}
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242] {}
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242] {}
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-5.1.0.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-5.1.0.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-5.1.0.jar:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-5.1.0.jar:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-5.1.0.jar:?] {}
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar:?] {}
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Render thread
Stacktrace:
at com.teamacronymcoders.quantumquarry.block.QuarryHelper.lambda$getMinerEntriesByLens$1(QuarryHelper.java:142)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
at com.teamacronymcoders.quantumquarry.block.QuarryHelper.getMinerEntriesByLens(QuarryHelper.java:146)
at com.teamacronymcoders.quantumquarry.block.QuarryTile.getRecipesForCache(QuarryTile.java:150)
at com.teamacronymcoders.quantumquarry.block.QuarryTile.lambda$new$2(QuarryTile.java:64)
at com.hrznstudio.titanium.component.inventory.InventoryComponent.onContentsChanged(InventoryComponent.java:152)
at net.minecraftforge.items.ItemStackHandler.setStackInSlot(ItemStackHandler.java:60)
at net.minecraftforge.items.SlotItemHandler.putStack(SlotItemHandler.java:61)
at net.minecraft.inventory.container.Container.slotClick(Container.java:273)
at net.minecraft.client.multiplayer.PlayerController.windowClick(PlayerController.java:404)
at net.minecraft.client.gui.screen.inventory.ContainerScreen.handleMouseClick(ContainerScreen.java:531)
at net.minecraft.client.gui.screen.inventory.ContainerScreen.mouseReleased(ContainerScreen.java:498)
at net.minecraft.client.MouseHelper.lambda$mouseButtonCallback$1(MouseHelper.java:93)
-- Affected screen --
Details:
Screen name: com.hrznstudio.titanium.client.screen.container.BasicAddonScreen
Stacktrace:
at net.minecraft.client.gui.screen.Screen.wrapScreenError(Screen.java:446)
at net.minecraft.client.MouseHelper.mouseButtonCallback(MouseHelper.java:91)
at net.minecraft.client.MouseHelper.lambda$null$4(MouseHelper.java:173)
at net.minecraft.util.concurrent.ThreadTaskExecutor.execute(ThreadTaskExecutor.java:86)
at net.minecraft.client.MouseHelper.lambda$registerCallbacks$5(MouseHelper.java:172)
at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:36)
at org.lwjgl.system.JNI.invokeV(Native Method)
at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3101)
at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:85)
-- Affected level --
Details:
All players: 1 total; [ClientPlayerEntity['Dev'/335, l='MpServer', x=39.75, y=4.00, z=-21.97]]
Chunk stats: Client Chunk Cache: 841, 529
Level dimension: DimensionType{minecraft:overworld}
Level name: MpServer
Level seed: -8574037100930456970
Level generator: ID 01 - flat, ver 0. Features enabled: false
Level generator options: {}
Level spawn location: World: (48,4,-32), Chunk: (at 0,0,0 in 3,-2; contains blocks 48,0,-32 to 63,255,-17), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1)
Level time: 179223 game time, 160178 day time
Known server brands:
Level was modded: false
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:457)
at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:1839)
at net.minecraft.client.Minecraft.run(Minecraft.java:572)
at net.minecraft.client.main.Main.main(Main.java:177)
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.15.2
Minecraft Version ID: 1.15.2
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_242, AdoptOpenJDK
Java VM Version: OpenJDK 64-Bit Server VM (mixed mode),
Memory: 2476313496 bytes (2361 MB) / 3769630720 bytes (3595 MB) up to 7618953216 bytes (7266 MB)
CPUs: 8
JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
ModLauncher: 5.1.0+69+master.79f13f7
ModLauncher launch target: fmluserdevclient
ModLauncher naming: mcp
ModLauncher services:
/eventbus-2.2.0-service.jar eventbus PLUGINSERVICE
/forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-launcher.jar object_holder_definalize PLUGINSERVICE
/forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-launcher.jar runtime_enum_extender PLUGINSERVICE
/accesstransformers-2.1.1-shadowed.jar accesstransformer PLUGINSERVICE
/forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-launcher.jar capability_inject_definalize PLUGINSERVICE
/forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-launcher.jar runtimedistcleaner PLUGINSERVICE
/forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-launcher.jar fml TRANSFORMATIONSERVICE
FML: 31.2
Forge: net.minecraftforge:31.2.5
FML Language Providers:
[email protected]
minecraft@1
Mod List:
client-extra.jar Minecraft {[email protected] DONE}
powah-2941416_mapped_snapshot_20200528-1.15.1.jar Powah {[email protected] DONE}
cucumber-2965044_mapped_snapshot_20200528-1.15.1.jar Cucumber Library {[email protected] DONE}
titanium-1.15.2-2.4.0_mapped_snapshot_20200528-1.15.1.jar Titanium {[email protected] DONE}
silent-lib-2946599_mapped_snapshot_20200528-1.15.1.jar Silent Lib {[email protected]+49 DONE}
lollipop-2941403_mapped_snapshot_20200528-1.15.1.jar Lollipop {[email protected] DONE}
wtbw_lib-2950461_mapped_snapshot_20200528-1.15.1.jar WTBW Library {[email protected] DONE}
jei-1.15.2-6.0.0.3_mapped_snapshot_20200528-1.15.1.jar Just Enough Items {[email protected] DONE}
silents-gems-2961883_mapped_snapshot_20200528-1.15.1.jar Silent's Gems 3 {[email protected]+87 DONE}
resources Quantum Quarry {quantumquarry@null DONE}
mekanism-2958427_mapped_snapshot_20200528-1.15.1.jar Mekanism {[email protected] DONE}
forge-1.15.2-31.2.5_mapped_snapshot_20200528-1.15.1-recomp.jar Forge {[email protected] DONE}
silents-mechanisms-2948946_mapped_snapshot_20200528-1.15.1.jar Silent's Mechanisms {[email protected]+51 DONE}
wtbw_core-2950464_mapped_snapshot_20200528-1.15.1.jar WTBW Core {[email protected] DONE}
mystical-agriculture-2959440_mapped_snapshot_20200528-1.15.1.jar Mystical Agriculture {[email protected] DONE}
Launched Version: MOD_DEV
Backend library: LWJGL version 3.2.2 build 10
Backend API: GeForce GTX 1080 Ti/PCIe/SSE2 GL version 4.6.0 NVIDIA 445.75, NVIDIA Corporation
GL Caps: Using framebuffer using OpenGL 3.0
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-7700K CPU @ 4.20GHz
package com.teamacronymcoders.quantumquarry.block;
import com.hrznstudio.titanium.component.inventory.InventoryComponent;
import com.hrznstudio.titanium.component.inventory.SidedInventoryComponent;
import com.teamacronymcoders.quantumquarry.QuantumConfig;
import com.teamacronymcoders.quantumquarry.QuantumQuarry;
import com.teamacronymcoders.quantumquarry.misc.recipe.ItemStackKey;
import com.teamacronymcoders.quantumquarry.misc.recipe.MinerEntry;
import net.minecraft.block.BlockState;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.server.ServerWorld;
import net.minecraft.world.storage.loot.LootContext.Builder;
import net.minecraft.world.storage.loot.LootParameters;
import net.minecraftforge.common.ToolType;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class QuarryHelper {
private static final List<MinerEntry> ENTRIES = new ArrayList<>();
private static Map<ItemStackKey, List<MinerEntry>> cachedMaps = new HashMap<>();
/**
* @param powerIn Power Stored in the Quarry
* @param lens Stored Lens
* @param tool Stored Appropriate Tool for breaking the blockstate.
* @return returns the amount of operations that can be completed with the current power amount.
*/
public static int getAmountOfOperationsForPower(int powerIn, ItemStack lens, int totalEfficiencyFromTools) {
int powerPerOperation = getPowerPerOperationWithEfficiency(lens, totalEfficiencyFromTools);
return Math.round((float) powerIn / powerPerOperation);
}
/**
* @param lens Stored Lens
* @param totalEfficiencyFromTools Total Efficiency Level from All Tools
* @return Returns the default cost minus the efficiency modifier
*/
public static int getPowerPerOperationWithEfficiency(ItemStack lens, int totalEfficiencyFromTools) {
int efficiency = EnchantmentHelper.getEnchantmentLevel(Enchantments.EFFICIENCY, lens) + totalEfficiencyFromTools;
return Math.max(QuantumConfig.getBaseCost() - (QuantumConfig.getEfficiencyReduction() * efficiency), QuantumConfig.getMinimumPowerDrain());
}
public static boolean doesNotHaveClashingEnchantmentsTool(ItemStack stack, InventoryComponent component) {
boolean hasFortuneInsert = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack) > 0;
boolean hasSilkTouchInsert = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0;
if (hasFortuneInsert) {
for (int i = 0; i < 2; i++) {
boolean hasSilkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, component.getStackInSlot(i)) > 0;
if (hasSilkTouch) return false;
}
}
if (hasSilkTouchInsert) {
for (int i = 0; i < 2; i++) {
boolean hasFortune = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, component.getStackInSlot(i)) > 0;
if (hasFortune) return false;
}
}
return true;
}
public static boolean doesNotHaveClashingEnchantments(ItemStack lens, ItemStack tool) {
Map<Enchantment, Integer> enchantmentsLens = EnchantmentHelper.getEnchantments(lens);
Map<Enchantment, Integer> enchantmentsTool = EnchantmentHelper.getEnchantments(tool);
boolean canInsert = true;
for (Enchantment enchantment : enchantmentsTool.keySet()) {
for (Enchantment enchantment1 : enchantmentsLens.keySet()) {
if (!enchantment.equals(enchantment1)) {
canInsert = enchantment.isCompatibleWith(enchantment1);
}
}
}
return canInsert;
}
/**
* @param world Server World
* @param state BlockState to generate drops for
* @param lens Stored Lens
* @param tool Stored Appropriate Tool for "breaking" the block
* @param playerEntity Nullable Player
* @return List of ItemStack Drops generated from LootTables
*/
public static List<ItemStack> getDrops(@Nonnull BlockPos pos, @Nonnull ServerWorld world, @Nonnull BlockState state, @Nullable ItemStack lens, @Nonnull ItemStack tool, @Nullable PlayerEntity playerEntity) {
Builder context = new Builder(world)
.withParameter(LootParameters.BLOCK_STATE, state)
.withParameter(LootParameters.TOOL, tool)
.withParameter(LootParameters.POSITION, pos);
if (lens != null) {
context.withLuck(3.0F);
}
if (playerEntity != null) {
context.withParameter(LootParameters.THIS_ENTITY, playerEntity);
}
return state.getDrops(context);
}
/**
* @param state Blockstate being broken.
* @param toolInventory Tool-Inventory
* @return Returns the appropriate tool to use to break the tool.
*/
public static ItemStack getAppropriateTool(BlockState state, SidedInventoryComponent<QuarryTile> toolInventory) {
if (state.getHarvestTool() != null) {
switch (state.getHarvestTool().getName()) {
case "axe": return toolInventory.getStackInSlot(0);
case "shovel": return toolInventory.getStackInSlot(1);
case "pickaxe": return toolInventory.getStackInSlot(2);
}
}
return toolInventory.getStackInSlot(2);
}
/**
* @param state Blockstate being broken
* @param tool Appropriate Tool for the Blockstate
* @return Returns if the blockstate can be broken by the tool.
*/
public static boolean canToolBreakBlock(BlockState state, ItemStack tool) {
for (ToolType type : tool.getToolTypes()) {
if (state.getHarvestLevel() < tool.getHarvestLevel(type, null, state)) {
return true;
}
}
return false;
}
public static List<MinerEntry> getMinerEntriesByLens(ItemStack lens) {
ItemStackKey key = new ItemStackKey(lens);
Predicate<MinerEntry> filter = (lens.isEmpty()) ? entry -> true : entry -> entry.getLens().test(lens);
if (cachedMaps.containsKey(key)) {
return cachedMaps.get(key);
}
List<MinerEntry> entries = getEntries().stream().filter(filter).collect(Collectors.toList());
List<MinerEntry> collection = new ArrayList<>();
for (MinerEntry entry : entries) {
if (entry != null) {
collection.add(entry);
}
}
cachedMaps.put(key, collection);
return collection;
}
public static List<MinerEntry> getEntries() {
return ENTRIES;
}
@Nullable
public static MinerEntry getMinerEntry(List<MinerEntry> entries) {
int w = 0;
if (QuantumConfig.getShouldAirExistInTheQuarryPool()) {
w += QuantumConfig.getAirWeightedValue();
}
for (MinerEntry r : entries) {
w += r.getWeight();
}
if(w <= 0) return null;
int number = QuantumQuarry.RANDOM.nextInt(w) + 1;
int currentWeight = 0;
for (MinerEntry entry : entries) {
currentWeight += entry.getWeight();
if (currentWeight >= number) {
return entry;
}
}
return null;
}
}
package com.teamacronymcoders.quantumquarry.block;
import com.hrznstudio.titanium.annotation.Save;
import com.hrznstudio.titanium.api.IFactory;
import com.hrznstudio.titanium.api.client.IScreenAddon;
import com.hrznstudio.titanium.block.tile.ActiveTile;
import com.hrznstudio.titanium.component.energy.EnergyStorageComponent;
import com.hrznstudio.titanium.component.inventory.SidedInventoryComponent;
import com.hrznstudio.titanium.container.addon.IContainerAddon;
import com.teamacronymcoders.quantumquarry.QuantumConfig;
import com.teamacronymcoders.quantumquarry.QuantumQuarry;
import com.teamacronymcoders.quantumquarry.datagen.QuantumTagDataProvider.ItemTags;
import com.teamacronymcoders.quantumquarry.item.PlayerCardItem;
import com.teamacronymcoders.quantumquarry.misc.recipe.MinerEntry;
import com.teamacronymcoders.quantumquarry.misc.registry.QuantumQuarryRegistryHandler;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.DyeColor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.energy.IEnergyStorage;
import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Set;
public class QuarryTile extends ActiveTile<QuarryTile> {
private SidedInventoryComponent<QuarryTile> toolInventory;
private SidedInventoryComponent<QuarryTile> storageInventory;
private SidedInventoryComponent<QuarryTile> lensInventory;
private SidedInventoryComponent<QuarryTile> energyInventory;
private SidedInventoryComponent<QuarryTile> cardInventory;
private EnergyStorageComponent energyStorage;
private final LazyOptional<IEnergyStorage> energyCap = LazyOptional.of(() -> energyStorage);
private List<MinerEntry> cachedEntries;
@Save
private boolean hold = false;
@SuppressWarnings({"unchecked", "rawtypes"})
public QuarryTile() {
super(QuantumQuarryRegistryHandler.quarryBlock);
addInventory(toolInventory = (SidedInventoryComponent) new SidedInventoryComponent<>("tool_inventory", 7, -150, 3, 0)
.setColor(DyeColor.BLUE)
.setOnSlotChanged((stack, integer) -> markComponentForUpdate(true))
.setRange(3, 1)
.setInputFilter(this::canInsertTool));
addInventory(lensInventory = (SidedInventoryComponent) new SidedInventoryComponent<>("lens_inventory", 151, -150, 1, 1)
.setColor(DyeColor.PURPLE)
.setOnSlotChanged((stack, integer) -> {
markComponentForUpdate(true);
getRecipesForCache(stack);
})
.setRange(1, 1)
.setInputFilter(this::canInsertLens));
addInventory(storageInventory = (SidedInventoryComponent) new SidedInventoryComponent<>("storage_inventory", 7, -125, 54, 2)
.setColor(DyeColor.RED)
.setOnSlotChanged((stack, integer) -> markComponentForUpdate(true))
.setRange(9, 6)
.setInputFilter((stack, integer) -> false));
addInventory(energyInventory = (SidedInventoryComponent) new SidedInventoryComponent<>("energy_inventory", -99, 60, 1, 3)
.setColor(DyeColor.ORANGE)
.setOnSlotChanged((stack, integer) -> markComponentForUpdate(true))
.setInputFilter((stack, integer) -> stack.getCapability(CapabilityEnergy.ENERGY).isPresent()));
addInventory(cardInventory = (SidedInventoryComponent) new SidedInventoryComponent<>("card_inventory", 97, -150, 1, 4)
.setColor(DyeColor.LIME)
.setOnSlotChanged((stack, integer) -> markComponentForUpdate(true))
.setInputFilter((stack, integer) -> stack.getItem() instanceof PlayerCardItem && ((PlayerCardItem) stack.getItem()).hasPlayerID()));
energyStorage = new EnergyStorageComponent(QuantumConfig.getMaxPowerStorage(), -100, 0);
}
@Override
public void tick() {
// Don't Remove super.tick();
super.tick();
handleEnergySlot();
if (cachedEntries == null) {
cachedEntries = getRecipesForCache(ItemStack.EMPTY);
}
ItemStack lens = getLens();
handleQuantumQuarry(lens);
if (hold) {
handlePowerDrain(lens);
}
}
@Nonnull
@Override
public QuarryTile getSelf() {
return this;
}
private boolean canInsertLens(ItemStack stack, int slot) {
boolean isLens = stack.getItem().isIn(ItemTags.LensTag);
boolean doesNotConflict = QuarryHelper.doesNotHaveClashingEnchantments(stack, toolInventory.getStackInSlot(0)) && QuarryHelper.doesNotHaveClashingEnchantments(stack, toolInventory.getStackInSlot(1)) && QuarryHelper.doesNotHaveClashingEnchantments(stack, toolInventory.getStackInSlot(2));
return isLens && doesNotConflict;
}
private boolean canInsertTool(ItemStack stack, int slot) {
Set<ToolType> toolTypes = stack.getToolTypes();
boolean doesNotConflict = QuarryHelper.doesNotHaveClashingEnchantments(getLens(), stack) && QuarryHelper.doesNotHaveClashingEnchantmentsTool(stack, toolInventory);
switch (slot) {
case 0: return doesNotConflict && toolTypes.contains(ToolType.AXE);
case 1: return doesNotConflict && toolTypes.contains(ToolType.SHOVEL);
case 2: return doesNotConflict && toolTypes.contains(ToolType.PICKAXE);
default: return false;
}
}
@Override
public List<IFactory<? extends IScreenAddon>> getScreenAddons() {
List<IFactory<? extends IScreenAddon>> addons = super.getScreenAddons();
addons.addAll(energyStorage.getScreenAddons());
return addons;
}
@Override
public List<IFactory<? extends IContainerAddon>> getContainerAddons() {
List<IFactory<? extends IContainerAddon>> addons = super.getContainerAddons();
addons.addAll(energyStorage.getContainerAddons());
return addons;
}
@Nonnull
public <U> LazyOptional<U> getCapability(@Nonnull Capability<U> cap, @Nullable Direction side) {
return cap == CapabilityEnergy.ENERGY ? this.energyCap.cast() : super.getCapability(cap, side);
}
public ItemStack getLens() {
return lensInventory.getStackInSlot(0);
}
public int getCurrentEnergy() {
return energyStorage.getEnergyStored();
}
public List<MinerEntry> getRecipesForCache(ItemStack lens) {
return QuarryHelper.getMinerEntriesByLens(lens);
}
@Nullable
public MinerEntry getRandomCachedEntry() {
if (cachedEntries != null && !cachedEntries.isEmpty()) {
return QuarryHelper.getMinerEntry(cachedEntries);
}
return null;
}
public void handleEnergySlot() {
if (!energyInventory.getStackInSlot(0).isEmpty()) {
ItemStack stack = energyInventory.getStackInSlot(0);
stack.getCapability(CapabilityEnergy.ENERGY).ifPresent(iEnergyStorage -> {
int charged = energyStorage.receiveEnergy(iEnergyStorage.getEnergyStored(), false);
if(charged > 0) {
energyStorage.extractEnergy(charged, false);
}
});
}
}
public void handleQuantumQuarry(ItemStack lens) {
if (!hold && world != null && !world.isRemote()) {
for (int i = 0; i < Math.min(QuarryHelper.getAmountOfOperationsForPower(getCurrentEnergy(), lens, getCollectedEffiency()), 20); i++) {
MinerEntry entry = getRandomCachedEntry();
ItemStack tool = QuarryHelper.getAppropriateTool(entry.getBlock().getDefaultState(), toolInventory);
if (QuarryHelper.canToolBreakBlock(entry.getBlock().getDefaultState(), tool)) {
List<ItemStack> generated = QuarryHelper.getDrops(pos, (ServerWorld) world, entry.getBlock().getDefaultState(), lens, tool, getPlayerFromCard());
for (ItemStack stack : generated) {
if (!ItemHandlerHelper.insertItemStacked(storageInventory, stack, false).isEmpty()) {
hold = true;
break;
}
}
if (hold) {
break;
}
if (QuantumConfig.getShouldToolsTakeDamage()) {
tool.attemptDamageItem(1, QuantumQuarry.RANDOM, null);
}
handlePowerDrain(lens);
}
}
}
}
public void handlePowerDrain(ItemStack lens) {
int drain = hold ? QuantumConfig.getMinimumPowerDrain() : QuarryHelper.getPowerPerOperationWithEfficiency(lens, getCollectedEffiency());
if (getCurrentEnergy() - drain > 0) {
energyStorage.extractEnergy(drain, false);
} else if (getCurrentEnergy() != 0) {
energyStorage.setEnergyStored(0);
}
}
public int getCollectedEffiency() {
int e = 0;
for (int i = 0; i < 2; i++) {
e += EnchantmentHelper.getEnchantmentLevel(Enchantments.EFFICIENCY, toolInventory.getStackInSlot(i));
}
return e;
}
public void setHold(boolean hold) {
this.hold = hold;
}
public PlayerEntity getPlayerFromCard() {
return world != null && cardInventory.getStackInSlot(0).getItem() instanceof PlayerCardItem ? ((PlayerCardItem) cardInventory.getStackInSlot(0).getItem()).getPlayer(world) : null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment