145 lines
No EOL
4.6 KiB
Python
145 lines
No EOL
4.6 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from otp.ai.MagicWordGlobal import *
|
|
from DistributedPlantBaseAI import DistributedPlantBaseAI
|
|
from FlowerBase import FlowerBase
|
|
|
|
import GardenGlobals
|
|
import time
|
|
|
|
ONE_DAY = 86400
|
|
|
|
class DistributedFlowerAI(DistributedPlantBaseAI, FlowerBase):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedFlowerAI')
|
|
|
|
def setTypeIndex(self, value):
|
|
DistributedPlantBaseAI.setTypeIndex(self, value)
|
|
FlowerBase.setSpecies(self, value)
|
|
|
|
def calculate(self, lastCheck):
|
|
now = int(time.time())
|
|
if lastCheck == 0:
|
|
lastCheck = now
|
|
|
|
grown = 0
|
|
|
|
# Water level
|
|
elapsed = now - lastCheck
|
|
while elapsed > ONE_DAY:
|
|
if self.waterLevel >= 0:
|
|
grown += 1
|
|
|
|
elapsed -= ONE_DAY
|
|
self.waterLevel -= 1
|
|
|
|
self.waterLevel = max(self.waterLevel, -2)
|
|
|
|
# Growth level
|
|
maxGrowth = self.growthThresholds[2]
|
|
newGL = min(self.growthLevel + grown, maxGrowth)
|
|
self.setGrowthLevel(newGL)
|
|
|
|
self.lastCheck = now - elapsed
|
|
self.update()
|
|
|
|
def update(self):
|
|
mdata = map(list, self.mgr.data['flowers'])
|
|
mdata[self.flowerIndex] = [self.getSpecies(), self.waterLevel, self.lastCheck, self.getGrowthLevel(), self.getVariety()]
|
|
self.mgr.data['flowers'] = mdata
|
|
self.mgr.update()
|
|
|
|
def removeItem(self, usingSatanPickAll=0):
|
|
avId = self.air.getAvatarIdFromSender()
|
|
if not usingSatanPickAll:
|
|
if avId != self.ownerDoId:
|
|
self.air.writeServerEvent('suspicious', avId, 'tried to remove someone else\'s flower!')
|
|
return
|
|
|
|
self.d_setMovie(GardenGlobals.MOVIE_REMOVE)
|
|
|
|
action = 'remove'
|
|
if self.getGrowthLevel() >= self.growthThresholds[2]:
|
|
action = 'pick'
|
|
|
|
def _remove(task):
|
|
if not self.air:
|
|
return
|
|
|
|
av = self.air.doId2do.get(self.ownerDoId)
|
|
if not av:
|
|
return
|
|
|
|
plot = self.mgr.placePlot(self.flowerIndex)
|
|
plot.flowerIndex = self.flowerIndex
|
|
plot.setPlot(self.plot)
|
|
plot.setOwnerIndex(self.ownerIndex)
|
|
plot.generateWithRequired(self.zoneId)
|
|
|
|
index = (0, 1, 2, 2, 2, 3, 3, 3, 4, 4)[self.flowerIndex]
|
|
idx = (0, 0, 0, 1, 2, 0, 1, 2, 0, 1)[self.flowerIndex]
|
|
plot.sendUpdate('setBoxDoId', [self.mgr._boxes[index].doId, idx])
|
|
|
|
self.air.writeServerEvent('%s-flower' % action, avId, plot=self.plot)
|
|
self.requestDelete()
|
|
|
|
self.mgr.flowers.remove(self)
|
|
|
|
mdata = map(list, self.mgr.data['flowers'])
|
|
mdata[self.flowerIndex] = self.mgr.getNullPlant()
|
|
self.mgr.data['flowers'] = mdata
|
|
self.mgr.update()
|
|
|
|
if action == 'pick':
|
|
av.b_setShovelSkill(av.getShovelSkill() + self.getValue())
|
|
av.addFlowerToBasket(self.getSpecies(), self.getVariety())
|
|
|
|
if task:
|
|
return task.done
|
|
|
|
if usingSatanPickAll:
|
|
_remove(None)
|
|
|
|
else:
|
|
taskMgr.doMethodLater(7, _remove, self.uniqueName('do-remove'))
|
|
|
|
@magicWord(category=CATEGORY_PROGRAMMER)
|
|
def satanGrowFlowers():
|
|
av = spellbook.getTarget()
|
|
estate = av.air.estateManager._lookupEstate(av)
|
|
|
|
if not estate:
|
|
return 'Estate not found!'
|
|
|
|
garden = estate.gardenManager.gardens.get(av.doId)
|
|
if not garden:
|
|
return 'Garden not found!'
|
|
|
|
now = int(time.time())
|
|
i = 0
|
|
for flower in garden.flowers.union(garden.trees):
|
|
flower.b_setWaterLevel(5)
|
|
flower.b_setGrowthLevel(2)
|
|
flower.update()
|
|
i += 1
|
|
|
|
return '%d disgusting flowers and trees grown' % i
|
|
|
|
@magicWord(category=CATEGORY_PROGRAMMER)
|
|
def satanPickAll():
|
|
av = spellbook.getTarget()
|
|
estate = av.air.estateManager._lookupEstate(av)
|
|
|
|
if not estate:
|
|
return 'Estate not found!'
|
|
|
|
garden = estate.gardenManager.gardens.get(av.doId)
|
|
if not garden:
|
|
return 'Garden not found!'
|
|
|
|
i = 0
|
|
for flower in garden.flowers.copy():
|
|
if flower.getGrowthLevel() >= flower.growthThresholds[2]:
|
|
flower.removeItem(1)
|
|
i += 1
|
|
|
|
return '%d disgusting flowers picked' % i
|
|
|