up3
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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)...)
|
||||
}
|
||||
Reference in New Issue
Block a user