125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
from math import *
|
|
import math
|
|
import random
|
|
|
|
from StomperGlobals import *
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed import ClockDelta
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.showbase.PythonUtil import lerp
|
|
from direct.task import Task
|
|
from otp.level import BasicEntities
|
|
from panda3d.core import *
|
|
from pandac.PandaModules import NodePath
|
|
|
|
|
|
class DistributedMover(BasicEntities.DistributedNodePathEntity):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedMover')
|
|
laserFieldModels = ['phase_9/models/cogHQ/square_stomper']
|
|
|
|
def __init__(self, cr):
|
|
BasicEntities.DistributedNodePathEntity.__init__(self, cr)
|
|
self.attachedEnt = None
|
|
self.oldParent = None
|
|
self.entity2Move = None
|
|
self.moveTarget = None
|
|
self.pos0Wait = 1.0
|
|
self.pos0Move = 1.0
|
|
self.pos1Wait = 1.0
|
|
self.pos1Move = 1.0
|
|
self.moverIval = None
|
|
|
|
def generateInit(self):
|
|
self.notify.debug('generateInit')
|
|
BasicEntities.DistributedNodePathEntity.generateInit(self)
|
|
|
|
def generate(self):
|
|
self.notify.debug('generate')
|
|
BasicEntities.DistributedNodePathEntity.generate(self)
|
|
|
|
def announceGenerate(self):
|
|
self.notify.debug('announceGenerate')
|
|
BasicEntities.DistributedNodePathEntity.announceGenerate(self)
|
|
self.loadModel()
|
|
|
|
def disable(self):
|
|
self.notify.debug('disable')
|
|
self.ignoreAll()
|
|
taskMgr.remove(self.taskName)
|
|
BasicEntities.DistributedNodePathEntity.disable(self)
|
|
|
|
def delete(self):
|
|
self.notify.debug('delete')
|
|
if self.moverIval:
|
|
self.moverIval.finish()
|
|
self.unloadModel()
|
|
if self.taskName:
|
|
taskMgr.remove(self.taskName)
|
|
BasicEntities.DistributedNodePathEntity.delete(self)
|
|
|
|
def loadModel(self):
|
|
self.moverNode = self.attachNewNode('mover')
|
|
self.rotateNode = self.attachNewNode('rotate')
|
|
self.model = None
|
|
if self.entity2Move:
|
|
self.setEntity2Move(self.entity2Move)
|
|
self.taskName = 'moverUpdate %s' % self.doId
|
|
return
|
|
|
|
def unloadModel(self):
|
|
if self.model:
|
|
self.model.removeNode()
|
|
del self.model
|
|
self.model = None
|
|
return
|
|
|
|
def setEntity2Move(self, entId):
|
|
self.entity2Move = entId
|
|
if entId:
|
|
ent = self.level.getEntity(entId)
|
|
if ent:
|
|
if self.attachedEnt and not self.attachedEnt.isEmpty():
|
|
self.attachedEnt.reparentTo(self.oldParent)
|
|
self.oldParent = ent.getParent()
|
|
ent.reparentTo(self.moverNode)
|
|
self.attachedEnt = ent
|
|
|
|
def startMove(self, timeStamp):
|
|
currentTime = ClockDelta.globalClockDelta.getRealNetworkTime()
|
|
timeDiff = (currentTime - timeStamp) / 1000.0
|
|
target = self.level.getEntity(self.moveTarget)
|
|
if not target:
|
|
return
|
|
okay2Play = 1
|
|
if self.moverIval:
|
|
self.moverIval.finish()
|
|
if self.moverIval.isPlaying():
|
|
okay2Play = 0
|
|
if okay2Play and self.moveTarget:
|
|
childList = self.getChildren()
|
|
for child in childList:
|
|
if child != self.moverNode:
|
|
child.reparentTo(self.moverNode)
|
|
|
|
timeLag = 0.0
|
|
timeJump = self.pos0Move - timeDiff
|
|
if timeJump < 0 or self.cycleType in 'linear':
|
|
timeJump = self.pos0Move
|
|
timeLag = timeDiff
|
|
myBlend = 'easeInOut'
|
|
if self.cycleType in 'linear':
|
|
myBlend = 'noBlend'
|
|
self.moverIval = Sequence()
|
|
firstIVal = LerpPosHprInterval(self.moverNode, timeJump, Vec3(target.getPos(self)[0], target.getPos(self)[1], target.getPos(self)[2]), Vec3(target.getHpr(self)[0], target.getHpr(self)[1], target.getHpr(self)[2]), blendType=myBlend, fluid=1)
|
|
self.moverIval.append(firstIVal)
|
|
if self.cycleType in 'linear':
|
|
for linearCycle in xrange(10):
|
|
self.moverIval.append(firstIVal)
|
|
|
|
if self.cycleType != 'oneWay':
|
|
self.moverIval.append(Wait(self.pos1Wait))
|
|
self.moverIval.append(LerpPosHprInterval(self.moverNode, self.pos1Move, Vec3(0, 0, 0), Vec3(0, 0, 0), blendType=myBlend, fluid=1))
|
|
if self.cycleType == 'loop':
|
|
self.moverIval.append(Wait(self.pos0Wait))
|
|
self.moverIval.start()
|
|
self.moverIval.setT(timeLag)
|