oldschool-toontown/toontown/racing/Kart.py

538 lines
22 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
from direct.directnotify import DirectNotifyGlobal
from panda3d.core import *
2019-11-02 17:27:54 -05:00
from direct.gui.DirectGui import *
from panda3d.core import *
2019-11-02 17:27:54 -05:00
from direct.interval.IntervalGlobal import *
from otp.avatar import ShadowCaster
from toontown.racing.KartDNA import *
from toontown.toonbase import TTLocalizer
class Kart(NodePath, ShadowCaster.ShadowCaster):
notify = DirectNotifyGlobal.directNotify.newCategory('Kart')
index = 0
baseScale = 2.0
RFWHEEL = 0
LFWHEEL = 1
RRWHEEL = 2
LRWHEEL = 3
wheelData = [{'node': 'wheel*Node2'},
{'node': 'wheel*Node1'},
{'node': 'wheel*Node3'},
{'node': 'wheel*Node4'}]
ShadowScale = 2.5
SFX_BaseDir = 'phase_6/audio/sfx/'
2020-01-14 13:28:52 -06:00
SFX_KartStart = SFX_BaseDir + 'KART_Engine_start_%d.ogg'
SFX_KartLoop = SFX_BaseDir + 'KART_Engine_loop_%d.ogg'
2019-11-02 17:27:54 -05:00
def __init__(self):
NodePath.__init__(self)
an = ActorNode('vehicle-test')
anp = NodePath(an)
NodePath.assign(self, anp)
self.actorNode = an
ShadowCaster.ShadowCaster.__init__(self, False)
Kart.index += 1
self.updateFields = []
self.kartDNA = [-1] * getNumFields()
self.kartAccessories = {KartDNA.ebType: None,
KartDNA.spType: None,
KartDNA.fwwType: (None, None),
KartDNA.bwwType: (None, None)}
self.texCount = 1
return
def delete(self):
self.__stopWheelSpin()
del self.kartDNA
del self.updateFields
self.kartLoopSfx.stop()
NodePath.removeNode(self)
ShadowCaster.ShadowCaster.delete(self)
def getKartBounds(self):
return self.geom[0].getTightBounds()
def generateKart(self, forGui = 0):
self.LODnode = FadeLODNode('lodNode')
self.LODpath = self.attachNewNode(self.LODnode)
self.LODnode.setFadeTime(0.15)
self.geom = {}
self.pitchNode = {}
self.toonNode = {}
self.rotateNode = self.attachNewNode('rotate')
levelIn = [base.config.GetInt('lod1-in', 30), base.config.GetInt('lod2-in', 80), base.config.GetInt('lod2-in', 200)]
levelOut = [base.config.GetInt('lod1-out', 0), base.config.GetInt('lod2-out', 30), base.config.GetInt('lod2-out', 80)]
lodRequired = 3
if forGui:
lodRequired = 1
levelIn[0] = base.config.GetInt('lod1-in', 2500)
levelIn[1] = base.config.GetInt('lod1-out', 0)
self.toonSeat = NodePath('toonSeat')
for level in range(lodRequired):
self.__createLODKart(level)
self.LODnode.addSwitch(levelIn[level], levelOut[level])
self.setScale(self.baseScale)
self.flattenMedium()
for level in range(lodRequired):
self.toonSeat = self.toonSeat.instanceTo(self.toonNode[level])
self.LODpath.reparentTo(self.rotateNode)
tempNode = NodePath('tempNode')
self.accGeomScale = tempNode.getScale(self.pitchNode[0]) * self.baseScale
tempNode.removeNode()
self.__applyBodyColor()
self.__applyEngineBlock()
self.__applySpoiler()
self.__applyFrontWheelWells()
self.__applyBackWheelWells()
self.__applyRims()
self.__applyDecals()
self.__applyAccessoryColor()
self.wheelCenters = []
self.wheelBases = []
for wheel in self.wheelData:
center = self.geom[0].find('**/' + wheel['node'])
self.wheelCenters.append(center)
wheelBase = center.getParent().attachNewNode('wheelBase')
wheelBase.setPos(center.getPos())
wheelBase.setZ(0)
self.wheelBases.append(wheelBase)
self.wheelBaseH = self.wheelCenters[0].getH()
self.__startWheelSpin()
self.setWheelSpinSpeed(0)
if not forGui:
self.shadowJoint = self.geom[0]
self.initializeDropShadow()
self.setActiveShadow()
self.dropShadow.setScale(self.ShadowScale)
else:
self.shadowJoint = self.LODpath
self.initializeDropShadow()
self.setActiveShadow()
self.dropShadow.setScale(1.3, 3, 1)
kartType = self.kartDNA[KartDNA.bodyType]
self.kartStartSfx = base.loader.loadSfx(self.SFX_KartStart % kartType)
self.kartLoopSfx = base.loader.loadSfx(self.SFX_KartLoop % kartType)
2019-11-02 17:27:54 -05:00
self.kartLoopSfx.setLoop()
def __createLODKart(self, level):
kartBodyPath = getKartModelPath(self.kartDNA[KartDNA.bodyType], level)
self.geom[level] = loader.loadModel(kartBodyPath)
self.geom[level].reparentTo(self.LODpath)
self.geom[level].setH(180)
self.geom[level].setPos(0.0, 0, 0.025)
self.pitchNode[level] = self.geom[level].find('**/suspensionNode')
self.toonNode[level] = self.geom[level].find('**/toonNode')
scale = 1.0 / self.pitchNode[level].getScale()[0]
scale /= self.baseScale
self.toonNode[level].setScale(scale)
h = (180 + self.pitchNode[level].getH()) % 360
self.toonNode[level].setH(h)
pos = Point3(0, -1.3, -7)
self.toonNode[level].setPos(pos)
def resetGeomPos(self):
for level in list(self.geom.keys()):
2019-11-02 17:27:54 -05:00
self.geom[level].setPos(0, 0, 0.025)
def __update(self):
for field in self.updateFields:
if field == KartDNA.bodyType:
if hasattr(self, 'geom'):
for kart in self.geom:
self.geom[kart].removeNode()
self.__createLODKart(kart)
self.geom[kart].reparentTo(self.rotateNode)
self.__applyBodyColor()
self.__applyEngineBlock()
self.__applySpoiler()
self.__applyFrontWheelWells()
self.__applyRims()
self.__applyDecals()
self.__applyAccessoryColor()
else:
raise Exception('Kart::__update - Has this method been called before generateKart?')
2019-11-02 17:27:54 -05:00
elif field == KartDNA.bodyColor:
self.__applyBodyColor()
elif field == KartDNA.accColor:
self.__applyAccessoryColor()
elif field == KartDNA.ebType:
if self.kartAccessories[KartDNA.ebType] != None:
name = self.kartAccessories[KartDNA.ebType].getName()
for key in list(self.geom.keys()):
2019-11-02 17:27:54 -05:00
self.geom[key].find('**/%s' % name).removeNode()
self.kartAccessories[KartDNA.ebType].removeNode()
self.kartAccessories[KartDNA.ebType] = None
self.__applyEngineBlock()
elif field == KartDNA.spType:
if self.kartAccessories[KartDNA.spType] != None:
name = self.kartAccessories[KartDNA.spType].getName()
for key in list(self.geom.keys()):
2019-11-02 17:27:54 -05:00
self.geom[key].find('**/%s' % name).removeNode()
self.kartAccessories[KartDNA.spType].removeNode()
self.kartAccessories[KartDNA.spType] = None
self.__applySpoiler()
elif field == KartDNA.fwwType:
if self.kartAccessories[KartDNA.fwwType] != (None, None):
left, right = self.kartAccessories[KartDNA.fwwType]
for key in list(self.geom.keys()):
2019-11-02 17:27:54 -05:00
self.geom[key].find('**/%s' % left.getName()).removeNode()
self.geom[key].find('**/%s' % right.getName()).removeNode()
left.removeNode()
right.removeNode()
self.kartAccessories[KartDNA.fwwType] = (None, None)
self.__applyFrontWheelWells()
elif field == KartDNA.bwwType:
if self.kartAccessories[KartDNA.bwwType] != (None, None):
left, right = self.kartAccessories[KartDNA.bwwType]
for key in list(self.geom.keys()):
2019-11-02 17:27:54 -05:00
self.geom[key].find('**/%s' % left.getName()).removeNode()
self.geom[key].find('**/%s' % right.getName()).removeNode()
left.removeNode()
right.removeNode()
self.kartAccessories[KartDNA.bwwType] = (None, None)
self.__applyBackWheelWells()
else:
if field == KartDNA.rimsType:
self.__applyRims()
elif field == KartDNA.decalType:
self.__applyDecals()
self.__applyAccessoryColor()
self.updateFields = []
return
def updateDNAField(self, field, fieldValue):
if field == KartDNA.bodyType:
self.setBodyType(fieldValue)
elif field == KartDNA.bodyColor:
self.setBodyColor(fieldValue)
elif field == KartDNA.accColor:
self.setAccessoryColor(fieldValue)
elif field == KartDNA.ebType:
self.setEngineBlockType(fieldValue)
elif field == KartDNA.spType:
self.setSpoilerType(fieldValue)
elif field == KartDNA.fwwType:
self.setFrontWheelWellType(fieldValue)
elif field == KartDNA.bwwType:
self.setBackWheelWellType(fieldValue)
elif field == KartDNA.rimsType:
self.setRimType(fieldValue)
elif field == KartDNA.decalType:
self.setDecalType(fieldValue)
self.updateFields.append(field)
self.__update()
def __applyBodyColor(self):
if self.kartDNA[KartDNA.bodyColor] == InvalidEntry:
bodyColor = getDefaultColor()
else:
bodyColor = getAccessory(self.kartDNA[KartDNA.bodyColor])
for kart in self.geom:
kartBody = self.geom[kart].find('**/chasse')
kartBody.setColorScale(bodyColor)
def __applyAccessoryColor(self):
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
for kart in self.geom:
hoodDecal = self.geom[kart].find('**/hoodDecal')
rightSideDecal = self.geom[kart].find('**/rightSideDecal')
leftSideDecal = self.geom[kart].find('**/leftSideDecal')
hoodDecal.setColorScale(accColor)
rightSideDecal.setColorScale(accColor)
leftSideDecal.setColorScale(accColor)
for type in [KartDNA.ebType, KartDNA.spType]:
model = self.kartAccessories.get(type, None)
if model != None and not model.find('**/vertex').isEmpty():
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
model.find('**/vertex').setColorScale(accColor)
for type in [KartDNA.fwwType, KartDNA.bwwType]:
lModel, rModel = self.kartAccessories.get(type, (None, None))
if lModel != None and not lModel.find('**/vertex').isEmpty():
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
lModel.find('**/vertex').setColorScale(accColor)
rModel.find('**/vertex').setColorScale(accColor)
return
def __applyEngineBlock(self):
ebType = self.kartDNA[KartDNA.ebType]
if ebType == InvalidEntry:
return
ebPath = getAccessory(ebType)
attachNode = getAccessoryAttachNode(ebType)
model = loader.loadModel(ebPath)
self.kartAccessories[KartDNA.ebType] = model
model.setScale(self.accGeomScale)
if not model.find('**/vertex').isEmpty():
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
model.find('**/vertex').setColorScale(accColor)
for kart in self.geom:
engineBlockNode = self.geom[kart].find('**/%s' % attachNode)
model.setPos(engineBlockNode.getPos(self.pitchNode[kart]))
model.setHpr(engineBlockNode.getHpr(self.pitchNode[kart]))
model.instanceTo(self.pitchNode[kart])
def __applySpoiler(self):
spType = self.kartDNA[KartDNA.spType]
if spType == InvalidEntry:
return
spPath = getAccessory(spType)
attachNode = getAccessoryAttachNode(spType)
model = loader.loadModel(spPath)
self.kartAccessories[KartDNA.spType] = model
model.setScale(self.accGeomScale)
for kart in self.geom:
spoilerNode = self.geom[kart].find('**/%s' % attachNode)
model.setPos(spoilerNode.getPos(self.pitchNode[kart]))
model.setHpr(spoilerNode.getHpr(self.pitchNode[kart]))
model.instanceTo(self.pitchNode[kart])
def __applyRims(self):
if self.kartDNA[KartDNA.rimsType] == InvalidEntry:
rimTexPath = getAccessory(getDefaultRim())
else:
rimTexPath = getAccessory(self.kartDNA[KartDNA.rimsType])
rimTex = loader.loadTexture('%s.jpg' % rimTexPath, '%s_a.rgb' % rimTexPath)
for kart in self.geom:
leftFrontWheelRim = self.geom[kart].find('**/leftFrontWheelRim')
rightFrontWheelRim = self.geom[kart].find('**/rightFrontWheelRim')
leftRearWheelRim = self.geom[kart].find('**/leftRearWheelRim')
rightRearWheelRim = self.geom[kart].find('**/rightRearWheelRim')
rimTex.setMinfilter(Texture.FTLinearMipmapLinear)
leftFrontWheelRim.setTexture(rimTex, self.texCount)
rightFrontWheelRim.setTexture(rimTex, self.texCount)
leftRearWheelRim.setTexture(rimTex, self.texCount)
rightRearWheelRim.setTexture(rimTex, self.texCount)
self.texCount += 1
def __applyFrontWheelWells(self):
fwwType = self.kartDNA[KartDNA.fwwType]
if fwwType == InvalidEntry:
return
fwwPath = getAccessory(fwwType)
attachNode = getAccessoryAttachNode(fwwType)
leftAttachNode = attachNode % 'left'
rightAttachNode = attachNode % 'right'
leftModel = loader.loadModel(fwwPath)
rightModel = loader.loadModel(fwwPath)
self.kartAccessories[KartDNA.fwwType] = (leftModel, rightModel)
if not leftModel.find('**/vertex').isEmpty():
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
leftModel.find('**/vertex').setColorScale(accColor)
rightModel.find('**/vertex').setColorScale(accColor)
for kart in self.geom:
leftNode = self.geom[kart].find('**/%s' % leftAttachNode)
rightNode = self.geom[kart].find('**/%s' % rightAttachNode)
leftNodePath = leftModel.instanceTo(self.pitchNode[kart])
leftNodePath.setPos(rightNode.getPos(self.pitchNode[kart]))
leftNodePath.setHpr(rightNode.getHpr(self.pitchNode[kart]))
leftNodePath.setScale(self.accGeomScale)
leftNodePath.setSx(-1.0 * leftNodePath.getSx())
leftNodePath.setTwoSided(True)
rightNodePath = rightModel.instanceTo(self.pitchNode[kart])
rightNodePath.setPos(leftNode.getPos(self.pitchNode[kart]))
rightNodePath.setHpr(leftNode.getHpr(self.pitchNode[kart]))
rightNodePath.setScale(self.accGeomScale)
def __applyBackWheelWells(self):
bwwType = self.kartDNA[KartDNA.bwwType]
if bwwType == InvalidEntry:
return
bwwPath = getAccessory(bwwType)
attachNode = getAccessoryAttachNode(bwwType)
leftAttachNode = attachNode % 'left'
rightAttachNode = attachNode % 'right'
leftModel = loader.loadModel(bwwPath)
rightModel = loader.loadModel(bwwPath)
self.kartAccessories[KartDNA.bwwType] = (leftModel, rightModel)
if not leftModel.find('**/vertex').isEmpty():
if self.kartDNA[KartDNA.accColor] == InvalidEntry:
accColor = getDefaultColor()
else:
accColor = getAccessory(self.kartDNA[KartDNA.accColor])
leftModel.find('**/vertex').setColorScale(accColor)
rightModel.find('**/vertex').setColorScale(accColor)
for kart in self.geom:
leftNode = self.geom[kart].find('**/%s' % leftAttachNode)
rightNode = self.geom[kart].find('**/%s' % rightAttachNode)
leftNodePath = leftModel.instanceTo(self.pitchNode[kart])
leftNodePath.setPos(rightNode.getPos(self.pitchNode[kart]))
leftNodePath.setHpr(rightNode.getHpr(self.pitchNode[kart]))
leftNodePath.setScale(self.accGeomScale)
leftNodePath.setSx(-1.0 * leftNodePath.getSx())
leftNodePath.setTwoSided(True)
rightNodePath = rightModel.instanceTo(self.pitchNode[kart])
rightNodePath.setPos(leftNode.getPos(self.pitchNode[kart]))
rightNodePath.setHpr(leftNode.getHpr(self.pitchNode[kart]))
rightNodePath.setScale(self.accGeomScale)
def __applyDecals(self):
if self.kartDNA[KartDNA.decalType] != InvalidEntry:
decalId = getAccessory(self.kartDNA[KartDNA.decalType])
kartDecal = getDecalId(self.kartDNA[KartDNA.bodyType])
hoodDecalTex = loader.loadTexture('phase_6/maps/%s_HoodDecal_%s.jpg' % (kartDecal, decalId), 'phase_6/maps/%s_HoodDecal_%s_a.rgb' % (kartDecal, decalId))
sideDecalTex = loader.loadTexture('phase_6/maps/%s_SideDecal_%s.jpg' % (kartDecal, decalId), 'phase_6/maps/%s_SideDecal_%s_a.rgb' % (kartDecal, decalId))
hoodDecalTex.setMinfilter(Texture.FTLinearMipmapLinear)
sideDecalTex.setMinfilter(Texture.FTLinearMipmapLinear)
for kart in self.geom:
hoodDecal = self.geom[kart].find('**/hoodDecal')
rightSideDecal = self.geom[kart].find('**/rightSideDecal')
leftSideDecal = self.geom[kart].find('**/leftSideDecal')
hoodDecal.setTexture(hoodDecalTex, self.texCount)
rightSideDecal.setTexture(sideDecalTex, self.texCount)
leftSideDecal.setTexture(sideDecalTex, self.texCount)
hoodDecal.show()
rightSideDecal.show()
leftSideDecal.show()
else:
for kart in self.geom:
hoodDecal = self.geom[kart].find('**/hoodDecal')
rightSideDecal = self.geom[kart].find('**/rightSideDecal')
leftSideDecal = self.geom[kart].find('**/leftSideDecal')
hoodDecal.hide()
rightSideDecal.hide()
leftSideDecal.hide()
self.texCount += 1
def rollSuspension(self, roll):
for kart in self.pitchNode:
self.pitchNode[kart].setR(roll)
def pitchSuspension(self, pitch):
for kart in self.pitchNode:
self.pitchNode[kart].setP(pitch)
def getDNA(self):
return self.kartDNA
def setDNA(self, dna):
if self.kartDNA != [-1] * getNumFields():
for field in range(len(self.kartDNA)):
2019-11-02 17:27:54 -05:00
if dna[field] != self.kartDNA[field]:
self.updateDNAField(field, dna[field])
return
self.kartDNA = dna
def setBodyType(self, bodyType):
self.kartDNA[KartDNA.bodyType] = bodyType
def getBodyType(self):
return self.kartDNA[KartDNA.bodyType]
def setBodyColor(self, bodyColor):
self.kartDNA[KartDNA.bodyColor] = bodyColor
def getBodyColor(self):
return self.kartDNA[KartDNA.bodyColor]
def setAccessoryColor(self, accColor):
self.kartDNA[KartDNA.accColor] = accColor
def getAccessoryColor(self):
return self.kartDNA[KartDNA.accColor]
def setEngineBlockType(self, ebType):
self.kartDNA[KartDNA.ebType] = ebType
def getEngineBlockType(self):
return self.kartDNA[KartDNA.ebType]
def setSpoilerType(self, spType):
self.kartDNA[KartDNA.spType] = spType
def getSpoilerType(self):
return self.kartDNA[KartDNA.spType]
def setFrontWheelWellType(self, fwwType):
self.kartDNA[KartDNA.fwwType] = fwwType
def getFrontWheelWellType(self):
return self.kartDNA[KartDNA.fwwType]
def setBackWheelWellType(self, bwwType):
self.kartDNA[KartDNA.bwwType] = bwwType
def getBackWheelWellType(self):
return self.kartDNA[KartDNA.bwwType]
def setRimType(self, rimsType):
self.kartDNA[KartDNA.rimsType] = rimsType
def getRimType(self):
return self.kartDNA[KartDNA.rimsType]
def setDecalType(self, decalType):
self.kartDNA[KartDNA.decalType] = decalType
def getDecalType(self):
return self.kartDNA[KartDNA.decalType]
def getGeomNode(self):
return self.geom[0]
def spinWheels(self, amount):
newSpin = (self.oldSpinAmount + amount) % 360
for wheelNode in self.wheelCenters:
wheelNode.setP(newSpin)
self.oldSpinAmount = newSpin
def setWheelSpinSpeed(self, speed):
pass
def __startWheelSpin(self):
self.oldSpinAmount = 0
def __stopWheelSpin(self):
pass
def turnWheels(self, amount):
amount += self.wheelBaseH
node = self.wheelCenters[self.RFWHEEL]
node.setH(amount)
node = self.wheelCenters[self.LFWHEEL]
node.setH(amount)
def generateEngineStartTrack(self):
length = self.kartStartSfx.length()
def printVol():
print(self.kartLoopSfx.getVolume())
2019-11-02 17:27:54 -05:00
track = Parallel(SoundInterval(self.kartStartSfx), Func(self.kartLoopSfx.play), LerpFunctionInterval(self.kartLoopSfx.setVolume, fromData=0, toData=0.4, duration=length))
return Sequence(track, Func(printVol))
def generateEngineStopTrack(self, duration = 0):
track = Parallel(LerpFunctionInterval(self.kartLoopSfx.setVolume, fromData=0.4, toData=0, duration=duration))
return track