151 lines
4.9 KiB
Python
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()
|