mirror of
https://port.numenaute.org/aleajactaest/clientbot.git
synced 2024-11-25 00:26:33 +00:00
update script
This commit is contained in:
parent
00364990cb
commit
94498be11c
1 changed files with 131 additions and 15 deletions
146
client.py
146
client.py
|
@ -163,7 +163,7 @@ class BitStream():
|
||||||
self.pushChar(x)
|
self.pushChar(x)
|
||||||
#y = ord(x)
|
#y = ord(x)
|
||||||
#self.internalSerial(y, 8)
|
#self.internalSerial(y, 8)
|
||||||
def pushArrayUint8(self, valeur, size):
|
def pushArrayUint8(self, valeur):
|
||||||
' ex.: pushArrayChar([0,1,3,4]) '
|
' ex.: pushArrayChar([0,1,3,4]) '
|
||||||
for i in valeur:
|
for i in valeur:
|
||||||
self.pushUint8(i)
|
self.pushUint8(i)
|
||||||
|
@ -422,6 +422,9 @@ class BitStream():
|
||||||
self._read = readBefore
|
self._read = readBefore
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def getPosInBit(self):
|
||||||
|
return self._pos
|
||||||
|
|
||||||
def TestBitStream():
|
def TestBitStream():
|
||||||
a = BitStream()
|
a = BitStream()
|
||||||
a.pushBool(True)
|
a.pushBool(True)
|
||||||
|
@ -1837,15 +1840,6 @@ class CPersistentDataRecord:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CActionBlock:
|
|
||||||
def __init__(self):
|
|
||||||
self.Cycle = 0
|
|
||||||
self.FirstPacket = 0
|
|
||||||
self.Actions = None
|
|
||||||
self.Sucess = True
|
|
||||||
|
|
||||||
|
|
||||||
def getPowerOf2(v):
|
def getPowerOf2(v):
|
||||||
res=1;
|
res=1;
|
||||||
ret=0;
|
ret=0;
|
||||||
|
@ -2427,6 +2421,9 @@ class CActionGeneric(CAction):
|
||||||
size = message.readUint32('size')
|
size = message.readUint32('size')
|
||||||
self._Message = message.readBitStreamUint8(size, 'message')
|
self._Message = message.readBitStreamUint8(size, 'message')
|
||||||
|
|
||||||
|
def pack(self, msgout):
|
||||||
|
msgout.pushArrayUint8(self._Message, len(self._Message) )
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self._Message = None
|
self._Message = None
|
||||||
|
|
||||||
|
@ -2455,6 +2452,13 @@ class CActionGenericMultiPart(CAction):
|
||||||
size = message.readUint32('size')
|
size = message.readUint32('size')
|
||||||
self.PartCont = message.readBitStreamUint8(size, 'PartCont')
|
self.PartCont = message.readBitStreamUint8(size, 'PartCont')
|
||||||
|
|
||||||
|
|
||||||
|
def pack(self, msgout):
|
||||||
|
msgout.pushUint8(self.Number)
|
||||||
|
msgout.pushUint16(self.Part)
|
||||||
|
msgout.pushUint16(self.NbBlock)
|
||||||
|
msgout.pushArrayUint8(self.PartCont)
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.PartCont = []
|
self.PartCont = []
|
||||||
self.Number = 0
|
self.Number = 0
|
||||||
|
@ -2572,6 +2576,30 @@ class CActionFactory:
|
||||||
log = logging.getLogger('myLogger')
|
log = logging.getLogger('myLogger')
|
||||||
log.warning('Unpacking an action with unknown code, skip it (%u)' % code)
|
log.warning('Unpacking an action with unknown code, skip it (%u)' % code)
|
||||||
return action
|
return action
|
||||||
|
def pack(self, action, msgout):
|
||||||
|
if action.Code < 4:
|
||||||
|
msgout.pushBool(True)
|
||||||
|
msgout.internalSerial(self.Code, 2)
|
||||||
|
else:
|
||||||
|
msgout.pushBool(False)
|
||||||
|
msgout.pushUint8(self.Code)
|
||||||
|
action.pack(message)
|
||||||
|
|
||||||
|
class CActionBlock:
|
||||||
|
def __init__(self):
|
||||||
|
self.Cycle = 0
|
||||||
|
self.FirstPacket = 0
|
||||||
|
self.Actions = None
|
||||||
|
self.Sucess = True
|
||||||
|
|
||||||
|
def serial(self, msgout, actionFactory):
|
||||||
|
msgout.pushUint32(self.Cycle)
|
||||||
|
msgout.pushUint8(len(self.Actions))
|
||||||
|
for action in self.Actions:
|
||||||
|
# msgPosBefore = msgout.getPosInBit()
|
||||||
|
actionFactory.pack(action, msgout)
|
||||||
|
# msgPosAfter = msgout.getPosInBit()
|
||||||
|
# actionSize = actionFactory.size(action)
|
||||||
|
|
||||||
class CImpulseDecoder:
|
class CImpulseDecoder:
|
||||||
'''
|
'''
|
||||||
|
@ -2630,6 +2658,11 @@ class CImpulseDecoder:
|
||||||
self._LastAck1 = [-1, -1]
|
self._LastAck1 = [-1, -1]
|
||||||
self._LastAck2 = [-1, -1, -1, -1]
|
self._LastAck2 = [-1, -1, -1, -1]
|
||||||
|
|
||||||
|
class TStampQueue:
|
||||||
|
def __init__(self, first=None, second=None):
|
||||||
|
self.first = first
|
||||||
|
self.second = second
|
||||||
|
|
||||||
class ClientNetworkConnection:
|
class ClientNetworkConnection:
|
||||||
'''
|
'''
|
||||||
Partie client de la gestion de la communication reseau avec le serveur:
|
Partie client de la gestion de la communication reseau avec le serveur:
|
||||||
|
@ -2689,6 +2722,10 @@ class ClientNetworkConnection:
|
||||||
self._Actions = []
|
self._Actions = []
|
||||||
self._PacketStamps = []
|
self._PacketStamps = []
|
||||||
self.decodeImpulse = DecodeImpulse(self.log, self.world)
|
self.decodeImpulse = DecodeImpulse(self.log, self.world)
|
||||||
|
self._InstantPing = 0
|
||||||
|
self._BestPing = 10000
|
||||||
|
self._MsPerTick = 100
|
||||||
|
self._LastSendTime = 0
|
||||||
|
|
||||||
def signal_exit(self, sig, frame):
|
def signal_exit(self, sig, frame):
|
||||||
self.log.warning("Receive signal to quit program")
|
self.log.warning("Receive signal to quit program")
|
||||||
|
@ -2719,6 +2756,7 @@ class ClientNetworkConnection:
|
||||||
def buildSystemHeader(self, msgout): # code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::buildSystemHeader(NLMISC::CBitMemStream &msgout)
|
def buildSystemHeader(self, msgout): # code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::buildSystemHeader(NLMISC::CBitMemStream &msgout)
|
||||||
msgout.pushSint32(self._CurrentSendNumber)
|
msgout.pushSint32(self._CurrentSendNumber)
|
||||||
msgout.pushBool(True) # systemMode
|
msgout.pushBool(True) # systemMode
|
||||||
|
self._PacketStamps.append( TStampQueue(self._CurrentSendNumber, self._UpdateTime) )
|
||||||
self._CurrentSendNumber += 1
|
self._CurrentSendNumber += 1
|
||||||
|
|
||||||
def sendSystemLogin(self): # code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::sendSystemLogin()
|
def sendSystemLogin(self): # code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::sendSystemLogin()
|
||||||
|
@ -2774,6 +2812,7 @@ class ClientNetworkConnection:
|
||||||
|
|
||||||
|
|
||||||
def sendSystemDisconnection(self):
|
def sendSystemDisconnection(self):
|
||||||
|
self.log.debug("sendSystemDisconnection")
|
||||||
if self._sock is None:
|
if self._sock is None:
|
||||||
raise ValueError
|
raise ValueError
|
||||||
msgout = BitStream()
|
msgout = BitStream()
|
||||||
|
@ -2781,6 +2820,36 @@ class ClientNetworkConnection:
|
||||||
msgout.pushUint8(CLFECOMMON.SYSTEM_DISCONNECTION_CODE)
|
msgout.pushUint8(CLFECOMMON.SYSTEM_DISCONNECTION_CODE)
|
||||||
self._sock.sendto(msgout.toBytes(), self.frontend)
|
self._sock.sendto(msgout.toBytes(), self.frontend)
|
||||||
|
|
||||||
|
def sendNormalMessage(self):
|
||||||
|
self.log.debug("sendNormalMessage")
|
||||||
|
if self._sock is None:
|
||||||
|
raise ValueError
|
||||||
|
msgout = BitStream()
|
||||||
|
msgout.pushSint32(self._CurrentSendNumber)
|
||||||
|
msgout.pushBool(False) # Normal
|
||||||
|
msgout.pushSint32(self._LastReceivedNumber)
|
||||||
|
msgout.pushSint32(self._AckBitMask)
|
||||||
|
|
||||||
|
numPacked = 0
|
||||||
|
|
||||||
|
for block in self._Actions:
|
||||||
|
if block.Cycle == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
if block.FirstPacket == 0:
|
||||||
|
block.FirstPacket = self._CurrentSendNumber;
|
||||||
|
|
||||||
|
block.serial(message)
|
||||||
|
numPacked += 1
|
||||||
|
if message.getPosInBit() > 480*8: # easy version
|
||||||
|
break
|
||||||
|
|
||||||
|
self._sock.sendto(msgout.toBytes(), self.frontend)
|
||||||
|
|
||||||
|
self._LastSendTime = int(time.clock_gettime(1)*1000)
|
||||||
|
self._PacketStamps.append( TStampQueue(self._CurrentSendNumber, self._UpdateTime) )
|
||||||
|
self._CurrentSendNumber += 1
|
||||||
|
|
||||||
def readDelta(self, msg):
|
def readDelta(self, msg):
|
||||||
propertyCount = msg.readUint16('propertyCount')
|
propertyCount = msg.readUint16('propertyCount')
|
||||||
self.log.debug("propertyCount:%d" % propertyCount)
|
self.log.debug("propertyCount:%d" % propertyCount)
|
||||||
|
@ -2879,7 +2948,16 @@ class ClientNetworkConnection:
|
||||||
self.sendSystemAckSync()
|
self.sendSystemAckSync()
|
||||||
|
|
||||||
def decodeVisualProperties(self, msgin):
|
def decodeVisualProperties(self, msgin):
|
||||||
self.log.debug("TODO")
|
'''
|
||||||
|
khanat-opennel-code/code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::decodeVisualProperties( CBitMemStream& msgin )
|
||||||
|
'''
|
||||||
|
while True:
|
||||||
|
if msgin.getPosInBit() + 8*8 > len(msgin)*8:
|
||||||
|
return
|
||||||
|
slot = msgin.readUint8('slot')
|
||||||
|
associationBits = msgin.readUint32('associationBits')
|
||||||
|
self.log.debug("TODO")
|
||||||
|
return
|
||||||
|
|
||||||
def receiveNormalMessage(self, msgin):
|
def receiveNormalMessage(self, msgin):
|
||||||
self.log.debug("received normal message Packet (%d) %s" % (msgin.needRead(), msgin.showLastData() ))
|
self.log.debug("received normal message Packet (%d) %s" % (msgin.needRead(), msgin.showLastData() ))
|
||||||
|
@ -2890,12 +2968,42 @@ class ClientNetworkConnection:
|
||||||
self.log.debug('actions: None')
|
self.log.debug('actions: None')
|
||||||
self.log.debug("Message not read (%d) %s" % (msgin.needRead(), msgin.showLastData() ))
|
self.log.debug("Message not read (%d) %s" % (msgin.needRead(), msgin.showLastData() ))
|
||||||
|
|
||||||
# remove all old action that are acked
|
# remove all old actions that are acked
|
||||||
while self._Actions and self._Actions[0].FirstPacket != 0 and self._Actions[0].FirstPacket :
|
while self._Actions and self._Actions[0].FirstPacket != 0 and self._Actions[0].FirstPacket :
|
||||||
|
self.log.debug("remove old action")
|
||||||
self._Actions.pop(0)
|
self._Actions.pop(0)
|
||||||
|
|
||||||
self._CurrentServerTick = self._CurrentReceivedNumber * 2 + self._Synchronize
|
self._CurrentServerTick = self._CurrentReceivedNumber * 2 + self._Synchronize
|
||||||
|
|
||||||
|
# remove useless stamps in queue
|
||||||
|
while len(self._PacketStamps) != 0 and self._LastReceivedAck > self._PacketStamps[0].first:
|
||||||
|
self._PacketStamps.pop(0)
|
||||||
|
|
||||||
|
# Statistique !
|
||||||
|
if len(self._PacketStamps) == 0 or self._PacketStamps[0].first > self._LastReceivedAck:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
ackedPacketTime = self._PacketStamps[0].second
|
||||||
|
ping = self._UpdateTime - ackedPacketTime
|
||||||
|
self._InstantPing = ping
|
||||||
|
if ping < self._BestPing:
|
||||||
|
self._BestPing = ping
|
||||||
|
earliest = ackedPacketTime + self._BestPing//2
|
||||||
|
latest = self._UpdateTime - self._BestPing//2
|
||||||
|
|
||||||
|
numStepTick = self._CurrentServerTick - self._CurrentClientTick
|
||||||
|
if numStepTick > 0 and earliest > self._CurrentClientTime and latest > self._CurrentClientTime:
|
||||||
|
if self._CurrentClientTime + self._MsPerTick * numStepTick < earliest:
|
||||||
|
self._MsPerTick = (earliest - self._CurrentClientTime)//numStepTick
|
||||||
|
if (self._CurrentClientTime + self._MsPerTick * numStepTick) > latest:
|
||||||
|
self._MsPerTick = (latest - self._CurrentClientTime)//numStepTick
|
||||||
|
if self._MsPerTick == 0:
|
||||||
|
self.log.warning("_MsPerTick is 0 because server tick is too big %d compare to the client tick is %d" %(self._CurrentServerTick, self._CurrentClientTick))
|
||||||
|
self._MsPerTick = 1
|
||||||
|
elif numStepTick <= 0:
|
||||||
|
self._MsPerTick = self._LCT
|
||||||
|
|
||||||
|
|
||||||
## remove useless stamps in queue
|
## remove useless stamps in queue
|
||||||
#while self._PacketStamps and self._LastReceivedAck > self._PacketStamps[0].first:
|
#while self._PacketStamps and self._LastReceivedAck > self._PacketStamps[0].first:
|
||||||
# self._PacketStamps.pop(0)
|
# self._PacketStamps.pop(0)
|
||||||
|
@ -2918,7 +3026,7 @@ class ClientNetworkConnection:
|
||||||
# Decode the visual properties
|
# Decode the visual properties
|
||||||
self.decodeVisualProperties( msgin );
|
self.decodeVisualProperties( msgin );
|
||||||
|
|
||||||
self._LastReceivedNormalTime = self._UpdateTime;
|
self._LastReceivedNormalTime = int(time.clock_gettime(1)*1000)
|
||||||
|
|
||||||
def receiveSystemAckQuit(self, msgin):
|
def receiveSystemAckQuit(self, msgin):
|
||||||
self.log.debug("received ACK_QUIT")
|
self.log.debug("received ACK_QUIT")
|
||||||
|
@ -3157,6 +3265,10 @@ class ClientNetworkConnection:
|
||||||
if counterLoop > 10:
|
if counterLoop > 10:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def send(self):
|
||||||
|
if self._ConnectionState == TConnectionState.Connected and self._LastSendTime > 100:
|
||||||
|
self.sendNormalMessage()
|
||||||
|
|
||||||
def EmulateFirst(self, msgRawXml, databaseRawXml):
|
def EmulateFirst(self, msgRawXml, databaseRawXml):
|
||||||
self.msgXml = ET.fromstring(msgRawXml)
|
self.msgXml = ET.fromstring(msgRawXml)
|
||||||
#ET.dump(msgXml)
|
#ET.dump(msgXml)
|
||||||
|
@ -3173,9 +3285,13 @@ class ClientNetworkConnection:
|
||||||
self.sendSystemLogin()
|
self.sendSystemLogin()
|
||||||
|
|
||||||
self.log.info("Receive Message")
|
self.log.info("Receive Message")
|
||||||
for i in range(0, 2): # while True:
|
i = 0
|
||||||
self.log.debug('loop %d' % i)
|
for _ in range(0, 50):
|
||||||
|
#while True:
|
||||||
|
self.log.debug("%s [%s: %d] %s" % ("*" * 40, "Loop", i,"*" * 40))
|
||||||
self.update()
|
self.update()
|
||||||
|
self.send()
|
||||||
|
i += 1
|
||||||
|
|
||||||
self.log.info("Client Quit")
|
self.log.info("Client Quit")
|
||||||
self.sendSystemQuit()
|
self.sendSystemQuit()
|
||||||
|
|
Loading…
Reference in a new issue