oldschool-toontown/toontown/distributed/HoodMgr.py
2019-12-30 19:17:24 -05:00

931 lines
35 KiB
Python

from pandac.PandaModules import *
from direct.showbase import DirectObject
from direct.directnotify import DirectNotifyGlobal
from toontown.launcher import DownloadForceAcknowledge
import random
from toontown.toonbase import ToontownGlobals
from toontown.hood import ZoneUtil
class HoodMgr(DirectObject.DirectObject):
notify = DirectNotifyGlobal.directNotify.newCategory('HoodMgr')
ToontownCentralInitialDropPoints = ([-90.7,
-60.0,
0.025,
102.575,
0,
0],
[-91.4,
-40.5,
-3.948,
125.763,
0,
0],
[-107.8,
-17.8,
-1.937,
149.456,
0,
0],
[-108.7,
12.8,
-1.767,
158.756,
0,
0],
[-42.1,
-22.8,
-1.328,
-248.1,
0,
0],
[-35.2,
-60.2,
0.025,
-265.639,
0,
0])
ToontownCentralHQDropPoints = ([-43.5,
42.6,
-0.55,
-100.454,
0,
0],
[-53.0,
12.5,
-2.948,
281.502,
0,
0],
[-40.3,
-18.5,
-0.913,
-56.674,
0,
0],
[-1.9,
-37.0,
0.025,
-23.43,
0,
0],
[1.9,
-5.9,
4.0,
-37.941,
0,
0])
ToontownCentralTunnelDropPoints = ([-28.3,
40.1,
0.25,
17.25,
0,
0],
[-63.75,
58.96,
-0.5,
-23.75,
0,
0],
[-106.93,
17.66,
-2.2,
99.0,
0,
0],
[-116.0,
-21.5,
-0.038,
50.0,
0,
0],
[74.88,
-115.0,
2.53,
-224.41,
0,
0],
[30.488,
-101.5,
2.53,
-179.23,
0,
0])
dropPoints = {ToontownGlobals.DonaldsDock: ([-28.0,
-2.5,
5.8,
120.0,
0.0,
0.0],
[-22,
13,
5.8,
155.6,
0.0,
0.0],
[67,
47,
5.7,
134.7,
0.0,
0.0],
[62,
19,
5.7,
97.0,
0.0,
0.0],
[66,
-27,
5.7,
80.5,
0.0,
0.0],
[-114,
-7,
5.7,
-97.0,
-0.0,
0.0],
[-108,
36,
5.7,
-153.8,
-0.0,
0.0],
[-116,
-46,
5.7,
-70.1,
-0.0,
0.0],
[-63,
-79,
5.7,
-41.2,
-0.0,
0.0],
[-2,
-79,
5.7,
57.4,
-0.0,
0.0],
[-38,
-78,
5.7,
9.1,
-0.0,
0.0]),
ToontownGlobals.ToontownCentral: ([-60,
-8,
1.3,
-90,
0,
0],
[-66,
-9,
1.3,
-274,
0,
0],
[17,
-28,
4.1,
-44,
0,
0],
[87.7,
-22,
4,
66,
0,
0],
[-9.6,
61.1,
0,
132,
0,
0],
[-109.0,
-2.5,
-1.656,
-90,
0,
0],
[-35.4,
-81.3,
0.5,
-4,
0,
0],
[-103,
72,
0,
-141,
0,
0],
[93.5,
-148.4,
2.5,
43,
0,
0],
[25,
123.4,
2.55,
272,
0,
0],
[48,
39,
4,
201,
0,
0],
[-80,
-61,
0.1,
-265,
0,
0],
[-46.875,
43.68,
-1.05,
124,
0,
0],
[34,
-105,
2.55,
45,
0,
0],
[16,
-75,
2.55,
56,
0,
0],
[-27,
-56,
0.1,
45,
0,
0],
[100,
27,
4.1,
150,
0,
0],
[-70,
4.6,
-1.9,
90,
0,
0],
[-130.7,
50,
0.55,
-111,
0,
0]),
ToontownGlobals.TheBrrrgh: ([35,
-32,
6.2,
138,
0.0,
0.0],
[26,
-105,
6.2,
-339,
0.0,
0.0],
[-29,
-139,
6.2,
-385,
0.0,
0.0],
[-79,
-123,
6.2,
-369,
0.0,
0.0],
[-114,
-86,
3,
-54,
0.0,
0.0],
[-136,
9,
6.2,
-125,
0.0,
0.0],
[-75,
92,
6.2,
-187,
0.0,
0.0],
[-7,
75,
6.2,
-187,
0.0,
0.0],
[-106,
-42,
8.6,
-111,
0.0,
0.0],
[-116,
-44,
8.3,
-20,
0.0,
0.0]),
ToontownGlobals.MinniesMelodyland: ([86,
44,
-13.5,
121.1,
0.0,
0.0],
[88,
-8,
-13.5,
91,
0,
0],
[92,
-76,
-13.5,
62.5,
0.0,
0.0],
[53,
-112,
6.5,
65.8,
0.0,
0.0],
[-69,
-71,
6.5,
-67.2,
0.0,
0.0],
[-75,
21,
6.5,
-100.9,
0.0,
0.0],
[-21,
72,
6.5,
-129.5,
0.0,
0.0],
[56,
72,
6.5,
138.2,
0.0,
0.0],
[-41,
47,
6.5,
-98.9,
0.0,
0.0]),
ToontownGlobals.DaisyGardens: ([0,
0,
0,
-10.5,
0,
0],
[76,
35,
1.1,
-30.2,
0.0,
0.0],
[97,
106,
0.0,
51.4,
0.0,
0.0],
[51,
180,
10.0,
22.6,
0.0,
0.0],
[-14,
203,
10.0,
85.6,
0.0,
0.0],
[-58,
158,
10.0,
-146.9,
0.0,
0.0],
[-86,
128,
0.0,
-178.9,
0.0,
0.0],
[-64,
65,
0.0,
17.7,
0.0,
0.0],
[-13,
39,
0.0,
-15.7,
0.0,
0.0],
[-12,
193,
0.0,
-112.4,
0.0,
0.0],
[87,
128,
0.0,
45.4,
0.0,
0.0]),
ToontownGlobals.DonaldsDreamland: ([77,
91,
0.0,
124.4,
0.0,
0.0],
[29,
92,
0.0,
-154.5,
0.0,
0.0],
[-28,
49,
-16.4,
-142.0,
0.0,
0.0],
[21,
40,
-16.0,
-65.1,
0.0,
0.0],
[48,
27,
-15.4,
-161.0,
0.0,
0.0],
[-2,
-22,
-15.2,
-132.1,
0.0,
0.0],
[-92,
-88,
0.0,
-116.3,
0.0,
0.0],
[-56,
-93,
0.0,
-21.5,
0.0,
0.0],
[20,
-88,
0.0,
-123.4,
0.0,
0.0],
[76,
-90,
0.0,
11.0,
0.0,
0.0]),
ToontownGlobals.GoofySpeedway: ([-0.7,
62,
0.08,
182,
0,
0],
[-1,
-30,
0.06,
183,
0,
0],
[-13,
-120,
0,
307,
0,
0],
[16.4,
-120,
0,
65,
0,
0],
[-0.5,
-90,
0,
182,
0,
0],
[-30,
-25,
-0.373,
326,
0,
0],
[29,
-17,
-0.373,
32,
0,
0]),
ToontownGlobals.GolfZone: ([-49.6,
102,
0,
162,
0,
0],
[-22.8,
36.6,
0,
157.5,
0,
0],
[40,
51,
0,
185,
0,
0],
[48.3,
122.2,
0,
192,
0,
0],
[106.3,
69.2,
0,
133,
0,
0],
[-81.5,
47.2,
0,
183,
0,
0],
[-80.5,
-84.2,
0,
284,
0,
0],
[73,
-111,
0,
354,
0,
0]),
ToontownGlobals.OutdoorZone: ([-165.8,
108,
0.025,
252,
0,
0],
[21,
130,
0.16,
170,
0,
0],
[93,
78.5,
0.23,
112,
0,
0],
[79,
-1.6,
0.75,
163,
0,
0],
[10,
33,
5.32,
130.379,
0,
0],
[-200,
-42,
0.025,
317.543,
0,
0],
[-21,
-65,
0.335,
-18,
0,
0],
[23,
68.5,
4.51,
-22.808,
0,
0]),
ToontownGlobals.Tutorial: ([130.9,
-8.6,
-1.3,
105.5,
0,
0],),
ToontownGlobals.SellbotHQ: ([64,
-128,
0.26,
36,
0,
0],
[9,
-140,
0.26,
0,
0,
0],
[-82,
-112,
0.26,
-127,
0,
0],
[-73,
-213,
0.26,
-23,
0,
0],
[-20,
-243,
0.26,
-9,
0,
0],
[79,
-208,
0.26,
43,
0,
0]),
ToontownGlobals.CashbotHQ: ([102,
-437,
-23.439,
360,
0,
0],
[124,
-437,
-23.439,
360,
0,
0],
[110,
-446,
-23.439,
360,
0,
0],
[132,
-446,
-23.439,
360,
0,
0]),
ToontownGlobals.LawbotHQ: ([77.5,
129.13,
-68.4,
-166.6,
0,
0],
[-57.7,
80.75,
-68.4,
-139.2,
0,
0],
[203.3,
46.36,
-68.4,
-213.37,
0,
0],
[88.2,
-336.52,
-68.4,
-720.4,
0,
0],
[232.77,
-305.33,
-68.4,
-651,
0,
0],
[-20.16,
-345.76,
-68.4,
-777.98,
0,
0])}
hoodName2Id = {'dd': ToontownGlobals.DonaldsDock,
'tt': ToontownGlobals.ToontownCentral,
'br': ToontownGlobals.TheBrrrgh,
'mm': ToontownGlobals.MinniesMelodyland,
'dg': ToontownGlobals.DaisyGardens,
'oz': ToontownGlobals.OutdoorZone,
'ff': ToontownGlobals.FunnyFarm,
'gs': ToontownGlobals.GoofySpeedway,
'dl': ToontownGlobals.DonaldsDreamland,
'bosshq': ToontownGlobals.BossbotHQ,
'sellhq': ToontownGlobals.SellbotHQ,
'cashhq': ToontownGlobals.CashbotHQ,
'lawhq': ToontownGlobals.LawbotHQ,
'gz': ToontownGlobals.GolfZone}
hoodId2Name = {ToontownGlobals.DonaldsDock: 'dd',
ToontownGlobals.ToontownCentral: 'tt',
ToontownGlobals.Tutorial: 'tt',
ToontownGlobals.TheBrrrgh: 'br',
ToontownGlobals.MinniesMelodyland: 'mm',
ToontownGlobals.DaisyGardens: 'dg',
ToontownGlobals.OutdoorZone: 'oz',
ToontownGlobals.FunnyFarm: 'ff',
ToontownGlobals.GoofySpeedway: 'gs',
ToontownGlobals.DonaldsDreamland: 'dl',
ToontownGlobals.BossbotHQ: 'bosshq',
ToontownGlobals.SellbotHQ: 'sellhq',
ToontownGlobals.CashbotHQ: 'cashhq',
ToontownGlobals.LawbotHQ: 'lawhq',
ToontownGlobals.GolfZone: 'gz'}
DefaultDropPoint = [0,
0,
0,
0,
0,
0]
dbgDropMode = 0
currentDropPoint = 0
def __init__(self, cr):
self.cr = cr
def getDropPoint(self, dropPointList):
if self.dbgDropMode == 0:
return random.choice(dropPointList)
else:
droppnt = self.currentDropPoint % len(dropPointList)
self.currentDropPoint = (self.currentDropPoint + 1) % len(dropPointList)
return dropPointList[droppnt]
def getAvailableZones(self):
if base.launcher == None:
return self.getZonesInPhase(4) + self.getZonesInPhase(6) + self.getZonesInPhase(8) + self.getZonesInPhase(9) + self.getZonesInPhase(10) + self.getZonesInPhase(11) + self.getZonesInPhase(12) + self.getZonesInPhase(13)
else:
zones = []
for phase in set(ToontownGlobals.phaseMap.values()):
if base.launcher.getPhaseComplete(phase):
zones = zones + self.getZonesInPhase(phase)
return zones
return
def getZonesInPhase(self, phase):
p = []
for i in list(ToontownGlobals.phaseMap.items()):
if i[1] == phase:
p.append(i[0])
return p
def getPhaseFromHood(self, hoodId):
hoodId = ZoneUtil.getCanonicalHoodId(hoodId)
return ToontownGlobals.phaseMap[hoodId]
def getPlaygroundCenterFromId(self, hoodId):
dropPointList = self.dropPoints.get(hoodId, None)
if dropPointList:
return self.getDropPoint(dropPointList)
else:
self.notify.warning('getPlaygroundCenterFromId: No such hood name as: ' + str(hoodId))
return self.DefaultDropPoint
return
def getIdFromName(self, hoodName):
id = self.hoodName2Id.get(hoodName)
if id:
return id
else:
self.notify.error('No such hood name as: %s' % hoodName)
return None
return None
def getNameFromId(self, hoodId):
name = self.hoodId2Name.get(hoodId)
if name:
return name
else:
self.notify.error('No such hood id as: %s' % hoodId)
return None
return None
def getFullnameFromId(self, hoodId):
hoodId = ZoneUtil.getCanonicalZoneId(hoodId)
return ToontownGlobals.hoodNameMap[hoodId][-1]
def addLinkTunnelHooks(self, hoodPart, nodeList, currentZoneId):
tunnelOriginList = []
for i in nodeList:
linkTunnelNPC = i.findAllMatches('**/linktunnel*')
for p in range(linkTunnelNPC.getNumPaths()):
linkTunnel = linkTunnelNPC.getPath(p)
name = linkTunnel.getName()
nameParts = name.split('_')
hoodStr = nameParts[1]
zoneStr = nameParts[2]
hoodId = self.getIdFromName(hoodStr)
zoneId = int(zoneStr)
hoodId = ZoneUtil.getTrueZoneId(hoodId, currentZoneId)
zoneId = ZoneUtil.getTrueZoneId(zoneId, currentZoneId)
linkSphere = linkTunnel.find('**/tunnel_trigger')
if linkSphere.isEmpty():
linkSphere = linkTunnel.find('**/tunnel_sphere')
if not linkSphere.isEmpty():
cnode = linkSphere.node()
cnode.setName('tunnel_trigger_' + hoodStr + '_' + zoneStr)
cnode.setCollideMask(ToontownGlobals.WallBitmask | ToontownGlobals.GhostBitmask)
else:
linkSphere = linkTunnel.find('**/tunnel_trigger_' + hoodStr + '_' + zoneStr)
if linkSphere.isEmpty():
self.notify.error('tunnel_trigger not found')
tunnelOrigin = linkTunnel.find('**/tunnel_origin')
if tunnelOrigin.isEmpty():
self.notify.error('tunnel_origin not found')
tunnelOriginPlaceHolder = render.attachNewNode('toph_' + hoodStr + '_' + zoneStr)
tunnelOriginList.append(tunnelOriginPlaceHolder)
tunnelOriginPlaceHolder.setPos(tunnelOrigin.getPos(render))
tunnelOriginPlaceHolder.setHpr(tunnelOrigin.getHpr(render))
hood = base.localAvatar.cr.playGame.hood
if ZoneUtil.tutorialDict:
how = 'teleportIn'
tutorialFlag = 1
else:
how = 'tunnelIn'
tutorialFlag = 0
hoodPart.accept('enter' + linkSphere.getName(), hoodPart.handleEnterTunnel, [{'loader': ZoneUtil.getLoaderName(zoneId),
'where': ZoneUtil.getToonWhereName(zoneId),
'how': how,
'hoodId': hoodId,
'zoneId': zoneId,
'shardId': None,
'tunnelOrigin': tunnelOriginPlaceHolder,
'tutorial': tutorialFlag}])
return tunnelOriginList
def extractGroupName(self, groupFullName):
return groupFullName.split(':', 1)[0]
def makeLinkTunnelName(self, hoodId, currentZone):
return '**/toph_' + self.getNameFromId(hoodId) + '_' + str(currentZone)