Poodletooth-iLand/toontown/estate/DistributedHouse.py

374 lines
14 KiB
Python

from panda3d.core import *
from toontown.toonbase.ToonBaseGlobal import *
from direct.gui.DirectGui import *
from direct.distributed.ClockDelta import *
from toontown.minigame.OrthoWalk import *
from string import *
from toontown.toonbase import ToontownGlobals
from direct.distributed import DistributedObject
from direct.directnotify import DirectNotifyGlobal
from direct.fsm import ClassicFSM
from direct.fsm import State
from toontown.toon import Toon
from direct.showbase import RandomNumGen
from toontown.toonbase import TTLocalizer
import random
from direct.showbase import PythonUtil
from toontown.hood import Place
import HouseGlobals
from toontown.building import ToonInteriorColors
from direct.showbase.MessengerGlobal import messenger
from toontown.dna.DNAParser import *
from otp.nametag.NametagGroup import NametagGroup
from otp.nametag.Nametag import Nametag
class DistributedHouse(DistributedObject.DistributedObject):
notify = directNotify.newCategory('DistributedHouse')
def __init__(self, cr):
DistributedObject.DistributedObject.__init__(self, cr)
self.houseType = 0
self.avId = -1
self.ownerId = 0
self.colorIndex = 0
self.house = None
self.name = ''
self.namePlate = None
self.nameText = None
self.nametag = None
self.floorMat = None
self.matText = None
self.randomGenerator = None
self.housePosInd = 0
self.house_loaded = 0
return
def disable(self):
DistributedObject.DistributedObject.disable(self)
def delete(self):
self.notify.debug('delete')
self.unload()
self.clearNametag()
if self.namePlate:
self.namePlate.removeNode()
del self.namePlate
self.namePlate = None
if self.floorMat:
self.floorMat.removeNode()
del self.floorMat
self.floorMat = None
if self.house:
self.house.removeNode()
del self.house
self.house_loaded = 0
del self.randomGenerator
DistributedObject.DistributedObject.delete(self)
return
def clearNametag(self):
if self.nametag != None:
self.nametag.unmanage(base.marginManager)
self.nametag.setAvatar(NodePath())
self.nametag.destroy()
self.nametag = None
return
def load(self):
self.notify.debug('load')
if not self.house_loaded:
if self.houseType >= len(self.cr.playGame.hood.loader.houseModels):
self.houseType = HouseGlobals.HOUSE_DEFAULT
houseModel = self.cr.playGame.hood.loader.houseModels[self.houseType]
self.house = houseModel.copyTo(self.cr.playGame.hood.loader.houseNode[self.housePosInd])
self.house_loaded = 1
self.cr.playGame.hood.loader.houseId2house[self.doId] = self.house
if self.houseType == HouseGlobals.HOUSE_DEFAULT:
self.__setHouseColor()
if self.houseType == HouseGlobals.HOUSE_DEFAULT or self.houseType == HouseGlobals.HOUSE_TEST:
self.__setupDoor()
else:
self.__setupDoorCustom()
messenger.send('houseLoaded-%d' % self.doId)
def announceGenerate(self):
DistributedObject.DistributedObject.announceGenerate(self)
messenger.send('setBuilding-' + str(self.doId))
def __setupDoor(self):
self.notify.debug('setupDoor')
self.dnaStore = self.cr.playGame.dnaStore
doorModelName = 'door_double_round_ul'
if doorModelName[-1:] == 'r':
doorModelName = doorModelName[:-1] + 'l'
else:
doorModelName = doorModelName[:-1] + 'r'
door = self.dnaStore.findNode(doorModelName)
door_origin = self.house.find('**/door_origin')
door_origin.setHpr(90, 0, 0)
door_origin.setScale(0.6, 0.6, 0.8)
door_origin.setPos(door_origin, 0.5, 0, 0.0)
doorNP = door.copyTo(door_origin)
self.door_origin = door_origin
self.randomGenerator = random.Random()
self.randomGenerator.seed(self.doId)
houseColor = HouseGlobals.stairWood
color = Vec4(houseColor[0], houseColor[1], houseColor[2], 1)
setupDoor(doorNP, door_origin, door_origin, self.dnaStore, str(self.colorIndex), color)
self.__setupNamePlate()
self.__setupFloorMat()
self.__setupNametag()
def __setupDoorCustom(self):
self.randomGenerator = random.Random()
self.randomGenerator.seed(self.doId)
self.notify.debug('setupDoorCustom')
self.dnaStore = self.cr.playGame.dnaStore
door = self.house.find('**/door_0')
door_origin = self.house.find('**/door_origin')
door_origin.setHpr(90, 0, 0)
door_origin.setScale(0.6, 0.6, 0.8)
doorNP = door
self.door_origin = door_origin
color = Vec4(1, 1, 1, 1)
parent = door_origin
rightDoor = door.find('**/rightDoor')
rightDoor.setHpr(door_origin, Vec3(0, 0, 0))
leftDoor = door.find('**/leftDoor')
leftDoor.setHpr(door_origin, Vec3(0, 0, 0))
doorTrigger = doorNP.find('**/door_*_trigger')
doorTrigger.wrtReparentTo(door_origin)
doorTrigger.node().setName('door_trigger_' + str(self.doId))
self.__setupFloorMat(changeColor=False)
self.__setupNametag()
self.__setupNamePlateCustom()
def __setupNamePlate(self):
self.notify.debug('__setupNamePlate')
if self.namePlate:
self.namePlate.removeNode()
del self.namePlate
self.namePlate = None
nameText = TextNode('nameText')
r = self.randomGenerator.random()
g = self.randomGenerator.random()
b = self.randomGenerator.random()
nameText.setTextColor(r, g, b, 1)
nameText.setAlign(nameText.ACenter)
nameText.setFont(ToontownGlobals.getBuildingNametagFont())
nameText.setShadowColor(0, 0, 0, 1)
nameText.setBin('fixed')
if TTLocalizer.BuildingNametagShadow:
nameText.setShadow(*TTLocalizer.BuildingNametagShadow)
nameText.setWordwrap(16.0)
xScale = 1.0
numLines = 0
if self.name == '':
return
else:
houseName = TTLocalizer.AvatarsHouse % TTLocalizer.GetPossesive(self.name)
nameText.setText(houseName)
self.nameText = nameText
textHeight = nameText.getHeight() - 2
textWidth = nameText.getWidth()
xScale = 1.0
if textWidth > 16:
xScale = 16.0 / textWidth
sign_origin = self.house.find('**/sign_origin')
pos = sign_origin.getPos()
sign_origin.setPosHpr(pos[0], pos[1], pos[2] + 0.15 * textHeight, 90, 0, 0)
self.namePlate = sign_origin.attachNewNode(self.nameText)
self.namePlate.setDepthWrite(0)
self.namePlate.setPos(0, -0.05, 0)
self.namePlate.setScale(xScale)
return nameText
def __setupFloorMat(self, changeColor = True):
if self.floorMat:
self.floorMat.removeNode()
del self.floorMat
self.floorMat = None
mat = self.house.find('**/mat')
if changeColor:
mat.setColor(0.4, 0.357, 0.259, 1.0)
color = HouseGlobals.houseColors[self.housePosInd]
matText = TextNode('matText')
matText.setTextColor(color[0], color[1], color[2], 1)
matText.setAlign(matText.ACenter)
matText.setFont(ToontownGlobals.getBuildingNametagFont())
matText.setShadowColor(0, 0, 0, 1)
matText.setBin('fixed')
if TTLocalizer.BuildingNametagShadow:
matText.setShadow(*TTLocalizer.BuildingNametagShadow)
matText.setWordwrap(10.0)
xScale = 1.0
numLines = 0
if self.name == '':
return
else:
houseName = TTLocalizer.AvatarsHouse % TTLocalizer.GetPossesive(self.name)
matText.setText(houseName)
self.matText = matText
textHeight = matText.getHeight() - 2
textWidth = matText.getWidth()
xScale = 1.0
if textWidth > 8:
xScale = 8.0 / textWidth
mat_origin = self.house.find('**/mat_origin')
pos = mat_origin.getPos()
mat_origin.setPosHpr(pos[0] - 0.15 * textHeight, pos[1], pos[2], 90, -90, 0)
self.floorMat = mat_origin.attachNewNode(self.matText)
self.floorMat.setDepthWrite(0)
self.floorMat.setPos(0, -.025, 0)
self.floorMat.setScale(0.45 * xScale)
return
def __setupNametag(self):
if self.nametag:
self.clearNametag()
if self.name == '':
houseName = ''
else:
houseName = TTLocalizer.AvatarsHouse % TTLocalizer.GetPossesive(self.name)
self.nametag = NametagGroup()
self.nametag.setFont(ToontownGlobals.getBuildingNametagFont())
if TTLocalizer.BuildingNametagShadow:
self.nametag.setShadow(*TTLocalizer.BuildingNametagShadow)
self.nametag.setContents(Nametag.CName)
self.nametag.setColorCode(NametagGroup.CCHouseBuilding)
self.nametag.setActive(0)
self.nametag.setAvatar(self.house)
self.nametag.setObjectCode(self.doId)
self.nametag.setName(houseName)
self.nametag.manage(base.marginManager)
def unload(self):
self.notify.debug('unload')
self.ignoreAll()
def setHouseReady(self):
self.notify.debug('setHouseReady')
try:
self.House_initialized
except:
self.House_initialized = 1
self.load()
def setHousePos(self, index):
self.notify.debug('setHousePos')
self.housePosInd = index
self.__setHouseColor()
def setHouseType(self, index):
self.notify.debug('setHouseType')
self.houseType = index
def setFavoriteNum(self, index):
self.notify.debug('setFavoriteNum')
self.favoriteNum = index
def __setHouseColor(self):
if self.house:
bwall = self.house.find('**/*back')
rwall = self.house.find('**/*right')
fwall = self.house.find('**/*front')
lwall = self.house.find('**/*left')
kd = 0.8
color = HouseGlobals.houseColors[self.colorIndex]
dark = (kd * color[0], kd * color[1], kd * color[2])
if not bwall.isEmpty():
bwall.setColor(color[0], color[1], color[2], 1)
if not fwall.isEmpty():
fwall.setColor(color[0], color[1], color[2], 1)
if not rwall.isEmpty():
rwall.setColor(dark[0], dark[1], dark[2], 1)
if not lwall.isEmpty():
lwall.setColor(dark[0], dark[1], dark[2], 1)
aColor = HouseGlobals.atticWood
attic = self.house.find('**/attic')
if not attic.isEmpty():
attic.setColor(aColor[0], aColor[1], aColor[2], 1)
color = HouseGlobals.houseColors2[self.colorIndex]
chimneyList = self.house.findAllMatches('**/chim*')
for chimney in chimneyList:
chimney.setColor(color[0], color[1], color[2], 1)
def setAvId(self, id):
self.avId = id
def setAvatarId(self, avId):
self.notify.debug('setAvatarId = %s' % avId)
self.ownerId = avId
def getAvatarId(self):
self.notify.debug('getAvatarId')
return self.ownerId
def setName(self, name):
self.name = name
if self.nameText and self.nameText.getText() != self.name:
if self.name == '':
self.nameText.setText('')
else:
self.nameText.setText(self.name + "'s\n House")
def getName(self):
return self.name
def b_setColor(self, colorInd):
self.setColor(colorInd)
self.d_setColor(colorInd)
def d_setColor(self, colorInd):
self.sendUpdate('setColor', [colorInd])
def setColor(self, colorInd):
self.colorIndex = colorInd
if self.house:
self.__setHouseColor()
def getColor(self):
return self.colorIndex
def __setupNamePlateCustom(self):
self.notify.debug('__setupNamePlateCustom')
if self.namePlate:
self.namePlate.removeNode()
del self.namePlate
self.namePlate = None
nameText = TextNode('nameText')
nameText.setCardAsMargin(0.1, 0.1, 0.1, 0.1)
nameText.setCardDecal(True)
nameText.setCardColor(1.0, 1.0, 1.0, 0.0)
r = self.randomGenerator.random()
g = self.randomGenerator.random()
b = self.randomGenerator.random()
nameText.setTextColor(r, g, b, 1)
nameText.setAlign(nameText.ACenter)
nameText.setFont(ToontownGlobals.getBuildingNametagFont())
nameText.setShadowColor(0, 0, 0, 1)
nameText.setBin('fixed')
if TTLocalizer.BuildingNametagShadow:
nameText.setShadow(*TTLocalizer.BuildingNametagShadow)
nameText.setWordwrap(16.0)
xScale = 1.0
numLines = 0
if self.name == '':
return
else:
houseName = TTLocalizer.AvatarsHouse % TTLocalizer.GetPossesive(self.name)
nameText.setText(houseName)
self.nameText = nameText
textHeight = nameText.getHeight() - 2
textWidth = nameText.getWidth()
xScale = 1.0
if textWidth > 16:
xScale = 16.0 / textWidth
sign_origin = self.house.find('**/sign_origin')
pos = sign_origin.getPos()
sign_origin.setPosHpr(pos[0], pos[1], pos[2] + 0.15 * textHeight, 90, 0, 0)
self.namePlate = sign_origin.attachNewNode(self.nameText)
self.namePlate.setDepthWrite(0)
self.namePlate.setPos(0, -0.05, 0)
self.namePlate.setScale(xScale)
return nameText