224 lines
8.9 KiB
Python
224 lines
8.9 KiB
Python
from toontown.estate import DistributedStatuary
|
|
from toontown.estate import DistributedLawnDecor
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.showbase.ShowBase import *
|
|
from pandac.PandaModules import *
|
|
from toontown.toon import Toon
|
|
from toontown.toon import ToonDNA
|
|
import GardenGlobals
|
|
from toontown.toonbase import TTLocalizer
|
|
from toontown.toonbase import ToontownGlobals
|
|
from pandac.PandaModules import NodePath
|
|
from pandac.PandaModules import Point3
|
|
|
|
def dnaCodeFromToonDNA(dna):
|
|
|
|
def findItemNumInList(wantItem, wantList):
|
|
i = 0
|
|
for item in wantList:
|
|
if item == wantItem:
|
|
break
|
|
i += 1
|
|
|
|
return i
|
|
|
|
if dna.gender == 'f':
|
|
genderTypeNum = 0
|
|
else:
|
|
genderTypeNum = 1
|
|
legTypeNum = findItemNumInList(dna.legs, ToonDNA.toonLegTypes) << 1
|
|
torsoTypeNum = findItemNumInList(dna.torso, ToonDNA.toonTorsoTypes) << 3
|
|
headTypeNum = findItemNumInList(dna.head, ToonDNA.toonHeadTypes) << 7
|
|
return headTypeNum | torsoTypeNum | legTypeNum | genderTypeNum
|
|
|
|
|
|
class DistributedToonStatuary(DistributedStatuary.DistributedStatuary):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedToonStatuary')
|
|
|
|
def __init__(self, cr):
|
|
self.notify.debug('constructing DistributedToonStatuary')
|
|
DistributedStatuary.DistributedStatuary.__init__(self, cr)
|
|
self.toon = None
|
|
return
|
|
|
|
def loadModel(self):
|
|
DistributedStatuary.DistributedStatuary.loadModel(self)
|
|
self.model.setScale(self.worldScale * 1.5, self.worldScale * 1.5, self.worldScale)
|
|
self.getToonPropertiesFromOptional()
|
|
dna = ToonDNA.ToonDNA()
|
|
dna.newToonFromProperties(self.headType, self.torsoType, self.legType, self.gender, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
self.setupStoneToon(dna)
|
|
self.poseToonFromTypeIndex(self.typeIndex)
|
|
self.toon.reparentTo(self.model)
|
|
|
|
def delete(self):
|
|
self.deleteToon()
|
|
DistributedStatuary.DistributedStatuary.delete(self)
|
|
|
|
def setupStoneToon(self, dna):
|
|
self.toon = Toon.Toon()
|
|
self.toon.setPos(0, 0, 0)
|
|
self.toon.setDNA(dna)
|
|
self.toon.initializeBodyCollisions('toonStatue')
|
|
self.toon.stopBlink()
|
|
self.toon.stopLookAround()
|
|
self.gender = self.toon.style.gender
|
|
self.speciesType = self.toon.style.getAnimal()
|
|
self.headType = self.toon.style.head
|
|
self.removeTextures()
|
|
self.setStoneTexture()
|
|
self.toon.dropShadow.hide()
|
|
self.toon.setZ(70)
|
|
self.toon.setScale(20 / 1.5, 20 / 1.5, 20)
|
|
|
|
def deleteToon(self):
|
|
self.notify.debug('entering deleteToon')
|
|
self.toon.delete()
|
|
self.toon = None
|
|
return
|
|
|
|
def copyLocalAvatarToon(self):
|
|
self.toon = Toon.Toon()
|
|
self.toon.reparentTo(render)
|
|
self.toon.setDNA(base.localAvatar.style)
|
|
self.toon.setPos(base.localAvatar, 0, 0, 0)
|
|
self.toon.pose('victory', 30)
|
|
self.toon.setH(180)
|
|
self.speciesType = self.toon.style.getAnimal()
|
|
self.gender = self.toon.style.gender
|
|
|
|
def setupCollision(self):
|
|
DistributedStatuary.DistributedStatuary.setupCollision(self)
|
|
self.colSphereNode.setScale(self.colSphereNode.getScale() * 1.5)
|
|
|
|
def setupShadow(self):
|
|
pass
|
|
|
|
def removeTextures(self):
|
|
for node in self.toon.findAllMatches('**/*'):
|
|
node.setState(RenderState.makeEmpty())
|
|
|
|
desatShirtTex = loader.loadTexture('phase_3/maps/desat_shirt_1.jpg')
|
|
desatSleeveTex = loader.loadTexture('phase_3/maps/desat_sleeve_1.jpg')
|
|
desatShortsTex = loader.loadTexture('phase_3/maps/desat_shorts_1.jpg')
|
|
desatSkirtTex = loader.loadTexture('phase_3/maps/desat_skirt_1.jpg')
|
|
if self.toon.hasLOD():
|
|
for lodName in self.toon.getLODNames():
|
|
torso = self.toon.getPart('torso', lodName)
|
|
torsoTop = torso.find('**/torso-top')
|
|
if torsoTop:
|
|
torsoTop.setTexture(desatShirtTex, 1)
|
|
sleeves = torso.find('**/sleeves')
|
|
if sleeves:
|
|
sleeves.setTexture(desatSleeveTex, 1)
|
|
bottoms = torso.findAllMatches('**/torso-bot*')
|
|
for bottomNum in xrange(0, bottoms.getNumPaths()):
|
|
bottom = bottoms.getPath(bottomNum)
|
|
if bottom:
|
|
if self.toon.style.torso[1] == 's':
|
|
bottom.setTexture(desatShortsTex, 1)
|
|
else:
|
|
bottom.setTexture(desatSkirtTex, 1)
|
|
|
|
def setStoneTexture(self):
|
|
gray = VBase4(1.6, 1.6, 1.6, 1)
|
|
self.toon.setColor(gray, 10)
|
|
stoneTex = loader.loadTexture('phase_5.5/maps/smoothwall_1.jpg')
|
|
ts = TextureStage('ts')
|
|
ts.setPriority(1)
|
|
self.toon.setTexture(ts, stoneTex)
|
|
tsDetail = TextureStage('tsDetail')
|
|
tsDetail.setPriority(2)
|
|
tsDetail.setSort(10)
|
|
tsDetail.setCombineRgb(tsDetail.CMInterpolate, tsDetail.CSTexture, tsDetail.COSrcColor, tsDetail.CSPrevious, tsDetail.COSrcColor, tsDetail.CSConstant, tsDetail.COSrcColor)
|
|
tsDetail.setColor(VBase4(0.5, 0.5, 0.5, 1))
|
|
if self.toon.hasLOD():
|
|
for lodName in self.toon.getLODNames():
|
|
head = self.toon.getPart('head', lodName)
|
|
eyes = head.find('**/eye*')
|
|
if not eyes.isEmpty():
|
|
eyes.setColor(Vec4(1.4, 1.4, 1.4, 0.3), 10)
|
|
ears = head.find('**/ears*')
|
|
animal = self.toon.style.getAnimal()
|
|
if animal != 'dog':
|
|
muzzle = head.find('**/muzzle*neutral')
|
|
else:
|
|
muzzle = head.find('**/muzzle*')
|
|
if ears != ears.notFound():
|
|
if self.speciesType == 'cat':
|
|
ears.setTexture(tsDetail, stoneTex)
|
|
elif self.speciesType == 'horse':
|
|
pass
|
|
elif self.speciesType == 'rabbit':
|
|
ears.setTexture(tsDetail, stoneTex)
|
|
elif self.speciesType == 'monkey':
|
|
ears.setTexture(tsDetail, stoneTex)
|
|
ears.setColor(VBase4(0.6, 0.9, 1, 1), 10)
|
|
if muzzle != muzzle.notFound():
|
|
muzzle.setTexture(tsDetail, stoneTex)
|
|
if self.speciesType == 'dog':
|
|
nose = head.find('**/nose')
|
|
if nose != nose.notFound():
|
|
nose.setTexture(tsDetail, stoneTex)
|
|
|
|
tsLashes = TextureStage('tsLashes')
|
|
tsLashes.setPriority(2)
|
|
tsLashes.setMode(tsLashes.MDecal)
|
|
if self.gender == 'f':
|
|
if self.toon.hasLOD():
|
|
head = self.toon.getPart('head', '1000')
|
|
else:
|
|
head = self.toon.getPart('head', 'lodRoot')
|
|
if self.headType[1] == 'l':
|
|
openString = 'open-long'
|
|
closedString = 'closed-long'
|
|
else:
|
|
openString = 'open-short'
|
|
closedString = 'closed-short'
|
|
lashesOpen = head.find('**/' + openString)
|
|
lashesClosed = head.find('**/' + closedString)
|
|
if lashesOpen != lashesOpen.notFound():
|
|
lashesOpen.setTexture(tsLashes, stoneTex)
|
|
lashesOpen.setColor(VBase4(1, 1, 1, 0.4), 10)
|
|
if lashesClosed != lashesClosed.notFound():
|
|
lashesClosed.setTexture(tsLashes, stoneTex)
|
|
lashesClosed.setColor(VBase4(1, 1, 1, 0.4), 10)
|
|
|
|
def setOptional(self, optional):
|
|
self.optional = optional
|
|
|
|
def getToonPropertiesFromOptional(self):
|
|
genderTypeNum = self.optional & 1
|
|
legTypeNum = (self.optional & 6) >> 1
|
|
torsoTypeNum = (self.optional & 120) >> 3
|
|
headTypeNum = (self.optional & 65408) >> 7
|
|
if genderTypeNum == 0:
|
|
self.gender = 'f'
|
|
else:
|
|
self.gender = 'm'
|
|
if legTypeNum <= len(ToonDNA.toonLegTypes):
|
|
self.legType = ToonDNA.toonLegTypes[legTypeNum]
|
|
if torsoTypeNum <= len(ToonDNA.toonTorsoTypes):
|
|
self.torsoType = ToonDNA.toonTorsoTypes[torsoTypeNum]
|
|
if headTypeNum <= len(ToonDNA.toonHeadTypes):
|
|
self.headType = ToonDNA.toonHeadTypes[headTypeNum]
|
|
|
|
def poseToonFromTypeIndex(self, typeIndex):
|
|
if typeIndex == 205:
|
|
self.toon.pose('wave', 18)
|
|
elif typeIndex == 206:
|
|
self.toon.pose('victory', 116)
|
|
elif typeIndex == 207:
|
|
self.toon.pose('bored', 96)
|
|
elif typeIndex == 208:
|
|
self.toon.pose('think', 59)
|
|
|
|
def poseToonFromSpecialsIndex(self, specialsIndex):
|
|
if specialsIndex == 105:
|
|
self.toon.pose('wave', 18)
|
|
elif specialsIndex == 106:
|
|
self.toon.pose('victory', 116)
|
|
elif specialsIndex == 107:
|
|
self.toon.pose('bored', 96)
|
|
elif specialsIndex == 108:
|
|
self.toon.pose('think', 59)
|