historical/toontown-classic.git/toontown/estate/DistributedHouseInteriorAI.py
2024-01-16 11:20:27 -06:00

210 lines
7 KiB
Python

import random
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from panda3d.toontown import *
from toontown.catalog import CatalogItem
from toontown.catalog.CatalogFlooringItem import CatalogFlooringItem
from toontown.catalog.CatalogFurnitureItem import CatalogFurnitureItem
from toontown.catalog.CatalogItemList import CatalogItemList
from toontown.catalog.CatalogMouldingItem import CatalogMouldingItem
from toontown.catalog.CatalogWainscotingItem import CatalogWainscotingItem
from toontown.catalog.CatalogWallpaperItem import CatalogWallpaperItem
from toontown.catalog.CatalogWindowItem import CatalogWindowItem
from toontown.estate import HouseGlobals
from toontown.estate.DistributedFurnitureManagerAI import DistributedFurnitureManagerAI
code2furnitureId = {
'regular_bed': 200,
'closetBoy': 500,
'jellybeanBank': 1350,
'FireplaceSq': 400,
'chairA': 100,
'cabinetYwood': 110,
'couch_1person': 700,
'rug': 1000,
'rugA': 1010,
'rugB': 1020,
'couch_2person': 710,
'ending_table': 1200,
'lamp_short': 600,
'lamp_tall': 610,
'phone': 1399,
'desk_only_wo_phone': 800,
'desk_only': 800
}
defaultWindows = CatalogItemList([
# Room 1
CatalogWindowItem(20, 2),
# Room 2
CatalogWindowItem(20, 4)
], store=CatalogItem.WindowPlacement)
# Disney counts moulding, flooring, and wainscoting as wallpapers.
defaultWallpaper = CatalogItemList([
# Room 1
CatalogWallpaperItem(1110, 0, 1010, 0),
CatalogMouldingItem(1000, 2),
CatalogFlooringItem(1000, 4),
CatalogWainscotingItem(1010, 4),
# Room 2
CatalogWallpaperItem(1110, 0, 1010, 0),
CatalogMouldingItem(1000, 2),
CatalogFlooringItem(1000, 4),
CatalogWainscotingItem(1010, 4)
], store=CatalogItem.Customization)
class DistributedHouseInteriorAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedHouseInteriorAI')
def __init__(self, air, house):
DistributedObjectAI.__init__(self, air)
self.house = house
self.houseId = 0
self.houseIndex = 0
self.wallpaper = ''
self.windows = ''
self.gender = None
self.furnitureManager = None
self.houseInterior = None
self.dnaData = None
self.dnaStore = DNAStorage()
def setHouseId(self, houseId):
self.houseId = houseId
def d_setHouseId(self, houseId):
self.sendUpdate('setHouseId', [houseId])
def b_setHouseId(self, houseId):
self.setHouseId(houseId)
self.d_setHouseId(houseId)
def getHouseId(self):
return self.houseId
def setHouseIndex(self, houseIndex):
self.houseIndex = houseIndex
def d_setHouseIndex(self, houseIndex):
self.sendUpdate('setHouseIndex', [houseIndex])
def b_setHouseIndex(self, houseIndex):
self.setHouseIndex(houseIndex)
self.d_setHouseIndex(houseIndex)
def getHouseIndex(self):
return self.houseIndex
def setWallpaper(self, wallpaper):
self.wallpaper = wallpaper
def d_setWallpaper(self, wallpaper):
self.sendUpdate('setWallpaper', [wallpaper])
def b_setWallpaper(self, wallpaper):
self.setWallpaper(wallpaper)
if self.isGenerated():
self.d_setWallpaper(wallpaper)
def getWallpaper(self):
return self.wallpaper
def setWindows(self, windows):
self.windows = windows
def d_setWindows(self, windows):
self.sendUpdate('setWindows', [windows])
def b_setWindows(self, windows):
self.setWindows(windows)
if self.isGenerated():
self.d_setWindows(windows)
def getWindows(self):
return self.windows
def start(self):
if self.house.getAvatarId() == 0:
# Blank houses do not need interiors.
return
# Generate the furniture manager:
self.furnitureManager = DistributedFurnitureManagerAI(self.air, self.house, self)
self.furnitureManager.setOwnerId(self.house.getAvatarId())
self.furnitureManager.setOwnerName(self.house.getName())
self.furnitureManager.setInteriorId(self.doId)
self.furnitureManager.generateWithRequired(self.zoneId)
# We either need to load existing furniture, or create new furniture if none exists:
if self.furnitureManager.getNumItems() == 0:
self.createInterior()
else:
self.furnitureManager.loadFurniture()
def createInterior(self):
self.houseInterior = random.choice(HouseGlobals.interiors)
self.dnaData = self.air.loadDNAFileAI(self.dnaStore, self.houseInterior[0])
furnitureData = {}
# First, iterate over the possible DNANodes in the file:
for i in xrange(self.dnaData.getNumChildren()):
# Get the DNANode:
node = self.dnaData.at(i)
# Make sure the DNANode is the interior:
if node.getName() == 'interior':
# Next, iterate over all of the objects:
for j in xrange(node.getNumChildren()):
# First, get the object:
obj = node.at(j)
# Now, get the name, position, and code:
objName = obj.getName()
x, y, z = obj.getPos()
h, p, r = obj.getHpr()
code = obj.getCode()
# Store the data in a dictionary for later:
furnitureData[objName] = {
'code': code,
'posHpr': (x, y, z, h, 0, 0),
'scale': obj.getScale(),
'itemId': code2furnitureId.get(code, 0)
}
furnitureData['phone'] = {
'code': 'phone',
'posHpr': (-11, 2, 0, 0, 0, 0),
'scale': 'phone',
'itemId': code2furnitureId.get('phone', 0)
}
interiorItems = CatalogItemList(store=CatalogItem.Customization | CatalogItem.Location)
ignoredItems = ['house_interiorA_DNARoot', 'GardenA_DNARoot']
for name, data in furnitureData.iteritems():
itemId = data.get('itemId', 0)
if itemId == 0:
if name not in ignoredItems:
self.notify.warning('Tried to generate item %s but the ID was not found!' % name)
continue
if name == 'closetBoy_DNARoot' and self.gender == 'f':
itemId += 10
newItem = CatalogFurnitureItem(itemId, posHpr=data.get('posHpr'))
interiorItems.append(newItem)
self.house.b_setInteriorItems(interiorItems.getBlob())
self.house.b_setInteriorWindows(defaultWindows.getBlob())
self.house.b_setInteriorWallpaper(defaultWallpaper.getBlob())
self.furnitureManager.wallpaper = self.house.interiorWallpaper
self.furnitureManager.windows = self.house.interiorWindows
self.furnitureManager.loadFurniture()
self.furnitureManager.saveFurniture()