oldschool-toontown/toontown/hood/OZHoodDataAI.py
2019-12-30 01:07:56 -05:00

235 lines
10 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from . import HoodDataAI, ZoneUtil
from toontown.toonbase import ToontownGlobals
from toontown.safezone import OZTreasurePlannerAI
from toontown.racing import DistributedStartingBlockAI
from pandac.PandaModules import *
from toontown.racing.RaceGlobals import *
from toontown.classicchars import DistributedGoofySpeedwayAI
from toontown.safezone import DistributedPicnicBasketAI
from toontown.classicchars import DistributedChipAI
from toontown.classicchars import DistributedDaleAI
from toontown.distributed import DistributedTimerAI
import string
from toontown.safezone import DistributedPicnicTableAI
from toontown.safezone import DistributedChineseCheckersAI
from toontown.safezone import DistributedCheckersAI
if __debug__:
import pdb
class OZHoodDataAI(HoodDataAI.HoodDataAI):
notify = DirectNotifyGlobal.directNotify.newCategory('OZHoodDataAI')
def __init__(self, air, zoneId=None):
hoodId = ToontownGlobals.OutdoorZone
if zoneId == None:
zoneId = hoodId
HoodDataAI.HoodDataAI.__init__(self, air, zoneId, hoodId)
self.classicChars = []
return
def startup(self):
HoodDataAI.HoodDataAI.startup(self)
if simbase.air.config.GetBool('create-chip-and-dale', 1):
chip = DistributedChipAI.DistributedChipAI(self.air)
chip.generateWithRequired(self.zoneId)
chip.start()
self.addDistObj(chip)
self.classicChars.append(chip)
dale = DistributedDaleAI.DistributedDaleAI(self.air, chip.doId)
dale.generateWithRequired(self.zoneId)
dale.start()
self.addDistObj(dale)
self.classicChars.append(dale)
chip.setDaleId(dale.doId)
self.treasurePlanner = OZTreasurePlannerAI.OZTreasurePlannerAI(self.zoneId)
self.treasurePlanner.start()
self.timer = DistributedTimerAI.DistributedTimerAI(self.air)
self.timer.generateWithRequired(self.zoneId)
self.createPicnicTables()
if simbase.config.GetBool('want-game-tables', 0):
self.createGameTables()
def cleanup(self):
self.timer.delete()
taskMgr.removeTasksMatching(str(self) + '_leaderBoardSwitch')
for board in self.leaderBoards:
board.delete()
del self.leaderBoards
def createLeaderBoards(self):
self.leaderBoards = []
dnaStore = DNAStorage()
dnaData = simbase.air.loadDNAFileAI(dnaStore, simbase.air.lookupDNAFileName('goofy_speedway_sz.dna'))
if isinstance(dnaData, DNAData):
self.leaderBoards = self.air.findLeaderBoards(dnaData, self.zoneId)
for distObj in self.leaderBoards:
if distObj:
if distObj.getName().count('city'):
type = 'city'
else:
if distObj.getName().count('stadium'):
type = 'stadium'
else:
if distObj.getName().count('country'):
type = 'country'
for subscription in LBSubscription[type]:
distObj.subscribeTo(subscription)
self.addDistObj(distObj)
def __cycleLeaderBoards(self, task=None):
messenger.send('GS_LeaderBoardSwap')
taskMgr.doMethodLater(self.cycleDuration, self.__cycleLeaderBoards, str(self) + '_leaderBoardSwitch')
def createStartingBlocks(self):
self.racingPads = []
self.viewingPads = []
self.viewingBlocks = []
self.startingBlocks = []
self.foundRacingPadGroups = []
self.foundViewingPadGroups = []
self.golfKartPads = []
self.golfKartPadGroups = []
for zone in self.air.zoneTable[self.canonicalHoodId]:
zoneId = ZoneUtil.getTrueZoneId(zone[0], self.zoneId)
dnaData = self.air.dnaDataMap.get(zone[0], None)
if isinstance(dnaData, DNAData):
area = ZoneUtil.getCanonicalZoneId(zoneId)
foundRacingPads, foundRacingPadGroups = self.air.findRacingPads(dnaData, zoneId, area, overrideDNAZone=True)
foundViewingPads, foundViewingPadGroups = self.air.findRacingPads(dnaData, zoneId, area, type='viewing_pad', overrideDNAZone=True)
self.racingPads += foundRacingPads
self.foundRacingPadGroups += foundRacingPadGroups
self.viewingPads += foundViewingPads
self.foundViewingPadGroups += foundViewingPadGroups
self.startingBlocks = []
for dnaGroup, distRacePad in zip(self.foundRacingPadGroups, self.racingPads):
startingBlocks = self.air.findStartingBlocks(dnaGroup, distRacePad)
self.startingBlocks += startingBlocks
for startingBlock in startingBlocks:
distRacePad.addStartingBlock(startingBlock)
for distObj in self.startingBlocks:
self.addDistObj(distObj)
for dnaGroup, distViewPad in zip(self.foundViewingPadGroups, self.viewingPads):
startingBlocks = self.air.findStartingBlocks(dnaGroup, distViewPad)
for viewingBlock in self.viewingBlocks:
distViewPad.addStartingBlock(viewingBlocks)
for distObj in self.viewingBlocks:
self.addDistObj(distObj)
for viewPad in self.viewingPads:
self.addDistObj(viewPad)
for racePad in self.racingPads:
racePad.request('WaitEmpty')
self.addDistObj(racePad)
return
def findAndCreateGameTables(self, dnaGroup, zoneId, area, overrideDNAZone = 0, type = 'game_table'):
picnicTables = []
picnicTableGroups = []
if isinstance(dnaGroup, DNAGroup) and string.find(dnaGroup.getName(), type) >= 0:
if type == 'game_table':
nameInfo = dnaGroup.getName().split('_')
pos = Point3(0, 0, 0)
hpr = Point3(0, 0, 0)
for i in range(dnaGroup.getNumChildren()):
childDnaGroup = dnaGroup.at(i)
if string.find(childDnaGroup.getName(), 'game_table') >= 0:
pos = childDnaGroup.getPos()
hpr = childDnaGroup.getHpr()
break
picnicTable = DistributedPicnicTableAI.DistributedPicnicTableAI(self.air, zoneId, nameInfo[2], pos[0], pos[1], pos[2], hpr[0], hpr[1], hpr[2])
picnicTables.append(picnicTable)
else:
if isinstance(dnaGroup, DNAVisGroup) and not overrideDNAZone:
zoneId = ZoneUtil.getTrueZoneId(int(dnaGroup.getName().split(':')[0]), zoneId)
for i in range(dnaGroup.getNumChildren()):
childPicnicTables = self.findAndCreateGameTables(dnaGroup.at(i), zoneId, area, overrideDNAZone, type)
picnicTables += childPicnicTables
return picnicTables
def findAndCreatePicnicTables(self, dnaGroup, zoneId, area, overrideDNAZone = 0, type = 'picnic_table'):
picnicTables = []
picnicTableGroups = []
if isinstance(dnaGroup, DNAGroup) and string.find(dnaGroup.getName(), type) >= 0:
if type == 'picnic_table':
nameInfo = dnaGroup.getName().split('_')
pos = Point3(0, 0, 0)
hpr = Point3(0, 0, 0)
for i in range(dnaGroup.getNumChildren()):
childDnaGroup = dnaGroup.at(i)
if string.find(childDnaGroup.getName(), 'picnic_table') >= 0:
pos = childDnaGroup.getPos()
hpr = childDnaGroup.getHpr()
break
picnicTable = DistributedPicnicBasketAI.DistributedPicnicBasketAI(self.air, nameInfo[2], pos[0], pos[1], pos[2], hpr[0], hpr[1], hpr[2])
picnicTable.generateWithRequired(zoneId)
picnicTables.append(picnicTable)
else:
if isinstance(dnaGroup, DNAVisGroup) and not overrideDNAZone:
zoneId = ZoneUtil.getTrueZoneId(int(dnaGroup.getName().split(':')[0]), zoneId)
for i in range(dnaGroup.getNumChildren()):
childPicnicTables = self.findAndCreatePicnicTables(dnaGroup.at(i), zoneId, area, overrideDNAZone, type)
picnicTables += childPicnicTables
return picnicTables
def createGameTables(self):
self.gameTables = []
for zone in self.air.zoneTable[self.canonicalHoodId]:
zoneId = ZoneUtil.getTrueZoneId(zone[0], self.zoneId)
dnaData = self.air.dnaDataMap.get(zone[0], None)
if isinstance(dnaData, DNAData):
area = ZoneUtil.getCanonicalZoneId(zoneId)
foundTables = self.findAndCreateGameTables(dnaData, zoneId, area, overrideDNAZone=True)
self.gameTables += foundTables
for picnicTable in self.gameTables:
self.addDistObj(picnicTable)
return
def createPicnicTables(self):
self.picnicTables = []
for zone in self.air.zoneTable[self.canonicalHoodId]:
zoneId = ZoneUtil.getTrueZoneId(zone[0], self.zoneId)
dnaData = self.air.dnaDataMap.get(zone[0], None)
if isinstance(dnaData, DNAData):
area = ZoneUtil.getCanonicalZoneId(zoneId)
foundTables = self.findAndCreatePicnicTables(dnaData, zoneId, area, overrideDNAZone=True)
self.picnicTables += foundTables
for picnicTable in self.picnicTables:
picnicTable.start()
self.addDistObj(picnicTable)
return
def findStartingBlocks(self, dnaRacingPadGroup, distRacePad):
startingBlocks = []
for i in range(dnaRacingPadGroup.getNumChildren()):
dnaGroup = dnaRacingPadGroup.at(i)
if string.find(dnaGroup.getName(), 'starting_block') >= 0:
padLocation = dnaGroup.getName().split('_')[2]
pos = dnaGroup.getPos()
hpr = dnaGroup.getHpr()
if isinstance(distRacePad, DistributedRacePadAI):
sb = DistributedStartingBlockAI(self, distRacePad, pos[0], pos[1], pos[2], hpr[0], hpr[1], hpr[2], int(padLocation))
else:
sb = DistributedViewingBlockAI(self, distRacePad, pos[0], pos[1], pos[2], hpr[0], hpr[1], hpr[2], int(padLocation))
sb.generateWithRequired(distRacePad.zoneId)
startingBlocks.append(sb)
else:
self.notify.debug('Found dnaGroup that is not a starting_block under a race pad group')
return startingBlocks