from panda3d.core import * from toontown.toonbase.ToontownGlobals import * from direct.gui.DirectGui import * from direct.showbase import DirectObject from direct.directnotify import DirectNotifyGlobal from direct.fsm import StateData from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer import types from toontown.toon import NPCToons from toontown.toon import NPCFriendPanel from toontown.toonbase import ToontownBattleGlobals class TownBattleSOSPanel(DirectFrame, StateData.StateData): notify = DirectNotifyGlobal.directNotify.newCategory('TownBattleSOSPanel') def __init__(self, doneEvent): DirectFrame.__init__(self, relief=None) self.initialiseoptions(TownBattleSOSPanel) StateData.StateData.__init__(self, doneEvent) self.friends = {} self.NPCFriends = {} self.textRolloverColor = Vec4(1, 1, 0, 1) self.textDownColor = Vec4(0.5, 0.9, 1, 1) self.textDisabledColor = Vec4(0.4, 0.8, 0.4, 1) self.bldg = 0 self.chosenNPCToons = [] return def load(self): if self.isLoaded == 1: return None self.isLoaded = 1 bgd = loader.loadModel('phase_3.5/models/gui/frame') gui = loader.loadModel('phase_3.5/models/gui/frame4names') scrollGui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') backGui = loader.loadModel('phase_3.5/models/gui/battle_gui') self['image'] = bgd self['image_pos'] = (0.0, 0.1, -0.08) self.setScale(0.3) self.title = DirectLabel(parent=self, relief=None, text=TTLocalizer.TownBattleSOSNoFriends, text_scale=0.4, text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), pos=(0.0, 0.0, 1.5)) self.NPCFriendPanel = NPCFriendPanel.NPCFriendPanel(parent=self, callable=True, doneEvent=self.doneEvent) self.NPCFriendPanel.setPos(-0.75, 0, -0.15) self.NPCFriendPanel.setScale(0.325) self.NPCFriendsLabel = DirectLabel(parent=self, relief=None, text=TTLocalizer.TownBattleSOSNPCFriends, text_scale=0.3, text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), pos=(-0.75, 0.0, -2.0)) self.scrollList = DirectScrolledList(parent=self, relief=None, image=gui.find('**/frame4names'), image_scale=(0.11, 1, 0.1), text=TTLocalizer.FriendsListPanelOnlineFriends, text_scale=0.04, text_pos=(-0.02, 0.275), text_fg=(0, 0, 0, 1), incButton_image=(scrollGui.find('**/FndsLst_ScrollUp'), scrollGui.find('**/FndsLst_ScrollDN'), scrollGui.find('**/FndsLst_ScrollUp_Rllvr'), scrollGui.find('**/FndsLst_ScrollUp')), incButton_relief=None, incButton_pos=(0.0, 0.0, -0.3), incButton_image3_color=Vec4(0.6, 0.6, 0.6, 0.6), incButton_scale=(1.0, 1.0, -1.0), decButton_image=(scrollGui.find('**/FndsLst_ScrollUp'), scrollGui.find('**/FndsLst_ScrollDN'), scrollGui.find('**/FndsLst_ScrollUp_Rllvr'), scrollGui.find('**/FndsLst_ScrollUp')), decButton_relief=None, decButton_pos=(0.0, 0.0, 0.175), decButton_image3_color=Vec4(0.6, 0.6, 0.6, 0.6), itemFrame_pos=(-0.17, 0.0, 0.11), itemFrame_relief=None, numItemsVisible=9, items=[], pos=(2.4, 0.0, 0.025), scale=3.5) clipper = PlaneNode('clipper') clipper.setPlane(Plane(Vec3(-1, 0, 0), Point3(0.32, 0, 0))) clipNP = self.scrollList.component('itemFrame').attachNewNode(clipper) self.scrollList.component('itemFrame').setClipPlane(clipNP) self.close = DirectButton(parent=self, relief=None, image=(backGui.find('**/PckMn_BackBtn'), backGui.find('**/PckMn_BackBtn_Dn'), backGui.find('**/PckMn_BackBtn_Rlvr')), pos=(2.3, 0.0, -1.65), scale=3, text=TTLocalizer.TownBattleSOSBack, text_scale=0.05, text_pos=(0.01, -0.012), text_fg=Vec4(0, 0, 0.8, 1), command=self.__close) gui.removeNode() scrollGui.removeNode() backGui.removeNode() bgd.removeNode() self.hide() return def unload(self): if self.isLoaded == 0: return None self.isLoaded = 0 self.exit() del self.title del self.scrollList del self.close del self.friends del self.NPCFriends DirectFrame.destroy(self) return None def makeFriendButton(self, friendId): handle = base.cr.identifyFriend(friendId) if not handle: base.cr.fillUpFriendsMap() return friendName = handle.getName() if handle.isPet(): com = self.__chosePet else: com = self.__choseFriend return DirectButton(relief=None, text=friendName, text_scale=0.04, text_align=TextNode.ALeft, text_fg=(0.0, 0.0, 0.0, 1.0), text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, text3_fg=self.textDisabledColor, command=com, extraArgs=[friendId, friendName]) def makeNPCFriendButton(self, NPCFriendId, numCalls): if NPCFriendId not in TTLocalizer.NPCToonNames: return None friendName = TTLocalizer.NPCToonNames[NPCFriendId] friendName += ' %d' % numCalls fg = Vec4(0.0, 0.0, 0.0, 1.0) return DirectButton(relief=None, text=friendName, text_scale=0.04, text_align=TextNode.ALeft, text_fg=fg, text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, text3_fg=self.textDisabledColor, command=self.__choseNPCFriend, extraArgs=[NPCFriendId]) def enter(self, canLure = 1, canTrap = 1): if self.isEntered == 1: return None self.isEntered = 1 if self.isLoaded == 0: self.load() self.canLure = canLure self.canTrap = canTrap self.factoryToonIdList = None messenger.send('SOSPanelEnter', [self]) self.__updateScrollList() self.__updateNPCFriendsPanel() self.__updateTitleText() self.show() self.accept('friendOnline', self.__friendOnline) self.accept('friendOffline', self.__friendOffline) self.accept('friendsListChanged', self.__friendsListChanged) self.accept('friendsMapComplete', self.__friendsListChanged) return def exit(self): if self.isEntered == 0: return None self.isEntered = 0 self.hide() self.ignore('friendOnline') self.ignore('friendOffline') self.ignore('friendsListChanged') self.ignore('friendsMapComplete') messenger.send(self.doneEvent) return None def __close(self): doneStatus = {} doneStatus['mode'] = 'Back' messenger.send(self.doneEvent, [doneStatus]) def __choseFriend(self, friendId, friendName): doneStatus = {} doneStatus['mode'] = 'Friend' doneStatus['friend'] = friendId messenger.send(self.doneEvent, [doneStatus]) def __chosePet(self, petId, petName): doneStatus = {} doneStatus['mode'] = 'Pet' doneStatus['petId'] = petId doneStatus['petName'] = petName messenger.send(self.doneEvent, [doneStatus]) def __choseNPCFriend(self, friendId): doneStatus = {} doneStatus['mode'] = 'NPCFriend' doneStatus['friend'] = friendId self.chosenNPCToons.append(friendId) messenger.send(self.doneEvent, [doneStatus]) def setFactoryToonIdList(self, toonIdList): self.factoryToonIdList = toonIdList[:] def __updateScrollList(self): friends = [] if base.wantPets and config.GetBool('want-pets-in-battle', 1) and base.localAvatar.hasPet(): friends.append(base.localAvatar.getPetId()) if not self.bldg or self.factoryToonIdList is not None: for friendId in base.localAvatar.friendsList: if base.cr.isFriendOnline(friendId): if self.factoryToonIdList is None or friendId in self.factoryToonIdList: friends.append(friendId) for friendId in self.friends.keys(): if friendId not in friends: friendButton = self.friends[friendId] self.scrollList.removeItem(friendButton) if not friendButton.isEmpty(): friendButton.destroy() del self.friends[friendId] for friendId in friends: if friendId not in self.friends: friendButton = self.makeFriendButton(friendId) if friendButton: self.scrollList.addItem(friendButton) self.friends[friendId] = friendButton def __updateNPCFriendsPanel(self): self.NPCFriends = {} for friend, count in base.localAvatar.NPCFriendsDict.items(): track = NPCToons.getNPCTrack(friend) if track == ToontownBattleGlobals.LURE_TRACK and self.canLure == 0 or track == ToontownBattleGlobals.TRAP_TRACK and self.canTrap == 0: self.NPCFriends[friend] = 0 else: self.NPCFriends[friend] = count self.NPCFriendPanel.setFriends(self.NPCFriends) self.NPCFriendPanel.update() def __updateTitleText(self): isEmpty = (len(self.friends) == 0 and len(self.NPCFriends) == 0) if isEmpty: self.title['text'] = TTLocalizer.TownBattleSOSNoFriends else: self.title['text'] = TTLocalizer.TownBattleSOSWhichFriend def __friendOnline(self, doId): self.__updateScrollList() self.__updateTitleText() def __friendOffline(self, doId): self.__updateScrollList() self.__updateTitleText() def __friendsListChanged(self): self.__updateScrollList() self.__updateTitleText()