mirror of
https://github.com/naalit/slotlink.git
synced 2025-12-31 04:13:02 +00:00
Fix Crafting ingredient lost
This commit is contained in:
parent
9920db6761
commit
e3ba93c1d1
7 changed files with 77 additions and 40 deletions
|
|
@ -7,7 +7,7 @@ yarn_mappings = 1.16.1+build.10
|
|||
loader_version = 0.8.8+build.202
|
||||
|
||||
# Mod properties
|
||||
mod_version = 0.3.1
|
||||
mod_version = 0.3.2
|
||||
maven_group = com.github.badasintended
|
||||
archives_base_name = slotlink
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ object Mod {
|
|||
@Environment(EnvType.CLIENT)
|
||||
fun client() {
|
||||
ScreenRegistry.init()
|
||||
NetworkRegistry.initClient()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,14 @@ import badasintended.slotlink.common.openScreen
|
|||
import badasintended.slotlink.common.sendActionBar
|
||||
import badasintended.slotlink.common.tag2Pos
|
||||
import badasintended.slotlink.common.writeRequestData
|
||||
import badasintended.slotlink.network.NetworkRegistry
|
||||
import io.netty.buffer.Unpooled
|
||||
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import net.minecraft.util.ActionResult
|
||||
import net.minecraft.util.Hand
|
||||
import net.minecraft.util.hit.BlockHitResult
|
||||
|
|
@ -39,6 +43,10 @@ class RequestBlock : ChildBlock("request") {
|
|||
val masterPos = tag2Pos(nbt.getCompound("masterPos"))
|
||||
writeRequestData(buf, world, masterPos)
|
||||
}
|
||||
|
||||
ServerSidePacketRegistry.INSTANCE.sendToPlayer(
|
||||
player, NetworkRegistry.FIRST_SORT, PacketByteBuf(Unpooled.buffer())
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package badasintended.slotlink.client.compatibility.rei
|
|||
|
||||
import badasintended.slotlink.Mod
|
||||
import badasintended.slotlink.block.BlockRegistry
|
||||
import badasintended.slotlink.network.NetworkRegistry.CRAFT_CLEAR
|
||||
import badasintended.slotlink.network.NetworkRegistry.CRAFT_PULL
|
||||
import badasintended.slotlink.screen.AbstractRequestScreenHandler
|
||||
import com.google.common.collect.Lists
|
||||
|
|
@ -78,6 +77,7 @@ class SlotlinkReiPlugin : REIPluginV0 {
|
|||
if (!foundAll.values.all { it }) return@r Result.createFailed(
|
||||
"error.rei.not.enough.materials", notFound
|
||||
)
|
||||
if (!INSTANCE.canServerReceive(CRAFT_PULL)) return@r Result.createFailed("error.rei.not.on.server")
|
||||
if (!context.isActuallyCrafting) return@r Result.createSuccessful()
|
||||
|
||||
val outside = arrayListOf<ArrayList<Item>>()
|
||||
|
|
@ -98,9 +98,6 @@ class SlotlinkReiPlugin : REIPluginV0 {
|
|||
|
||||
context.minecraft.openScreen(context.containerScreen)
|
||||
|
||||
container.clearCraft()
|
||||
INSTANCE.sendToServer(CRAFT_CLEAR, PacketByteBuf(Unpooled.buffer()))
|
||||
|
||||
container.pullInput(outside)
|
||||
INSTANCE.sendToServer(CRAFT_PULL, buf)
|
||||
|
||||
|
|
|
|||
|
|
@ -8,9 +8,6 @@ import badasintended.slotlink.common.slotAction
|
|||
import badasintended.slotlink.network.NetworkRegistry
|
||||
import badasintended.slotlink.screen.AbstractRequestScreenHandler
|
||||
import io.netty.buffer.Unpooled
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry
|
||||
|
|
@ -104,7 +101,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
// Crafting Result slot
|
||||
val resultSlot = main.createChild(
|
||||
{ WCraftingResultSlot { sort(lastSort, lastFilter) } },
|
||||
{ WCraftingResultSlot { sort() } },
|
||||
positionOf(craftingLabel, 91, 24),
|
||||
sizeOf(26)
|
||||
)
|
||||
|
|
@ -133,7 +130,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
for (i in 0 until 27) {
|
||||
val slot = main.createChild(
|
||||
{ WPlayerSlot { sort(lastSort, lastFilter) } },
|
||||
{ WPlayerSlot { sort() } },
|
||||
positionOf(playerInvLabel, (((i % 9) * 18) - 1), (((i / 9) * 18) + 11)),
|
||||
sizeOf(18)
|
||||
)
|
||||
|
|
@ -144,7 +141,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
for (i in 0 until 9) {
|
||||
val slot = main.createChild(
|
||||
{ WPlayerSlot { sort(lastSort, lastFilter) } },
|
||||
{ WPlayerSlot { sort() } },
|
||||
positionOf(playerInvLabel, (((i % 9) * 18) - 1), 70),
|
||||
sizeOf(18)
|
||||
)
|
||||
|
|
@ -177,7 +174,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
for (i in 0 until 48) {
|
||||
val slot = main.createChild(
|
||||
{ WMultiSlot({ slotActionPerformed = it }, { sort(lastSort, lastFilter) }) },
|
||||
{ WMultiSlot({ slotActionPerformed = it }, { sort() }) },
|
||||
positionOf(scrollArea, ((i % 8) * 18), ((i / 8) * 18), 2),
|
||||
sizeOf(18)
|
||||
)
|
||||
|
|
@ -199,17 +196,12 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
sizeOf(14)
|
||||
)
|
||||
|
||||
GlobalScope.launch {
|
||||
delay(100)
|
||||
sort(lastSort, lastFilter)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun onClearButtonClick() {
|
||||
c.clearCraft()
|
||||
ClientSidePacketRegistry.INSTANCE.sendToServer(NetworkRegistry.CRAFT_CLEAR, PacketByteBuf(Unpooled.buffer()))
|
||||
sort(lastSort, lastFilter)
|
||||
sort()
|
||||
}
|
||||
|
||||
private fun onPutAllButtonClick() {
|
||||
|
|
@ -217,14 +209,14 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
filledSlots.forEach { slot ->
|
||||
slotAction(c, slot.slotNumber, slot.inventoryNumber, 0, QUICK_MOVE, c.player)
|
||||
}
|
||||
sort(lastSort, lastFilter)
|
||||
sort()
|
||||
}
|
||||
|
||||
private fun onSlotAreaClick() {
|
||||
if (!slotActionPerformed) {
|
||||
slotAction(c, 0, -2, 0, PICKUP, c.player)
|
||||
slotAction(c, 0, -2, 0, QUICK_MOVE, c.player)
|
||||
sort(lastSort, lastFilter)
|
||||
sort()
|
||||
}
|
||||
slotActionPerformed = false
|
||||
}
|
||||
|
|
@ -269,6 +261,8 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
}
|
||||
|
||||
fun sort() = sort(lastSort, lastFilter)
|
||||
|
||||
private fun sort(sortBy: SortBy, filter: String): SortBy {
|
||||
if (stillSorting) return lastSort
|
||||
|
||||
|
|
@ -292,15 +286,15 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
if (trimmedFilter.isNotBlank()) {
|
||||
when (trimmedFilter.first()) {
|
||||
'@' -> filledSlots.removeIf {
|
||||
!Registry.ITEM.getId(it.stack.item).toString().contains(trimmedFilter.drop(1).trim(), true)
|
||||
!Registry.ITEM.getId(it.stack.item).toString().contains(trimmedFilter.drop(1), true)
|
||||
}
|
||||
'#' -> filledSlots.removeIf r@{ slot ->
|
||||
val tag = trimmedFilter.drop(1).trim()
|
||||
val tag = trimmedFilter.drop(1)
|
||||
val tags = c.world.tagManager.items().getTagsFor(slot.stack.item)
|
||||
if (tags.isEmpty() and tag.isEmpty()) return@r false
|
||||
else tags.none { it.toString().contains(tag, true) }
|
||||
else return@r tags.none { it.toString().contains(tag, true) }
|
||||
}
|
||||
else -> filledSlots.removeIf { !it.stack.item.name.string.contains(trimmedFilter.trim(), true) }
|
||||
else -> filledSlots.removeIf { !it.stack.name.string.contains(trimmedFilter.trim(), true) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -316,7 +310,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
|
||||
when (sortBy) {
|
||||
SortBy.NAME -> {
|
||||
filledStacks.sortBy { it.name.asString() }
|
||||
filledStacks.sortBy { it.name.string }
|
||||
}
|
||||
SortBy.IDENTIFIER -> {
|
||||
filledStacks.sortBy { Registry.ITEM.getId(it.item).toString() }
|
||||
|
|
@ -385,7 +379,7 @@ abstract class AbstractRequestScreen<H : AbstractRequestScreenHandler>(c: H) : M
|
|||
slotArea.setSize<W>(sizeOf(144, slotSize))
|
||||
searchBar.setPosition<W>(positionOf(scrollArea, 0, slotSize + 3))
|
||||
|
||||
sort(lastSort, lastFilter)
|
||||
sort()
|
||||
|
||||
super.resize(client, width, height)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,10 +2,15 @@ package badasintended.slotlink.network
|
|||
|
||||
import badasintended.slotlink.Mod
|
||||
import badasintended.slotlink.block.RequestBlock
|
||||
import badasintended.slotlink.client.gui.screen.AbstractRequestScreen
|
||||
import badasintended.slotlink.screen.AbstractRequestScreenHandler
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry
|
||||
import net.fabricmc.fabric.api.network.PacketConsumer
|
||||
import net.fabricmc.fabric.api.network.PacketContext
|
||||
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
|
|
@ -20,6 +25,8 @@ object NetworkRegistry {
|
|||
val CRAFT_CLEAR = Mod.id("craft_clear")
|
||||
val CRAFT_PULL = Mod.id("craft_pull")
|
||||
|
||||
val FIRST_SORT = Mod.id("first_sort")
|
||||
|
||||
fun initMain() {
|
||||
rS(REQUEST_SAVE, this::requestSave)
|
||||
rS(REMOTE_SAVE, this::remoteSave)
|
||||
|
|
@ -29,10 +36,20 @@ object NetworkRegistry {
|
|||
rS(CRAFT_PULL, this::craftPull)
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
fun initClient() {
|
||||
rC(FIRST_SORT, this::firstSort)
|
||||
}
|
||||
|
||||
private fun rS(id: Identifier, function: (PacketContext, PacketByteBuf) -> Unit) {
|
||||
ServerSidePacketRegistry.INSTANCE.register(id, PacketConsumer(function))
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
private fun rC(id: Identifier, function: (PacketContext, PacketByteBuf) -> Unit) {
|
||||
ClientSidePacketRegistry.INSTANCE.register(id, PacketConsumer(function))
|
||||
}
|
||||
|
||||
private fun requestSave(context: PacketContext, buf: PacketByteBuf) {
|
||||
val pos = buf.readBlockPos()
|
||||
val sort = buf.readInt()
|
||||
|
|
@ -96,4 +113,11 @@ object NetworkRegistry {
|
|||
}
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
private fun firstSort(context: PacketContext, buf: PacketByteBuf) {
|
||||
context.taskQueue.run {
|
||||
(MinecraftClient.getInstance().currentScreen as AbstractRequestScreen<*>?)?.sort()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,11 +125,17 @@ abstract class AbstractRequestScreenHandler(syncId: Int, player: PlayerEntity, b
|
|||
}
|
||||
outputSlot.setStack<WSlot>(ItemStack.EMPTY)
|
||||
|
||||
val remainingStacks = world.recipeManager.getRemainingStacks(RecipeType.CRAFTING, craftingInv, world)
|
||||
|
||||
val filledInput = inputSlots.filterNot { it.stack.isEmpty }
|
||||
filledInput.forEach { slot ->
|
||||
val first = linkedSlots.firstOrNull { StackUtilities.equalItemAndTag(it.stack, slot.stack) }
|
||||
if ((first == null) or (slot.stack.count > 1)) slot.stack.decrement(1)
|
||||
else first!!.stack.decrement(1)
|
||||
filledInput.forEachIndexed { i, slot ->
|
||||
if (remainingStacks[i].isEmpty) {
|
||||
val first = linkedSlots.firstOrNull { StackUtilities.equalItemAndTag(it.stack, slot.stack) }
|
||||
if (first == null) slot.stack.decrement(1)
|
||||
else first.stack.decrement(1)
|
||||
} else {
|
||||
slot.setStack<WSlot>(remainingStacks[i])
|
||||
}
|
||||
}
|
||||
craftItem()
|
||||
}
|
||||
|
|
@ -138,20 +144,24 @@ abstract class AbstractRequestScreenHandler(syncId: Int, player: PlayerEntity, b
|
|||
val outputStack = outputSlot.stack
|
||||
val craftMax = outputStack.maxCount / outputStack.count
|
||||
|
||||
val filledInput = inputSlots.filterNot { it.stack.isEmpty }
|
||||
|
||||
var crafted = 1
|
||||
for (i in 0 until craftMax) {
|
||||
val remainingStacks = world.recipeManager.getRemainingStacks(RecipeType.CRAFTING, craftingInv, world)
|
||||
val filledInput = inputSlots.filterNot { it.stack.isEmpty }
|
||||
|
||||
var prevSuccess = true
|
||||
filledInput.forEach { slot ->
|
||||
val first = linkedSlots.firstOrNull { StackUtilities.equalItemAndTag(it.stack, slot.stack) }
|
||||
if (first == null) {
|
||||
prevSuccess = prevSuccess and (slot.stack.count >= 1)
|
||||
slot.stack.decrement(1)
|
||||
filledInput.forEachIndexed { j, slot ->
|
||||
if (remainingStacks[j].isEmpty) {
|
||||
val first = linkedSlots.firstOrNull { StackUtilities.equalItemAndTag(it.stack, slot.stack) }
|
||||
if (first == null) {
|
||||
prevSuccess = prevSuccess and (slot.stack.count >= 1)
|
||||
slot.stack.decrement(1)
|
||||
} else {
|
||||
prevSuccess = prevSuccess and true
|
||||
first.stack.decrement(1)
|
||||
}
|
||||
} else {
|
||||
prevSuccess = prevSuccess and true
|
||||
if (slot.stack.count > 1) slot.stack.decrement(1)
|
||||
else first.stack.decrement(1)
|
||||
slot.setStack<WSlot>(remainingStacks[j])
|
||||
}
|
||||
}
|
||||
if (!prevSuccess) break
|
||||
|
|
@ -199,6 +209,9 @@ abstract class AbstractRequestScreenHandler(syncId: Int, player: PlayerEntity, b
|
|||
}
|
||||
|
||||
fun pullInput(outside: ArrayList<ArrayList<Item>>) {
|
||||
clearCraft()
|
||||
dropInventory(player, world, craftingInv)
|
||||
|
||||
playerSlots.sortByDescending { it.stack.count }
|
||||
linkedSlots.sortByDescending { it.stack.count }
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue