106 lines
3.9 KiB
Python
106 lines
3.9 KiB
Python
from panda3d.core import *
|
|
from direct.distributed import DistributedObject
|
|
from direct.interval.ProjectileInterval import *
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.distributed.ClockDelta import *
|
|
from toontown.racing.DistributedVehicle import DistributedVehicle
|
|
from DroppedGag import *
|
|
|
|
class DistributedGag(DistributedObject.DistributedObject):
|
|
|
|
def __init__(self, cr):
|
|
DistributedObject.DistributedObject.__init__(self, cr)
|
|
self.nodePath = None
|
|
self.billboard = False
|
|
self.scale = 1
|
|
self.shadow = True
|
|
self.dropShadow = None
|
|
self.type = 0
|
|
return
|
|
|
|
def delete(self):
|
|
DistributedObject.DistributedObject.delete(self)
|
|
self.nodePath.delete()
|
|
self.ignoreAll()
|
|
|
|
def announceGenerate(self):
|
|
DistributedObject.DistributedObject.announceGenerate(self)
|
|
if not self.nodePath:
|
|
self.makeNodePath()
|
|
self.delta = -globalClockDelta.networkToLocalTime(self.initTime, globalClock.getFrameTime(), 16, 100) + globalClock.getFrameTime()
|
|
if self.type == 0:
|
|
self.name = self.uniqueName('banana')
|
|
elif self.type == 1:
|
|
self.name = self.uniqueName('pie')
|
|
self.nodePath.reparentTo(self.race.geom)
|
|
if self.ownerId == localAvatar.doId:
|
|
base.race.thrownGags[0].removeNode()
|
|
base.race.thrownGags = base.race.thrownGags[1:]
|
|
self.nodePath.setPos(self.pos[0], self.pos[1], self.pos[2])
|
|
else:
|
|
startPos = base.cr.doId2do[self.ownerId].getPos(render)
|
|
endPos = Vec3(self.pos[0], self.pos[1], self.pos[2])
|
|
throwIt = ProjectileInterval(self.nodePath, startPos=startPos, endPos=endPos, duration=1)
|
|
throwIt.start()
|
|
taskMgr.doMethodLater(0.8 - self.delta, self.addCollider, self.uniqueName('addCollider'))
|
|
|
|
def addCollider(self, t):
|
|
bs = CollisionSphere(0, 0, 0, 2)
|
|
bn = CollisionNode(self.name)
|
|
self.bnp = NodePath(bn)
|
|
if not self.nodePath.isEmpty():
|
|
self.bnp.reparentTo(self.nodePath)
|
|
self.bnp.node().addSolid(bs)
|
|
self.bnp.node().setIntoCollideMask(BitMask32(32768))
|
|
self.bnp.node().setFromCollideMask(BitMask32(32768))
|
|
self.accept('imIn-' + self.name, self.b_imHit)
|
|
|
|
def b_imHit(self, cevent):
|
|
self.ignoreAll()
|
|
self.sendUpdate('hitSomebody', [localAvatar.doId, globalClockDelta.getFrameNetworkTime(16, 100)])
|
|
if self.type == 0:
|
|
base.race.localKart.hitBanana()
|
|
elif self.type == 1:
|
|
base.race.localKart.hitPie()
|
|
self.nodePath.hide()
|
|
if hasattr(self, 'bnp'):
|
|
self.bnp.removeNode()
|
|
|
|
def hitSomebody(self, avId, timeStamp):
|
|
if localAvatar.doId != avId:
|
|
kart = DistributedVehicle.getKartFromAvId(avId)
|
|
if kart:
|
|
self.nodePath.hide()
|
|
if hasattr(self, 'bnp'):
|
|
self.bnp.removeNode()
|
|
kart.playSpin(timeStamp)
|
|
|
|
def setActivateTime(self, actTime):
|
|
self.activateTime = actTime
|
|
|
|
def setInitTime(self, initTime):
|
|
self.initTime = initTime
|
|
|
|
def setRace(self, doId):
|
|
self.race = base.cr.doId2do.get(doId)
|
|
|
|
def setPos(self, x, y, z):
|
|
self.pos = (x, y, z)
|
|
|
|
def makeNodePath(self):
|
|
if self.type == 0:
|
|
self.nodePath = DroppedGag(self.uniqueName('gag'), base.race.banana)
|
|
if self.billboard:
|
|
self.nodePath.setBillboardPointEye()
|
|
self.nodePath.setScale(0.9 * self.scale)
|
|
if self.type == 1:
|
|
self.nodePath = DroppedGag(self.uniqueName('gag'), base.race.banana)
|
|
if self.billboard:
|
|
self.nodePath.setBillboardPointEye()
|
|
self.nodePath.setScale(4.0 * self.scale)
|
|
|
|
def setOwnerId(self, ownerId):
|
|
self.ownerId = ownerId
|
|
|
|
def setType(self, type):
|
|
self.type = type
|