from panda3d.core import * from direct.gui.DirectGui import * from direct.task.Task import Task from direct.interval.IntervalGlobal import * from . import DistributedCloset from . import ClosetGlobals from . import TrunkGUI from toontown.toon import ToonDNA from toontown.toonbase import TTLocalizer from toontown.toonbase import ToontownGlobals N_A = 0 class DistributedTrunk(DistributedCloset.DistributedCloset): notify = directNotify.newCategory('DistributedTrunk') def __init__(self, cr): DistributedCloset.DistributedCloset.__init__(self, cr) self.hatList = [] self.glassesList = [] self.backpackList = [] self.shoesList = [] self.oldHatList = [] self.oldGlassesList = [] self.oldBackpackList = [] self.oldShoesList = [] self.swapHatEvent = '' self.swapGlassesEvent = '' self.swapBackpackEvent = '' self.swapShoesEvent = '' self.hatDeleted = 0 self.glassesDeleted = 0 self.backpackDeleted = 0 self.shoesDeleted = 0 self.isFreePlayer = 0 def printInfo(self): print('avid: %s, gender: %s' % (self.av.doId, self.av.style.gender)) print('current hat = %s, glasses = %s, backpack = %s, shoes = %s' % (self.av.getHat(), self.av.getGlasses(), self.av.getBackpack(), self.av.getShoes())) print('hatList = %s' % self.av.getHatList()) print('glassesList = %s' % self.av.getGlassesList()) print('backpackList = %s' % self.av.getBackpackList()) print('shoesList = %s' % self.av.getShoesList()) def setState(self, mode, avId, ownerId, gender, hatList, glassesList, backpackList, shoesList): self.notify.debug('setState, mode=%s, avId=%s, ownerId=%d' % (mode, avId, ownerId)) self.isOwner = avId == ownerId self.ownerGender = gender if mode == ClosetGlobals.CLOSED: self.fsm.request('closed') return elif mode == ClosetGlobals.OPEN: self.customerId = avId self.av = self.cr.doId2do.get(self.customerId, None) if self.av: if self.av.getGameAccess() != ToontownGlobals.AccessFull: self.isOwner = 0 self.isFreePlayer = 1 else: self.isFreePlayer = 0 if base.localAvatar.getDoId() == self.customerId: self.gender = self.av.style.gender self.hatList = hatList self.glassesList = glassesList self.backpackList = backpackList self.shoesList = shoesList self.oldHatList = self.hatList[0:] self.oldGlassesList = self.glassesList[0:] self.oldBackpackList = self.backpackList[0:] self.oldShoesList = self.shoesList[0:] print('-----------Starting trunk interaction-----------') self.printInfo() print('-------------------------------------------------') if not self.isOwner: self.__popupNotOwnerPanel() else: taskMgr.doMethodLater(0.5, self.popupChangeClothesGUI, self.uniqueName('popupChangeClothesGUI')) self.fsm.request('open') return def load(self): lNode = self.find('**/lid_origin') lLid = self.find('**/lid') if lNode.isEmpty() or lLid.isEmpty(): self.lid = None else: lLid.wrtReparentTo(lNode) self.lid = lNode if not lNode.isEmpty(): self.scale = lLid.getScale()[0] * 0.6 return def popupChangeClothesGUI(self, task): self.notify.debug('popupChangeClothesGUI') self.purchaseDoneEvent = self.uniqueName('purchaseDone') self.swapHatEvent = self.uniqueName('swapHat') self.swapGlassesEvent = self.uniqueName('swapGlasses') self.swapBackpackEvent = self.uniqueName('swapBackpack') self.swapShoesEvent = self.uniqueName('swapShoes') self.cancelEvent = self.uniqueName('cancel') self.accept(self.purchaseDoneEvent, self.__proceedToCheckout) self.accept(self.swapHatEvent, self.__handleSwapHat) self.accept(self.swapGlassesEvent, self.__handleSwapGlasses) self.accept(self.swapBackpackEvent, self.__handleSwapBackpack) self.accept(self.swapShoesEvent, self.__handleSwapShoes) self.accept(self.cancelEvent, self._handleCancel) self.deleteEvent = self.uniqueName('delete') if self.isOwner: self.accept(self.deleteEvent, self.__handleDelete) if not self.closetGUI: self.closetGUI = TrunkGUI.TrunkGUI(self.isOwner, self.purchaseDoneEvent, self.cancelEvent, self.swapHatEvent, self.swapGlassesEvent, self.swapBackpackEvent, self.swapShoesEvent, self.deleteEvent, self.hatList, self.glassesList, self.backpackList, self.shoesList) self.closetGUI.load() if self.gender != self.ownerGender: self.closetGUI.setGender(self.ownerGender) self.closetGUI.enter(base.localAvatar) self.closetGUI.showButtons() oldHat = self.av.getHat() oldGlasses = self.av.getGlasses() oldBackpack = self.av.getBackpack() oldShoes = self.av.getShoes() self.oldStyle = {ToonDNA.HAT: oldHat, ToonDNA.GLASSES: oldGlasses, ToonDNA.BACKPACK: oldBackpack, ToonDNA.SHOES: oldShoes} return Task.done def resetCloset(self): self.ignoreAll() taskMgr.remove(self.uniqueName('popupChangeClothesGUI')) taskMgr.remove(self.uniqueName('lerpCamera')) taskMgr.remove(self.uniqueName('lerpToon')) if self.closetGUI: self.closetGUI.hideButtons() self.closetGUI.exit() self.closetGUI.unload() self.closetGUI = None del self.av self.av = base.localAvatar oldHat = self.av.getHat() oldGlasses = self.av.getGlasses() oldBackpack = self.av.getBackpack() oldShoes = self.av.getShoes() self.oldStyle = {ToonDNA.HAT: oldHat, ToonDNA.GLASSES: oldGlasses, ToonDNA.BACKPACK: oldBackpack, ToonDNA.SHOES: oldShoes} self.hatDeleted = 0 self.glassesDeleted = 0 self.backpackDeleted = 0 self.shoesDeleted = 0 return Task.done def _handleCancel(self): if self.oldStyle: oldHat = self.oldStyle[ToonDNA.HAT] oldGlasses = self.oldStyle[ToonDNA.GLASSES] oldBackpack = self.oldStyle[ToonDNA.BACKPACK] oldShoes = self.oldStyle[ToonDNA.SHOES] self.d_setDNA(oldHat[0], oldHat[1], oldHat[2], oldGlasses[0], oldGlasses[1], oldGlasses[2], oldBackpack[0], oldBackpack[1], oldBackpack[2], oldShoes[0], oldShoes[1], oldShoes[2], 1) else: self.notify.info('avoided crash in handleCancel') self._handlePurchaseDone() if self.closetGUI: self.closetGUI.resetClothes(self.oldStyle) if self.popupInfo != None: self.popupInfo.destroy() self.popupInfo = None return def __handleSwapHat(self): item = self.av.getHat() self.d_setDNA(item[0], item[1], item[2], N_A, N_A, N_A, N_A, N_A, N_A, N_A, N_A, N_A, 0, ToonDNA.HAT) if self.closetGUI: self.closetGUI.updateTrashButtons() def __handleSwapGlasses(self): item = self.av.getGlasses() self.d_setDNA(N_A, N_A, N_A, item[0], item[1], item[2], N_A, N_A, N_A, N_A, N_A, N_A, 0, ToonDNA.GLASSES) if self.closetGUI: self.closetGUI.updateTrashButtons() def __handleSwapBackpack(self): item = self.av.getBackpack() self.d_setDNA(N_A, N_A, N_A, N_A, N_A, N_A, item[0], item[1], item[2], N_A, N_A, N_A, 0, ToonDNA.BACKPACK) if self.closetGUI: self.closetGUI.updateTrashButtons() def __handleSwapShoes(self): item = self.av.getShoes() self.d_setDNA(N_A, N_A, N_A, N_A, N_A, N_A, N_A, N_A, N_A, item[0], item[1], item[2], 0, ToonDNA.SHOES) if self.closetGUI: self.closetGUI.updateTrashButtons() def __handleDelete(self, which): if which == ToonDNA.HAT: itemList = self.closetGUI.hats trashIndex = self.closetGUI.hatChoice swapFunc = self.closetGUI.swapHat removeFunc = self.closetGUI.removeHat trashItem = self.av.getHat() self.hatDeleted = self.hatDeleted | 1 elif which == ToonDNA.GLASSES: itemList = self.closetGUI.glasses trashIndex = self.closetGUI.glassesChoice swapFunc = self.closetGUI.swapGlasses removeFunc = self.closetGUI.removeGlasses trashItem = self.av.getGlasses() self.glassesDeleted = self.glassesDeleted | 1 elif which == ToonDNA.BACKPACK: itemList = self.closetGUI.backpacks trashIndex = self.closetGUI.backpackChoice swapFunc = self.closetGUI.swapBackpack removeFunc = self.closetGUI.removeBackpack trashItem = self.av.getBackpack() self.backpackDeleted = self.backpackDeleted | 1 elif which == ToonDNA.SHOES: itemList = self.closetGUI.shoes trashIndex = self.closetGUI.shoesChoice swapFunc = self.closetGUI.swapShoes removeFunc = self.closetGUI.removeShoes trashItem = self.av.getShoes() self.shoesDeleted = self.shoesDeleted | 1 else: self.notify.warning("we don't know about this item(type = %s)" % which) return if len(itemList) > 1: if trashIndex == 0: swapFunc(1) else: swapFunc(-1) removeFunc(trashIndex) self.sendUpdate('removeItem', [trashItem[0], trashItem[1], trashItem[2], which]) swapFunc(0) self.closetGUI.updateTrashButtons() else: self.notify.warning("cant delete this item(type = %s), since we don't have a replacement" % which) def resetItemLists(self): self.hatList = self.oldHatList[0:] self.glassesList = self.oldGlassesList[0:] self.backpackList = self.oldBackpackList[0:] self.shoesList = self.oldShoesList[0:] self.closetGUI.hat = self.hatList self.closetGUI.glasses = self.glassesList self.closetGUI.backpack = self.backpackList self.closetGUI.shoes = self.shoesList self.hatDeleted = 0 self.glassesDeleted = 0 self.backpackDeleted = 0 self.shoesDeleted = 0 def __proceedToCheckout(self): if self.hatDeleted or self.glassesDeleted or self.backpackDeleted or self.shoesDeleted: self.__popupAreYouSurePanel() else: self._handlePurchaseDone() def _handlePurchaseDone(self, timeout = 0): if timeout == 1: oldHat = self.oldStyle[ToonDNA.HAT] oldGlasses = self.oldStyle[ToonDNA.GLASSES] oldBackpack = self.oldStyle[ToonDNA.BACKPACK] oldShoes = self.oldStyle[ToonDNA.SHOES] self.d_setDNA(oldHat[0], oldHat[1], oldHat[2], oldGlasses[0], oldGlasses[1], oldGlasses[2], oldBackpack[0], oldBackpack[1], oldBackpack[2], oldShoes[0], oldShoes[1], oldShoes[2], 1) else: which = 0 if hasattr(self.closetGUI, 'hatChoice') and hasattr(self.closetGUI, 'glassesChoice') and hasattr(self.closetGUI, 'backpackChoice') and hasattr(self.closetGUI, 'shoesChoice'): if self.closetGUI.hatChoice != 0 or self.hatDeleted: which = which | ToonDNA.HAT if self.closetGUI.glassesChoice != 0 or self.glassesDeleted: which = which | ToonDNA.GLASSES if self.closetGUI.backpackChoice != 0 or self.backpackDeleted: which = which | ToonDNA.BACKPACK if self.closetGUI.shoesChoice != 0 or self.shoesDeleted: which = which | ToonDNA.SHOES hat = self.av.getHat() glasses = self.av.getGlasses() backpack = self.av.getBackpack() shoes = self.av.getShoes() self.d_setDNA(hat[0], hat[1], hat[2], glasses[0], glasses[1], glasses[2], backpack[0], backpack[1], backpack[2], shoes[0], shoes[1], shoes[2], 2, which) def d_setDNA(self, hatIdx, hatTexture, hatColor, glassesIdx, glassesTexture, glassesColor, backpackIdx, backpackTexture, backpackColor, shoesIdx, shoesTexture, shoesColor, finished, which = ToonDNA.HAT | ToonDNA.GLASSES | ToonDNA.BACKPACK | ToonDNA.SHOES): self.sendUpdate('setDNA', [hatIdx, hatTexture, hatColor, glassesIdx, glassesTexture, glassesColor, backpackIdx, backpackTexture, backpackColor, shoesIdx, shoesTexture, shoesColor, finished, which]) def setCustomerDNA(self, avId, hatIdx, hatTexture, hatColor, glassesIdx, glassesTexture, glassesColor, backpackIdx, backpackTexture, backpackColor, shoesIdx, shoesTexture, shoesColor, which): if avId and avId != base.localAvatar.doId: av = base.cr.doId2do.get(avId, None) if av: if self.av == base.cr.doId2do[avId]: if which & ToonDNA.HAT: self.av.setHat(hatIdx, hatTexture, hatColor) if which & ToonDNA.GLASSES: self.av.setGlasses(glassesIdx, glassesTexture, glassesColor) if which & ToonDNA.BACKPACK: self.av.setBackpack(backpackIdx, backpackTexture, backpackColor) if which & ToonDNA.SHOES: self.av.setShoes(shoesIdx, shoesTexture, shoesColor) self.av.generateToonAccessories() return def __popupNotOwnerPanel(self): if self.popupInfo != None: self.popupInfo.destroy() self.popupInfo = None self.purchaseDoneEvent = self.uniqueName('purchaseDone') self.swapHatEvent = self.uniqueName('swapHat') self.swapGlassesEvent = self.uniqueName('swapGlasses') self.swapBackpackEvent = self.uniqueName('swapBackpack') self.swapShoesEvent = self.uniqueName('swapShoes') self.cancelEvent = self.uniqueName('cancel') self.accept(self.purchaseDoneEvent, self.__proceedToCheckout) self.accept(self.swapHatEvent, self.__handleSwapHat) self.accept(self.swapGlassesEvent, self.__handleSwapGlasses) self.accept(self.swapBackpackEvent, self.__handleSwapBackpack) self.accept(self.swapShoesEvent, self.__handleSwapShoes) self.accept(self.cancelEvent, self._handleCancel) self.deleteEvent = self.uniqueName('delete') if self.isOwner: self.accept(self.deleteEvent, self.__handleDelete) buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')) if self.isFreePlayer: textMsg = TTLocalizer.TrunkNotPaidMessage else: textMsg = TTLocalizer.TrunkNotOwnerMessage self.popupInfo = DirectFrame(parent=hidden, relief=None, state='normal', text=textMsg, frameSize=(-1, 1, -1, 1), text_wordwrap=10, geom=DGG.getDefaultDialogGeom(), geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=(0.88, 1, 0.55), geom_pos=(0, 0, -.08), text_scale=0.08, text_pos=(0, 0.06)) DirectButton(self.popupInfo, image=okButtonImage, relief=None, text=TTLocalizer.ClosetPopupOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.21), command=self._handleNotOwnerMessageOK) buttons.removeNode() self.popupInfo.reparentTo(aspect2d) return def __popupAreYouSurePanel(self): if self.popupInfo != None: self.popupInfo.destroy() self.popupInfo = None buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')) cancelButtonImage = (buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')) self.popupInfo = DirectFrame(parent=hidden, relief=None, state='normal', text=TTLocalizer.TrunkAreYouSureMessage, frameSize=(-1, 1, -1, 1), text_wordwrap=10, geom=DGG.getDefaultDialogGeom(), geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=(0.88, 1, 0.55), geom_pos=(0, 0, -.08), text_scale=0.08, text_pos=(0, 0.08)) DirectButton(self.popupInfo, image=okButtonImage, relief=None, text=TTLocalizer.ClosetPopupOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(-0.1, 0.0, -0.21), command=self._handleYesImSure) DirectButton(self.popupInfo, image=cancelButtonImage, relief=None, text=TTLocalizer.ClosetPopupCancel, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.1, 0.0, -0.21), command=self._handleNotSure) buttons.removeNode() self.popupInfo.reparentTo(aspect2d) return def _openDoors(self): if self.closetTrack: self.closetTrack.finish() openHpr = Vec3(0, -80, 0) if self.av: self.av.applyCheesyEffect(ToontownGlobals.CENormal) self.closetTrack = Parallel() if self.lid: self.closetTrack.append(self.lid.hprInterval(0.5, openHpr)) self.closetTrack.start() def _closeDoors(self): if self.closetTrack: self.closetTrack.finish() closeHpr = Vec3(0, 0, 0) if self.av: self.av.reconsiderCheesyEffect() self.closetTrack = Parallel() if self.lid: self.closetTrack.append(self.lid.hprInterval(0.5, closeHpr)) self.closetTrack.start()