1717
1818package com.lambda.task.tasks
1919
20+ import baritone.api.pathing.goals.GoalBlock
2021import com.lambda.Lambda.LOG
2122import com.lambda.config.groups.BuildConfig
2223import com.lambda.config.groups.InteractionConfig
2324import com.lambda.config.groups.InventoryConfig
2425import com.lambda.interaction.request.rotation.RotationConfig
2526import com.lambda.context.SafeContext
27+ import com.lambda.event.events.EntityEvent
2628import com.lambda.event.events.MovementEvent
2729import com.lambda.event.events.TickEvent
2830import com.lambda.event.events.WorldEvent
@@ -41,6 +43,7 @@ import com.lambda.interaction.construction.simulation.BuildGoal
4143import com.lambda.interaction.construction.simulation.BuildSimulator.simulate
4244import com.lambda.interaction.construction.simulation.Simulation.Companion.simulation
4345import com.lambda.interaction.construction.verify.TargetState
46+ import com.lambda.interaction.material.transfer.TransactionExecutor.Companion.transfer
4447import com.lambda.module.modules.client.TaskFlowModule
4548import com.lambda.task.Task
4649import com.lambda.util.BaritoneUtils
@@ -50,6 +53,10 @@ import com.lambda.util.Communication.info
5053import com.lambda.util.Formatting.string
5154import com.lambda.util.collections.LimitedDecayQueue
5255import com.lambda.util.extension.Structure
56+ import com.lambda.util.extension.inventorySlots
57+ import com.lambda.util.item.ItemUtils.block
58+ import com.lambda.util.player.SlotUtils.hotbarAndStorage
59+ import net.minecraft.entity.ItemEntity
5360import net.minecraft.util.math.BlockPos
5461
5562class BuildTask @Ta5kBuilder constructor(
@@ -71,7 +78,8 @@ class BuildTask @Ta5kBuilder constructor(
7178
7279 private var placements = 0
7380 private var breaks = 0
74- private var goodPositions = setOf<BlockPos >()
81+ private val dropsToCollect = mutableSetOf<ItemEntity >()
82+ // private var goodPositions = setOf<BlockPos>()
7583
7684 override fun SafeContext.onStart () {
7785 (blueprint as ? PropagatingBlueprint )?.next()
@@ -80,6 +88,7 @@ class BuildTask @Ta5kBuilder constructor(
8088 init {
8189 listen<TickEvent .Pre > {
8290 currentInteraction?.let { context ->
91+ // TaskFlowModule.drawables = listOf(context)
8392 if (context.shouldRotate(build) && ! context.rotation.done) return @let
8493 context.interact(interact.swingHand)
8594 }
@@ -88,6 +97,30 @@ class BuildTask @Ta5kBuilder constructor(
8897 pendingInteractions.add(context)
8998 }
9099 instantBreaks.clear()
100+
101+ dropsToCollect.firstOrNull()?.let { itemDrop ->
102+ if (! world.entities.contains(itemDrop)) {
103+ dropsToCollect.remove(itemDrop)
104+ BaritoneUtils .cancel()
105+ return @listen
106+ }
107+
108+ val noInventorySpace = player.hotbarAndStorage.none { it.isEmpty }
109+ if (noInventorySpace) {
110+ val stackToThrow = player.currentScreenHandler.inventorySlots.firstOrNull {
111+ it.stack.item.block in TaskFlowModule .inventory.disposables
112+ } ? : run {
113+ failure(" No item in inventory to throw but inventory is full and cant pick up item drop" )
114+ return @listen
115+ }
116+ transfer {
117+ throwStack(stackToThrow.id)
118+ }.execute(this @BuildTask)
119+ return @listen
120+ }
121+
122+ BaritoneUtils .setGoalAndPath(GoalBlock (itemDrop.blockPos))
123+ }
91124 }
92125
93126 listen<TickEvent .Post > {
@@ -100,13 +133,16 @@ class BuildTask @Ta5kBuilder constructor(
100133 }
101134
102135 onRotate {
136+ if (collectDrops && dropsToCollect.isNotEmpty()) return @onRotate
137+
103138// val sim = blueprint.simulation(interact, rotation, inventory)
104139// BlockPos.iterateOutwards(player.blockPos, 5, 5, 5).forEach { pos ->
105140// sim.simulate(pos.toFastVec())
106141// }
107142
108143 // ToDo: Simulate for each pair player positions that work
109144 val results = blueprint.simulate(player.eyePos, interact, rotation, inventory, build)
145+
110146 TaskFlowModule .drawables = results.filterIsInstance<Drawable >()
111147 .plus(pendingInteractions.toList())
112148// .plus(sim.goodPositions())
@@ -196,6 +232,19 @@ class BuildTask @Ta5kBuilder constructor(
196232 }
197233 }
198234 }
235+
236+ // ToDo: Dependent on the tracked data order. When set stack is called after position it wont work
237+ listen<EntityEvent .EntityUpdate > {
238+ if (! collectDrops) return @listen
239+ if (it.entity !is ItemEntity ) return @listen
240+ pendingInteractions.find { context ->
241+ val inRange = context.expectedPos.toCenterPos().isInRange(it.entity.pos, 0.5 )
242+ val correctMaterial = context.checkedState.block == it.entity.stack.item.block
243+ inRange && correctMaterial
244+ }?.let { context ->
245+ dropsToCollect.add(it.entity)
246+ }
247+ }
199248 }
200249
201250 companion object {
0 commit comments