Fix Crafting ingredient lost

This commit is contained in:
deirn 2020-07-07 18:21:45 +07:00
parent 9920db6761
commit e3ba93c1d1
No known key found for this signature in database
GPG key ID: 13925278A3EBA7B7
7 changed files with 77 additions and 40 deletions

View file

@ -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

View file

@ -33,6 +33,7 @@ object Mod {
@Environment(EnvType.CLIENT)
fun client() {
ScreenRegistry.init()
NetworkRegistry.initClient()
}
}

View file

@ -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())
)
}

View file

@ -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)

View file

@ -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)
}

View file

@ -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()
}
}
}

View file

@ -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 }