50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
|
|
package session
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"github.com/df-mc/dragonfly/server/item/recipe"
|
||
|
|
"github.com/df-mc/dragonfly/server/world"
|
||
|
|
"github.com/sandertv/gophertunnel/minecraft/protocol"
|
||
|
|
)
|
||
|
|
|
||
|
|
// stonecutterInputSlot is the slot index of the input item in the stonecutter.
|
||
|
|
const stonecutterInputSlot = 0x03
|
||
|
|
|
||
|
|
// handleStonecutting handles a CraftRecipe stack request action made using a stonecutter.
|
||
|
|
func (h *ItemStackRequestHandler) handleStonecutting(a *protocol.CraftRecipeStackRequestAction, s *Session, tx *world.Tx) error {
|
||
|
|
craft, ok := s.recipes[a.RecipeNetworkID]
|
||
|
|
if !ok {
|
||
|
|
return fmt.Errorf("recipe with network id %v does not exist", a.RecipeNetworkID)
|
||
|
|
}
|
||
|
|
if _, shapeless := craft.(recipe.Shapeless); !shapeless {
|
||
|
|
return fmt.Errorf("recipe with network id %v is not a shapeless recipe", a.RecipeNetworkID)
|
||
|
|
}
|
||
|
|
if craft.Block() != "stonecutter" {
|
||
|
|
return fmt.Errorf("recipe with network id %v is not a stonecutter recipe", a.RecipeNetworkID)
|
||
|
|
}
|
||
|
|
|
||
|
|
timesCrafted := int(a.NumberOfCrafts)
|
||
|
|
if timesCrafted < 1 {
|
||
|
|
return fmt.Errorf("times crafted must be at least 1")
|
||
|
|
}
|
||
|
|
|
||
|
|
expectedInputs := craft.Input()
|
||
|
|
input, _ := h.itemInSlot(protocol.StackRequestSlotInfo{
|
||
|
|
Container: protocol.FullContainerName{ContainerID: protocol.ContainerStonecutterInput},
|
||
|
|
Slot: stonecutterInputSlot,
|
||
|
|
}, s, tx)
|
||
|
|
if input.Count() < timesCrafted {
|
||
|
|
return fmt.Errorf("input item count is less than number of crafts")
|
||
|
|
}
|
||
|
|
if !matchingStacks(input, expectedInputs[0]) {
|
||
|
|
return fmt.Errorf("input item is not the same as expected input")
|
||
|
|
}
|
||
|
|
|
||
|
|
output := craft.Output()
|
||
|
|
h.setItemInSlot(protocol.StackRequestSlotInfo{
|
||
|
|
Container: protocol.FullContainerName{ContainerID: protocol.ContainerStonecutterInput},
|
||
|
|
Slot: stonecutterInputSlot,
|
||
|
|
}, input.Grow(-timesCrafted), s, tx)
|
||
|
|
return h.createResults(s, tx, repeatStacks(output, timesCrafted)...)
|
||
|
|
}
|