Created
May 31, 2020 20:42
-
-
Save Lanse505/8c582492cd76c6cb03babf5615e54b72 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
---- 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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