toontown-just-works/toontown/racing/DistributedGag.py
2024-07-07 18:08:39 -05:00

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