toontown-just-works/toontown/estate/DistributedHouseInterior.py
2024-07-07 18:08:39 -05:00

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()