2019-11-02 17:27:54 -05:00
|
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
from toontown.toonbase.ToontownGlobals import *
|
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import *
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import VineGameGlobals
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.interval.SoundInterval import SoundInterval
|
|
|
|
|
2019-11-02 20:22:48 -05:00
|
|
|
class VineBat(NodePath, DirectObject):
|
2019-11-02 17:27:54 -05:00
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('VineBat')
|
|
|
|
RADIUS = 1.7
|
|
|
|
|
|
|
|
def __init__(self, batIndex, timeToTraverseField):
|
|
|
|
NodePath.__init__(self, 'VineBat')
|
|
|
|
DirectObject.__init__(self)
|
|
|
|
pos = Point3(0, 0, 0)
|
|
|
|
serialNum = 0
|
|
|
|
gameId = 0
|
|
|
|
self.serialNum = serialNum
|
|
|
|
self.batIndex = batIndex
|
|
|
|
self.timeToTraverseField = timeToTraverseField
|
|
|
|
gameAssets = loader.loadModel('phase_4/models/minigames/vine_game')
|
|
|
|
bat3 = gameAssets.find('**/bat3')
|
|
|
|
bat2 = gameAssets.find('**/bat2')
|
|
|
|
bat1 = gameAssets.find('**/bat__1')
|
2019-12-30 23:20:22 -06:00
|
|
|
seqNode = SequenceNode('bat')
|
2019-11-02 17:27:54 -05:00
|
|
|
seqNode.addChild(bat1.node())
|
|
|
|
seqNode.addChild(bat2.node())
|
|
|
|
seqNode.addChild(bat3.node())
|
|
|
|
seqNode.setFrameRate(12)
|
|
|
|
seqNode.pingpong(False)
|
|
|
|
self.batModel = self.attachNewNode(seqNode)
|
|
|
|
self.batModel.reparentTo(self)
|
|
|
|
gameAssets.removeNode()
|
|
|
|
self.batModelIcon = self.attachNewNode('batIcon')
|
|
|
|
self.batModel.copyTo(self.batModelIcon)
|
|
|
|
regularCamMask = BitMask32.bit(0)
|
|
|
|
self.batModelIcon.hide(regularCamMask)
|
|
|
|
self.batModelIcon.show(VineGameGlobals.RadarCameraBitmask)
|
|
|
|
self.batModelIcon.setScale(0.55)
|
|
|
|
self.batModel.setScale(0.15)
|
|
|
|
self.setPos(-100, 0, 0)
|
|
|
|
center = Point3(0, 0, 0)
|
|
|
|
self.sphereName = 'batSphere-%s-%s' % (gameId, self.serialNum)
|
|
|
|
self.collSphere = CollisionSphere(center[0], center[1], center[2], self.RADIUS)
|
|
|
|
self.collSphere.setTangible(0)
|
|
|
|
self.collNode = CollisionNode(self.sphereName)
|
|
|
|
self.collNode.setIntoCollideMask(VineGameGlobals.SpiderBitmask)
|
|
|
|
self.collNode.addSolid(self.collSphere)
|
|
|
|
self.collNodePath = self.attachNewNode(self.collNode)
|
|
|
|
self.collNodePath.hide()
|
|
|
|
self.accept('enter' + self.sphereName, self.__handleEnterSphere)
|
2020-01-14 13:28:52 -06:00
|
|
|
self.screechSfx = base.loader.loadSfx('phase_4/audio/sfx/MG_sfx_vine_game_bat_shriek_3.ogg')
|
|
|
|
self.flySfx = base.loader.loadSfx('phase_4/audio/sfx/MG_sfx_vine_game_bat_flying_lp.ogg')
|
2019-11-02 17:27:54 -05:00
|
|
|
self.oldCutoffDistance = base.sfxPlayer.getCutoffDistance()
|
|
|
|
base.sfxPlayer.setCutoffDistance(240)
|
|
|
|
self.soundInterval = SoundInterval(self.flySfx, node=self, listenerNode=base.localAvatar, seamlessLoop=True, volume=0.5, cutOff=240)
|
|
|
|
self.reparentTo(render)
|
|
|
|
self.startedFlying = False
|
|
|
|
self.warnedForThisLap = False
|
|
|
|
startX = VineGameGlobals.VineXIncrement * VineGameGlobals.NumVines
|
|
|
|
endX = -VineGameGlobals.VineXIncrement
|
|
|
|
self.velocity = float(startX - endX) / self.timeToTraverseField
|
|
|
|
self.warnDistance = 35
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self.ignoreAll()
|
|
|
|
self.batModel.removeNode()
|
|
|
|
del self.batModel
|
|
|
|
del self.collSphere
|
|
|
|
self.collNodePath.removeNode()
|
|
|
|
del self.collNodePath
|
|
|
|
del self.collNode
|
|
|
|
self.removeNode()
|
|
|
|
self.soundInterval.finish()
|
|
|
|
del self.soundInterval
|
|
|
|
del self.flySfx
|
|
|
|
del self.screechSfx
|
|
|
|
base.sfxPlayer.setCutoffDistance(self.oldCutoffDistance)
|
|
|
|
|
|
|
|
def __handleEnterSphere(self, collEntry):
|
|
|
|
self.ignoreAll()
|
|
|
|
self.notify.debug('treasuerGrabbed')
|
|
|
|
messenger.send('VineBatGrabbed', [self.serialNum])
|
|
|
|
|
|
|
|
def showGrab(self):
|
|
|
|
self.reparentTo(hidden)
|
|
|
|
self.collNode.setIntoCollideMask(BitMask32(0))
|
|
|
|
|
|
|
|
def startFlying(self):
|
|
|
|
self.startedFlying = True
|
|
|
|
self.soundInterval.loop()
|
|
|
|
|
|
|
|
def stopFlying(self):
|
|
|
|
self.flySfx.setVolume(0)
|
|
|
|
self.soundInterval.finish()
|
|
|
|
|
|
|
|
def startLap(self):
|
|
|
|
self.warnedForThisLap = False
|
|
|
|
|
|
|
|
def checkScreech(self):
|
|
|
|
distance = base.localAvatar.getDistance(self)
|
|
|
|
if distance < self.warnDistance:
|
|
|
|
if self.getX(render) > base.localAvatar.getX(render):
|
|
|
|
if not self.warnedForThisLap:
|
|
|
|
self.screechSfx.play()
|
|
|
|
self.warnedForThisLap = True
|