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

243 lines
No EOL
10 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from otp.ai.MagicWordGlobal import *
from DistributedLawnDecorAI import DistributedLawnDecorAI
import GardenGlobals
class DistributedGardenPlotAI(DistributedLawnDecorAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGardenPlotAI')
def announceGenerate(self):
DistributedLawnDecorAI.announceGenerate(self)
self.plotType = GardenGlobals.whatCanBePlanted(self.ownerIndex, self.plot)
self.__plantingAvId = 0
def __initialSanityCheck(self, wantedType=None, forceOwner=False):
if self.__plantingAvId:
# Busy, silently ignore
return
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if not av:
self.air.writeServerEvent('suspicious', avId, 'called DistributedGardenPlotAI method outside shard!')
return
if wantedType is not None and self.plotType != wantedType:
self.air.writeServerEvent('suspicious', avId, 'called incorrect DistributedGardenPlotAI method!', plotType=self.plotType,
wantedType=wantedType)
return self.d_interactionDenied()
if avId != self.ownerDoId and not forceOwner:
self.air.writeServerEvent('suspicious', avId, 'called someone else\'s DistributedGardenPlotAI plant method!',
ownerDoId=self.ownerDoId)
return self.d_interactionDenied()
return av
def plantFlower(self, species, variety, usingSatanFlowerAll=0):
av = self.__initialSanityCheck(GardenGlobals.FLOWER_TYPE if not usingSatanFlowerAll else None, usingSatanFlowerAll)
if not av:
return
def invalid(problem):
msg = 'tried to plant flower but something went wrong: %s' % problem
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
if not usingSatanFlowerAll:
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
attr = GardenGlobals.PlantAttributes.get(species, {})
if attr.get('plantType') != GardenGlobals.FLOWER_TYPE:
return invalid('invalid species: %d' % species)
if variety >= len(attr['varieties']):
return invalid('invalid variety: %d' % variety)
if not usingSatanFlowerAll:
cost = len(GardenGlobals.Recipes[attr['varieties'][variety][0]]['beans'])
av.takeMoney(cost)
self.d_setMovie(GardenGlobals.MOVIE_PLANT)
def _plant(task):
flower = self.mgr.plantFlower(self.flowerIndex, species, variety, plot=self,
ownerIndex=self.ownerIndex, plotId=self.plot,
waterLevel=0)
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]
flower.sendUpdate('setBoxDoId', [self.mgr._boxes[index].doId, idx])
if not usingSatanFlowerAll:
flower.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId)
flower.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId)
self.air.writeServerEvent('plant-flower', self.__plantingAvId, species=species, variety=variety,
plot=self.plot, name=attr.get('name', 'unknown satan flower'))
if task:
return task.done
if usingSatanFlowerAll:
_plant(None)
else:
taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant'))
self.__plantingAvId = av.doId
return 1
def plantGagTree(self, track, index):
av = self.__initialSanityCheck(GardenGlobals.GAG_TREE_TYPE)
if not av:
return
for i in xrange(index):
if not self.mgr.hasTree(track, i):
msg = 'tried to plant tree but an index is missing: %d' % index
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
if self.mgr.hasTree(track, index):
msg = 'tried to plant tree but gag already planted'
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
if av.inventory.useItem(track, index) == -1:
msg = 'tried to plant tree but not carrying selected gag'
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
av.d_setInventory(av.getInventory())
self.d_setMovie(GardenGlobals.MOVIE_PLANT)
def _plant(task):
if not self.air:
return
tree = self.mgr.plantTree(self.treeIndex, track * 7 + index, plot=self, ownerIndex=self.ownerIndex,
plotId=self.plot, pos=(self.getPos(), self.getH()))
tree.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId)
tree.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId)
self.air.writeServerEvent('plant-tree', self.__plantingAvId, track=track, index=index, plot=self.plot)
return task.done
taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant'))
self.__plantingAvId = av.doId
def plantStatuary(self, species):
av = self.__initialSanityCheck(GardenGlobals.STATUARY_TYPE)
if not av:
return
def invalid(problem):
msg = 'tried to plant statuary but something went wrong: %s' % problem
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
attr = GardenGlobals.PlantAttributes.get(species, {})
if attr.get('plantType') != GardenGlobals.STATUARY_TYPE:
return invalid('invalid species: %d' % species)
it = species - 100
if it == 134:
it = 135
if not av.removeGardenItem(it, 1):
return invalid('av doesn\'t own item: %d' % species)
self.d_setMovie(GardenGlobals.MOVIE_PLANT)
def _plant(task):
if not self.air:
return
statuary = self.mgr.placeStatuary(self.mgr.S_pack(0, 0, species, 0), plot=self,
ownerIndex=self.ownerIndex, plotId=self.plot,
pos=(self.getPos(), self.getH()), generate=False)
statuary.generateWithRequired(self.zoneId)
statuary.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId)
statuary.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId)
self.air.writeServerEvent('plant-statuary', self.__plantingAvId, species=species, plot=self.plot)
return task.done
taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant'))
self.__plantingAvId = av.doId
def plantToonStatuary(self, species, dnaCode):
av = self.__initialSanityCheck(GardenGlobals.STATUARY_TYPE)
if not av:
return
def invalid(problem):
msg = 'tried to plant statuary but something went wrong: %s' % problem
self.notify.warning('%d %s' % (av.doId, msg))
self.air.writeServerEvent('suspicious', av.doId, msg)
return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED)
attr = GardenGlobals.PlantAttributes.get(species, {})
if attr.get('plantType') != GardenGlobals.STATUARY_TYPE:
return invalid('invalid species: %d' % species)
if not av.removeGardenItem(species - 100, 1):
return invalid('av doesn\'t own item: %d' % species)
self.d_setMovie(GardenGlobals.MOVIE_PLANT)
def _plant(task):
if not self.air:
return
statuary = self.mgr.placeStatuary(self.mgr.S_pack(dnaCode, 0, species, 0), plot=self,
ownerIndex=self.ownerIndex, plotId=self.plot,
pos=(self.getPos(), self.getH()), generate=False)
statuary.generateWithRequired(self.zoneId)
statuary.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId)
self.air.writeServerEvent('plant-statuary', self.__plantingAvId, species=species, plot=self.plot)
return task.done
taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant'))
self.__plantingAvId = av.doId
def plantNothing(self, burntBeans):
av = self.__initialSanityCheck()
if av:
av.takeMoney(burntBeans)
@magicWord(category=CATEGORY_PROGRAMMER, types=[int, int])
def satanFlowerAll(species=49, variety=0):
invoker = spellbook.getInvoker()
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 obj in garden.objects.copy():
if isinstance(obj, DistributedGardenPlotAI):
if obj.plotType != GardenGlobals.FLOWER_TYPE:
continue
if not obj.plantFlower(species, variety, 1):
return 'Error on plot %d' % i
i += 1
return '%d disgusting flowers planted' % i
@magicWord(category=CATEGORY_PROGRAMMER)
def gibSpecials():
av = spellbook.getTarget()
av.gardenSpecials = []
for x in (100, 101, 103, 105, 106, 107, 108, 130, 131, 135):
av.addGardenItem(x, 99)