coghq: Handle viszones via quiet zone transition.
This replicates the behavior from OTP better.
This commit is contained in:
parent
81f64fe57b
commit
656a77f857
3 changed files with 71 additions and 38 deletions
|
@ -76,8 +76,6 @@ class CogHQExterior(BattlePlace.BattlePlace):
|
||||||
self.tunnelOriginList = base.cr.hoodMgr.addLinkTunnelHooks(self, self.nodeList, self.zoneId)
|
self.tunnelOriginList = base.cr.hoodMgr.addLinkTunnelHooks(self, self.nodeList, self.zoneId)
|
||||||
how = requestStatus['how']
|
how = requestStatus['how']
|
||||||
self.fsm.request(how, [requestStatus])
|
self.fsm.request(how, [requestStatus])
|
||||||
if __astron__ and self.zoneId != ToontownGlobals.BossbotHQ:
|
|
||||||
self.handleInterests()
|
|
||||||
|
|
||||||
def exit(self):
|
def exit(self):
|
||||||
self.fsm.requestFinalState()
|
self.fsm.requestFinalState()
|
||||||
|
@ -138,31 +136,3 @@ class CogHQExterior(BattlePlace.BattlePlace):
|
||||||
def exitSquished(self):
|
def exitSquished(self):
|
||||||
taskMgr.remove(base.localAvatar.uniqueName('finishSquishTask'))
|
taskMgr.remove(base.localAvatar.uniqueName('finishSquishTask'))
|
||||||
base.localAvatar.laffMeter.stop()
|
base.localAvatar.laffMeter.stop()
|
||||||
|
|
||||||
if __astron__:
|
|
||||||
def handleInterests(self):
|
|
||||||
# First, we need to load the DNA file for this Cog HQ.
|
|
||||||
dnaStore = DNAStorage()
|
|
||||||
dnaFileName = self.genDNAFileName(self.zoneId)
|
|
||||||
loadDNAFileAI(dnaStore, dnaFileName)
|
|
||||||
|
|
||||||
# Next, we need to collect all of the visgroup zone IDs.
|
|
||||||
self.zoneVisDict = {}
|
|
||||||
for i in range(dnaStore.getNumDNAVisGroupsAI()):
|
|
||||||
visGroup = dnaStore.getDNAVisGroupAI(i)
|
|
||||||
groupFullName = visGroup.getName()
|
|
||||||
visZoneId = int(base.cr.hoodMgr.extractGroupName(groupFullName))
|
|
||||||
visZoneId = ZoneUtil.getTrueZoneId(visZoneId, self.zoneId)
|
|
||||||
visibles = []
|
|
||||||
for i in range(visGroup.getNumVisibles()):
|
|
||||||
visibles.append(int(visGroup.getVisibleName(i)))
|
|
||||||
|
|
||||||
visibles.append(ZoneUtil.getBranchZone(visZoneId))
|
|
||||||
self.zoneVisDict[visZoneId] = visibles
|
|
||||||
|
|
||||||
# Finally, we want interest in all visgroups due to this being a Cog HQ.
|
|
||||||
visList = list(self.zoneVisDict.values())[0]
|
|
||||||
if self.zoneId not in visList:
|
|
||||||
visList.append(self.zoneId)
|
|
||||||
|
|
||||||
base.cr.sendSetZoneMsg(self.zoneId, visList)
|
|
||||||
|
|
|
@ -149,3 +149,16 @@ class CogHQLoader(StateData.StateData):
|
||||||
self.exitPlace()
|
self.exitPlace()
|
||||||
self.placeClass = None
|
self.placeClass = None
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if __astron__:
|
||||||
|
@staticmethod
|
||||||
|
def genDNAFileName(zoneId):
|
||||||
|
from toontown.toonbase import ToontownGlobals
|
||||||
|
zoneId = ZoneUtil.getCanonicalZoneId(zoneId)
|
||||||
|
hoodId = ZoneUtil.getCanonicalHoodId(zoneId)
|
||||||
|
hood = ToontownGlobals.dnaMap[hoodId]
|
||||||
|
phase = ToontownGlobals.streetPhaseMap[hoodId]
|
||||||
|
if hoodId == zoneId:
|
||||||
|
zoneId = 'sz'
|
||||||
|
|
||||||
|
return 'phase_%s/dna/%s_%s.dna' % (phase, hood, zoneId)
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
from panda3d.core import *
|
from panda3d.core import *
|
||||||
|
from panda3d.toontown import *
|
||||||
from direct.showbase.PythonUtil import Functor, PriorityCallbacks
|
from direct.showbase.PythonUtil import Functor, PriorityCallbacks
|
||||||
from direct.task import Task
|
from direct.task import Task
|
||||||
from toontown.distributed.ToontownMsgTypes import *
|
from toontown.distributed.ToontownMsgTypes import *
|
||||||
|
from toontown.toonbase import ToontownGlobals
|
||||||
from otp.otpbase import OTPGlobals
|
from otp.otpbase import OTPGlobals
|
||||||
from direct.directnotify import DirectNotifyGlobal
|
from direct.directnotify import DirectNotifyGlobal
|
||||||
from direct.fsm import StateData
|
from direct.fsm import StateData
|
||||||
|
@ -284,18 +286,66 @@ class QuietZoneState(StateData.StateData):
|
||||||
where = self._requestStatus['where']
|
where = self._requestStatus['where']
|
||||||
base.cr.dumpAllSubShardObjects()
|
base.cr.dumpAllSubShardObjects()
|
||||||
base.cr.resetDeletedSubShardDoIds()
|
base.cr.resetDeletedSubShardDoIds()
|
||||||
if __astron__ and where == 'street':
|
if __astron__:
|
||||||
visZones = [ZoneUtil.getBranchZone(zoneId)]
|
# Add viszones to streets and Cog HQs:
|
||||||
# Assuming that the DNA have been loaded by bulk load before this.
|
visZones = []
|
||||||
loader = base.cr.playGame.hood.loader
|
if where == 'street':
|
||||||
visZones += [loader.node2zone[x] for x in loader.nodeDict[zoneId]]
|
visZones = self.getStreetViszones(zoneId)
|
||||||
if zoneId not in visZones:
|
if zoneId not in visZones:
|
||||||
visZones.append(zoneId)
|
visZones.append(zoneId)
|
||||||
base.cr.sendSetZoneMsg(zoneId, visZones)
|
base.cr.sendSetZoneMsg(zoneId, visZones)
|
||||||
|
elif where in ('cogHQExterior', 'factoryExterior'):
|
||||||
|
visZones = self.getCogHQViszones(zoneId)
|
||||||
|
if zoneId not in visZones:
|
||||||
|
visZones.append(zoneId)
|
||||||
|
if len(visZones) < 1 or (len(visZones) == 1 and visZones[0] == zoneId):
|
||||||
|
base.cr.sendSetZoneMsg(zoneId)
|
||||||
|
else:
|
||||||
|
base.cr.sendSetZoneMsg(zoneId, visZones)
|
||||||
else:
|
else:
|
||||||
base.cr.sendSetZoneMsg(zoneId)
|
base.cr.sendSetZoneMsg(zoneId)
|
||||||
self.waitForDatabase('WaitForSetZoneResponse')
|
self.waitForDatabase('WaitForSetZoneResponse')
|
||||||
self.fsm.request('waitForSetZoneComplete')
|
self.fsm.request('waitForSetZoneComplete')
|
||||||
|
|
||||||
|
if __astron__:
|
||||||
|
def getStreetViszones(self, zoneId):
|
||||||
|
visZones = [ZoneUtil.getBranchZone(zoneId)]
|
||||||
|
# Assuming that the DNA have been loaded by bulk load before this (see Street.py).
|
||||||
|
loader = base.cr.playGame.hood.loader
|
||||||
|
visZones += [loader.node2zone[x] for x in loader.nodeDict[zoneId]]
|
||||||
|
self.notify.debug(f'getStreetViszones(zoneId={zoneId}): returning visZones: {visZones}')
|
||||||
|
return visZones
|
||||||
|
|
||||||
|
def getCogHQViszones(self, zoneId):
|
||||||
|
loader = base.cr.playGame.hood.loader
|
||||||
|
|
||||||
|
if zoneId in (ToontownGlobals.LawbotOfficeExt, ToontownGlobals.BossbotHQ):
|
||||||
|
# There are no viszones for these zones, just return an empty list.
|
||||||
|
return []
|
||||||
|
|
||||||
|
# First, we need to load the DNA file for this Cog HQ.
|
||||||
|
dnaStore = DNAStorage()
|
||||||
|
dnaFileName = loader.genDNAFileName(zoneId)
|
||||||
|
loadDNAFileAI(dnaStore, dnaFileName)
|
||||||
|
|
||||||
|
# Next, we need to collect all of the visgroup zone IDs.
|
||||||
|
loader.zoneVisDict = {}
|
||||||
|
for i in range(dnaStore.getNumDNAVisGroupsAI()):
|
||||||
|
visGroup = dnaStore.getDNAVisGroupAI(i)
|
||||||
|
groupFullName = visGroup.getName()
|
||||||
|
visZoneId = int(base.cr.hoodMgr.extractGroupName(groupFullName))
|
||||||
|
visZoneId = ZoneUtil.getTrueZoneId(visZoneId, zoneId)
|
||||||
|
visibles = []
|
||||||
|
for i in range(visGroup.getNumVisibles()):
|
||||||
|
visibles.append(int(visGroup.getVisibleName(i)))
|
||||||
|
|
||||||
|
# Now we'll store it in the loader since we need them when we enter a Cog battle.
|
||||||
|
loader.zoneVisDict[visZoneId] = visibles
|
||||||
|
|
||||||
|
# Finally, we want interest in all visgroups due to this being a Cog HQ.
|
||||||
|
visZones = list(loader.zoneVisDict.values())[0]
|
||||||
|
self.notify.debug(f'getCogHQViszones(zoneId={zoneId}): returning visZones: {visZones}')
|
||||||
|
return visZones
|
||||||
|
|
||||||
def exitWaitForSetZoneResponse(self):
|
def exitWaitForSetZoneResponse(self):
|
||||||
self.notify.debug('exitWaitForSetZoneResponse()')
|
self.notify.debug('exitWaitForSetZoneResponse()')
|
||||||
|
|
Loading…
Reference in a new issue