Commit before bitstream rewrite

This commit is contained in:
Emily 2021-05-04 15:50:53 +02:00
parent 6d9c0805ac
commit 4812d9c35d
3 changed files with 114 additions and 13 deletions

45
notes/notes.txt Normal file
View File

@ -0,0 +1,45 @@
SendImmediate( (char*)bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), SYSTEM_PRIORITY, UNRELIABLE, 0, target, false, false, currentTimeNS )
char* data = bitStream.GetData()
int numberOfBitsToSend = bitStream.GetNumberOfBitsUsed()
PacketPriority priority = SYSTEM_PRIORITY
PacketReliability reliability = UNRELIABLE
char orderingChannel = 0
PlayerID playerId = target
bool broadcast = false
bool useCallerDataAllocation = false
RakNetTimeNS currentTime = currentTimeNS
Send( char *data, int numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, unsigned char orderingChannel, bool makeDataCopy, int MTUSize, RakNetTimeNS currentTime )
char* data = bitStream.GetData()
int numberOfBitsToSend = bitStream.GetNumberOfBitsUsed()
PacketPriority priority = SYSTEM_PRIORITY
PacketReliability reliability = UNRELIABLE
char orderingChannel = 0
bool makeDataCopy = true
int MTUSize = 576
RakNetTimeNS currentTime = currentTimeNS
internalPacket->creationTime = currentTime
internalPacket->data = data // (cpy)
internalPacket->dataBitLength = numberOfBitsToSend
internalPacket->nextActionTime = 0
internalPacket->messageNumber = messageNumber
internalPacket->priority = priority
internalPacket->reliability = reliability
internalPacket->splitPacketCount = 0
int headerLength = BITS_TO_BYTES( GetBitStreamHeaderLength(internalPacket) )
int maxDataSize = 576 - 28 - headerLength // MTUSize - UDP_HEADER_SIZE - headerLength
; More stuff to note from
...
sendPacketSet[ internalPacket->priority ].Push( internalPacket );

View File

@ -75,8 +75,8 @@ class PlayerClient(BaseClient):
async def on_player_packet(self, packet: bytes): async def on_player_packet(self, packet: bytes):
bitstream = Bitstream(packet) bitstream = Bitstream(packet)
_, has_acks = bitstream.read(0x01) _, has_acks = bitstream.read_bit()
if has_acks[0]: if has_acks:
logger.debug("Unfinished code hit; has_acks: True") logger.debug("Unfinished code hit; has_acks: True")
return return
@ -90,16 +90,26 @@ class PlayerClient(BaseClient):
return False return False
_, message_number = bitstream.read(0x10) _, message_number = bitstream.read(0x10)
_, reliability = bitstream.read(0x04) _, reliability = bitstream.read_int(0x04)
_, is_split_packet = bitstream.read(0x01)
if is_split_packet[0]: if reliability in (7, 9, 10):
success, ordering_channel = bitstream.read_int(0x05)
if success == False:
return False
success, ordering_index = bitstream.read_int(0x10)
if success == False:
return False
_, is_split_packet = bitstream.read_bit()
if is_split_packet:
logger.warning("Skipping split packet") logger.warning("Skipping split packet")
return return
# Something I dont understand yet # Something I dont understand yet
# TODO: ReadCompressed # TODO: ReadCompressed
bitstream.offset += 1 #bitstream.offset += 1
_, data = bitstream.read_compressed(0x10, True)
_, unknown = bitstream.read(0x01) _, unknown = bitstream.read(0x01)
_, bit_length = bitstream.read(0x08) _, bit_length = bitstream.read(0x08)
## ##

View File

@ -2,7 +2,7 @@ import ctypes as c
from array import array from array import array
from typing import Tuple from typing import Tuple, Union
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -78,10 +78,10 @@ class Bitstream:
self._buffer[byte_index] = byte self._buffer[byte_index] = byte
return True return True
def read(self, bit_length: int) -> Tuple[bool, bytes]: def read_int(self, bit_length: int) -> Tuple[bool, int]:
if not self._can_access_bits(bit_length): if not self._can_access_bits(bit_length):
return False, b"" return False, 0
byte_from = self._offset >> 3 byte_from = self._offset >> 3
byte_to = (self._offset + bit_length + 7) >> 3 byte_to = (self._offset + bit_length + 7) >> 3
@ -105,10 +105,56 @@ class Bitstream:
#if self._offset % 8 == 0: #if self._offset % 8 == 0:
#value += #value +=
return True, value.to_bytes((bit_length + 7) >> 3, "big") # bytes(value) return True, value
def read(self, bit_length: int) -> Tuple[bool, bytes]:
success, value = self.read_int(bit_length)
return success, value.to_bytes((bit_length + 7) >> 3, "big") # bytes(value)
def read_compressed(self): def read_compressed(self, bit_length: int, unsigned: bool = True) -> Tuple[bool, bytes]:
pass current_byte = (bit_length >> 3) - 1
out = bytearray(current_byte + 1)
byte_match = 0 if unsigned else 0xFF
half_byte_match = 0 if unsigned else 0xF0
while current_byte > 0:
success, bit = self.read_bit()
if success == False: # Cannot read the bit (end of stream)
return False, out
if bit:
out[current_byte] = byte_match
current_byte -= 1
else:
success, data = self.read((current_byte + 1) << 3)
out[:current_byte] = data
if success == False:
return False, out
return True, out
if self.offset + 1 > self.length:
return False, out
success, bit = self.read_bit()
if success == False: # Cannot read the bit (end of stream)
return False, out
if bit:
success, data = self.read(4)
out[current_byte:current_byte + 4] = data
if success == False:
return False, out
out[current_byte] |= half_byte_match # Maybe recheck this in BitStream.cpp@L617; We have to set the high 4 bits since these are set to 0 by ReadBits
else:
success, data = self.read(8)
out[current_byte:current_byte + 8] = data
if success == False:
return False, out
return True, out
def pretty(self) -> str: def pretty(self) -> str:
b = bytearray(" " + " ".join(" ".join(format(c, "08b")) for c in self._buffer) + " ", "ascii") b = bytearray(" " + " ".join(" ".join(format(c, "08b")) for c in self._buffer) + " ", "ascii")