126 lines
4.6 KiB
Python
126 lines
4.6 KiB
Python
from toontown.toonbase.ToontownGlobals import *
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.distributed.ClockDelta import *
|
|
from toontown.catalog import CatalogItem
|
|
from toontown.toonbase import ToontownGlobals
|
|
from direct.distributed import DistributedObject
|
|
from toontown.toonbase import TTLocalizer
|
|
import DistributedHouseItem
|
|
from direct.distributed import DistributedSmoothNode
|
|
from direct.task import Task
|
|
import HouseGlobals
|
|
|
|
class DistributedFurnitureItem(DistributedHouseItem.DistributedHouseItem, DistributedSmoothNode.DistributedSmoothNode):
|
|
notify = directNotify.newCategory('DistributedFurnitureItem')
|
|
def __init__(self, cr):
|
|
DistributedHouseItem.DistributedHouseItem.__init__(self, cr)
|
|
DistributedSmoothNode.DistributedSmoothNode.__init__(self, cr)
|
|
NodePath.__init__(self)
|
|
self.localControl = True
|
|
self.__broadcastFrequency = 0.25
|
|
self.__adjustStarted = 0
|
|
self.furnitureMgr = None
|
|
self.transmitRelativeTo = None
|
|
return
|
|
|
|
def generate(self):
|
|
DistributedHouseItem.DistributedHouseItem.generate(self)
|
|
DistributedSmoothNode.DistributedSmoothNode.generate(self)
|
|
self.__taskName = self.taskName('sendRequestPosHpr')
|
|
|
|
def announceGenerate(self):
|
|
DistributedHouseItem.DistributedHouseItem.announceGenerate(self)
|
|
DistributedSmoothNode.DistributedSmoothNode.announceGenerate(self)
|
|
self.load()
|
|
|
|
def load(self):
|
|
pass
|
|
|
|
def disable(self):
|
|
taskMgr.remove(self.__taskName)
|
|
self.stopSmooth()
|
|
self.furnitureMgr.dfitems.remove(self)
|
|
self.furnitureMgr = None
|
|
DistributedHouseItem.DistributedHouseItem.disable(self)
|
|
DistributedSmoothNode.DistributedSmoothNode.disable(self)
|
|
return
|
|
|
|
def delete(self):
|
|
self.removeNode()
|
|
del self.item
|
|
DistributedHouseItem.DistributedHouseItem.delete(self)
|
|
DistributedSmoothNode.DistributedSmoothNode.delete(self)
|
|
|
|
def setItem(self, furnitureMgrId, blob):
|
|
self.furnitureMgr = self.cr.doId2do.get(furnitureMgrId)
|
|
if self.furnitureMgr:
|
|
self.furnitureMgr.dfitems.append(self)
|
|
self.item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
|
|
self.assign(self.loadModel())
|
|
interior = self.furnitureMgr.getInteriorObject()
|
|
self.reparentTo(interior.interior)
|
|
|
|
def loadModel(self):
|
|
return self.item.loadModel()
|
|
|
|
def startAdjustPosHpr(self):
|
|
if self.__adjustStarted:
|
|
return
|
|
self.__adjustStarted = 1
|
|
self.clearSmoothing()
|
|
taskMgr.remove(self.__taskName)
|
|
posHpr = self.__getPosHpr()
|
|
self.__oldPosHpr = posHpr
|
|
self.sendRequestPosHpr(0, *posHpr)
|
|
taskMgr.doMethodLater(self.__broadcastFrequency, self.__posHprBroadcast, self.__taskName)
|
|
|
|
def __posHprBroadcast(self, task):
|
|
posHpr = self.__getPosHpr()
|
|
if not self.__comparePosHpr(posHpr, self.__oldPosHpr, 0.1):
|
|
pass
|
|
else:
|
|
self.__oldPosHpr = posHpr
|
|
self.sendRequestPosHpr(0, *posHpr)
|
|
taskMgr.doMethodLater(self.__broadcastFrequency, self.__posHprBroadcast, self.__taskName)
|
|
return Task.done
|
|
|
|
def stopAdjustPosHpr(self):
|
|
if not self.__adjustStarted:
|
|
return
|
|
self.__adjustStarted = 0
|
|
taskMgr.remove(self.__taskName)
|
|
posHpr = self.__getPosHpr()
|
|
self.sendRequestPosHpr(1, *posHpr)
|
|
del self.__oldPosHpr
|
|
|
|
def sendRequestPosHpr(self, final, x, y, z, h, p, r):
|
|
t = globalClockDelta.getFrameNetworkTime()
|
|
self.sendUpdate('requestPosHpr', (final, x, y, z, h, 0, 0, t))
|
|
|
|
def setMode(self, mode, avId):
|
|
if mode == HouseGlobals.FURNITURE_MODE_START:
|
|
if avId != base.localAvatar.getDoId():
|
|
self.startSmooth()
|
|
elif mode == HouseGlobals.FURNITURE_MODE_STOP:
|
|
if avId != base.localAvatar.getDoId():
|
|
self.stopSmooth()
|
|
elif mode == HouseGlobals.FURNITURE_MODE_OFF:
|
|
pass
|
|
else:
|
|
self.notify.warning('setMode: unknown mode: %s avId: %s' % (mode, avId))
|
|
|
|
def __getPosHpr(self):
|
|
if self.transmitRelativeTo == None:
|
|
pos = self.getPos()
|
|
hpr = self.getHpr()
|
|
else:
|
|
pos = self.getPos(self.transmitRelativeTo)
|
|
hpr = self.getHpr(self.transmitRelativeTo)
|
|
return (pos[0], pos[1], pos[2], hpr[0], 0, 0)
|
|
|
|
def __comparePosHpr(self, a, b, threshold):
|
|
for i in xrange(len(a)):
|
|
if abs(a[i] - b[i]) >= threshold:
|
|
return 1
|
|
|
|
return 0
|