187 lines
7.6 KiB
Python
187 lines
7.6 KiB
Python
from toontown.toonbase.ToontownGlobals import *
|
|
from toontown.toonbase.ToonBaseGlobal import *
|
|
from panda3d.core import *
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.distributed.ClockDelta import *
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed import DistributedObject
|
|
import HouseGlobals
|
|
from toontown.catalog import CatalogItemList
|
|
from toontown.catalog import CatalogItem
|
|
from toontown.catalog import CatalogSurfaceItem
|
|
from toontown.catalog import CatalogWallpaperItem
|
|
from toontown.catalog import CatalogFlooringItem
|
|
from toontown.catalog import CatalogMouldingItem
|
|
from toontown.catalog import CatalogWainscotingItem
|
|
from toontown.dna.DNAParser import *
|
|
WindowPlugNames = ['**/windowcut_%s*' % x for x in ('b', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i')]
|
|
RoomNames = ['**/group%s' % x for x in ( 4, 3, 2, 1)]
|
|
WallNames = ('ceiling*', 'wall_side_middle*', 'wall_front_middle*', 'windowcut_*')
|
|
MouldingNames = ('wall_side_top*', 'wall_front_top*')
|
|
FloorNames = ('floor*',)
|
|
WainscotingNames = ('wall_side_bottom*', 'wall_front_bottom*')
|
|
BorderNames = ('wall_side_middle*_border', 'wall_front_middle*_border', 'windowcut_*_border')
|
|
WallpaperPieceNames = (WallNames,
|
|
MouldingNames,
|
|
FloorNames,
|
|
WainscotingNames,
|
|
BorderNames)
|
|
|
|
class DistributedHouseInterior(DistributedObject.DistributedObject):
|
|
|
|
def __init__(self, cr):
|
|
DistributedObject.DistributedObject.__init__(self, cr)
|
|
self.houseId = 0
|
|
self.houseIndex = 0
|
|
self.interior = None
|
|
self.exteriorWindowsHidden = 0
|
|
|
|
def generate(self):
|
|
DistributedObject.DistributedObject.generate(self)
|
|
|
|
def announceGenerate(self):
|
|
DistributedObject.DistributedObject.announceGenerate(self)
|
|
self.setup()
|
|
|
|
def disable(self):
|
|
self.interior.removeNode()
|
|
del self.interior
|
|
DistributedObject.DistributedObject.disable(self)
|
|
|
|
def delete(self):
|
|
self.ignore(self.uniqueName('enterclosetSphere'))
|
|
DistributedObject.DistributedObject.delete(self)
|
|
|
|
def setup(self):
|
|
dnaStore = base.cr.playGame.dnaStore
|
|
self.interior = loader.loadModel('phase_5.5/models/estate/tt_m_ara_int_estateHouseA')
|
|
self.interior.reparentTo(render)
|
|
doorModelName = 'door_double_round_ur'
|
|
door = dnaStore.findNode(doorModelName)
|
|
door_origin = self.interior.find('**/door_origin')
|
|
door_origin.setHpr(180, 0, 0)
|
|
door_origin.setScale(0.8, 0.8, 0.8)
|
|
door_origin.setPos(door_origin, 0, -0.025, 0)
|
|
doorNP = door.copyTo(door_origin)
|
|
houseColor = HouseGlobals.atticWood
|
|
color = Vec4(houseColor[0], houseColor[1], houseColor[2], 1)
|
|
setupDoor(doorNP, door_origin, door_origin, dnaStore, str(self.houseId), color)
|
|
doorFrame = doorNP.find('door_*_flat')
|
|
doorFrame.setColor(color)
|
|
self.interior.flattenMedium()
|
|
self.windowSlots = []
|
|
for name in WindowPlugNames:
|
|
plugNodes = self.interior.findAllMatches(name)
|
|
if plugNodes.isEmpty():
|
|
self.windowSlots.append((None, None))
|
|
else:
|
|
viewBase = plugNodes[0].getParent().attachNewNode('view')
|
|
viewBase.setTransform(plugNodes[0].getTransform())
|
|
plug = plugNodes[0].getParent().attachNewNode('plug')
|
|
plugNodes.reparentTo(plug)
|
|
plug.flattenLight()
|
|
self.windowSlots.append((plug, viewBase))
|
|
|
|
self.windowSlots[2][1].setPosHpr(-21.28, -37.15, 16.25, -90.4, 0, 0)
|
|
self.windowSlots[6][1].setPosHpr(-12.0, 26.0, 5.51, 0, 0, 0)
|
|
self.windowSlots[4][1].setPosHpr(16.0, -12.0, 5.51, -90, 0, 0)
|
|
self.__colorWalls()
|
|
self.__setupWindows()
|
|
messenger.send('houseInteriorLoaded-%d' % self.zoneId)
|
|
return None
|
|
|
|
def __colorWalls(self):
|
|
if not self.wallpaper:
|
|
self.notify.info('No wallpaper in interior; clearing.')
|
|
for str in WallNames + WainscotingNames:
|
|
nodes = self.interior.findAllMatches('**/%s' % str)
|
|
for node in nodes:
|
|
node.setTextureOff(1)
|
|
|
|
return
|
|
numSurfaceTypes = CatalogSurfaceItem.NUM_ST_TYPES
|
|
numRooms = min(len(self.wallpaper) / numSurfaceTypes, len(RoomNames))
|
|
for room in xrange(numRooms):
|
|
roomName = RoomNames[room]
|
|
roomNode = self.interior.find(roomName)
|
|
if not roomNode.isEmpty():
|
|
for surface in xrange(numSurfaceTypes):
|
|
slot = room * numSurfaceTypes + surface
|
|
wallpaper = self.wallpaper[slot]
|
|
color = wallpaper.getColor()
|
|
texture = wallpaper.loadTexture()
|
|
for str in WallpaperPieceNames[surface]:
|
|
nodes = roomNode.findAllMatches('**/%s' % str)
|
|
for node in nodes:
|
|
if str == 'ceiling*':
|
|
r, g, b, a = color
|
|
scale = 0.66
|
|
r *= scale
|
|
g *= scale
|
|
b *= scale
|
|
node.setColorScale(r, g, b, a)
|
|
else:
|
|
node.setColorScale(*color)
|
|
node.setTexture(texture, 1)
|
|
|
|
if wallpaper.getSurfaceType() == CatalogSurfaceItem.STWallpaper:
|
|
color2 = wallpaper.getBorderColor()
|
|
texture2 = wallpaper.loadBorderTexture()
|
|
nodes = roomNode.findAllMatches('**/%s_border' % str)
|
|
for node in nodes:
|
|
node.setColorScale(*color2)
|
|
node.setTexture(texture2, 1)
|
|
|
|
nodes = self.interior.findAllMatches('**/arch*')
|
|
for node in nodes:
|
|
node.setColorScale(*(HouseGlobals.archWood + (1,)))
|
|
|
|
def __setupWindows(self):
|
|
for plug, viewBase in self.windowSlots:
|
|
if plug:
|
|
plug.show()
|
|
if viewBase:
|
|
viewBase.getChildren().detach()
|
|
|
|
if not self.windows:
|
|
self.notify.info('No windows in interior; returning.')
|
|
return
|
|
for item in self.windows:
|
|
plug, viewBase = self.windowSlots[item.placement]
|
|
if plug:
|
|
plug.hide()
|
|
if viewBase:
|
|
model = item.loadModel()
|
|
model.reparentTo(viewBase)
|
|
if self.exteriorWindowsHidden:
|
|
model.findAllMatches('**/outside').stash()
|
|
|
|
def hideExteriorWindows(self):
|
|
self.exteriorWindowsHidden = 1
|
|
for item in self.windows:
|
|
plug, viewBase = self.windowSlots[item.placement]
|
|
if viewBase:
|
|
viewBase.findAllMatches('**/outside').stash()
|
|
|
|
def showExteriorWindows(self):
|
|
self.exteriorWindowsHidden = 0
|
|
for item in self.windows:
|
|
plug, viewBase = self.windowSlots[item.placement]
|
|
if viewBase:
|
|
viewBase.findAllMatches('**/outside;+s').unstash()
|
|
|
|
def setHouseId(self, index):
|
|
self.houseId = index
|
|
|
|
def setHouseIndex(self, index):
|
|
self.houseIndex = index
|
|
|
|
def setWallpaper(self, items):
|
|
self.wallpaper = CatalogItemList.CatalogItemList(items, store=CatalogItem.Customization)
|
|
if self.interior:
|
|
self.__colorWalls()
|
|
|
|
def setWindows(self, items):
|
|
self.windows = CatalogItemList.CatalogItemList(items, store=CatalogItem.Customization | CatalogItem.WindowPlacement)
|
|
if self.interior:
|
|
self.__setupWindows()
|