From de673b3264c68926c693e3714c70761a3bcedf1c Mon Sep 17 00:00:00 2001 From: BiSaXa <1669855+BiSaXa@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:21:51 +0300 Subject: janky bitreader, usercmdinfo almost finished --- classes/userCmdInfo.go | 140 +++++++++++++++---------------------------------- go.mod | 2 - go.sum | 2 - utils/bitreader.go | 41 +++++++++++++++ utils/utils.go | 31 ----------- 5 files changed, 83 insertions(+), 133 deletions(-) create mode 100644 utils/bitreader.go diff --git a/classes/userCmdInfo.go b/classes/userCmdInfo.go index a85a495..e91633d 100644 --- a/classes/userCmdInfo.go +++ b/classes/userCmdInfo.go @@ -1,8 +1,6 @@ package classes import ( - "fmt" - "github.com/bisaxa/demoparser/utils" ) @@ -15,110 +13,56 @@ type UserCmdInfo struct { ForwardMove float32 SideMove float32 UpMove float32 + // Buttons int32 This could work but no idea on parsing buttons + // Impulse byte } + // WeaponSelect int32 } + // WeaponSubtype int32 Not worth the effort, no one cares about these + // MouseDx int16 } + // MouseDy int } } +// It is so janky it hurts, but hey it is at least working (hopefully) +// Reading the data is really weird, who even implemented this smh func UserCmdInfoInit(byteArr []byte, size int32) (output UserCmdInfo) { var class UserCmdInfo - if utils.ReadBitsFromReversedByteArray1(byteArr) { - class.CommandNumber = int32(utils.ReadBitsFromReversedByteArray16(byteArr, 15)) - fmt.Printf("%b\n", class.CommandNumber) - } - return class -} - -/* -func UserCmdInfoInit(byteArr []byte, size int) (output UserCmdInfo) { - var class UserCmdInfo - reversedByteArr := utils.ReverseByteArrayValues(byteArr, size) - reader := bitreader.BitReader(reversedByteArr) - if size-1 >= 4 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.CommandNumber = int32(value) - } else { - return class + successCount := 0 + failedCount := 0 + looped := 0 + classIndex := 0 + // fmt.Println(byteArr) + // fmt.Printf("%08b", byteArr) + for i := 0; i < 8; i++ { + if successCount+failedCount > 7 { + failedCount = -successCount + looped++ } - } - if size-1 >= 8 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.TickCount = int32(value) - } else { - return class - } - } - if size-1 >= 12 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.ViewAnglesX = float32(value) - } else { - return class - } - } - if size-1 >= 16 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.ViewAnglesY = float32(value) - } else { - return class - } - } - if size-1 >= 20 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.ViewAnglesZ = float32(value) - } else { - return class - } - } - if size-1 >= 24 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.ForwardMove = float32(value) - } else { - return class - } - } - if size-1 >= 28 { - bit, err := reader.ReadBit() - utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.SideMove = float32(value) - } else { - return class - } - } - if size-1 >= 32 { - bit, err := reader.ReadBit() + firstBit, err := utils.ReadBitStateLSB(byteArr[successCount*4+looped], successCount+failedCount) utils.CheckError(err) - if bit { - value, err := reader.ReadBits(32) - utils.CheckError(err) - class.UpMove = float32(value) + if firstBit { + successCount++ + switch classIndex { + case 0: + class.CommandNumber = utils.Read32BitsAfterFirstBitInt32(byteArr, successCount+failedCount, successCount*4+looped) + case 1: + class.TickCount = utils.Read32BitsAfterFirstBitInt32(byteArr, successCount+failedCount, successCount*4+looped) + case 2: + class.ViewAnglesX = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + case 3: + class.ViewAnglesY = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + case 4: + class.ViewAnglesZ = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + case 5: + class.ForwardMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + case 6: + class.SideMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + case 7: + class.UpMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped) + } + classIndex++ } else { - return class + failedCount++ + classIndex++ } } return class } -*/ diff --git a/go.mod b/go.mod index a8203a2..c8d836c 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,3 @@ module github.com/bisaxa/demoparser go 1.19 - -require github.com/32bitkid/bitreader v1.0.1 diff --git a/go.sum b/go.sum index 6bc7cd5..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +0,0 @@ -github.com/32bitkid/bitreader v1.0.1 h1:BlmpTTTL1us9nQ+EUh4M/r5/mY+j4JeC5qOCgL/08ms= -github.com/32bitkid/bitreader v1.0.1/go.mod h1:wiZHryiWx8YsSuS17YiR7Be4rz6FNxxQl/zs1eWJBMo= diff --git a/utils/bitreader.go b/utils/bitreader.go new file mode 100644 index 0000000..c4936fd --- /dev/null +++ b/utils/bitreader.go @@ -0,0 +1,41 @@ +package utils + +import ( + "fmt" + "math" + "strconv" +) + +func ReadBitStateLSB(input byte, index int) (bool, error) { + if index < 0 && index > 7 { + return false, fmt.Errorf("IndexOutOfBounds for type byte") + } + value := input & (1 << index) + return (value > 0), nil +} + +func Read32BitsAfterFirstBitInt32(input []byte, index int, step int) int32 { + binary := "" + binary += fmt.Sprintf("%08b", input[step])[8-index : 8] + binary += fmt.Sprintf("%08b", input[step-1]) + binary += fmt.Sprintf("%08b", input[step-2]) + binary += fmt.Sprintf("%08b", input[step-3]) + binary += fmt.Sprintf("%08b", input[step-4])[:8-index] + output, err := strconv.ParseInt(binary, 2, 32) + CheckError(err) + return int32(output) + +} + +func Read32BitsAfterFirstBitFloat32(input []byte, index int, step int) float32 { + binary := "" + binary += fmt.Sprintf("%08b", input[step])[8-index : 8] + binary += fmt.Sprintf("%08b", input[step-1]) + binary += fmt.Sprintf("%08b", input[step-2]) + binary += fmt.Sprintf("%08b", input[step-3]) + binary += fmt.Sprintf("%08b", input[step-4])[:8-index] + output, err := strconv.ParseUint(binary, 2, 32) + CheckError(err) + return math.Float32frombits(uint32(output)) + +} diff --git a/utils/utils.go b/utils/utils.go index 6874e6b..5226e80 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,15 +1,12 @@ package utils import ( - "bytes" "encoding/binary" "log" "math" "math/bits" "os" "unsafe" - - "github.com/32bitkid/bitreader" ) func CheckError(e error) { @@ -18,34 +15,6 @@ func CheckError(e error) { } } -func ReadBitsFromReversedByteArray1(byteArr []byte) bool { - r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr)))) - value, err := r.Read1() - CheckError(err) - return value -} - -func ReadBitsFromReversedByteArray8(byteArr []byte, bitLength uint) uint8 { - r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr)))) - value, err := r.Read8(bitLength) - CheckError(err) - return value -} - -func ReadBitsFromReversedByteArray16(byteArr []byte, bitLength uint) uint16 { - r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr)))) - value, err := r.Read16(bitLength) - CheckError(err) - return value -} - -func ReadBitsFromReversedByteArray32(byteArr []byte, bitLength uint) uint32 { - r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr)))) - value, err := r.Read32(bitLength) - CheckError(err) - return value -} - func ReverseByteArrayValues(byteArr []byte, size int) []byte { arr := make([]byte, size) for index, byteValue := range byteArr { -- cgit v1.2.3