Poodletooth-iLand/toontown/coghq/DistributedButton.py

136 lines
6.9 KiB
Python

from panda3d.core import *
from direct.interval.IntervalGlobal import *
from direct.distributed.ClockDelta import *
import MovingPlatform
from toontown.toonbase import ToontownGlobals
from direct.directnotify import DirectNotifyGlobal
from direct.fsm import ClassicFSM
import DistributedSwitch
from toontown.toonbase import TTLocalizer
class DistributedButton(DistributedSwitch.DistributedSwitch):
countdownSeconds = 3.0
def __init__(self, cr):
self.countdownTrack = None
DistributedSwitch.DistributedSwitch.__init__(self, cr)
return
def setSecondsOn(self, secondsOn):
self.secondsOn = secondsOn
def avatarExit(self, avatarId):
DistributedSwitch.DistributedSwitch.avatarExit(self, avatarId)
if self.secondsOn != -1.0 and self.secondsOn > 0.0 and self.countdownSeconds > 0.0 and self.countdownSeconds < self.secondsOn and self.fsm.getCurrentState().getName() == 'playing':
track = self.switchCountdownTrack()
if track is not None:
track.start(0.0)
self.countdownTrack = track
return
def setupSwitch(self):
model = loader.loadModel('phase_9/models/cogHQ/CogDoor_Button')
if model:
buttonBase = model.find('**/buttonBase')
change = render.attachNewNode('changePos')
buttonBase.reparentTo(change)
rootNode = render.attachNewNode(self.getName() + '-buttonBase_root')
change.reparentTo(rootNode)
self.buttonFrameNode = rootNode
self.buttonFrameNode.show()
button = model.find('**/button')
change = render.attachNewNode('change')
button.reparentTo(change)
rootNode = render.attachNewNode(self.getName() + '-button_root')
rootNode.setColor(self.color)
change.reparentTo(rootNode)
self.buttonNode = rootNode
self.buttonNode.show()
self.buttonFrameNode.reparentTo(self)
self.buttonNode.reparentTo(self)
if 1:
radius = 0.5
cSphere = CollisionSphere(0.0, 0.0, radius, radius)
cSphere.setTangible(0)
cSphereNode = CollisionNode(self.getName())
cSphereNode.addSolid(cSphere)
cSphereNode.setCollideMask(ToontownGlobals.WallBitmask)
self.cSphereNodePath = rootNode.attachNewNode(cSphereNode)
if 1:
collisionFloor = button.find('**/collision_floor')
if collisionFloor.isEmpty():
top = 0.475
size = 0.5
floor = CollisionPolygon(Point3(-size, -size, top),
Point3( size, -size, top),
Point3( size, size, top),
Point3(-size, size, top))
floor.setTangible(1)
floorNode = CollisionNode('collision_floor')
floorNode.addSolid(floor)
collisionFloor = button.attachNewNode(floorNode)
else:
change = collisionFloor.getParent().attachNewNode('changeFloor')
change.setScale(0.5, 0.5, 1.0)
collisionFloor.reparentTo(change)
collisionFloor.node().setFromCollideMask(BitMask32.allOff())
collisionFloor.node().setIntoCollideMask(ToontownGlobals.FloorBitmask)
self.buttonFrameNode.flattenMedium()
self.buttonNode.flattenMedium()
def delete(self):
DistributedSwitch.DistributedSwitch.delete(self)
def enterTrigger(self, args = None):
DistributedSwitch.DistributedSwitch.enterTrigger(self, args)
def exitTrigger(self, args = None):
DistributedSwitch.DistributedSwitch.exitTrigger(self, args)
def switchOnTrack(self):
onSfx = base.loadSfx('phase_9/audio/sfx/CHQ_FACT_switch_pressed.ogg')
duration = 0.8
halfDur = duration * 0.5
pos = Vec3(0.0, 0.0, -0.2)
color = Vec4(0.0, 1.0, 0.0, 1.0)
track = Sequence(Func(self.setIsOn, 1), Parallel(SoundInterval(onSfx, node=self.node, volume=0.9), LerpPosInterval(nodePath=self.buttonNode, duration=duration, pos=pos, blendType='easeInOut'), Sequence(Wait(halfDur), LerpColorInterval(nodePath=self.buttonNode, duration=halfDur, color=color, override=1, blendType='easeOut'))))
return track
def switchCountdownTrack(self):
wait = self.secondsOn - self.countdownSeconds
countDownSfx = base.loadSfx('phase_9/audio/sfx/CHQ_FACT_switch_depressed.ogg')
track = Parallel(
SoundInterval(countDownSfx),
Sequence(
Wait(wait),
Wait(0.5),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=self.color, override=1, blendType='easeIn'),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=Vec4(0.0, 1.0, 0.0, 1.0), override=1, blendType='easeOut'),
Wait(0.5),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=self.color, override=1, blendType='easeIn'),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=Vec4(0.0, 1.0, 0.0, 1.0), override=1, blendType='easeOut'),
Wait(0.4),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=self.color, override=1, blendType='easeIn'),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=Vec4(0.0, 1.0, 0.0, 1.0), override=1, blendType='easeOut'),
Wait(0.3),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=self.color, override=1, blendType='easeIn'),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=Vec4(0.0, 1.0, 0.0, 1.0), override=1, blendType='easeOut'),
Wait(0.2),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, color=self.color, override=1, blendType='easeIn'),
LerpColorInterval(nodePath=self.buttonNode, duration=0.1, override=1, color=Vec4(0.0, 1.0, 0.0, 1.0), blendType='easeOut'),
Wait(0.1)))
return track
def switchOffTrack(self):
offSfx = base.loadSfx('phase_9/audio/sfx/CHQ_FACT_switch_popup.ogg')
duration = 1.0
halfDur = duration * 0.5
pos = Vec3(0.0)
track = Sequence(Parallel(SoundInterval(offSfx, node=self.node, volume=1.0), LerpPosInterval(nodePath=self.buttonNode, duration=duration, pos=pos, blendType='easeInOut'), Sequence(Wait(halfDur), LerpColorInterval(nodePath=self.buttonNode, duration=halfDur, color=self.color, override=1, blendType='easeIn'))), Func(self.setIsOn, 0))
return track
def exitPlaying(self):
if self.countdownTrack:
self.countdownTrack.finish()
self.countdownTrack = None
DistributedSwitch.DistributedSwitch.exitPlaying(self)