toontown-just-works/toontown/safezone/DistributedTreasure.py
2024-07-07 18:08:39 -05:00

165 lines
6.3 KiB
Python

from panda3d.core import *
from direct.interval.IntervalGlobal import *
from toontown.toonbase.ToontownGlobals import *
from direct.distributed import DistributedObject
from direct.directnotify import DirectNotifyGlobal
from toontown.safezone import TreasureGlobals
class DistributedTreasure(DistributedObject.DistributedObject):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTreasure')
def __init__(self, cr):
DistributedObject.DistributedObject.__init__(self, cr)
self.av = None
self.treasureFlyTrack = None
self.nodePath = None
self.dropShadow = None
self.rejectSoundPath = 'phase_4/audio/sfx/ring_miss.ogg'
self.playSoundForRemoteToons = 1
self.scale = 1.0
self.shadow = 1
self.fly = 1
self.zOffset = 0.0
self.billboard = 0
self.treasureType = None
return
def disable(self):
self.ignoreAll()
self.nodePath.detachNode()
DistributedObject.DistributedObject.disable(self)
def delete(self):
if self.treasureFlyTrack:
self.treasureFlyTrack.finish()
self.treasureFlyTrack = None
DistributedObject.DistributedObject.delete(self)
self.nodePath.removeNode()
return
def announceGenerate(self):
DistributedObject.DistributedObject.announceGenerate(self)
self.loadModel()
self.startAnimation()
self.nodePath.wrtReparentTo(render)
self.accept(self.uniqueName('entertreasureSphere'), self.handleEnterSphere)
def handleEnterSphere(self, collEntry = None):
localAvId = base.localAvatar.getDoId()
if not self.fly:
self.handleGrab(localAvId)
self.d_requestGrab()
def d_requestGrab(self):
self.sendUpdate('requestGrab', [])
def getSphereRadius(self):
return 2.0
def loadModel(self):
modelPath, grabSoundPath = TreasureGlobals.TreasureModels[self.treasureType]
if base.cr.newsManager.isHolidayRunning(VALENTOONS_DAY):
modelPath = TreasureGlobals.ValentineTreasureModel
self.grabSound = base.loadSfx(grabSoundPath)
self.rejectSound = base.loadSfx(self.rejectSoundPath)
if self.nodePath == None:
self.makeNodePath()
else:
self.treasure.getChildren().detach()
model = loader.loadModel(modelPath)
model.instanceTo(self.treasure)
return
def makeNodePath(self):
self.nodePath = NodePath(self.uniqueName('treasure'))
if self.billboard:
self.nodePath.setBillboardPointEye()
self.nodePath.setScale(0.9 * self.scale)
self.treasure = self.nodePath.attachNewNode('treasure')
if self.shadow:
if not self.dropShadow:
self.dropShadow = loader.loadModel('phase_3/models/props/drop_shadow')
self.dropShadow.setColor(0, 0, 0, 0.5)
self.dropShadow.setPos(0, 0, 0.025)
self.dropShadow.setScale(0.4 * self.scale)
self.dropShadow.flattenLight()
self.dropShadow.reparentTo(self.nodePath)
collSphere = CollisionSphere(0, 0, 0, self.getSphereRadius())
collSphere.setTangible(0)
collNode = CollisionNode(self.uniqueName('treasureSphere'))
collNode.setIntoCollideMask(WallBitmask)
collNode.addSolid(collSphere)
self.collNodePath = self.nodePath.attachNewNode(collNode)
self.collNodePath.stash()
def getParentNodePath(self):
return render
def setTreasureType(self, treasureType):
self.treasureType = treasureType
def setPosition(self, x, y, z):
if not self.nodePath:
self.makeNodePath()
self.nodePath.reparentTo(self.getParentNodePath())
self.nodePath.setPos(x, y, z + self.zOffset)
self.collNodePath.unstash()
def setGrab(self, avId):
if avId == 0:
return
if self.fly or avId != base.localAvatar.getDoId():
self.handleGrab(avId)
def setReject(self):
if self.treasureFlyTrack:
self.treasureFlyTrack.finish()
self.treasureFlyTrack = None
base.playSfx(self.rejectSound, node=self.nodePath)
self.treasureFlyTrack = Sequence(LerpColorScaleInterval(self.nodePath, 0.8, colorScale=VBase4(0, 0, 0, 0), startColorScale=VBase4(1, 1, 1, 1), blendType='easeIn'), LerpColorScaleInterval(self.nodePath, 0.2, colorScale=VBase4(1, 1, 1, 1), startColorScale=VBase4(0, 0, 0, 0), blendType='easeOut'), name=self.uniqueName('treasureFlyTrack'))
self.treasureFlyTrack.start()
return
def handleGrab(self, avId):
self.collNodePath.stash()
self.avId = avId
if avId in self.cr.doId2do:
av = self.cr.doId2do[avId]
self.av = av
else:
self.nodePath.detachNode()
return
if self.playSoundForRemoteToons or self.avId == base.localAvatar.getDoId():
base.playSfx(self.grabSound, node=self.nodePath)
if not self.fly:
self.nodePath.detachNode()
return
self.nodePath.wrtReparentTo(av)
if self.treasureFlyTrack:
self.treasureFlyTrack.finish()
self.treasureFlyTrack = None
avatarGoneName = self.av.uniqueName('disable')
self.accept(avatarGoneName, self.handleUnexpectedExit)
flytime = 1.0
track = Sequence(LerpPosInterval(self.nodePath, flytime, pos=Point3(0, 0, 3), startPos=self.nodePath.getPos(), blendType='easeInOut'), Func(self.nodePath.detachNode), Func(self.ignore, avatarGoneName))
if self.shadow:
self.treasureFlyTrack = Sequence(HideInterval(self.dropShadow), track, ShowInterval(self.dropShadow), name=self.uniqueName('treasureFlyTrack'))
else:
self.treasureFlyTrack = Sequence(track, name=self.uniqueName('treasureFlyTrack'))
self.treasureFlyTrack.start()
return
def handleUnexpectedExit(self):
self.notify.warning('While getting treasure, ' + str(self.avId) + ' disconnected.')
if self.treasureFlyTrack:
self.treasureFlyTrack.finish()
self.treasureFlyTrack = None
return
def getStareAtNodeAndOffset(self):
return (self.nodePath, Point3())
def startAnimation(self):
pass