toontown-just-works/toontown/estate/DistributedTV.py
2024-07-07 18:08:39 -05:00

144 lines
No EOL
6.4 KiB
Python

from direct.gui.DirectGui import *
from otp.otpbase import OTPLocalizer
from toontown.catalog import CatalogFurnitureItem
from toontown.toonbase import ToontownGlobals, TTLocalizer
from toontown.toontowngui import TTDialog
from DistributedFurnitureItem import DistributedFurnitureItem
import glob, ntpath, os, time
class DistributedTV(DistributedFurnitureItem):
def __init__(self, cr):
DistributedFurnitureItem.__init__(self, cr)
self.dialog = None
self.screen = None
self.sound = None
self.accept('exitingStoppedState', self.destroyGui)
def loadModel(self, animate=1):
model = DistributedFurnitureItem.loadModel(self)
if animate:
pos = CatalogFurnitureItem.TvToPosScale[self.item.furnitureType]
self.screen = NodePath(CardMaker('tv-screen').generate())
model.find('**/toonTownBugTV_screen').hide()
self.screen.reparentTo(model)
self.screen.setScale(*pos[1])
self.screen.setPos(*pos[0])
self.resetScreen()
cSphere = CollisionSphere(0.0, -1.5, 1.0, 1.575)
cSphere.setTangible(0)
colNode = CollisionNode('TV-%s' % self.doId)
colNode.addSolid(cSphere)
cSpherePath = model.attachNewNode(colNode)
cSpherePath.setCollideMask(ToontownGlobals.WallBitmask)
self.accept('enterTV-%s' % self.doId, self.__enterSphere)
return model
def disable(self):
self.ignoreAll()
self.destroyGui()
self.destroySound()
DistributedFurnitureItem.disable(self)
def setVideo(self, video, time):
if (not video) or (not time):
return
self.destroySound()
self.startVideo(os.path.join('user', os.path.join('videos', video)), time)
def getPack(self, name):
for pack in TTLocalizer.TVPacks:
if pack.lower() in name:
return pack
return None
def destroySound(self):
if self.sound:
self.sound.stop()
self.sound = None
def destroyGui(self, arg=None):
if self.dialog:
self.dialog.destroy()
self.dialog = None
def destroyGuiAndWalk(self, arg=None):
self.destroyGui()
base.cr.playGame.getPlace().setState('walk')
def cutOff(self, string):
return string if len(string) < 24 else '%s...' % string[:24]
def resetScreen(self):
self.screen.setTextureOff(TextureStage.getDefault())
self.screen.setColor(0.3, 0.3, 0.3, 1.0)
def startVideo(self, video, startTime):
if not os.path.exists(video):
pack = self.getPack(video)
base.localAvatar.setSystemMessage(0, TTLocalizer.TVUnknownVideoPack % pack if pack else TTLocalizer.TVUnknownVideo)
self.resetScreen()
return
start = time.time() - startTime
movie = loader.loadTexture(video)
self.sound = loader.loadSfx(video)
length = self.sound.length()
if start >= length:
start -= int(start / length) * length
movie.synchronizeTo(self.sound)
self.screen.setColor(1, 1, 1, 1)
self.screen.setTexture(movie)
self.screen.setTexScale(TextureStage.getDefault(), movie.getTexScale())
self.sound.setTime(start)
self.sound.setLoop(True)
self.sound.play()
def __enterSphere(self, collisionEntry):
if base.localAvatar.doId != self.furnitureMgr.ownerId:
return
videos = []
gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui')
buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
buttonImage = (gui.find('**/FndsLst_ScrollUp'), gui.find('**/FndsLst_ScrollDN'), gui.find('**/FndsLst_ScrollUp_Rllvr'), gui.find('**/FndsLst_ScrollUp'))
base.cr.playGame.getPlace().setState('stopped')
self.dialog = DirectFrame(relief=None, geom=DGG.getDefaultDialogGeom(), geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=(1.33, 1, 1.4),
pos=(0, 0, 0), text=TTLocalizer.TVChooseVideo, text_scale=0.07, text_pos=(0, 0.575))
for file in sorted(glob.glob('user/videos/*.mp4')):
filename = ntpath.basename(file)
videos.append(DirectButton(relief=None, text=self.cutOff(filename[:-4]), text_pos=(0.0, -0.0225), text_scale=0.048, text_align=TextNode.ALeft, text_fg=(0, 0, 0, 1), text3_fg=(0.4, 0.8, 0.4, 1), text1_bg=(0.5, 0.9, 1, 1), text2_bg=(1, 1, 0, 1), command=self.chooseVideo, extraArgs=[filename]))
scrollList = DirectScrolledList(parent=self.dialog, relief=None, pos=(-0.05, 0, 0), incButton_image=buttonImage, incButton_relief=None, incButton_scale=(1.3, 1.3, -1.3),
incButton_pos=(0.045, 0, -0.4), incButton_image3_color=(1, 1, 1, 0.2), decButton_image=buttonImage, decButton_relief=None,
decButton_scale=1.3, decButton_pos=(0.045, 0, 0.5), decButton_image3_color=(1, 1, 1, 0.2), itemFrame_pos=(-0.247, 0, 0.365),
itemFrame_scale=1.0, itemFrame_relief=DGG.SUNKEN, itemFrame_frameSize=(-0.02, 0.6, -0.7, 0.08), itemFrame_frameColor=(0.85, 0.95, 1, 1),
itemFrame_borderWidth=(0.01, 0.01), numItemsVisible=10, forceHeight=0.065, items=videos)
cancelButton = DirectButton(parent=self.dialog, relief=None, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), pos=(0, 0, -0.55), text=OTPLocalizer.lCancel, text_scale=0.06, text_pos=(0, -0.1), command=self.destroyGuiAndWalk)
gui.removeNode()
buttons.removeNode()
def chooseVideo(self, video):
self.destroyGuiAndWalk()
self.sendUpdate('requestVideo', [video])
def showDialog(self, text):
base.cr.playGame.getPlace().setState('stopped')
self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=text, text_wordwrap=15, fadeScreen=1, command=self.destroyGuiAndWalk)
def requestVideoResponse(self, response):
if response == ToontownGlobals.TV_NOT_OWNER:
self.showDialog(TTLocalizer.TVNotOwner)
elif response == ToontownGlobals.TV_INVALID_VIDEO:
self.showDialog(TTLocalizer.TVInvalidVideo)
elif response == ToontownGlobals.TV_OK:
self.showDialog(TTLocalizer.TVOK)