toontown-just-works/toontown/suit/Goon.py
2024-07-07 18:08:39 -05:00

151 lines
4.9 KiB
Python

from panda3d.core import *
from direct.actor import Actor
from otp.avatar import Avatar
from toontown.toonbase import ToontownGlobals
from toontown.toonbase import TTLocalizer
import GoonGlobals
import SuitDNA
import math
AnimDict = {'pg': (('walk', '-walk'), ('collapse', '-collapse'), ('recovery', '-recovery')),
'sg': (('walk', '-walk'), ('collapse', '-collapse'), ('recovery', '-recovery'))}
ModelDict = {'pg': 'phase_9/models/char/Cog_Goonie',
'sg': 'phase_9/models/char/Cog_Goonie'}
class Goon(Avatar.Avatar):
def __init__(self, dnaName = None):
try:
self.Goon_initialized
except:
self.Goon_initialized = 1
Avatar.Avatar.__init__(self)
self.ignore('nametagAmbientLightChanged')
self.hFov = 70
self.attackRadius = 15
self.strength = 15
self.velocity = 4
self.scale = 1.0
if dnaName is not None:
self.initGoon(dnaName)
return
def initGoon(self, dnaName):
dna = SuitDNA.SuitDNA()
dna.newGoon(dnaName)
self.setDNA(dna)
self.type = dnaName
self.createHead()
self.find('**/actorGeom').setH(180)
self.nametag3d.hide()
def initializeBodyCollisions(self, collIdStr):
Avatar.Avatar.initializeBodyCollisions(self, collIdStr)
if not self.ghostMode:
self.collNode.setCollideMask(self.collNode.getIntoCollideMask() | ToontownGlobals.PieBitmask)
def delete(self):
try:
self.Goon_deleted
except:
self.Goon_deleted = 1
filePrefix = ModelDict[self.style.name]
loader.unloadModel(filePrefix + '-zero')
animList = AnimDict[self.style.name]
for anim in animList:
loader.unloadModel(filePrefix + anim[1])
Avatar.Avatar.delete(self)
return None
def setDNAString(self, dnaString):
self.dna = SuitDNA.SuitDNA()
self.dna.makeFromNetString(dnaString)
self.setDNA(self.dna)
def setDNA(self, dna):
if self.style:
pass
else:
self.style = dna
self.generateGoon()
self.initializeDropShadow()
self.initializeNametag3d()
def generateGoon(self):
dna = self.style
filePrefix = ModelDict[dna.name]
self.loadModel(filePrefix + '-zero')
animDict = {}
animList = AnimDict[dna.name]
for anim in animList:
animDict[anim[0]] = filePrefix + anim[1]
self.loadAnims(animDict)
def getShadowJoint(self):
return self.getGeomNode()
def getNametagJoints(self):
return []
def createHead(self):
self.headHeight = 3.0
head = self.find('**/joint35')
if head.isEmpty():
head = self.find('**/joint40')
self.hat = self.find('**/joint8')
parentNode = head.getParent()
self.head = parentNode.attachNewNode('headRotate')
head.reparentTo(self.head)
self.hat.reparentTo(self.head)
if self.type == 'pg':
self.hat.find('**/security_hat').hide()
elif self.type == 'sg':
self.hat.find('**/hard_hat').hide()
else:
self.hat.find('**/security_hat').hide()
self.hat.find('**/hard_hat').hide()
self.eye = self.find('**/eye')
self.eye.setColorScale(1, 1, 1, 1)
self.eye.setColor(1, 1, 0, 1)
self.radar = None
return
def scaleRadar(self):
if self.radar:
self.radar.removeNode()
self.radar = self.eye.attachNewNode('radar')
model = loader.loadModel('phase_9/models/cogHQ/alphaCone2')
beam = self.radar.attachNewNode('beam')
transformNode = model.find('**/transform')
transformNode.getChildren().reparentTo(beam)
self.radar.setPos(0, -.5, 0.4)
self.radar.setTransparency(1)
self.radar.setDepthWrite(0)
self.halfFov = self.hFov / 2.0
fovRad = self.halfFov * math.pi / 180.0
self.cosHalfFov = math.cos(fovRad)
kw = math.tan(fovRad) * self.attackRadius / 10.5
kl = math.sqrt(self.attackRadius * self.attackRadius + 9.0) / 25.0
beam.setScale(kw / self.scale, kl / self.scale, kw / self.scale)
beam.setHpr(0, self.halfFov, 0)
p = self.radar.getRelativePoint(beam, Point3(0, -6, -1.8))
self.radar.setSz(-3.5 / p[2])
self.radar.flattenMedium()
self.radar.setColor(1, 1, 1, 0.2)
def colorHat(self):
if self.type == 'pg':
colorList = GoonGlobals.PG_COLORS
elif self.type == 'sg':
colorList = GoonGlobals.SG_COLORS
else:
return
if self.strength >= 20:
self.hat.setColorScale(colorList[0])
elif self.strength >= 15:
self.hat.setColorScale(colorList[1])
else:
self.hat.clearColorScale()