oldschool-toontown/toontown/estate/DistributedToonStatuary.py

225 lines
8.9 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
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 range(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)