toontown-just-works/toontown/hood/HoodAI.py
2024-07-07 18:08:39 -05:00

181 lines
7.7 KiB
Python

from direct.directnotify.DirectNotifyGlobal import *
from toontown.building import DistributedBuildingMgrAI
from toontown.dna.DNAParser import DNAStorage, DNAGroup, DNAVisGroup
from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI
from toontown.hood import ZoneUtil
from toontown.safezone import TreasureGlobals
from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI
from toontown.safezone.DistributedPartyGateAI import DistributedPartyGateAI
from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI
from toontown.suit import DistributedSuitPlannerAI
from toontown.toon import NPCToons
from toontown.toonbase import TTLocalizer
from toontown.toonbase import ToontownGlobals
class HoodAI:
notify = directNotify.newCategory('HoodAI')
notify.setInfo(True)
def __init__(self, air, zoneId, canonicalHoodId):
self.air = air
self.zoneId = zoneId
self.canonicalHoodId = canonicalHoodId
self.fishingPonds = []
self.partyGates = []
self.treasurePlanner = None
self.buildingManagers = []
self.suitPlanners = []
for zoneId in self.getZoneTable():
self.notify.info('Creating objects... ' + self.getLocationName(zoneId))
dnaFileName = self.air.lookupDNAFileName(zoneId)
dnaStore = DNAStorage()
dnaData = simbase.air.loadDNAFileAI(dnaStore, dnaFileName)
self.air.dnaStoreMap[zoneId] = dnaStore
self.air.dnaDataMap[zoneId] = dnaData
def getZoneTable(self):
zoneTable = [self.zoneId]
zoneTable.extend(ToontownGlobals.HoodHierarchy.get(self.canonicalHoodId, []))
return zoneTable
def getLocationName(self, zoneId):
lookupTable = ToontownGlobals.hoodNameMap
isStreet = (zoneId%1000) != 0
if isStreet:
lookupTable = TTLocalizer.GlobalStreetNames
name = lookupTable.get(zoneId, '')
if isStreet:
return '%s, %s' % (self.getLocationName(self.zoneId), name[2])
return name[2]
def startup(self):
if self.air.wantFishing:
self.createFishingPonds()
if self.air.wantParties:
self.createPartyPeople()
if simbase.config.GetBool('want-treasure-planners', True):
self.createTreasurePlanner()
self.createBuildingManagers()
if simbase.config.GetBool('want-suit-planners', True):
self.createSuitPlanners()
def shutdown(self):
if self.treasurePlanner:
self.treasurePlanner.stop()
self.treasurePlanner.deleteAllTreasuresNow()
self.treasurePlanner = None
for suitPlanner in self.suitPlanners:
suitPlanner.requestDelete()
del self.air.suitPlanners[suitPlanner.zoneId]
self.suitPlanners = []
for buildingManager in self.buildingManagers:
buildingManager.cleanup()
del self.air.buildingManagers[buildingManager.branchId]
self.buildingManagers = []
del self.fishingPonds
for distObj in self.doId2do.values():
distObj.requestDelete()
def findFishingPonds(self, dnaGroup, zoneId, area):
fishingPonds = []
fishingPondGroups = []
if isinstance(dnaGroup, DNAGroup) and ('fishing_pond' in dnaGroup.getName()):
fishingPondGroups.append(dnaGroup)
fishingPond = DistributedFishingPondAI(simbase.air)
fishingPond.setArea(area)
fishingPond.generateWithRequired(zoneId)
fishingPond.start()
fishingPonds.append(fishingPond)
elif isinstance(dnaGroup, DNAVisGroup):
zoneId = int(dnaGroup.getName().split(':')[0])
for i in xrange(dnaGroup.getNumChildren()):
(foundFishingPonds, foundFishingPondGroups) = self.findFishingPonds(dnaGroup.at(i), zoneId, area)
fishingPonds.extend(foundFishingPonds)
fishingPondGroups.extend(foundFishingPondGroups)
return (fishingPonds, fishingPondGroups)
def findFishingSpots(self, dnaGroup, fishingPond):
fishingSpots = []
if isinstance(dnaGroup, DNAGroup) and ('fishing_spot' in dnaGroup.getName()):
fishingSpot = DistributedFishingSpotAI(simbase.air)
fishingSpot.setPondDoId(fishingPond.doId)
x, y, z = dnaGroup.getPos()
h, p, r = dnaGroup.getHpr()
fishingSpot.setPosHpr(x, y, z, h, p, r)
fishingSpot.generateWithRequired(fishingPond.zoneId)
fishingSpots.append(fishingSpot)
for i in xrange(dnaGroup.getNumChildren()):
foundFishingSpots = self.findFishingSpots(dnaGroup.at(i), fishingPond)
fishingSpots.extend(foundFishingSpots)
return fishingSpots
def createFishingPonds(self):
self.fishingPonds = []
fishingPondGroups = []
for zoneId in self.getZoneTable():
dnaData = self.air.dnaDataMap.get(zoneId, None)
if dnaData.getName() == 'root':
area = ZoneUtil.getCanonicalZoneId(zoneId)
(foundFishingPonds, foundFishingPondGroups) = self.findFishingPonds(dnaData, zoneId, area)
self.fishingPonds.extend(foundFishingPonds)
fishingPondGroups.extend(foundFishingPondGroups)
for fishingPond in self.fishingPonds:
NPCToons.createNpcsInZone(self.air, fishingPond.zoneId)
fishingSpots = []
for (dnaGroup, fishingPond) in zip(fishingPondGroups, self.fishingPonds):
fishingSpots.extend(self.findFishingSpots(dnaGroup, fishingPond))
def findPartyGates(self, dnaGroup, zoneId):
partyGates = []
if isinstance(dnaGroup, DNAGroup) and ('prop_party_gate' in dnaGroup.getName()):
partyGate = DistributedPartyGateAI(simbase.air)
partyGate.setArea(zoneId)
partyGate.generateWithRequired(zoneId)
partyGates.append(partyGates)
for i in xrange(dnaGroup.getNumChildren()):
foundPartyGates = self.findPartyGates(dnaGroup.at(i), zoneId)
partyGates.extend(foundPartyGates)
return partyGates
def createPartyPeople(self):
self.partyGates = []
for zoneId in self.getZoneTable():
dnaData = self.air.dnaDataMap.get(zoneId, None)
if dnaData.getName() == 'root':
foundPartyGates = self.findPartyGates(dnaData, zoneId)
self.partyGates.extend(foundPartyGates)
def createTreasurePlanner(self):
spawnInfo = TreasureGlobals.SafeZoneTreasureSpawns.get(self.canonicalHoodId)
if not spawnInfo:
return
treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = spawnInfo
self.treasurePlanner = SZTreasurePlannerAI(
self.canonicalHoodId, treasureType, healAmount, spawnPoints,
spawnRate, maxTreasures)
self.treasurePlanner.start()
def createBuildingManagers(self):
for zoneId in self.getZoneTable():
dnaStore = self.air.dnaStoreMap[zoneId]
buildingManager = DistributedBuildingMgrAI.DistributedBuildingMgrAI(
self.air, zoneId, dnaStore, self.air.trophyMgr)
self.buildingManagers.append(buildingManager)
self.air.buildingManagers[zoneId] = buildingManager
def createSuitPlanners(self):
for zoneId in self.getZoneTable():
if zoneId == self.zoneId:
continue
suitPlanner = DistributedSuitPlannerAI.DistributedSuitPlannerAI(self.air, zoneId)
suitPlanner.generateWithRequired(zoneId)
suitPlanner.d_setZoneId(zoneId)
suitPlanner.initTasks()
self.suitPlanners.append(suitPlanner)
self.air.suitPlanners[zoneId] = suitPlanner