aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/userCmdInfo.go140
-rw-r--r--go.mod2
-rw-r--r--go.sum2
-rw-r--r--utils/bitreader.go41
-rw-r--r--utils/utils.go31
5 files changed, 83 insertions, 133 deletions
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 @@
1package classes 1package classes
2 2
3import ( 3import (
4 "fmt"
5
6 "github.com/bisaxa/demoparser/utils" 4 "github.com/bisaxa/demoparser/utils"
7) 5)
8 6
@@ -15,110 +13,56 @@ type UserCmdInfo struct {
15 ForwardMove float32 13 ForwardMove float32
16 SideMove float32 14 SideMove float32
17 UpMove float32 15 UpMove float32
16 // Buttons int32 This could work but no idea on parsing buttons
17 // Impulse byte }
18 // WeaponSelect int32 }
19 // WeaponSubtype int32 Not worth the effort, no one cares about these
20 // MouseDx int16 }
21 // MouseDy int }
18} 22}
19 23
24// It is so janky it hurts, but hey it is at least working (hopefully)
25// Reading the data is really weird, who even implemented this smh
20func UserCmdInfoInit(byteArr []byte, size int32) (output UserCmdInfo) { 26func UserCmdInfoInit(byteArr []byte, size int32) (output UserCmdInfo) {
21 var class UserCmdInfo 27 var class UserCmdInfo
22 if utils.ReadBitsFromReversedByteArray1(byteArr) { 28 successCount := 0
23 class.CommandNumber = int32(utils.ReadBitsFromReversedByteArray16(byteArr, 15)) 29 failedCount := 0
24 fmt.Printf("%b\n", class.CommandNumber) 30 looped := 0
25 } 31 classIndex := 0
26 return class 32 // fmt.Println(byteArr)
27} 33 // fmt.Printf("%08b", byteArr)
28 34 for i := 0; i < 8; i++ {
29/* 35 if successCount+failedCount > 7 {
30func UserCmdInfoInit(byteArr []byte, size int) (output UserCmdInfo) { 36 failedCount = -successCount
31 var class UserCmdInfo 37 looped++
32 reversedByteArr := utils.ReverseByteArrayValues(byteArr, size)
33 reader := bitreader.BitReader(reversedByteArr)
34 if size-1 >= 4 {
35 bit, err := reader.ReadBit()
36 utils.CheckError(err)
37 if bit {
38 value, err := reader.ReadBits(32)
39 utils.CheckError(err)
40 class.CommandNumber = int32(value)
41 } else {
42 return class
43 } 38 }
44 } 39 firstBit, err := utils.ReadBitStateLSB(byteArr[successCount*4+looped], successCount+failedCount)
45 if size-1 >= 8 {
46 bit, err := reader.ReadBit()
47 utils.CheckError(err)
48 if bit {
49 value, err := reader.ReadBits(32)
50 utils.CheckError(err)
51 class.TickCount = int32(value)
52 } else {
53 return class
54 }
55 }
56 if size-1 >= 12 {
57 bit, err := reader.ReadBit()
58 utils.CheckError(err)
59 if bit {
60 value, err := reader.ReadBits(32)
61 utils.CheckError(err)
62 class.ViewAnglesX = float32(value)
63 } else {
64 return class
65 }
66 }
67 if size-1 >= 16 {
68 bit, err := reader.ReadBit()
69 utils.CheckError(err)
70 if bit {
71 value, err := reader.ReadBits(32)
72 utils.CheckError(err)
73 class.ViewAnglesY = float32(value)
74 } else {
75 return class
76 }
77 }
78 if size-1 >= 20 {
79 bit, err := reader.ReadBit()
80 utils.CheckError(err)
81 if bit {
82 value, err := reader.ReadBits(32)
83 utils.CheckError(err)
84 class.ViewAnglesZ = float32(value)
85 } else {
86 return class
87 }
88 }
89 if size-1 >= 24 {
90 bit, err := reader.ReadBit()
91 utils.CheckError(err)
92 if bit {
93 value, err := reader.ReadBits(32)
94 utils.CheckError(err)
95 class.ForwardMove = float32(value)
96 } else {
97 return class
98 }
99 }
100 if size-1 >= 28 {
101 bit, err := reader.ReadBit()
102 utils.CheckError(err)
103 if bit {
104 value, err := reader.ReadBits(32)
105 utils.CheckError(err)
106 class.SideMove = float32(value)
107 } else {
108 return class
109 }
110 }
111 if size-1 >= 32 {
112 bit, err := reader.ReadBit()
113 utils.CheckError(err) 40 utils.CheckError(err)
114 if bit { 41 if firstBit {
115 value, err := reader.ReadBits(32) 42 successCount++
116 utils.CheckError(err) 43 switch classIndex {
117 class.UpMove = float32(value) 44 case 0:
45 class.CommandNumber = utils.Read32BitsAfterFirstBitInt32(byteArr, successCount+failedCount, successCount*4+looped)
46 case 1:
47 class.TickCount = utils.Read32BitsAfterFirstBitInt32(byteArr, successCount+failedCount, successCount*4+looped)
48 case 2:
49 class.ViewAnglesX = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
50 case 3:
51 class.ViewAnglesY = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
52 case 4:
53 class.ViewAnglesZ = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
54 case 5:
55 class.ForwardMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
56 case 6:
57 class.SideMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
58 case 7:
59 class.UpMove = utils.Read32BitsAfterFirstBitFloat32(byteArr, successCount+failedCount, successCount*4+looped)
60 }
61 classIndex++
118 } else { 62 } else {
119 return class 63 failedCount++
64 classIndex++
120 } 65 }
121 } 66 }
122 return class 67 return class
123} 68}
124*/
diff --git a/go.mod b/go.mod
index a8203a2..c8d836c 100644
--- a/go.mod
+++ b/go.mod
@@ -1,5 +1,3 @@
1module github.com/bisaxa/demoparser 1module github.com/bisaxa/demoparser
2 2
3go 1.19 3go 1.19
4
5require 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 @@
1github.com/32bitkid/bitreader v1.0.1 h1:BlmpTTTL1us9nQ+EUh4M/r5/mY+j4JeC5qOCgL/08ms=
2github.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 @@
1package utils
2
3import (
4 "fmt"
5 "math"
6 "strconv"
7)
8
9func ReadBitStateLSB(input byte, index int) (bool, error) {
10 if index < 0 && index > 7 {
11 return false, fmt.Errorf("IndexOutOfBounds for type byte")
12 }
13 value := input & (1 << index)
14 return (value > 0), nil
15}
16
17func Read32BitsAfterFirstBitInt32(input []byte, index int, step int) int32 {
18 binary := ""
19 binary += fmt.Sprintf("%08b", input[step])[8-index : 8]
20 binary += fmt.Sprintf("%08b", input[step-1])
21 binary += fmt.Sprintf("%08b", input[step-2])
22 binary += fmt.Sprintf("%08b", input[step-3])
23 binary += fmt.Sprintf("%08b", input[step-4])[:8-index]
24 output, err := strconv.ParseInt(binary, 2, 32)
25 CheckError(err)
26 return int32(output)
27
28}
29
30func Read32BitsAfterFirstBitFloat32(input []byte, index int, step int) float32 {
31 binary := ""
32 binary += fmt.Sprintf("%08b", input[step])[8-index : 8]
33 binary += fmt.Sprintf("%08b", input[step-1])
34 binary += fmt.Sprintf("%08b", input[step-2])
35 binary += fmt.Sprintf("%08b", input[step-3])
36 binary += fmt.Sprintf("%08b", input[step-4])[:8-index]
37 output, err := strconv.ParseUint(binary, 2, 32)
38 CheckError(err)
39 return math.Float32frombits(uint32(output))
40
41}
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 @@
1package utils 1package utils
2 2
3import ( 3import (
4 "bytes"
5 "encoding/binary" 4 "encoding/binary"
6 "log" 5 "log"
7 "math" 6 "math"
8 "math/bits" 7 "math/bits"
9 "os" 8 "os"
10 "unsafe" 9 "unsafe"
11
12 "github.com/32bitkid/bitreader"
13) 10)
14 11
15func CheckError(e error) { 12func CheckError(e error) {
@@ -18,34 +15,6 @@ func CheckError(e error) {
18 } 15 }
19} 16}
20 17
21func ReadBitsFromReversedByteArray1(byteArr []byte) bool {
22 r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr))))
23 value, err := r.Read1()
24 CheckError(err)
25 return value
26}
27
28func ReadBitsFromReversedByteArray8(byteArr []byte, bitLength uint) uint8 {
29 r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr))))
30 value, err := r.Read8(bitLength)
31 CheckError(err)
32 return value
33}
34
35func ReadBitsFromReversedByteArray16(byteArr []byte, bitLength uint) uint16 {
36 r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr))))
37 value, err := r.Read16(bitLength)
38 CheckError(err)
39 return value
40}
41
42func ReadBitsFromReversedByteArray32(byteArr []byte, bitLength uint) uint32 {
43 r := bitreader.NewReader(bytes.NewBuffer(ReverseByteArrayValues(byteArr, len(byteArr))))
44 value, err := r.Read32(bitLength)
45 CheckError(err)
46 return value
47}
48
49func ReverseByteArrayValues(byteArr []byte, size int) []byte { 18func ReverseByteArrayValues(byteArr []byte, size int) []byte {
50 arr := make([]byte, size) 19 arr := make([]byte, size)
51 for index, byteValue := range byteArr { 20 for index, byteValue := range byteArr {