support initial ARUP not present in handshake
This commit is contained in:
parent
ce91cf1867
commit
b427621690
689
gameview.py
689
gameview.py
@ -1288,7 +1288,7 @@ class gui(QtGui.QWidget):
|
|||||||
self.realizationbtn.setToolTip('Show the next message with a realization effect')
|
self.realizationbtn.setToolTip('Show the next message with a realization effect')
|
||||||
self.realizationsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0)
|
self.realizationsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0)
|
||||||
self.shakebtn = buttons.AOToggleButton(self, 265+42 + 164, 192 + 304, "screenshake") # AO 2.8
|
self.shakebtn = buttons.AOToggleButton(self, 265+42 + 164, 192 + 304, "screenshake") # AO 2.8
|
||||||
self.shakebtn.clicked.connect(self.icchat_focus)
|
self.shakebtn.clicked.connect(self.onShakeButton)
|
||||||
self.shakebtn.setToolTip('Show the next message with a shaking effect')
|
self.shakebtn.setToolTip('Show the next message with a shaking effect')
|
||||||
self.customobject = buttons.CustomObjection(self, 250 + 516 - 30, 312 + 40)
|
self.customobject = buttons.CustomObjection(self, 250 + 516 - 30, 312 + 40)
|
||||||
|
|
||||||
@ -1352,6 +1352,7 @@ class gui(QtGui.QWidget):
|
|||||||
|
|
||||||
self.areas = []
|
self.areas = []
|
||||||
self.areas_len = 0
|
self.areas_len = 0
|
||||||
|
self.no_arup = False
|
||||||
self.muteselected = -1
|
self.muteselected = -1
|
||||||
self.unmuteselected = -1
|
self.unmuteselected = -1
|
||||||
self.muted = []
|
self.muted = []
|
||||||
@ -1454,6 +1455,10 @@ class gui(QtGui.QWidget):
|
|||||||
self.effectdropdown.setCurrentIndex(0)
|
self.effectdropdown.setCurrentIndex(0)
|
||||||
self.icchat_focus()
|
self.icchat_focus()
|
||||||
|
|
||||||
|
def onShakeButton(self):
|
||||||
|
self.sfxbutton.setChecked(False)
|
||||||
|
self.icchat_focus()
|
||||||
|
|
||||||
def onOOCLoginBtn(self):
|
def onOOCLoginBtn(self):
|
||||||
if not self.oocnameinput.text():
|
if not self.oocnameinput.text():
|
||||||
self.oocnameinput.setText("unnamed")
|
self.oocnameinput.setText("unnamed")
|
||||||
@ -3402,6 +3407,100 @@ class gui(QtGui.QWidget):
|
|||||||
if self.musicslider.value() == 0:
|
if self.musicslider.value() == 0:
|
||||||
audio.pausehandle(self.music)
|
audio.pausehandle(self.music)
|
||||||
|
|
||||||
|
def allMusic(self):
|
||||||
|
for song, fname in self.musiclist.items():
|
||||||
|
songitem = QtGui.QListWidgetItem()
|
||||||
|
songitem.setText(song)
|
||||||
|
if exists(unicode(AOpath + 'sounds/music/' + fname.replace("<and>","&").lower())):
|
||||||
|
songitem.setBackgroundColor(QtGui.QColor(128, 255, 128))
|
||||||
|
#else:
|
||||||
|
#songitem.setBackgroundColor(QtGui.QColor(255, 128, 128))
|
||||||
|
self.musicitems.addItem(songitem)
|
||||||
|
|
||||||
|
def allEvidence(self, evi):
|
||||||
|
self.evidence = evi
|
||||||
|
if self.evidencedropdown.count() > 0:
|
||||||
|
self.evidencedropdown.clear()
|
||||||
|
for evi in self.evidence:
|
||||||
|
while len(evi) < 3: # new AO 2.9 bug where they never correctly escaped evidence name/desc/image on FantaProtocol
|
||||||
|
evi += [""]
|
||||||
|
evi[0] = decode_ao_str(evi[0].decode('utf-8'))
|
||||||
|
evi[1] = decode_ao_str(evi[1].decode('utf-8'))
|
||||||
|
evi[2] = decode_ao_str(evi[2].decode('utf-8'))
|
||||||
|
self.evidencedropdown.addItem(evi[0].strip())
|
||||||
|
|
||||||
|
if not self.evidence:
|
||||||
|
self.evidencedropdown.setCurrentIndex(0)
|
||||||
|
self.evidencedesc.setText('.')
|
||||||
|
else:
|
||||||
|
self.evidencedropdown.setCurrentIndex(self.selectedevi)
|
||||||
|
|
||||||
|
def updatePlayerList(self, pid, op, utype, data=""):
|
||||||
|
pid = str(pid)
|
||||||
|
if op == 0: # Add or remove player
|
||||||
|
if utype == 0: # Add a player
|
||||||
|
self.playerList.addItem("[%s]" % pid)
|
||||||
|
if not pid in self.playerlist:
|
||||||
|
self.playerlist[pid] = ["", "", "", ""]
|
||||||
|
if utype == 1: # Remove a player
|
||||||
|
item = self.playerList.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith)
|
||||||
|
if item:
|
||||||
|
self.playerList.takeItem(self.playerList.row(item[0]))
|
||||||
|
if pid in self.playerlist:
|
||||||
|
del self.playerlist[pid]
|
||||||
|
else: # Update a player
|
||||||
|
if pid in self.playerlist:
|
||||||
|
self.playerlist[pid][utype] = data
|
||||||
|
|
||||||
|
item = self.playerList.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith)
|
||||||
|
if item:
|
||||||
|
name = self.playerlist[pid][0]
|
||||||
|
char = self.playerlist[pid][1]
|
||||||
|
charname = self.playerlist[pid][2]
|
||||||
|
text = "[%s]" % pid
|
||||||
|
if char:
|
||||||
|
text += " %s" % char
|
||||||
|
if charname:
|
||||||
|
text += " (%s)" % charname
|
||||||
|
if name:
|
||||||
|
text += " %s" % name
|
||||||
|
item[0].setText(text)
|
||||||
|
|
||||||
|
def start_pause_timers(self, command, timer_id, timer_ms):
|
||||||
|
if command == 0:
|
||||||
|
if not self.onscreen_timer.isActive():
|
||||||
|
self.onscreen_timer.start(self.timer_tick)
|
||||||
|
self.onscreen_timer_times[timer_id] = timer_ms
|
||||||
|
self.onscreen_timer_paused[timer_id] = False
|
||||||
|
self.update_timers()
|
||||||
|
print "[client] Timer %d was started for %d ms" % (timer_id, timer_ms)
|
||||||
|
elif command == 1:
|
||||||
|
self.onscreen_timer_paused[timer_id] = True
|
||||||
|
elif command == 2:
|
||||||
|
self.onscreen_timer_labels[timer_id].show()
|
||||||
|
elif command == 3:
|
||||||
|
self.onscreen_timer_labels[timer_id].hide()
|
||||||
|
|
||||||
|
def update_timers(self):
|
||||||
|
for timer_id, label in enumerate(self.onscreen_timer_labels):
|
||||||
|
time_ms = self.onscreen_timer_times[timer_id]
|
||||||
|
if not time_ms or self.onscreen_timer_paused[timer_id]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
secs = time_ms / 1000
|
||||||
|
mins = secs / 60
|
||||||
|
hours = mins / 60
|
||||||
|
label.setText("%02d:%02d:%02d" % (hours, mins % 60, secs % 60))
|
||||||
|
|
||||||
|
self.onscreen_timer_times[timer_id] -= self.timer_tick
|
||||||
|
if self.onscreen_timer_times[timer_id] <= 0:
|
||||||
|
label.hide()
|
||||||
|
self.onscreen_timer_times[timer_id] = 0
|
||||||
|
self.onscreen_timer_paused[timer_id] = True
|
||||||
|
|
||||||
|
if self.onscreen_timer_times == [0, 0, 0, 0, 0]:
|
||||||
|
self.onscreen_timer.stop()
|
||||||
|
|
||||||
def startGame(self, tcp, playerlist, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""):
|
def startGame(self, tcp, playerlist, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""):
|
||||||
self.willDisconnect = False
|
self.willDisconnect = False
|
||||||
self.mychar = -1
|
self.mychar = -1
|
||||||
@ -3509,11 +3608,13 @@ class gui(QtGui.QWidget):
|
|||||||
for msg in oocjoin:
|
for msg in oocjoin:
|
||||||
self.ooclog.append(msg)
|
self.ooclog.append(msg)
|
||||||
|
|
||||||
self.allMusic()
|
if self.areas_len:
|
||||||
|
for i in range(self.areas_len):
|
||||||
for area in areas[0]:
|
areaitem = QtGui.QListWidgetItem()
|
||||||
areaitem = QtGui.QListWidgetItem()
|
self.areaitems.addItem(areaitem)
|
||||||
self.areaitems.addItem(areaitem)
|
self.allMusic()
|
||||||
|
else:
|
||||||
|
self.no_arup = True
|
||||||
|
|
||||||
for pid in playerlist:
|
for pid in playerlist:
|
||||||
self.updatePlayerList(pid, 0, 0)
|
self.updatePlayerList(pid, 0, 0)
|
||||||
@ -3543,99 +3644,269 @@ class gui(QtGui.QWidget):
|
|||||||
|
|
||||||
self.icchatinput.setFocus()
|
self.icchatinput.setFocus()
|
||||||
|
|
||||||
def allMusic(self):
|
class TCP_Thread(QtCore.QThread):
|
||||||
for song, fname in self.musiclist.items():
|
connectionError = QtCore.pyqtSignal(str, str, str)
|
||||||
songitem = QtGui.QListWidgetItem()
|
MS_Chat = QtCore.pyqtSignal(list)
|
||||||
songitem.setText(song)
|
newChar = QtCore.pyqtSignal(str)
|
||||||
if exists(unicode(AOpath + 'sounds/music/' + fname.replace("<and>","&").lower())):
|
newBackground = QtCore.pyqtSignal(str, bool)
|
||||||
songitem.setBackgroundColor(QtGui.QColor(128, 255, 128))
|
IC_Log = QtCore.pyqtSignal(str)
|
||||||
#else:
|
OOC_Log = QtCore.pyqtSignal(str)
|
||||||
#songitem.setBackgroundColor(QtGui.QColor(255, 128, 128))
|
charSlots = QtCore.pyqtSignal()
|
||||||
self.musicitems.addItem(songitem)
|
showCharSelect = QtCore.pyqtSignal()
|
||||||
|
allEvidence = QtCore.pyqtSignal(list)
|
||||||
|
rainbowColor = QtCore.pyqtSignal(str)
|
||||||
|
updatePlayerList = QtCore.pyqtSignal(str, int, int, str)
|
||||||
|
timerUpdate = QtCore.pyqtSignal(int, int, int)
|
||||||
|
|
||||||
def allEvidence(self, evi):
|
send_attempts = 0
|
||||||
self.evidence = evi
|
max_attempts = 5
|
||||||
if self.evidencedropdown.count() > 0:
|
|
||||||
self.evidencedropdown.clear()
|
|
||||||
for evi in self.evidence:
|
|
||||||
while len(evi) < 3: # new AO 2.9 bug where they never correctly escaped evidence name/desc/image on FantaProtocol
|
|
||||||
evi += [""]
|
|
||||||
evi[0] = decode_ao_str(evi[0].decode('utf-8'))
|
|
||||||
evi[1] = decode_ao_str(evi[1].decode('utf-8'))
|
|
||||||
evi[2] = decode_ao_str(evi[2].decode('utf-8'))
|
|
||||||
self.evidencedropdown.addItem(evi[0].strip())
|
|
||||||
|
|
||||||
if not self.evidence:
|
def __init__(self, parent):
|
||||||
self.evidencedropdown.setCurrentIndex(0)
|
super(TCP_Thread, self).__init__(parent)
|
||||||
self.evidencedesc.setText('.')
|
self.parent = parent
|
||||||
else:
|
|
||||||
self.evidencedropdown.setCurrentIndex(self.selectedevi)
|
|
||||||
|
|
||||||
def updatePlayerList(self, pid, op, utype, data=""):
|
def run(self):
|
||||||
pid = str(pid)
|
pingtimer = 150
|
||||||
if op == 0: # Add or remove player
|
rainbow = 0
|
||||||
if utype == 0: # Add a player
|
sendtick = 0
|
||||||
self.playerList.addItem("[%s]" % pid)
|
tempdata = ""
|
||||||
if not pid in self.playerlist:
|
color = QtGui.QColor()
|
||||||
self.playerlist[pid] = ["", "", "", ""]
|
color.setHsv(rainbow, 255, 255)
|
||||||
if utype == 1: # Remove a player
|
#color.setHsv(0, 255, 255)
|
||||||
item = self.playerList.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith)
|
while True:
|
||||||
if item:
|
if self.parent.disconnectnow:
|
||||||
self.playerList.takeItem(self.playerList.row(item[0]))
|
self.parent.disconnectCommon()
|
||||||
if pid in self.playerlist:
|
self.quit()
|
||||||
del self.playerlist[pid]
|
return
|
||||||
else: # Update a player
|
pingtimer -= 1
|
||||||
if pid in self.playerlist:
|
|
||||||
self.playerlist[pid][utype] = data
|
|
||||||
|
|
||||||
item = self.playerList.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith)
|
if pingtimer == 0:
|
||||||
if item:
|
pingbefore = time.time()
|
||||||
name = self.playerlist[pid][0]
|
self.parent.tcp.send('CH#%')
|
||||||
char = self.playerlist[pid][1]
|
pingtimer = 150
|
||||||
charname = self.playerlist[pid][2]
|
|
||||||
text = "[%s]" % pid
|
|
||||||
if char:
|
|
||||||
text += " %s" % char
|
|
||||||
if charname:
|
|
||||||
text += " (%s)" % charname
|
|
||||||
if name:
|
|
||||||
text += " %s" % name
|
|
||||||
item[0].setText(text)
|
|
||||||
|
|
||||||
def start_pause_timers(self, command, timer_id, timer_ms):
|
if self.parent.m_chatmessage[TEXT_COLOR] == str(C_RAINBOW):
|
||||||
if command == 0:
|
color.setHsv(rainbow, 255, 255)
|
||||||
if not self.onscreen_timer.isActive():
|
rainbow += 5
|
||||||
self.onscreen_timer.start(self.timer_tick)
|
if rainbow > 255:
|
||||||
self.onscreen_timer_times[timer_id] = timer_ms
|
rainbow = 0
|
||||||
self.onscreen_timer_paused[timer_id] = False
|
#self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')')
|
||||||
self.update_timers()
|
self.rainbowColor.emit('background-color: rgba(0, 0, 0, 0); color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')')
|
||||||
print "[client] Timer %d was started for %d ms" % (timer_id, timer_ms)
|
|
||||||
elif command == 1:
|
|
||||||
self.onscreen_timer_paused[timer_id] = True
|
|
||||||
elif command == 2:
|
|
||||||
self.onscreen_timer_labels[timer_id].show()
|
|
||||||
elif command == 3:
|
|
||||||
self.onscreen_timer_labels[timer_id].hide()
|
|
||||||
|
|
||||||
def update_timers(self):
|
if sendtick:
|
||||||
for timer_id, label in enumerate(self.onscreen_timer_labels):
|
sendtick -= 1
|
||||||
time_ms = self.onscreen_timer_times[timer_id]
|
if self.parent.msgqueue and not sendtick:
|
||||||
if not time_ms or self.onscreen_timer_paused[timer_id]:
|
self.parent.tcp.send(self.parent.msgqueue[0])
|
||||||
|
sendtick = 4
|
||||||
|
|
||||||
|
error, total = self.parent.tcp.recv()
|
||||||
|
if error == -2:
|
||||||
|
# if the message can't be sent, discard it
|
||||||
|
if sendtick == 4:
|
||||||
|
self.send_attempts += 1
|
||||||
|
if self.send_attempts >= self.max_attempts:
|
||||||
|
self.send_attempts = 0
|
||||||
|
#print "[warning] message discarded"
|
||||||
|
del self.parent.msgqueue[0]
|
||||||
|
self.parent.msgqueueList.takeItem(0)
|
||||||
|
continue
|
||||||
|
elif error == -1:
|
||||||
|
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', "%s connection to server lost." % ("WebSocket" if self.parent.tcp.isWS else "TCP"))
|
||||||
|
self.parent.willDisconnect = True
|
||||||
|
self.quit()
|
||||||
|
return
|
||||||
|
elif error == -3:
|
||||||
|
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', "There was a critical connection failure. Please check your internet connection.\n\nDetails: %s." % total)
|
||||||
|
self.parent.willDisconnect = True
|
||||||
|
self.quit()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.send_attempts = 0
|
||||||
|
|
||||||
|
handle_packets(self, total)
|
||||||
|
|
||||||
|
def handle_packets(caller, total):
|
||||||
|
for network in total:
|
||||||
|
header = network[0]
|
||||||
|
if header == 'MS':
|
||||||
|
if len(network) < 15:
|
||||||
|
print '[warning]', 'malformed/incomplete MS#chat (IC chat) network message was received'
|
||||||
continue
|
continue
|
||||||
|
|
||||||
secs = time_ms / 1000
|
network[CHATMSG] = decode_ao_str(network[CHATMSG].decode('utf-8'))
|
||||||
mins = secs / 60
|
caller.MS_Chat.emit(network)
|
||||||
hours = mins / 60
|
|
||||||
label.setText("%02d:%02d:%02d" % (hours, mins % 60, secs % 60))
|
|
||||||
|
|
||||||
self.onscreen_timer_times[timer_id] -= self.timer_tick
|
elif header == 'MC':
|
||||||
if self.onscreen_timer_times[timer_id] <= 0:
|
music = decode_ao_str(network[1])
|
||||||
label.hide()
|
charid = int(network[2])
|
||||||
self.onscreen_timer_times[timer_id] = 0
|
t = time.localtime()
|
||||||
self.onscreen_timer_paused[timer_id] = True
|
if charid != -1:
|
||||||
|
try:
|
||||||
|
name = caller.parent.charlist[charid][0]
|
||||||
|
except:
|
||||||
|
name = 'char id %d' % charid
|
||||||
|
|
||||||
if self.onscreen_timer_times == [0, 0, 0, 0, 0]:
|
if len(network) > 3 and network[3]:
|
||||||
self.onscreen_timer.stop()
|
name += " ("+network[3].decode("utf-8")+")"
|
||||||
|
caller.IC_Log.emit('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music))
|
||||||
|
else:
|
||||||
|
caller.IC_Log.emit('[%d:%.2d] The music was changed to %s' % (t[3], t[4], music))
|
||||||
|
caller.parent.playMusic(music)
|
||||||
|
|
||||||
|
elif header == 'BN':
|
||||||
|
caller.newBackground.emit(network[1].lower(), True)
|
||||||
|
|
||||||
|
elif header == 'CT':
|
||||||
|
name = decode_ao_str(network[1].decode('utf-8'))
|
||||||
|
chatmsg = decode_ao_str(network[2].decode('utf-8').replace("\n", "<br />"))
|
||||||
|
caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg))
|
||||||
|
|
||||||
|
elif header == 'PV':
|
||||||
|
caller.parent.mychar = int(network[3])
|
||||||
|
caller.parent.charselect.hide()
|
||||||
|
caller.newChar.emit(caller.parent.charlist[caller.parent.mychar][0])
|
||||||
|
|
||||||
|
elif header == 'LE':
|
||||||
|
del network[0]
|
||||||
|
caller.allEvidence.emit([evi.split('&') for evi in network])
|
||||||
|
|
||||||
|
elif header == 'ZZ':
|
||||||
|
if caller.parent.modcall:
|
||||||
|
audio.freehandle(caller.parent.modcall)
|
||||||
|
caller.parent.modcall = audio.loadhandle(0, "mod_call.wav", 0, 0, 0)
|
||||||
|
audio.sethandleattr(caller.parent.modcall, BASS_ATTRIB_VOL, caller.parent.soundslider.value() / 100.0)
|
||||||
|
audio.playhandle(caller.parent.modcall, False)
|
||||||
|
|
||||||
|
if len(network) > 1:
|
||||||
|
caller.OOC_Log.emit('<b>[MOD CALL] ' + network[1].replace("\n", "<br />") + '</b>')
|
||||||
|
else:
|
||||||
|
caller.OOC_Log.emit('<b>[MOD CALL] But there was no extra information. (old server?)</b>')
|
||||||
|
elif header == 'CharsCheck':
|
||||||
|
del network[0]
|
||||||
|
for i in range(len(network)):
|
||||||
|
caller.parent.charlist[i][1] = int(network[i])
|
||||||
|
|
||||||
|
caller.charSlots.emit()
|
||||||
|
|
||||||
|
elif header == 'RT':
|
||||||
|
testimony = network[1]
|
||||||
|
wtcefile = AOpath+"sounds/general/sfx-testimony2"
|
||||||
|
if caller.parent.wtcesfx:
|
||||||
|
audio.freehandle(caller.parent.wtcesfx)
|
||||||
|
|
||||||
|
if testimony == 'judgeruling':
|
||||||
|
variant = int(network[2])
|
||||||
|
if variant == 0:
|
||||||
|
wtcefile = AOpath+"sounds/general/sfx-notguilty"
|
||||||
|
elif variant == 1:
|
||||||
|
wtcefile = AOpath+"sounds/general/sfx-guilty"
|
||||||
|
else:
|
||||||
|
variant = 0
|
||||||
|
caller.parent.wtcesfx = audio.loadhandle(False, wtcefile+".opus" if exists(wtcefile+".opus") else wtcefile+".wav", 0, 0, 0)
|
||||||
|
audio.sethandleattr(caller.parent.wtcesfx, BASS_ATTRIB_VOL, caller.parent.soundslider.value() / 100.0)
|
||||||
|
audio.playhandle(caller.parent.wtcesfx, True)
|
||||||
|
caller.parent.WTCEsignal.emit(testimony, variant)
|
||||||
|
|
||||||
|
elif header == 'HP':
|
||||||
|
kind = int(network[1])
|
||||||
|
health = int(network[2])
|
||||||
|
caller.parent.healthbars.emit(kind, health)
|
||||||
|
|
||||||
|
elif header == 'KK':
|
||||||
|
reason = network[1]
|
||||||
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You were kicked from the server. (%s)' % reason)
|
||||||
|
|
||||||
|
elif header == 'KB':
|
||||||
|
reason = network[1]
|
||||||
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You have been banned from the server. (%s)' % reason)
|
||||||
|
|
||||||
|
elif header == 'BB': # message popup (AO 2.9)
|
||||||
|
message = network[1]
|
||||||
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'information', 'Message from server', message)
|
||||||
|
|
||||||
|
elif header == 'AUTH': # login status (AO 2.9)
|
||||||
|
status = int(network[1])
|
||||||
|
statusStrings = ["You have logged out", "Wrong password", "Logged in"]
|
||||||
|
if status == 1:
|
||||||
|
caller.parent.login = True
|
||||||
|
caller.parent.playerKick.setDisabled(False)
|
||||||
|
caller.parent.playerBan.setDisabled(False)
|
||||||
|
caller.parent.ooclogin.setText("Lo&g out")
|
||||||
|
elif status == -1:
|
||||||
|
caller.parent.login = False
|
||||||
|
caller.parent.playerKick.setDisabled(True)
|
||||||
|
caller.parent.playerBan.setDisabled(True)
|
||||||
|
caller.parent.ooclogin.setText("Lo&gin")
|
||||||
|
caller.OOC_Log.emit("<b>%s</b>" % (statusStrings[status+1]))
|
||||||
|
|
||||||
|
elif header == "CHECK": #ping
|
||||||
|
pingafter = time.time()
|
||||||
|
caller.parent.gotPing.emit(int((pingafter - pingbefore)*1000))
|
||||||
|
|
||||||
|
elif header == 'DONE':
|
||||||
|
caller.showCharSelect.emit()
|
||||||
|
|
||||||
|
elif header == 'PR':
|
||||||
|
del network[0]
|
||||||
|
caller.updatePlayerList.emit(network[0], 0, int(network[1]), "")
|
||||||
|
|
||||||
|
elif header == 'PU':
|
||||||
|
del network[0]
|
||||||
|
caller.updatePlayerList.emit(network[0], 1, int(network[1]), network[2].decode('utf-8'))
|
||||||
|
|
||||||
|
elif header == 'ARUP':
|
||||||
|
del network[0]
|
||||||
|
kind = int(network[0])
|
||||||
|
caller.parent.areas[kind] = [network[i] for i in range(1, len(network))]
|
||||||
|
|
||||||
|
# This is much harder than doing it during the handshake because of the way the music list is implemented
|
||||||
|
if caller.parent.no_arup:
|
||||||
|
caller.parent.no_arup = False
|
||||||
|
caller.parent.areas_len = len(caller.parent.areas[kind])
|
||||||
|
print '[client]', 'The server has %d areas' % caller.parent.areas_len
|
||||||
|
|
||||||
|
if caller.parent.areas_len:
|
||||||
|
for i in range(caller.parent.areas_len):
|
||||||
|
area_key, area_val = caller.parent.musiclist.items()[0]
|
||||||
|
caller.parent.areas[4].append(area_val)
|
||||||
|
|
||||||
|
areaitem = QtGui.QListWidgetItem()
|
||||||
|
caller.parent.areaitems.addItem(areaitem)
|
||||||
|
|
||||||
|
for j in range(len(network)):
|
||||||
|
if j != kind:
|
||||||
|
caller.parent.areas[j].append("")
|
||||||
|
|
||||||
|
# Remove the area from the music list
|
||||||
|
caller.parent.musiclist.popitem(False)
|
||||||
|
|
||||||
|
caller.parent.allMusic()
|
||||||
|
|
||||||
|
for i in range(caller.parent.areas_len):
|
||||||
|
area_players = caller.parent.areas[0][i]
|
||||||
|
area_status = caller.parent.areas[1][i].title()
|
||||||
|
area_cm = caller.parent.areas[2][i].decode('utf-8')
|
||||||
|
area_locked = caller.parent.areas[3][i].title()
|
||||||
|
area_name = caller.parent.areas[4][i].decode('utf-8')
|
||||||
|
if area_status == "Casing":
|
||||||
|
caller.parent.areaitems.item(i).setText("%s\n%s | %s\n%s users | %s" % (area_name, area_status, area_cm, area_players, area_locked))
|
||||||
|
else:
|
||||||
|
caller.parent.areaitems.item(i).setText("%s\n%s\n%s users | %s" % (area_name, area_status, area_players, area_locked))
|
||||||
|
|
||||||
|
if area_locked == "Locked":
|
||||||
|
caller.parent.areaitems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "lock.png"))
|
||||||
|
else:
|
||||||
|
caller.parent.areaitems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "house.png"))
|
||||||
|
|
||||||
|
elif header == 'TI':
|
||||||
|
del network[0]
|
||||||
|
timer_id = int(network[0])
|
||||||
|
command = int(network[1])
|
||||||
|
time_ms = 0
|
||||||
|
if len(network) == 3:
|
||||||
|
time_ms = int(network[2])
|
||||||
|
|
||||||
|
caller.timerUpdate.emit(command, timer_id, time_ms)
|
||||||
|
|
||||||
class PresentButton(QtGui.QLabel):
|
class PresentButton(QtGui.QLabel):
|
||||||
|
|
||||||
@ -3858,243 +4129,3 @@ class NextEmoteButton(QtGui.QLabel):
|
|||||||
def mousePressEvent(self, event):
|
def mousePressEvent(self, event):
|
||||||
self.gamewindow.current_emote_page += 1
|
self.gamewindow.current_emote_page += 1
|
||||||
self.gamewindow.set_emote_page()
|
self.gamewindow.set_emote_page()
|
||||||
|
|
||||||
class TCP_Thread(QtCore.QThread):
|
|
||||||
connectionError = QtCore.pyqtSignal(str, str, str)
|
|
||||||
MS_Chat = QtCore.pyqtSignal(list)
|
|
||||||
newChar = QtCore.pyqtSignal(str)
|
|
||||||
newBackground = QtCore.pyqtSignal(str, bool)
|
|
||||||
IC_Log = QtCore.pyqtSignal(str)
|
|
||||||
OOC_Log = QtCore.pyqtSignal(str)
|
|
||||||
charSlots = QtCore.pyqtSignal()
|
|
||||||
showCharSelect = QtCore.pyqtSignal()
|
|
||||||
allEvidence = QtCore.pyqtSignal(list)
|
|
||||||
rainbowColor = QtCore.pyqtSignal(str)
|
|
||||||
updatePlayerList = QtCore.pyqtSignal(str, int, int, str)
|
|
||||||
timerUpdate = QtCore.pyqtSignal(int, int, int)
|
|
||||||
|
|
||||||
send_attempts = 0
|
|
||||||
max_attempts = 5
|
|
||||||
|
|
||||||
def __init__(self, parent):
|
|
||||||
super(TCP_Thread, self).__init__(parent)
|
|
||||||
self.parent = parent
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
pingtimer = 150
|
|
||||||
rainbow = 0
|
|
||||||
sendtick = 0
|
|
||||||
tempdata = ""
|
|
||||||
color = QtGui.QColor()
|
|
||||||
color.setHsv(rainbow, 255, 255)
|
|
||||||
#color.setHsv(0, 255, 255)
|
|
||||||
while True:
|
|
||||||
if self.parent.disconnectnow:
|
|
||||||
self.parent.disconnectCommon()
|
|
||||||
self.quit()
|
|
||||||
return
|
|
||||||
pingtimer -= 1
|
|
||||||
if pingtimer == 0:
|
|
||||||
pingbefore = time.time()
|
|
||||||
self.parent.tcp.send('CH#%')
|
|
||||||
pingtimer = 150
|
|
||||||
|
|
||||||
if self.parent.m_chatmessage[TEXT_COLOR] == str(C_RAINBOW):
|
|
||||||
color.setHsv(rainbow, 255, 255)
|
|
||||||
rainbow += 5
|
|
||||||
if rainbow > 255:
|
|
||||||
rainbow = 0
|
|
||||||
#self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')')
|
|
||||||
self.rainbowColor.emit('background-color: rgba(0, 0, 0, 0); color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')')
|
|
||||||
|
|
||||||
if sendtick:
|
|
||||||
sendtick -= 1
|
|
||||||
if self.parent.msgqueue and not sendtick:
|
|
||||||
self.parent.tcp.send(self.parent.msgqueue[0])
|
|
||||||
sendtick = 4
|
|
||||||
|
|
||||||
error, total = self.parent.tcp.recv()
|
|
||||||
if error == -2:
|
|
||||||
# if the message can't be sent, discard it
|
|
||||||
if sendtick == 4:
|
|
||||||
self.send_attempts += 1
|
|
||||||
if self.send_attempts >= self.max_attempts:
|
|
||||||
self.send_attempts = 0
|
|
||||||
#print "[warning] message discarded"
|
|
||||||
del self.parent.msgqueue[0]
|
|
||||||
self.parent.msgqueueList.takeItem(0)
|
|
||||||
continue
|
|
||||||
elif error == -1:
|
|
||||||
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', "%s connection to server lost." % ("WebSocket" if self.parent.tcp.isWS else "TCP"))
|
|
||||||
self.parent.willDisconnect = True
|
|
||||||
self.quit()
|
|
||||||
return
|
|
||||||
elif error == -3:
|
|
||||||
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', "There was a critical connection failure. Please check your internet connection.\n\nDetails: %s." % total)
|
|
||||||
self.parent.willDisconnect = True
|
|
||||||
self.quit()
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
self.send_attempts = 0
|
|
||||||
|
|
||||||
for network in total:
|
|
||||||
header = network[0]
|
|
||||||
#del network[-1]
|
|
||||||
if header == 'MS':
|
|
||||||
if len(network) < 15:
|
|
||||||
print '[warning]', 'malformed/incomplete MS#chat (IC chat) network message was received'
|
|
||||||
continue
|
|
||||||
|
|
||||||
network[CHATMSG] = decode_ao_str(network[CHATMSG].decode('utf-8'))
|
|
||||||
self.MS_Chat.emit(network)
|
|
||||||
|
|
||||||
elif header == 'MC':
|
|
||||||
music = decode_ao_str(network[1])
|
|
||||||
charid = int(network[2])
|
|
||||||
t = time.localtime()
|
|
||||||
if charid != -1:
|
|
||||||
try:
|
|
||||||
name = self.parent.charlist[charid][0]
|
|
||||||
except:
|
|
||||||
name = 'char id %d' % charid
|
|
||||||
|
|
||||||
if len(network) > 3 and network[3]:
|
|
||||||
name += " ("+network[3].decode("utf-8")+")"
|
|
||||||
self.IC_Log.emit('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music))
|
|
||||||
else:
|
|
||||||
self.IC_Log.emit('[%d:%.2d] The music was changed to %s' % (t[3], t[4], music))
|
|
||||||
self.parent.playMusic(music)
|
|
||||||
|
|
||||||
elif header == 'BN':
|
|
||||||
self.newBackground.emit(network[1].lower(), True)
|
|
||||||
|
|
||||||
elif header == 'CT':
|
|
||||||
name = decode_ao_str(network[1].decode('utf-8'))
|
|
||||||
chatmsg = decode_ao_str(network[2].decode('utf-8').replace("\n", "<br />"))
|
|
||||||
self.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg))
|
|
||||||
|
|
||||||
elif header == 'PV':
|
|
||||||
self.parent.mychar = int(network[3])
|
|
||||||
self.parent.charselect.hide()
|
|
||||||
self.newChar.emit(self.parent.charlist[self.parent.mychar][0])
|
|
||||||
|
|
||||||
elif header == 'LE':
|
|
||||||
del network[0]
|
|
||||||
self.allEvidence.emit([evi.split('&') for evi in network])
|
|
||||||
|
|
||||||
elif header == 'ZZ':
|
|
||||||
if self.parent.modcall:
|
|
||||||
audio.freehandle(self.parent.modcall)
|
|
||||||
self.parent.modcall = audio.loadhandle(0, "mod_call.wav", 0, 0, 0)
|
|
||||||
audio.sethandleattr(self.parent.modcall, BASS_ATTRIB_VOL, self.parent.soundslider.value() / 100.0)
|
|
||||||
audio.playhandle(self.parent.modcall, False)
|
|
||||||
|
|
||||||
if len(network) > 1:
|
|
||||||
self.OOC_Log.emit('<b>[MOD CALL] ' + network[1].replace("\n", "<br />") + '</b>')
|
|
||||||
else:
|
|
||||||
self.OOC_Log.emit('<b>[MOD CALL] But there was no extra information. (old server?)</b>')
|
|
||||||
elif header == 'CharsCheck':
|
|
||||||
del network[0]
|
|
||||||
for i in range(len(network)):
|
|
||||||
self.parent.charlist[i][1] = int(network[i])
|
|
||||||
|
|
||||||
self.charSlots.emit()
|
|
||||||
|
|
||||||
elif header == 'RT':
|
|
||||||
testimony = network[1]
|
|
||||||
wtcefile = AOpath+"sounds/general/sfx-testimony2"
|
|
||||||
if self.parent.wtcesfx:
|
|
||||||
audio.freehandle(self.parent.wtcesfx)
|
|
||||||
|
|
||||||
if testimony == 'judgeruling':
|
|
||||||
variant = int(network[2])
|
|
||||||
if variant == 0:
|
|
||||||
wtcefile = AOpath+"sounds/general/sfx-notguilty"
|
|
||||||
elif variant == 1:
|
|
||||||
wtcefile = AOpath+"sounds/general/sfx-guilty"
|
|
||||||
else:
|
|
||||||
variant = 0
|
|
||||||
self.parent.wtcesfx = audio.loadhandle(False, wtcefile+".opus" if exists(wtcefile+".opus") else wtcefile+".wav", 0, 0, 0)
|
|
||||||
audio.sethandleattr(self.parent.wtcesfx, BASS_ATTRIB_VOL, self.parent.soundslider.value() / 100.0)
|
|
||||||
audio.playhandle(self.parent.wtcesfx, True)
|
|
||||||
self.parent.WTCEsignal.emit(testimony, variant)
|
|
||||||
|
|
||||||
elif header == 'HP':
|
|
||||||
type = int(network[1])
|
|
||||||
health = int(network[2])
|
|
||||||
self.parent.healthbars.emit(type, health)
|
|
||||||
|
|
||||||
elif header == 'KK':
|
|
||||||
reason = network[1]
|
|
||||||
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You were kicked from the server. (%s)' % reason)
|
|
||||||
|
|
||||||
elif header == 'KB':
|
|
||||||
reason = network[1]
|
|
||||||
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You have been banned from the server. (%s)' % reason)
|
|
||||||
|
|
||||||
elif header == 'BB': # message popup (AO 2.9)
|
|
||||||
message = network[1]
|
|
||||||
self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'information', 'Message from server', message)
|
|
||||||
|
|
||||||
elif header == 'AUTH': # login status (AO 2.9)
|
|
||||||
status = int(network[1])
|
|
||||||
statusStrings = ["You have logged out", "Wrong password", "Logged in"]
|
|
||||||
if status == 1:
|
|
||||||
self.parent.login = True
|
|
||||||
self.parent.playerKick.setDisabled(False)
|
|
||||||
self.parent.playerBan.setDisabled(False)
|
|
||||||
self.parent.ooclogin.setText("Lo&g out")
|
|
||||||
elif status == -1:
|
|
||||||
self.parent.login = False
|
|
||||||
self.parent.playerKick.setDisabled(True)
|
|
||||||
self.parent.playerBan.setDisabled(True)
|
|
||||||
self.parent.ooclogin.setText("Lo&gin")
|
|
||||||
self.OOC_Log.emit("<b>%s</b>" % (statusStrings[status+1]))
|
|
||||||
|
|
||||||
elif header == "CHECK": #ping
|
|
||||||
pingafter = time.time()
|
|
||||||
self.parent.gotPing.emit(int((pingafter - pingbefore)*1000))
|
|
||||||
|
|
||||||
elif header == 'DONE':
|
|
||||||
self.showCharSelect.emit()
|
|
||||||
|
|
||||||
elif header == 'PR':
|
|
||||||
del network[0]
|
|
||||||
self.updatePlayerList.emit(network[0], 0, int(network[1]), "")
|
|
||||||
|
|
||||||
elif header == 'PU':
|
|
||||||
del network[0]
|
|
||||||
self.updatePlayerList.emit(network[0], 1, int(network[1]), network[2].decode('utf-8'))
|
|
||||||
|
|
||||||
elif header == 'ARUP':
|
|
||||||
del network[0]
|
|
||||||
type = int(network[0])
|
|
||||||
self.parent.areas[type] = [network[i] for i in range(1, len(network))]
|
|
||||||
for i in range(self.parent.areas_len):
|
|
||||||
try:
|
|
||||||
area_players = self.parent.areas[0][i]
|
|
||||||
area_status = self.parent.areas[1][i].title()
|
|
||||||
area_cm = self.parent.areas[2][i].decode('utf-8')
|
|
||||||
area_locked = self.parent.areas[3][i].title()
|
|
||||||
area_name = self.parent.areas[4][i].decode('utf-8')
|
|
||||||
if area_status == "Casing":
|
|
||||||
self.parent.areaitems.item(i).setText("%s\n%s | %s\n%s users | %s" % (area_name, area_status, area_cm, area_players, area_locked))
|
|
||||||
else:
|
|
||||||
self.parent.areaitems.item(i).setText("%s\n%s\n%s users | %s" % (area_name, area_status, area_players, area_locked))
|
|
||||||
|
|
||||||
if area_locked == "Locked":
|
|
||||||
self.parent.areaitems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "lock.png"))
|
|
||||||
else:
|
|
||||||
self.parent.areaitems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "house.png"))
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
elif header == 'TI':
|
|
||||||
del network[0]
|
|
||||||
timer_id = int(network[0])
|
|
||||||
command = int(network[1])
|
|
||||||
time_ms = 0
|
|
||||||
if len(network) == 3:
|
|
||||||
time_ms = int(network[2])
|
|
||||||
|
|
||||||
self.timerUpdate.emit(command, timer_id, time_ms)
|
|
19
mainmenu.py
19
mainmenu.py
@ -572,16 +572,23 @@ class AOServerInfo(QtCore.QThread):
|
|||||||
elif header == 'HP':
|
elif header == 'HP':
|
||||||
if self.disconnect:
|
if self.disconnect:
|
||||||
continue
|
continue
|
||||||
type = int(network[1])
|
kind = int(network[1])
|
||||||
health = int(network[2])
|
health = int(network[2])
|
||||||
hplist.append([type, health])
|
hplist.append([kind, health])
|
||||||
|
|
||||||
elif header == "ARUP": #AO2 2.6 new feature: area update
|
#AO2 2.6 new feature: area update. Not all servers send this during the handshake!
|
||||||
|
elif header == "ARUP":
|
||||||
del network[0]
|
del network[0]
|
||||||
type = int(network[0])
|
kind = int(network[0])
|
||||||
areas[type] = [network[i] for i in range(1, len(network))]
|
areas[kind] = [network[i] for i in range(1, len(network))]
|
||||||
areas_len = len(areas[type])
|
areas_len = len(areas[kind])
|
||||||
print '[client]', 'The server has %d areas' % areas_len
|
print '[client]', 'The server has %d areas' % areas_len
|
||||||
|
|
||||||
|
for i in areas_len:
|
||||||
|
for j in range(len(network)):
|
||||||
|
if j != kind:
|
||||||
|
caller.parent.areas[j].append("")
|
||||||
|
|
||||||
if musiclist:
|
if musiclist:
|
||||||
for i in range(areas_len):
|
for i in range(areas_len):
|
||||||
areas[4].append(musiclist[0])
|
areas[4].append(musiclist[0])
|
||||||
|
Loading…
Reference in New Issue
Block a user