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

143 lines
4.5 KiB
Python

from otp.ai.AIBase import *
from toontown.toonbase.ToontownGlobals import *
from toontown.racing.KartDNA import *
from direct.distributed.ClockDelta import *
from direct.distributed import DistributedSmoothNodeAI
from direct.fsm import FSM
from direct.task import Task
from direct.distributed.PyDatagram import *
class DistributedVehicleAI(DistributedSmoothNodeAI.DistributedSmoothNodeAI, FSM.FSM):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedVehicleAI')
def __init__(self, air, avId):
self.ownerId = avId
DistributedSmoothNodeAI.DistributedSmoothNodeAI.__init__(self, air)
FSM.FSM.__init__(self, 'DistributedVehicleAI')
self.driverId = 0
self.kartDNA = [-1] * getNumFields()
self.__initDNA()
self.request('Off')
def generate(self):
DistributedSmoothNodeAI.DistributedSmoothNodeAI.generate(self)
def delete(self):
DistributedSmoothNodeAI.DistributedSmoothNodeAI.delete(self)
def __initDNA(self):
owner = self.air.doId2do.get(self.ownerId)
if owner:
self.kartDNA[KartDNA.bodyType] = owner.getKartBodyType()
self.kartDNA[KartDNA.bodyColor] = owner.getKartBodyColor()
self.kartDNA[KartDNA.accColor] = owner.getKartAccessoryColor()
self.kartDNA[KartDNA.ebType] = owner.getKartEngineBlockType()
self.kartDNA[KartDNA.spType] = owner.getKartSpoilerType()
self.kartDNA[KartDNA.fwwType] = owner.getKartFrontWheelWellType()
self.kartDNA[KartDNA.bwwType] = owner.getKartBackWheelWellType()
self.kartDNA[KartDNA.rimsType] = owner.getKartRimType()
self.kartDNA[KartDNA.decalType] = owner.getKartDecalType()
else:
self.notify.warning('__initDNA - OWNER %s OF KART NOT FOUND!' % self.ownerId)
def d_setState(self, state, avId):
self.sendUpdate('setState', [state, avId])
def requestControl(self):
avId = self.air.getAvatarIdFromSender()
accId = self.air.getAccountIdFromSender()
if self.driverId == 0:
self.request('Controlled', avId, accId)
def requestParked(self):
avId = self.air.getAvatarIdFromSender()
if avId == self.driverId:
self.request('Parked')
def start(self):
self.request('Parked')
def enterOff(self):
return None
def exitOff(self):
return None
def enterParked(self):
self.driverId = 0
self.d_setState('P', 0)
return None
def exitParked(self):
return None
def enterControlled(self, avId, accId):
self.driverId = avId
fieldList = ['setComponentL',
'setComponentX',
'setComponentY',
'setComponentZ',
'setComponentH',
'setComponentP',
'setComponentR',
'setComponentT',
'setSmStop',
'setSmH',
'setSmZ',
'setSmXY',
'setSmXZ',
'setSmPos',
'setSmHpr',
'setSmXYH',
'setSmXYZH',
'setSmPosHpr',
'setSmPosHprL',
'clearSmoothing',
'suggestResync',
'returnResync']
#self.air.setAllowClientSend(avId, self, fieldList, accId)
#hack until CLIENTAGENT_SET_FIELDS_SENDABLE works
#probably should not be kept for any longer than it needs to
dg = PyDatagram()
dg.addServerHeader(self.doId, self.air.ourChannel, STATESERVER_OBJECT_SET_OWNER)
dg.addUint64(accId << 32 | avId)
self.air.send(dg)
self.d_setState('C', self.driverId)
def exitControlled(self):
pass
def handleUnexpectedExit(self):
self.notify.warning('toon: %d exited unexpectedly, resetting vehicle %d' % (self.driverId, self.doId))
self.request('Parked')
self.requestDelete()
def getBodyType(self):
return self.kartDNA[KartDNA.bodyType]
def getBodyColor(self):
return self.kartDNA[KartDNA.bodyColor]
def getAccessoryColor(self):
return self.kartDNA[KartDNA.accColor]
def getEngineBlockType(self):
return self.kartDNA[KartDNA.ebType]
def getSpoilerType(self):
return self.kartDNA[KartDNA.spType]
def getFrontWheelWellType(self):
return self.kartDNA[KartDNA.fwwType]
def getBackWheelWellType(self):
return self.kartDNA[KartDNA.bwwType]
def getRimType(self):
return self.kartDNA[KartDNA.rimsType]
def getDecalType(self):
return self.kartDNA[KartDNA.decalType]
def getOwner(self):
return self.ownerId