Skip to content

Commit

Permalink
packet/item_stack_request.go and player_auth_input.go: Symmetrical en…
Browse files Browse the repository at this point in the history
…code/decode.
  • Loading branch information
Sandertv committed Mar 22, 2023
1 parent 7ec8dc2 commit 7cc0ecb
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 159 deletions.
2 changes: 2 additions & 0 deletions minecraft/protocol/io.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@ type IO interface {
Item(x *ItemStack)
ItemInstance(i *ItemInstance)
ItemDescriptorCount(i *ItemDescriptorCount)
StackRequestAction(x *StackRequestAction)
MaterialReducer(x *MaterialReducer)
Recipe(x *Recipe)
EventType(x *Event)
TransactionDataType(x *InventoryTransactionData)
PlayerInventoryAction(x *UseItemTransactionData)
GameRule(x *GameRule)
AbilityValue(x *any)

Expand Down
215 changes: 97 additions & 118 deletions minecraft/protocol/item_stack.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package protocol

import (
"fmt"
)

const (
FilterCauseServerChatPublic = iota
FilterCauseServerChatWhisper
Expand Down Expand Up @@ -36,125 +32,108 @@ type ItemStackRequest struct {
FilterCause int32
}

// WriteStackRequest writes an ItemStackRequest x to Writer w.
func WriteStackRequest(w *Writer, x *ItemStackRequest) {
l := uint32(len(x.Actions))
w.Varint32(&x.RequestID)
w.Varuint32(&l)
for _, action := range x.Actions {
var id byte
switch action.(type) {
case *TakeStackRequestAction:
id = StackRequestActionTake
case *PlaceStackRequestAction:
id = StackRequestActionPlace
case *SwapStackRequestAction:
id = StackRequestActionSwap
case *DropStackRequestAction:
id = StackRequestActionDrop
case *DestroyStackRequestAction:
id = StackRequestActionDestroy
case *ConsumeStackRequestAction:
id = StackRequestActionConsume
case *CreateStackRequestAction:
id = StackRequestActionCreate
case *LabTableCombineStackRequestAction:
id = StackRequestActionLabTableCombine
case *BeaconPaymentStackRequestAction:
id = StackRequestActionBeaconPayment
case *MineBlockStackRequestAction:
id = StackRequestActionMineBlock
case *CraftRecipeStackRequestAction:
id = StackRequestActionCraftRecipe
case *AutoCraftRecipeStackRequestAction:
id = StackRequestActionCraftRecipeAuto
case *CraftCreativeStackRequestAction:
id = StackRequestActionCraftCreative
case *CraftRecipeOptionalStackRequestAction:
id = StackRequestActionCraftRecipeOptional
case *CraftGrindstoneRecipeStackRequestAction:
id = StackRequestActionCraftGrindstone
case *CraftLoomRecipeStackRequestAction:
id = StackRequestActionCraftLoom
case *CraftNonImplementedStackRequestAction:
id = StackRequestActionCraftNonImplementedDeprecated
case *CraftResultsDeprecatedStackRequestAction:
id = StackRequestActionCraftResultsDeprecated
default:
w.UnknownEnumOption(fmt.Sprintf("%T", action), "stack request action type")
}
w.Uint8(&id)
action.Marshal(w)
}
FuncSlice(w, &x.FilterStrings, w.String)
w.Int32(&x.FilterCause)
}

// StackRequest reads an ItemStackRequest x from Reader r.
func StackRequest(r *Reader, x *ItemStackRequest) {
var count uint32
// Marshal encodes/decodes an ItemStackRequest.
func (x *ItemStackRequest) Marshal(r IO) {
r.Varint32(&x.RequestID)
r.Varuint32(&count)
r.LimitUint32(count, mediumLimit)

x.Actions = make([]StackRequestAction, count)
for i := uint32(0); i < count; i++ {
var id uint8
r.Uint8(&id)

var action StackRequestAction
switch id {
case StackRequestActionTake:
action = &TakeStackRequestAction{}
case StackRequestActionPlace:
action = &PlaceStackRequestAction{}
case StackRequestActionSwap:
action = &SwapStackRequestAction{}
case StackRequestActionDrop:
action = &DropStackRequestAction{}
case StackRequestActionDestroy:
action = &DestroyStackRequestAction{}
case StackRequestActionConsume:
action = &ConsumeStackRequestAction{}
case StackRequestActionCreate:
action = &CreateStackRequestAction{}
case StackRequestActionPlaceInContainer:
action = &PlaceInContainerStackRequestAction{}
case StackRequestActionTakeOutContainer:
action = &TakeOutContainerStackRequestAction{}
case StackRequestActionLabTableCombine:
action = &LabTableCombineStackRequestAction{}
case StackRequestActionBeaconPayment:
action = &BeaconPaymentStackRequestAction{}
case StackRequestActionMineBlock:
action = &MineBlockStackRequestAction{}
case StackRequestActionCraftRecipe:
action = &CraftRecipeStackRequestAction{}
case StackRequestActionCraftRecipeAuto:
action = &AutoCraftRecipeStackRequestAction{}
case StackRequestActionCraftCreative:
action = &CraftCreativeStackRequestAction{}
case StackRequestActionCraftRecipeOptional:
action = &CraftRecipeOptionalStackRequestAction{}
case StackRequestActionCraftGrindstone:
action = &CraftGrindstoneRecipeStackRequestAction{}
case StackRequestActionCraftLoom:
action = &CraftLoomRecipeStackRequestAction{}
case StackRequestActionCraftNonImplementedDeprecated:
action = &CraftNonImplementedStackRequestAction{}
case StackRequestActionCraftResultsDeprecated:
action = &CraftResultsDeprecatedStackRequestAction{}
default:
r.UnknownEnumOption(id, "stack request action type")
return
}
action.Marshal(r)
x.Actions[i] = action
}
FuncSlice(r, &x.Actions, r.StackRequestAction)
FuncSlice(r, &x.FilterStrings, r.String)
r.Int32(&x.FilterCause)
}

// lookupStackRequestActionType looks up the ID of a StackRequestAction.
func lookupStackRequestActionType(x StackRequestAction, id *uint8) bool {
switch x.(type) {
case *TakeStackRequestAction:
*id = StackRequestActionTake
case *PlaceStackRequestAction:
*id = StackRequestActionPlace
case *SwapStackRequestAction:
*id = StackRequestActionSwap
case *DropStackRequestAction:
*id = StackRequestActionDrop
case *DestroyStackRequestAction:
*id = StackRequestActionDestroy
case *ConsumeStackRequestAction:
*id = StackRequestActionConsume
case *CreateStackRequestAction:
*id = StackRequestActionCreate
case *LabTableCombineStackRequestAction:
*id = StackRequestActionLabTableCombine
case *BeaconPaymentStackRequestAction:
*id = StackRequestActionBeaconPayment
case *MineBlockStackRequestAction:
*id = StackRequestActionMineBlock
case *CraftRecipeStackRequestAction:
*id = StackRequestActionCraftRecipe
case *AutoCraftRecipeStackRequestAction:
*id = StackRequestActionCraftRecipeAuto
case *CraftCreativeStackRequestAction:
*id = StackRequestActionCraftCreative
case *CraftRecipeOptionalStackRequestAction:
*id = StackRequestActionCraftRecipeOptional
case *CraftGrindstoneRecipeStackRequestAction:
*id = StackRequestActionCraftGrindstone
case *CraftLoomRecipeStackRequestAction:
*id = StackRequestActionCraftLoom
case *CraftNonImplementedStackRequestAction:
*id = StackRequestActionCraftNonImplementedDeprecated
case *CraftResultsDeprecatedStackRequestAction:
*id = StackRequestActionCraftResultsDeprecated
default:
return false
}
return true
}

// lookupStackRequestAction looks up the StackRequestAction matching an ID.
func lookupStackRequestAction(id uint8, x *StackRequestAction) bool {
switch id {
case StackRequestActionTake:
*x = &TakeStackRequestAction{}
case StackRequestActionPlace:
*x = &PlaceStackRequestAction{}
case StackRequestActionSwap:
*x = &SwapStackRequestAction{}
case StackRequestActionDrop:
*x = &DropStackRequestAction{}
case StackRequestActionDestroy:
*x = &DestroyStackRequestAction{}
case StackRequestActionConsume:
*x = &ConsumeStackRequestAction{}
case StackRequestActionCreate:
*x = &CreateStackRequestAction{}
case StackRequestActionPlaceInContainer:
*x = &PlaceInContainerStackRequestAction{}
case StackRequestActionTakeOutContainer:
*x = &TakeOutContainerStackRequestAction{}
case StackRequestActionLabTableCombine:
*x = &LabTableCombineStackRequestAction{}
case StackRequestActionBeaconPayment:
*x = &BeaconPaymentStackRequestAction{}
case StackRequestActionMineBlock:
*x = &MineBlockStackRequestAction{}
case StackRequestActionCraftRecipe:
*x = &CraftRecipeStackRequestAction{}
case StackRequestActionCraftRecipeAuto:
*x = &AutoCraftRecipeStackRequestAction{}
case StackRequestActionCraftCreative:
*x = &CraftCreativeStackRequestAction{}
case StackRequestActionCraftRecipeOptional:
*x = &CraftRecipeOptionalStackRequestAction{}
case StackRequestActionCraftGrindstone:
*x = &CraftGrindstoneRecipeStackRequestAction{}
case StackRequestActionCraftLoom:
*x = &CraftLoomRecipeStackRequestAction{}
case StackRequestActionCraftNonImplementedDeprecated:
*x = &CraftNonImplementedStackRequestAction{}
case StackRequestActionCraftResultsDeprecated:
*x = &CraftResultsDeprecatedStackRequestAction{}
default:
return false
}
return true
}

const (
ItemStackResponseStatusOK = iota
ItemStackResponseStatusError
Expand Down
17 changes: 5 additions & 12 deletions minecraft/protocol/packet/item_stack_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,14 @@ func (*ItemStackRequest) ID() uint32 {

// Marshal ...
func (pk *ItemStackRequest) Marshal(w *protocol.Writer) {
l := uint32(len(pk.Requests))
w.Varuint32(&l)
for _, req := range pk.Requests {
protocol.WriteStackRequest(w, &req)
}
pk.marshal(w)
}

// Unmarshal ...
func (pk *ItemStackRequest) Unmarshal(r *protocol.Reader) {
var count uint32
r.Varuint32(&count)
r.LimitUint32(count, 64)
pk.marshal(r)
}

pk.Requests = make([]protocol.ItemStackRequest, count)
for i := uint32(0); i < count; i++ {
protocol.StackRequest(r, &pk.Requests[i])
}
func (pk *ItemStackRequest) marshal(r protocol.IO) {
protocol.Slice(r, &pk.Requests)
}
35 changes: 6 additions & 29 deletions minecraft/protocol/packet/player_auth_input.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,38 +126,15 @@ func (pk *PlayerAuthInput) ID() uint32 {

// Marshal ...
func (pk *PlayerAuthInput) Marshal(w *protocol.Writer) {
w.Float32(&pk.Pitch)
w.Float32(&pk.Yaw)
w.Vec3(&pk.Position)
w.Vec2(&pk.MoveVector)
w.Float32(&pk.HeadYaw)
w.Varuint64(&pk.InputData)
w.Varuint32(&pk.InputMode)
w.Varuint32(&pk.PlayMode)
w.Varint32(&pk.InteractionModel)
if pk.PlayMode == PlayModeReality {
w.Vec3(&pk.GazeDirection)
}
w.Varuint64(&pk.Tick)
w.Vec3(&pk.Delta)

if pk.InputData&InputFlagPerformItemInteraction != 0 {
w.PlayerInventoryAction(&pk.ItemInteractionData)
}

if pk.InputData&InputFlagPerformItemStackRequest != 0 {
protocol.WriteStackRequest(w, &pk.ItemStackRequest)
}

if pk.InputData&InputFlagPerformBlockActions != 0 {
protocol.SliceVarint32Length(w, &pk.BlockActions)
}

w.Vec2(&pk.AnalogueMoveVector)
pk.marshal(w)
}

// Unmarshal ...
func (pk *PlayerAuthInput) Unmarshal(r *protocol.Reader) {
pk.marshal(r)
}

func (pk *PlayerAuthInput) marshal(r protocol.IO) {
r.Float32(&pk.Pitch)
r.Float32(&pk.Yaw)
r.Vec3(&pk.Position)
Expand All @@ -178,7 +155,7 @@ func (pk *PlayerAuthInput) Unmarshal(r *protocol.Reader) {
}

if pk.InputData&InputFlagPerformItemStackRequest != 0 {
protocol.StackRequest(r, &pk.ItemStackRequest)
protocol.Single(r, &pk.ItemStackRequest)
}

if pk.InputData&InputFlagPerformBlockActions != 0 {
Expand Down
11 changes: 11 additions & 0 deletions minecraft/protocol/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,17 @@ func (r *Reader) Item(x *ItemStack) {
}
}

// StackRequestAction reads a StackRequestAction from the reader.
func (r *Reader) StackRequestAction(x *StackRequestAction) {
var id uint8
r.Uint8(&id)
if !lookupStackRequestAction(id, x) {
r.UnknownEnumOption(id, "stack request action type")
return
}
(*x).Marshal(r)
}

// MaterialReducer reads a material reducer from the reader.
func (r *Reader) MaterialReducer(m *MaterialReducer) {
var mix int32
Expand Down
10 changes: 10 additions & 0 deletions minecraft/protocol/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,16 @@ func (w *Writer) Item(x *ItemStack) {
w.ByteSlice(&extraData)
}

// StackRequestAction writes a StackRequestAction to the writer.
func (w *Writer) StackRequestAction(x *StackRequestAction) {
var id byte
if !lookupStackRequestActionType(*x, &id) {
w.UnknownEnumOption(fmt.Sprintf("%T", *x), "stack request action type")
}
w.Uint8(&id)
(*x).Marshal(w)
}

// MaterialReducer writes a material reducer to the writer.
func (w *Writer) MaterialReducer(m *MaterialReducer) {
mix := (m.InputItem.NetworkID << 16) | int32(m.InputItem.MetadataValue)
Expand Down

0 comments on commit 7cc0ecb

Please sign in to comment.