oldschool-toontown/toontown/toon/ToonAvatarPanel.py

584 lines
23 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
from pandac.PandaModules import *
from direct.gui.DirectGui import *
from pandac.PandaModules import *
from direct.showbase import DirectObject
from . import ToonHead
2019-11-02 17:27:54 -05:00
from toontown.friends import FriendHandle
from . import LaffMeter
2019-11-02 17:27:54 -05:00
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
from toontown.friends import ToontownFriendSecret
from . import ToonAvatarDetailPanel
from . import AvatarPanelBase
2019-11-02 17:27:54 -05:00
from toontown.toontowngui import TTDialog
from otp.otpbase import OTPGlobals
class ToonAvatarPanel(AvatarPanelBase.AvatarPanelBase):
notify = DirectNotifyGlobal.directNotify.newCategory('ToonAvatarPanel')
def __init__(self, avatar, playerId = None):
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.playerId = playerId
if not self.playerId:
av = base.cr.doId2do.get(self.avId)
if av:
self.playerId = avatar.DISLid
else:
self.playerId = 0
self.playerInfo = None
if self.playerId:
self.playerInfo = base.cr.playerFriendsManager.playerId2Info.get(playerId)
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=(1.1, 100, 0.525))
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)
if base.cr.playerFriendsManager.askTransientFriend(self.avId) and self.avId not in base.cr.doId2do:
2019-11-02 17:27:54 -05:00
self.friendButton['state'] = DGG.DISABLED
if base.cr.avatarFriendsManager.checkIgnored(self.avId):
self.friendButton['state'] = DGG.DISABLED
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)
if base.cr.avatarFriendsManager.checkIgnored(self.avId):
self.goToButton['state'] = DGG.DISABLED
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)
if base.cr.avatarFriendsManager.checkIgnored(self.avId):
self.whisperButton['state'] = DGG.DISABLED
self.secretsButton = 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.AvatarPanelSecrets,
text0_fg=self.text0Color,
text1_fg=self.text1Color,
text2_fg=self.text2Color,
text3_fg=self.text3Color,
text_scale=TTLocalizer.TAPsecretsButton,
text_pos=(0.055, -0.01),
text_align=TextNode.ALeft,
command=self.__handleSecrets)
if base.cr.avatarFriendsManager.checkIgnored(self.avId):
self.secretsButton['state'] = DGG.DISABLED
from toontown.coghq import CogHQBossBattle
if isinstance(base.cr.playGame.getPlace(), CogHQBossBattle.CogHQBossBattle) and \
base.localAvatar.getGameAccess() != OTPGlobals.AccessFull:
self.secretsButton['state'] = DGG.DISABLED
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)
if base.cr.productName not in ['JP', 'DE', 'BR', 'FR']:
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 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
if base.cr.productName not in ['ES',
'JP',
'DE',
'BR',
'FR']:
self.reportButton['state'] = DGG.DISABLED
self.ignoreButton['state'] = DGG.DISABLED
self.goToButton['state'] = DGG.DISABLED
self.secretsButton['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, None)
return
def __handleSecrets(self):
base.localAvatar.chatMgr.noWhisper()
ToontownFriendSecret.showFriendSecret(ToontownFriendSecret.AvatarSecret)
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, self.playerId])
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 getPlayerId(self):
if hasattr(self, 'playerId'):
return self.playerId
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:
self.groupButton['text'] = ('', TTLocalizer.AvatarPanelGroupInvite, TTLocalizer.AvatarPanelGroupInvite)
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):
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()
return
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