from panda3d.core import * from direct.gui.DirectGui import * from direct.showbase import DirectObject import ToonHead import LaffMeter from otp.avatar import Avatar from direct.distributed import DistributedObject from direct.directnotify import DirectNotifyGlobal from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer import ToonAvatarDetailPanel import AvatarPanelBase from toontown.toontowngui import TTDialog from otp.otpbase import OTPGlobals class ToonAvatarPanel(AvatarPanelBase.AvatarPanelBase): notify = DirectNotifyGlobal.directNotify.newCategory('ToonAvatarPanel') def __init__(self, avatar): from toontown.friends import FriendsListPanel if base.cr.doId2do.get(avatar.getDoId()): avatar = base.cr.doId2do.get(avatar.getDoId()) AvatarPanelBase.AvatarPanelBase.__init__(self, avatar, FriendsListPanel=FriendsListPanel) self.notify.debug('Opening toon panel, avId=%d' % self.avId) self.laffMeter = None wantsLaffMeter = hasattr(avatar, 'hp') if not hasattr(avatar, 'style'): self.notify.warning("Avatar has no 'style'. Abort initialization.") AvatarPanelBase.AvatarPanelBase.cleanup(self) return base.localAvatar.obscureFriendsListButton(1) gui = loader.loadModel('phase_3.5/models/gui/avatar_panel_gui') self.frame = DirectFrame( image=gui.find('**/avatar_panel'), relief=None, pos=(-0.22, 0, -0.47), parent=base.a2dTopRight) self.disabledImageColor = Vec4(1, 1, 1, 0.4) self.text0Color = Vec4(1, 1, 1, 1) self.text1Color = Vec4(0.5, 1, 0.5, 1) self.text2Color = Vec4(1, 1, 0.5, 1) self.text3Color = Vec4(0.6, 0.6, 0.6, 1) self.head = self.frame.attachNewNode('head') self.head.setPos(0.02, 0, 0.31) self.headModel = ToonHead.ToonHead() self.headModel.setupHead(avatar.style, forGui=1) self.headModel.fitAndCenterHead(0.175, forGui=1) self.headModel.reparentTo(self.head) self.headModel.startBlink() self.headModel.startLookAround() self.healthText = DirectLabel( parent=self.frame, text='', pos=(0.06, 0, 0.2), text_pos=(0, 0), text_scale=0.05) self.healthText.hide() self.nameLabel = DirectLabel( parent=self.frame, pos=(0.0125, 0, 0.4), relief=None, text=self.avName, text_font=avatar.getFont(), text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0), text_scale=0.042, text_wordwrap=7.5, text_shadow=(1, 1, 1, 1)) self.closeButton = DirectButton( parent=self.frame, image=( gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr'), gui.find('**/CloseBtn_UP')), relief=None, pos=(0.157644, 0, -0.379167), command=self.__handleClose) self.friendButton = DirectButton( parent=self.frame, image=( gui.find('**/Frnds_Btn_UP'), gui.find('**/Frnds_Btn_DN'), gui.find('**/Frnds_Btn_RLVR'), gui.find('**/Frnds_Btn_UP')), image3_color=self.disabledImageColor, image_scale=0.9, relief=None, text=TTLocalizer.AvatarPanelFriends, text_scale=0.06, pos=(-0.103, 0, 0.133), text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_pos=(0.06, -0.02), text_align=TextNode.ALeft, command=self.__handleFriend) self.goToButton = DirectButton( parent=self.frame, image=( gui.find('**/Go2_Btn_UP'), gui.find('**/Go2_Btn_DN'), gui.find('**/Go2_Btn_RLVR'), gui.find('**/Go2_Btn_UP')), image3_color=self.disabledImageColor, image_scale=0.9, relief=None, pos=(-0.103, 0, 0.045), text=TTLocalizer.AvatarPanelGoTo, text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=0.06, text_pos=(0.06, -0.015), text_align=TextNode.ALeft, command=self.__handleGoto) self.whisperButton = DirectButton( parent=self.frame, image=( gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR'), gui.find('**/ChtBx_ChtBtn_UP')), image3_color=self.disabledImageColor, image_scale=0.9, relief=None, pos=(-0.103, 0, -0.0375), text=TTLocalizer.AvatarPanelWhisper, text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=TTLocalizer.TAPwhisperButton, text_pos=(0.06, -0.0125), text_align=TextNode.ALeft, command=self.__handleWhisper) self.trueFriendsButton = DirectButton( parent=self.frame, image=( gui.find('**/Amuse_Btn_UP'), gui.find('**/Amuse_Btn_DN'), gui.find('**/Amuse_Btn_RLVR'), gui.find('**/Amuse_Btn_UP')), image3_color=self.disabledImageColor, image_scale=0.9, relief=None, pos=(-0.103, 0, -0.13), text=TTLocalizer.AvatarPanelTrueFriends, text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=TTLocalizer.TAPtruefriendsButton, text_pos=(0.055, -0.01), text_align=TextNode.ALeft, command=self.__handleTrueFriends) ignoreStr, ignoreCmd, ignoreScale = self.getIgnoreButtonInfo() self.ignoreButton = DirectButton( parent=self.frame, image=( gui.find('**/Ignore_Btn_UP'), gui.find('**/Ignore_Btn_DN'), gui.find('**/Ignore_Btn_RLVR'), gui.find('**/Ignore_Btn_UP')), image3_color=self.disabledImageColor, image_scale=0.9, relief=None, pos=(-0.103697, 0, -0.21), text=ignoreStr, text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=ignoreScale, text_pos=(0.06, -0.015), text_align=TextNode.ALeft, command=ignoreCmd) self.reportButton = DirectButton( parent=self.frame, image=( gui.find('**/report_BtnUP'), gui.find('**/report_BtnDN'), gui.find('**/report_BtnRLVR'), gui.find('**/report_BtnUP')), image3_color=self.disabledImageColor, image_scale=0.65, relief=None, pos=(-0.103, 0, -0.29738), text=TTLocalizer.AvatarPanelReport, text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=0.06, text_pos=(0.06, -0.015), text_align=TextNode.ALeft, command=self.handleReport) if avatar.isAdmin(): self.ignoreButton['state'] = DGG.DISABLED self.reportButton['state'] = DGG.DISABLED elif base.localAvatar.isIgnored(self.avId): self.friendButton['state'] = DGG.DISABLED self.goToButton['state'] = DGG.DISABLED self.whisperButton['state'] = DGG.DISABLED self.trueFriendsButton['state'] = DGG.DISABLED if not base.localAvatar.isTeleportAllowed(): self.goToButton['state'] = DGG.DISABLED self.detailButton = DirectButton( parent=self.frame, image=( gui.find('**/ChtBx_BackBtn_UP'), gui.find('**/ChtBx_BackBtn_DN'), gui.find('**/ChtBx_BackBtn_Rllvr'), gui.find('**/ChtBx_BackBtn_UP')), relief=None, text=('', TTLocalizer.AvatarPanelDetail, TTLocalizer.AvatarPanelDetail, ''), text_fg=self.text2Color, text_shadow=(0, 0, 0, 1), text_scale=0.055, text_pos=(-0.075, -0.01), text_align=TextNode.ARight, pos=(-0.133773, 0, -0.395), command=self.__handleDetails) self.__makeBoardingGui() self.__makePetGui(avatar) self.__checkGroupStatus() gui.removeNode() if wantsLaffMeter: self.__makeLaffMeter(avatar) self.__updateHp(avatar.hp, avatar.maxHp) self.healthText.show() self.laffMeter.show() menuX = -0.05 menuScale = 0.064 if self.avGenerateName: self.accept(self.avGenerateName, self.__handleGenerateAvatar) if self.avHpChangeName: self.accept(self.avHpChangeName, self.__updateHp) self.accept('updateLaffMeter', self.__updateLaffMeter) self.accept('updateGroupStatus', self.__checkGroupStatus) self.frame.show() messenger.send('avPanelDone') def disableAll(self): self.detailButton['state'] = DGG.DISABLED self.reportButton['state'] = DGG.DISABLED self.ignoreButton['state'] = DGG.DISABLED self.goToButton['state'] = DGG.DISABLED self.trueFriendsButton['state'] = DGG.DISABLED self.whisperButton['state'] = DGG.DISABLED self.petButton['state'] = DGG.DISABLED self.friendButton['state'] = DGG.DISABLED self.closeButton['state'] = DGG.DISABLED self.groupButton['state'] = DGG.DISABLED self.boardingInfoButton['state'] = DGG.DISABLED def cleanup(self): if not hasattr(self, 'frame') or self.frame == None: return self.notify.debug('Clean up toon panel, avId=%d' % self.avId) if self.frame: self.frame.destroy() del self.frame self.frame = None ToonAvatarDetailPanel.unloadAvatarDetail() if self.groupButton: self.groupButton.destroy() del self.groupButton self.groupButton = None if self.boardingInfoButton: self.boardingInfoButton.destroy() del self.boardingInfoButton self.boardingInfoButton = None if self.boardingInfoText: self.boardingInfoText.destroy() del self.boardingInfoText self.boardingInfoText = None if self.groupFrame: self.groupFrame.destroy() del self.groupFrame self.groupFrame = None self.head.removeNode() del self.head self.headModel.stopBlink() self.headModel.stopLookAroundNow() self.headModel.delete() del self.headModel base.localAvatar.obscureFriendsListButton(-1) self.laffMeter = None self.ignore('updateLaffMeter') self.ignoreAll() if hasattr(self.avatar, 'bFake') and self.avatar.bFake: self.avatar.delete() base.setCellsAvailable([base.rightCells[0]], 1) AvatarPanelBase.AvatarPanelBase.cleanup(self) return def __handleGoto(self): if base.localAvatar.isTeleportAllowed(): base.localAvatar.chatMgr.noWhisper() messenger.send('gotoAvatar', [self.avId, self.avName, self.avDisableName]) def __handleToPet(self): toonAvatar = self.avatar if base.cr.doId2do.get(toonAvatar.getDoId()): toonAvatar = base.cr.doId2do.get(toonAvatar.getDoId()) petAvatar = base.cr.doId2do.get(toonAvatar.getPetId()) self.disableAll() from toontown.pets import PetDetail PetDetail.PetDetail(toonAvatar.getPetId(), self.__petDetailsLoaded) def __petDetailsLoaded(self, avatar): self.cleanup() if avatar: self.notify.debug("Looking at someone's pet. pet doId = %s" % avatar.doId) messenger.send('clickedNametag', [avatar]) def __handleWhisper(self): base.localAvatar.chatMgr.whisperTo(self.avName, self.avId) def __handleFriend(self): base.localAvatar.chatMgr.noWhisper() messenger.send('friendAvatar', [self.avId, self.avName, self.avDisableName]) def __handleDetails(self): base.localAvatar.chatMgr.noWhisper() messenger.send('avatarDetails', [self.avId, self.avName]) def __handleDisableAvatar(self): if not base.cr.isFriend(self.avId): self.cleanup() AvatarPanelBase.currentAvatarPanel = None else: self.healthText.hide() if self.laffMeter != None: self.laffMeter.stop() self.laffMeter.destroy() self.laffMeter = None return def __handleGenerateAvatar(self, avatar): newAvatar = base.cr.doId2do.get(self.avatar.doId) if newAvatar: self.avatar = newAvatar self.__updateLaffMeter(avatar, avatar.hp, avatar.maxHp) self.__checkGroupStatus() def __updateLaffMeter(self, avatar, hp, maxHp): if self.laffMeter == None: self.__makeLaffMeter(avatar) self.__updateHp(avatar.hp, avatar.maxHp) self.laffMeter.show() self.healthText.show() return def __makeLaffMeter(self, avatar): self.laffMeter = LaffMeter.LaffMeter(avatar.style, avatar.hp, avatar.maxHp) self.laffMeter.reparentTo(self.frame) self.laffMeter.setPos(-0.1, 0, 0.24) self.laffMeter.setScale(0.03) def __updateHp(self, hp, maxHp, quietly = 0): if self.laffMeter != None and hp != None and maxHp != None: self.laffMeter.adjustFace(hp, maxHp) self.healthText['text'] = '%d / %d' % (hp, maxHp) return def __handleClose(self): self.cleanup() AvatarPanelBase.currentAvatarPanel = None if self.friendsListShown: self.FriendsListPanel.showFriendsList() return def getAvId(self): if hasattr(self, 'avatar'): if self.avatar: return self.avatar.doId return None def isHidden(self): if not hasattr(self, 'frame') or not self.frame: return 1 return self.frame.isHidden() def getType(self): return 'toon' def handleInvite(self): if localAvatar.boardingParty.isInviteePanelUp(): localAvatar.boardingParty.showMe(TTLocalizer.BoardingPendingInvite, pos=(0, 0, 0)) else: self.groupButton['state'] = DGG.DISABLED localAvatar.boardingParty.requestInvite(self.avId) def handleKick(self): if not base.cr.playGame.getPlace().getState() == 'elevator': self.confirmKickOutDialog = TTDialog.TTDialog(style=TTDialog.YesNo, text=TTLocalizer.BoardingKickOutConfirm % self.avName, command=self.__confirmKickOutCallback) self.confirmKickOutDialog.show() def __confirmKickOutCallback(self, value): if self.confirmKickOutDialog: self.confirmKickOutDialog.destroy() self.confirmKickOutDialog = None if value > 0: if self.groupButton: self.groupButton['state'] = DGG.DISABLED localAvatar.boardingParty.requestKick(self.avId) return def __checkGroupStatus(self): self.groupFrame.hide() if hasattr(self, 'avatar'): if self.avatar and hasattr(self.avatar, 'getZoneId') and localAvatar.getZoneId() == self.avatar.getZoneId(): if localAvatar.boardingParty: if self.avId in localAvatar.boardingParty.getGroupMemberList(localAvatar.doId): if localAvatar.boardingParty.getGroupLeader(localAvatar.doId) == localAvatar.doId: self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupMemberKick, TTLocalizer.AvatarPanelGroupMemberKick) self.groupButton['image'] = self.kickOutImageList self.groupButton['command'] = self.handleKick self.groupButton['state'] = DGG.NORMAL else: self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupMember, TTLocalizer.AvatarPanelGroupMember) self.groupButton['command'] = None self.groupButton['image'] = self.inviteImageDisabled self.groupButton['image_color'] = Vec4(1, 1, 1, 0.4) self.groupButton['state'] = DGG.NORMAL else: g1 = localAvatar.boardingParty.countInGroup(self.avId) g2 = localAvatar.boardingParty.countInGroup(localAvatar.doId) if (g1 + g2) > localAvatar.boardingParty.maxSize: self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupMember, TTLocalizer.AvatarPanelGroupMember) self.groupButton['command'] = None self.groupButton['image'] = self.inviteImageDisabled self.groupButton['image_color'] = Vec4(1, 1, 1, 0.4) else: if g1 > 0 and g2 > 0: self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupInvite, "%s %d"%(TTLocalizer.AvatarPanelGroupMerge, (g1+g2))) self.groupFrame['text']=TTLocalizer.BoardingPartyTitleMerge; else: self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupInvite, TTLocalizer.AvatarPanelGroupInvite) self.groupFrame['text']=TTLocalizer.BoardingPartyTitle; self.groupButton['command'] = self.handleInvite self.groupButton['image'] = self.inviteImageList self.groupButton['state'] = DGG.NORMAL if base.config.GetBool('want-boarding-groups', 1): base.setCellsAvailable([base.rightCells[0]], 0) self.groupFrame.show() return def handleReadInfo(self, task = None): self.boardingInfoButton['state'] = DGG.DISABLED if self.boardingInfoText: self.boardingInfoText.destroy() self.boardingInfoText = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.BoardingPartyInform % localAvatar.boardingParty.maxSize, command=self.handleCloseInfo) def handleCloseInfo(self, *extraArgs): self.boardingInfoButton['state'] = DGG.NORMAL if self.boardingInfoText: self.boardingInfoText.destroy() del self.boardingInfoText self.boardingInfoText = None return def __makePetGui(self, avatar): if self.avatar.isAdmin(): helpGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_help') image = (helpGui.find('**/tt_t_gui_brd_helpUp'), helpGui.find('**/tt_t_gui_brd_helpDown'), helpGui.find('**/tt_t_gui_brd_helpHover'), helpGui.find('**/tt_t_gui_brd_helpDown')) text = ('', TTLocalizer.AvatarPanelCast, TTLocalizer.AvatarPanelCast, '') self.petButton = DirectButton(parent=self.frame, image=image, relief=None, pos=(0.02, -0.2, -0.385), text=text, text_fg=self.text2Color, scale=0.8, text_shadow=(0, 0, 0, 1), text_scale=0.07, text_pos=(0, -0.125), text_align=TextNode.ACenter, command=self.__handleCastDialog) helpGui.removeNode() return petGui = loader.loadModel('phase_3.5/models/gui/PetControlPannel') self.petButton = DirectButton(parent=self.frame, image=(petGui.find('**/PetControlToonButtonUp1'), petGui.find('**/PetControlToonButtonDown1'), petGui.find('**/PetControlToonButtonRollover1')), geom=petGui.find('**/PetBattleIcon'), geom3_color=self.disabledImageColor, relief=None, pos=(0.22, -0.2, -0.475), text=('', TTLocalizer.AvatarPanelPet, TTLocalizer.AvatarPanelPet, ''), text_fg=self.text2Color, text_shadow=(0, 0, 0, 1), text_scale=0.325, text_pos=(-1.3, 0.05), text_align=TextNode.ACenter, command=self.__handleToPet) self.petButton.setScale(0.15) if not (base.wantPets and avatar.hasPet()): self.petButton['state'] = DGG.DISABLED self.petButton.hide() petGui.removeNode() def __handleCastDialog(self): self.cleanupDialog() base.cr.playGame.getPlace().setState('stopped') self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.AvatarPanelCastInfo % self.avatar.getName(), text_wordwrap=20, command=self.cleanupDialogAndWalk) self.dialog.show() def __makeBoardingGui(self): self.confirmKickOutDialog = None groupAvatarBgGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_avatarPanelBg') boardingGroupBGImage = groupAvatarBgGui.find('**/tt_t_gui_brd_avatar_panel_party') self.groupFrame = DirectFrame(parent=self.frame, relief=None, image=boardingGroupBGImage, image_scale=(0.5, 1, 0.5), textMayChange=1, text=TTLocalizer.BoardingPartyTitle, text_wordwrap=16, text_scale=TTLocalizer.TAPgroupFrame, text_pos=(0.01, 0.08), pos=(0, 0, -0.61)) groupInviteGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_inviteButton') self.inviteImageList = (groupInviteGui.find('**/tt_t_gui_brd_inviteUp'), groupInviteGui.find('**/tt_t_gui_brd_inviteDown'), groupInviteGui.find('**/tt_t_gui_brd_inviteHover'), groupInviteGui.find('**/tt_t_gui_brd_inviteUp')) self.kickOutImageList = (groupInviteGui.find('**/tt_t_gui_brd_kickoutUp'), groupInviteGui.find('**/tt_t_gui_brd_kickoutDown'), groupInviteGui.find('**/tt_t_gui_brd_kickoutHover'), groupInviteGui.find('**/tt_t_gui_brd_kickoutUp')) self.inviteImageDisabled = groupInviteGui.find('**/tt_t_gui_brd_inviteDisabled') self.groupButton = DirectButton(parent=self.groupFrame, image=self.inviteImageList, image3_color=self.disabledImageColor, image_scale=0.85, relief=None, text=('', TTLocalizer.AvatarPanelGroupInvite, TTLocalizer.AvatarPanelGroupInvite), text0_fg=self.text0Color, text1_fg=self.text1Color, text2_fg=self.text2Color, text3_fg=self.text3Color, text_scale=TTLocalizer.TAPgroupButton, text_pos=(-0.0, -0.1), text_align=TextNode.ACenter, command=self.handleInvite, pos=(0.01013, 0, -0.05464)) helpGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_help') helpImageList = (helpGui.find('**/tt_t_gui_brd_helpUp'), helpGui.find('**/tt_t_gui_brd_helpDown'), helpGui.find('**/tt_t_gui_brd_helpHover'), helpGui.find('**/tt_t_gui_brd_helpDown')) self.boardingInfoButton = DirectButton(parent=self.groupFrame, relief=None, text_pos=(-0.05, 0.05), text_scale=0.06, text_align=TextNode.ALeft, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), image=helpImageList, image_scale=(0.5, 1, 0.5), image3_color=self.disabledImageColor, scale=1.05, command=self.handleReadInfo, pos=(0.1829, 0, 0.02405)) self.boardingInfoText = None groupInviteGui.removeNode() groupAvatarBgGui.removeNode() helpGui.removeNode() return def __handleTrueFriends(self): if not settings['trueFriends']: base.localAvatar.chatMgr.fsm.request('noTrueFriends') return self.cleanupDialog() base.cr.playGame.getPlace().fsm.request('stopped') if base.localAvatar.isTrueFriends(self.avatar.doId): self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo, text=TTLocalizer.TrueFriendsRemoveNotice % self.avatar.getName(), text_wordwrap=20, command=self.confirmTrueFriendsRemove) self.dialog.show() elif not base.cr.isFriend(self.avatar.doId): self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.TrueFriendsNotFriends % self.avatar.getName(), text_wordwrap=20, command=self.cleanupDialogAndWalk) self.dialog.show() else: self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo, text=TTLocalizer.TrueFriendsAddNotice % self.avatar.getName(), text_wordwrap=20, command=self.confirmTrueFriendsAdd) self.dialog.show() def confirmTrueFriendsAdd(self, state): self.cleanupDialog() if state > 0: base.localAvatar.addTrueFriends(self.avatar.doId) self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.TrueFriendsAdded.replace('%s', self.avatar.getName()), text_wordwrap=20, command=self.cleanupDialogAndWalk) self.dialog.show() else: base.cr.playGame.getPlace().fsm.request('walk') def confirmTrueFriendsRemove(self, state): self.cleanupDialog() if state > 0: base.localAvatar.removeTrueFriends(self.avatar.doId) self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.TrueFriendsRemoved % self.avatar.getName(), text_wordwrap=20, command=self.cleanupDialogAndWalk) self.dialog.show() else: base.cr.playGame.getPlace().fsm.request('walk') def cleanupDialogAndWalk(self, state=None): self.cleanupDialog() base.cr.playGame.getPlace().fsm.request('walk')