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

223 lines
7.6 KiB
Python

import DistributedLawnDecor
from direct.interval.IntervalGlobal import *
from direct.directnotify import DirectNotifyGlobal
from direct.showbase.ShowBase import *
import GardenGlobals
from toontown.toonbase import TTLocalizer
class DistributedPlantBase(DistributedLawnDecor.DistributedLawnDecor):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedPlantBase')
def __init__(self, cr):
DistributedLawnDecor.DistributedLawnDecor.__init__(self, cr)
self.model = None
self.growthLevel = -1
self.waterTrackDict = {}
return
def delete(self):
self.notify.debug('delete')
for waterTrack in self.waterTrackDict.values():
if waterTrack:
waterTrack.finish()
self.waterTrackDict = None
DistributedLawnDecor.DistributedLawnDecor.delete(self)
return
def disable(self):
self.notify.debug('disable')
DistributedLawnDecor.DistributedLawnDecor.disable(self)
def loadModel(self):
if hasattr(self, 'rotateNode') and self.rotateNode:
self.rotateNode.removeNode()
self.rotateNode = self.plantPath.attachNewNode('rotate')
self.model = None
modelName = self.getModelName()
self.model = loader.loadModel(modelName)
self.model.reparentTo(self.rotateNode)
self.stick2Ground()
return
def setupShadow(self):
DistributedLawnDecor.DistributedLawnDecor.setupShadow(self)
self.adjustWaterIndicator()
def setTypeIndex(self, typeIndex):
self.typeIndex = typeIndex
self.attributes = GardenGlobals.PlantAttributes[typeIndex]
self.name = self.attributes['name']
self.plantType = self.attributes['plantType']
self.growthThresholds = self.attributes['growthThresholds']
self.maxWaterLevel = self.attributes['maxWaterLevel']
self.minWaterLevel = self.attributes['minWaterLevel']
self.seedlingModel = self.attributes['seedlingModel']
self.establishedModel = self.attributes['establishedModel']
self.fullGrownModel = self.attributes['fullGrownModel']
def getTypeIndex(self):
return self.typeIndex
def setWaterLevel(self, waterLevel):
self.waterLevel = waterLevel
def getWaterLevel(self):
return self.waterLevel
def setGrowthLevel(self, growthLevel):
self.growthLevel = growthLevel
if self.model:
self.model.setScale(growthLevel)
def getGrowthLevel(self):
return self.growthLevel
def getShovelAction(self):
if self.isFruiting() and not self.isWilted() and self.canBeHarvested():
return TTLocalizer.GardeningPick
else:
return TTLocalizer.GardeningRemove
def getShovelCommand(self):
return self.handlePicking
def canBeHarvested(self):
return True
def handleEnterPlot(self, colEntry = None):
dist = self.getDistance(localAvatar)
self.accept('water-plant', self.__handleWatering)
base.localAvatar.addShovelRelatedDoId(self.doId)
def handleExitPlot(self, entry = None):
DistributedLawnDecor.DistributedLawnDecor.handleExitPlot(self, entry)
base.localAvatar.removeShovelRelatedDoId(self.doId)
self.ignore('water-plant')
def handleWatering(self):
self.startInteraction()
self.sendUpdate('waterPlant')
def __handleWatering(self, plantToWaterId):
if plantToWaterId == self.doId:
self.sendUpdate('waterPlant')
else:
self.notify.debug('not sending water plant')
def isFruiting(self):
retval = self.growthLevel >= self.growthThresholds[2]
return retval
def isGTEFruiting(self):
retval = self.growthLevel >= self.growthThresholds[2]
return retval
def isFullGrown(self):
if self.growthLevel >= self.growthThresholds[2]:
return False
elif self.growthLevel >= self.growthThresholds[1]:
return True
return False
def isGTEFullGrown(self):
retval = self.growthLevel >= self.growthThresholds[1]
return retval
def isEstablished(self):
if self.growthLevel >= self.growthThresholds[2]:
return False
elif self.growthLevel >= self.growthThresholds[1]:
return False
elif self.growthLevel >= self.growthThresholds[0]:
return True
return False
def isGTEEstablished(self):
if self.growthLevel >= self.growthThresholds[0]:
return True
return False
def isSeedling(self):
if self.growthLevel >= self.growthThresholds[2]:
return False
elif self.growthLevel >= self.growthThresholds[1]:
return False
elif self.growthLevel >= self.growthThresholds[0]:
return False
elif self.growthLevel < self.growthThresholds[0]:
return True
return False
def isGTESeedling(self):
return True
def isWilted(self):
return self.waterLevel < 0
def getModelName(self):
if self.growthLevel >= self.growthThresholds[1]:
modelName = self.fullGrownModel
elif self.growthLevel >= self.growthThresholds[1]:
modelName = self.fullGrownModel
elif self.growthLevel >= self.growthThresholds[0]:
modelName = self.establishedModel
else:
modelName = self.seedlingModel
return modelName
def setMovie(self, mode, avId):
if mode == GardenGlobals.MOVIE_WATER:
self.doWaterTrack(avId)
elif mode == GardenGlobals.MOVIE_FINISHPLANTING:
self.doFinishPlantingTrack(avId)
elif mode == GardenGlobals.MOVIE_REMOVE:
self.doDigupTrack(avId)
def doWaterTrack(self, avId):
toon = base.cr.doId2do.get(avId)
if not toon:
return
can = toon.getWateringCanModel()
can.hide()
can.reparentTo(toon.rightHand)
track = Sequence()
track.append(self.startCamIval(avId))
track.append(self.generateToonMoveTrack(toon))
track.append(Func(can.show))
track.append(self.generateWaterTrack(toon))
track.append(Func(can.removeNode))
track.append(self.stopCamIval(avId))
if avId == localAvatar.doId:
track.append(Func(self.sendUpdate, 'waterPlantDone'))
track.append(Func(self.finishInteraction))
track.start()
self.waterTrackDict[avId] = track
def generateWaterTrack(self, toon):
sound = loader.loadSfx('phase_5/audio/sfx/firehose_spray.ogg')
sound.setPlayRate(0.75)
waterTrack = Parallel()
waterTrack.append(Sequence(Parallel(ActorInterval(toon, 'water'), SoundInterval(sound, node=toon, volume=0.5)), Func(toon.loop, 'neutral')))
if hasattr(self, 'dropShadow') and self.dropShadow:
newColor = self.dropShadow.getColor()
alpha = min(1.0, newColor.getW() + 1 / 5.0)
newColor.setW(alpha)
waterTrack.append(LerpColorInterval(self.dropShadow, 2.1, newColor))
return waterTrack
def adjustWaterIndicator(self):
if self.model:
color = self.waterLevel / 5.0 + 1 / 5.0
self.notify.debug('%s %s' % (self.waterLevel, color))
if color < 0.2:
color = 0.2
if hasattr(self, 'dropShadow') and self.dropShadow:
self.dropShadow.setColor(0.0, 0.0, 0.0, color)
def canBeWatered(self):
return 1
def finishInteraction(self):
DistributedLawnDecor.DistributedLawnDecor.finishInteraction(self)
base.localAvatar.handleEndPlantInteraction(self)