def loadModels(self): self.playArea = loader.loadModel('phase_13/models/parties/partyTugOfWar') self.playArea.reparentTo(self.root) self.sign.reparentTo(self.playArea.find('**/TugOfWar_sign_locator')) self.dockPositions = [ [], []] for i in range(4): self.dockPositions[0].append(Point3(-(PartyGlobals.TugOfWarInitialToonPositionsXOffset) - PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ)) for i in range(4): self.dockPositions[1].append(Point3(PartyGlobals.TugOfWarInitialToonPositionsXOffset + PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ)) self.hopOffPositions = [ [], []] for i in range(1, 5): self.hopOffPositions[PartyGlobals.TeamActivityTeams.LeftTeam].append(self.playArea.find('**/leftTeamHopOff%d_locator' % i).getPos()) self.hopOffPositions[PartyGlobals.TeamActivityTeams.RightTeam].append(self.playArea.find('**/rightTeamHopOff%d_locator' % i).getPos()) for i in range(1, 5): pos = self.playArea.find('**/fallenToon%d_locator' % i).getPos() self.fallenPositions.append(pos) self.joinCollision = [] self.joinCollisionNodePaths = [] for i in range(len(PartyGlobals.TeamActivityTeams)): collShape = CollisionTube(PartyGlobals.TugOfWarJoinCollisionEndPoints[0], PartyGlobals.TugOfWarJoinCollisionEndPoints[1], PartyGlobals.TugOfWarJoinCollisionRadius) collShape.setTangible(True) self.joinCollision.append(CollisionNode('TugOfWarJoinCollision%d' % i)) self.joinCollision[i].addSolid(collShape) tubeNp = self.playArea.attachNewNode(self.joinCollision[i]) tubeNp.node().setCollideMask(ToontownGlobals.WallBitmask) self.joinCollisionNodePaths.append(tubeNp) self.joinCollisionNodePaths[i].setPos(PartyGlobals.TugOfWarJoinCollisionPositions[i]) self._DistributedPartyTugOfWarActivity__enableCollisions() ropeModel = loader.loadModel('phase_4/models/minigames/tug_of_war_rope') self.ropeTexture = ropeModel.findTexture('*') ropeModel.removeNode() for i in range(PartyGlobals.TugOfWarMaximumPlayersPerTeam * 2 - 1): rope = Rope(self.uniqueName('TugRope%d' % i)) if rope.showRope: rope.ropeNode.setRenderMode(RopeNode.RMBillboard) rope.ropeNode.setThickness(0.20000000000000001) rope.setTexture(self.ropeTexture) rope.ropeNode.setUvMode(RopeNode.UVDistance) rope.ropeNode.setUvDirection(1) rope.setTransparency(1) rope.setColor(0.89000000000000001, 0.89000000000000001, 0.59999999999999998, 1.0) rope.reparentTo(self.root) rope.stash() self.tugRopes.append(rope) self.splash = Splash.Splash(self.root) self.splash.setScale(2.0, 4.0, 1.0) pos = self.fallenPositions[0] self.splash.setPos(pos[0], pos[1], PartyGlobals.TugOfWarSplashZOffset) self.splash.hide()
def setup(self): # Setting the background to 'water' # .self refers back to class(linking it) ensuring it's not just global self.showbaseMain.setBackgroundColor((0, 0, 0, 1)) self.bg = self.showbaseMain.loadObject("water.jpg", scale=146, depth=200, transparency=False) # creating & positioning the green buoy self.gbuoy = self.showbaseMain.loadObject("Green_buoy.png", scale=4, depth=50) self.gbuoy.setPos(-7, 50, 7) # Second green buoy self.sgbuoy = self.showbaseMain.loadObject("Green_buoy.png", scale=4, depth=50) self.sgbuoy.setPos(9, 50, 3) # creating & positioning the red buoy self.rbuoy = self.showbaseMain.loadObject("Red_buoy.png", scale=4, depth=50) self.rbuoy.setPos(2.5, 50, -6) # Importing land self.sland = self.showbaseMain.loadObject("land.png", scale=16, depth=50) self.sland.setPos(3, 50, 9) self.sland.setR(180) self.land = self.showbaseMain.loadObject("land.png", scale=16, depth=50) self.land.setPos(-5, 50, -9) self.Finflag = self.showbaseMain.loadObject("Finflag.png", scale=4, depth=50) self.Finflag.setPos(15, 50, -10) # the 'rope' is the white line that is the # sailing course the user must follow r = Rope() r.setup(4, [(None, (-18, 0, 0)), (None, (-8, 0, -20)), (None, (-15, 0, 15)), (None, (0, 0, 10)), (None, (0, 0, -25)), (None, (10, 0, 10)), (None, (10, 0, 10)), (None, (15, 0, -10))]) r.ropeNode.setThickness(10) r.setPos(0, 55, 0) r.reparentTo(camera) self.curve = r.ropeNode.getCurve() self.curvePoints = r.getPoints(50) print(self.curvePoints)
def loadModels(self): self.playArea = loader.loadModel('phase_13/models/parties/partyTugOfWar') self.playArea.reparentTo(self.root) self.sign.reparentTo(self.playArea.find('**/TugOfWar_sign_locator')) self.dockPositions = [[], []] for i in xrange(4): self.dockPositions[0].append(Point3(-PartyGlobals.TugOfWarInitialToonPositionsXOffset - PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ)) for i in xrange(4): self.dockPositions[1].append(Point3(PartyGlobals.TugOfWarInitialToonPositionsXOffset + PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ)) self.hopOffPositions = [[], []] for i in xrange(1, 5): self.hopOffPositions[PartyGlobals.TeamActivityTeams.LeftTeam].append(self.playArea.find('**/leftTeamHopOff%d_locator' % i).getPos()) self.hopOffPositions[PartyGlobals.TeamActivityTeams.RightTeam].append(self.playArea.find('**/rightTeamHopOff%d_locator' % i).getPos()) for i in xrange(1, 5): pos = self.playArea.find('**/fallenToon%d_locator' % i).getPos() self.fallenPositions.append(pos) self.joinCollision = [] self.joinCollisionNodePaths = [] for i in xrange(len(PartyGlobals.TeamActivityTeams)): collShape = CollisionTube(PartyGlobals.TugOfWarJoinCollisionEndPoints[0], PartyGlobals.TugOfWarJoinCollisionEndPoints[1], PartyGlobals.TugOfWarJoinCollisionRadius) collShape.setTangible(True) self.joinCollision.append(CollisionNode('TugOfWarJoinCollision%d' % i)) self.joinCollision[i].addSolid(collShape) tubeNp = self.playArea.attachNewNode(self.joinCollision[i]) tubeNp.node().setCollideMask(ToontownGlobals.WallBitmask) self.joinCollisionNodePaths.append(tubeNp) self.joinCollisionNodePaths[i].setPos(PartyGlobals.TugOfWarJoinCollisionPositions[i]) self.__enableCollisions() ropeModel = loader.loadModel('phase_4/models/minigames/tug_of_war_rope') self.ropeTexture = ropeModel.findTexture('*') ropeModel.removeNode() for i in xrange(PartyGlobals.TugOfWarMaximumPlayersPerTeam * 2 - 1): rope = Rope(self.uniqueName('TugRope%d' % i)) if rope.showRope: rope.ropeNode.setRenderMode(RopeNode.RMBillboard) rope.ropeNode.setThickness(0.2) rope.setTexture(self.ropeTexture) rope.ropeNode.setUvMode(RopeNode.UVDistance) rope.ropeNode.setUvDirection(1) rope.setTransparency(1) rope.setColor(0.89, 0.89, 0.6, 1.0) rope.reparentTo(self.root) rope.stash() self.tugRopes.append(rope) self.splash = Splash.Splash(self.root) self.splash.setScale(2.0, 4.0, 1.0) pos = self.fallenPositions[0] self.splash.setPos(pos[0], pos[1], PartyGlobals.TugOfWarSplashZOffset) self.splash.hide()
def loadModels(self): # load the tug of war play area self.playArea = loader.loadModel( "phase_13/models/parties/partyTugOfWar") # reparent to the party ground root self.playArea.reparentTo(self.root) # place the activity sign self.sign.reparentTo(self.playArea.find("**/TugOfWar_sign_locator")) # define initial positions, with index 0 being closest to the other team self.dockPositions = [ [], # left team positions [], # right team positions ] for i in range(4): self.dockPositions[0].append( Point3( -PartyGlobals.TugOfWarInitialToonPositionsXOffset - PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ, )) for i in range(4): self.dockPositions[1].append( Point3( PartyGlobals.TugOfWarInitialToonPositionsXOffset + PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ, )) self.hopOffPositions = [ [], # left team positions [], # right team positions ] for i in range(1, 5): self.hopOffPositions[ PartyGlobals.TeamActivityTeams.LeftTeam].append( self.playArea.find("**/leftTeamHopOff%d_locator" % i).getPos()) self.hopOffPositions[ PartyGlobals.TeamActivityTeams.RightTeam].append( self.playArea.find("**/rightTeamHopOff%d_locator" % i).getPos()) # load positions for when toons fall into the water for i in range(1, 5): pos = self.playArea.find("**/fallenToon%d_locator" % i).getPos() self.fallenPositions.append(pos) # load collision that allows toons to play the game # create one for each dock that lets toons join a particular team self.joinCollision = [] self.joinCollisionNodePaths = [] for i in range(len(PartyGlobals.TeamActivityTeams)): collShape = CollisionTube( PartyGlobals.TugOfWarJoinCollisionEndPoints[0], PartyGlobals.TugOfWarJoinCollisionEndPoints[1], PartyGlobals.TugOfWarJoinCollisionRadius) collShape.setTangible(True) self.joinCollision.append( CollisionNode("TugOfWarJoinCollision%d" % i)) self.joinCollision[i].addSolid(collShape) tubeNp = self.playArea.attachNewNode(self.joinCollision[i]) tubeNp.node().setCollideMask(ToontownGlobals.WallBitmask) self.joinCollisionNodePaths.append(tubeNp) self.joinCollisionNodePaths[i].setPos( PartyGlobals.TugOfWarJoinCollisionPositions[i]) self.__enableCollisions() # Get the rope texture by extracting it from its model. ropeModel = loader.loadModel( "phase_4/models/minigames/tug_of_war_rope") self.ropeTexture = ropeModel.findTexture("*") ropeModel.removeNode() # create as many ropes as we will ever need for i in range(PartyGlobals.TugOfWarMaximumPlayersPerTeam * 2 - 1): rope = Rope(self.uniqueName("TugRope%d" % i)) if rope.showRope: rope.ropeNode.setRenderMode(RopeNode.RMBillboard) rope.ropeNode.setThickness(0.2) rope.setTexture(self.ropeTexture) rope.ropeNode.setUvMode(RopeNode.UVDistance) rope.ropeNode.setUvDirection(1) rope.setTransparency(1) rope.setColor(0.89, 0.89, 0.6, 1.0) rope.reparentTo(self.root) rope.stash() self.tugRopes.append(rope) # Splash object for when toon hits the water self.splash = Splash.Splash(self.root) self.splash.setScale(2.0, 4.0, 1.0) pos = self.fallenPositions[0] self.splash.setPos(pos[0], pos[1], PartyGlobals.TugOfWarSplashZOffset) self.splash.hide()
class CurveEditor(DirectObject): """ CurveEditor will create and edit the curve """ def __init__(self, editor): self.editor = editor self.i = 0 self.ropeNum = 0 self.curve = [] self.curveControl = [] self.currentRope = None self.degree = 3 def createCurve(self): if self.editor.mode == self.editor.CREATE_CURVE_MODE: self.view = self.editor.ui.currentView #Get the mouse position x = base.direct.dr.mouseX y = base.direct.dr.mouseY if self.editor.fMoveCamera == False and self.view != None: self.createControler(x,y) if self.currentRope != None: self.currentRope.detachNode() self.ropeUpdate(self.curve) self.accept("DIRECT-enter", self.onBaseMode) self.accept("DIRECT-enter", self.onBaseMode) def editCurve(self, task): if self.editor.mode == self.editor.EDIT_CURVE_MODE: if self.editor.fMoveCamera == False: self.selected = None self.selected = base.direct.selected.last if self.selected != None: for item in self.curveControl: if item[1] == self.selected: self.point = item #temporarily save the controler information for further use self.currentCurve = self.currentRope.ropeNode.getCurve() self.currentCurve.setVertex(item[0], self.selected.getPos()) self.accept("DIRECT-delete", self.onControlerDelete) return task.cont def onControlerDelete(self): if self.editor.mode == self.editor.EDIT_CURVE_MODE: self.curve.remove(self.curve[self.point[0]]) #reset the controller list for item in self.curveControl: if item[0] > self.point[0]: newname = 'controler%d' % (item[0]-1) item[1].setName(newname) self.curveControl[item[0]] = (item[0]-1, item[1]) self.curveControl.remove(self.point) self.currentRope.setup(self.degree,self.curve) def ropeUpdate(self, curve): self.currentRope = Rope() self.currentRope.setup(self.degree, curve) self.currentRope.reparentTo(render) def onBaseMode(self): self.editor.preMode = self.editor.mode self.editor.mode = self.editor.BASE_MODE self.editor.ui.editCurveMenuItem.Check(False) self.editor.ui.createCurveMenuItem.Check(False) self.i = 0 for item in self.curveControl: item[1].hide() if self.editor.preMode == self.editor.BASE_MODE : pass if self.editor.preMode == self.editor.CREATE_CURVE_MODE : self.updateScene() if self.editor.preMode == self.editor.EDIT_CURVE_MODE : self.doneEdit() self.curveControl = [] self.curve = [] self.currentRope = None base.direct.manipulationControl.enableManipulation() self.editor.ui.createCurveMenuItem.Check(False) self.editor.ui.editCurveMenuItem.Check(False) def updateScene(self): curveObjNP = self.editor.objectMgr.addNewCurve(self.curveControl, self.degree, nodePath=self.currentRope) curveObj = self.editor.objectMgr.findObjectByNodePath(curveObjNP) for item in self.curveControl: item[1].reparentTo(curveObjNP) self.editor.objectMgr.updateObjectPropValue(curveObj, 'Degree', self.degree, fSelectObject=False, fUndo=False) def doneEdit(self): base.direct.selected.last = None def createControler(self, x, y): if self.view != None: self.controler = render.attachNewNode("controler") self.controler = loader.loadModel('models/misc/smiley') controlerPathname = 'controler%d' % self.i self.controler.setName(controlerPathname) self.controler.setColor(0, 0, 0, 1) self.controler.setScale(0.2) self.controler.reparentTo(render) self.controler.setTag('OBJRoot','1') self.controler.setTag('Controller','1') #controller Tag self.i += 1 iRay = SelectionRay(self.view.camera) iRay.collider.setFromLens(self.view.camNode, x, y) iRay.collideWithBitMask(BitMask32.bit(21)) iRay.ct.traverse(self.view.collPlane) if iRay.getNumEntries() > 0: entry = iRay.getEntry(0) hitPt = entry.getSurfacePoint(entry.getFromNodePath()) if hitPt: # create a temp nodePath to get the position np = NodePath('temp') np.setPos(self.view.camera, hitPt) if base.direct.manipulationControl.fGridSnap: snappedPos = self.view.grid.computeSnapPoint(np.getPos()) np.setPos(snappedPos) # update temp nodePath's HPR and scale with newobj's np.setHpr(self.controler.getHpr()) np.setScale(self.controler.getScale()) # transform newobj to cursor position self.controler.setMat(Mat4(np.getMat())) np.remove() iRay.collisionNodePath.removeNode() del iRay self.curve.append((None, self.controler.getPos())) self.curveControl.append((self.i-1, self.controler))
class CurveEditor(DirectObject): """ CurveEditor will create and edit the curve """ def __init__(self, editor): self.editor = editor self.i = 0 self.ropeNum = 0 self.curve = [] self.curveControl = [] self.currentRope = None self.degree = 3 def createCurve(self): if self.editor.mode == self.editor.CREATE_CURVE_MODE: self.view = self.editor.ui.currentView #Get the mouse position x = base.direct.dr.mouseX y = base.direct.dr.mouseY if self.editor.fMoveCamera == False and self.view != None: self.createControler(x,y) if self.currentRope != None: self.currentRope.detachNode() self.ropeUpdate(self.curve) self.accept("DIRECT-enter", self.onBaseMode) self.accept("DIRECT-enter", self.onBaseMode) def editCurve(self, task): if self.editor.mode == self.editor.EDIT_CURVE_MODE: if self.editor.fMoveCamera == False: self.selected = None self.selected = base.direct.selected.last if self.selected != None: for item in self.curveControl: if item[1] == self.selected: self.point = item #temporarily save the controler information for further use self.currentCurve = self.currentRope.ropeNode.getCurve() self.currentCurve.setVertex(item[0], self.selected.getPos()) self.accept("DIRECT-delete", self.onControlerDelete) return task.cont def onControlerDelete(self): if self.editor.mode == self.editor.EDIT_CURVE_MODE: self.curve.remove(self.curve[self.point[0]]) #reset the controller list for item in self.curveControl: if item[0] > self.point[0]: newname = 'controler%d' % (item[0]-1) item[1].setName(newname) self.curveControl[item[0]] = (item[0]-1, item[1]) self.curveControl.remove(self.point) self.currentRope.setup(self.degree,self.curve) def ropeUpdate(self, curve): self.currentRope = Rope() self.currentRope.setup(self.degree, curve) self.currentRope.reparentTo(render) def onBaseMode(self): self.editor.preMode = self.editor.mode self.editor.mode = self.editor.BASE_MODE self.editor.ui.editCurveMenuItem.Check(False) self.editor.ui.createCurveMenuItem.Check(False) self.i = 0 for item in self.curveControl: item[1].hide() if self.editor.preMode == self.editor.BASE_MODE : pass if self.editor.preMode == self.editor.CREATE_CURVE_MODE : self.updateScene() if self.editor.preMode == self.editor.EDIT_CURVE_MODE : self.doneEdit() self.curveControl = [] self.curve = [] self.currentRope = None base.direct.manipulationControl.enableManipulation() self.editor.ui.createCurveMenuItem.Check(False) self.editor.ui.editCurveMenuItem.Check(False) def updateScene(self): curveObjNP = self.editor.objectMgr.addNewCurve(self.curveControl, self.degree, nodePath=self.currentRope) curveObj = self.editor.objectMgr.findObjectByNodePath(curveObjNP) for item in self.curveControl: item[1].reparentTo(curveObjNP) self.editor.objectMgr.updateObjectPropValue(curveObj, 'Degree', self.degree, fSelectObject=False, fUndo=False) def doneEdit(self): base.direct.selected.last = None def createControler(self, x, y): if self.view != None: self.controler = render.attachNewNode("controler") self.controler = loader.loadModel('models/misc/smiley') controlerPathname = 'controler%d' % self.i self.controler.setName(controlerPathname) self.controler.setColor(0, 0, 0, 1) self.controler.setScale(0.2) self.controler.reparentTo(render) self.controler.setTag('OBJRoot','1') self.controler.setTag('Controller','1') #controller Tag self.i += 1 iRay = SelectionRay(self.view.camera) iRay.collider.setFromLens(self.view.camNode, x, y) iRay.collideWithBitMask(BitMask32.bit(21)) iRay.ct.traverse(self.view.collPlane) if iRay.getNumEntries() > 0: entry = iRay.getEntry(0) hitPt = entry.getSurfacePoint(entry.getFromNodePath()) if hitPt: # create a temp nodePath to get the position np = NodePath('temp') np.setPos(self.view.camera, hitPt) if base.direct.manipulationControl.fGridSnap: snappedPos = self.view.grid.computeSnapPoint(np.getPos()) np.setPos(snappedPos) # update temp nodePath's HPR and scale with newobj's np.setHpr(self.controler.getHpr()) np.setScale(self.controler.getScale()) # transform newobj to cursor position self.controler.setMat(Mat4(np.getMat())) np.remove() iRay.collisionNodePath.removeNode() del iRay self.curve.append((None, self.controler.getPos())) self.curveControl.append((self.i-1, self.controler))
class DistributedDeliveryTruck(DistributedNode): notify = directNotify.newCategory('DistributedDeliveryTruck') barrelscale = 0.15 barrelpoints = [(1.05, 2.68, 0.84), (0, 2.68, 0.84), (-1.05, 2.68, 0.84), (1.05, 3.68, 0.84), (0, 3.68, 0.84), (-1.05, 3.68, 0.84), (1.05, 4.68, 0.84), (0, 4.68, 0.84), (-1.05, 4.68, 0.84), (1.05, 5.68, 0.84), (0, 5.68, 0.84), (-1.05, 5.68, 0.84), (1.05, 6.68, 0.84), (0, 6.68, 0.84), (-1.05, 6.68, 0.84), (1.05, 7.68, 0.84), (0, 7.68, 0.84), (-1.05, 7.68, 0.84)] def __init__(self, cr): DistributedNode.__init__(self, cr) self.kart = None self.rope = None self.pod = None self.barrels = [] self.numBarrels = 0 self.triggerNP = None self.mg = None return def setNumBarrels(self, num): self.numBarrels = num self.__generateBarrels() def getNumBarrels(self): return self.numBarrels def __removeAllBarrels(self): for barrel in self.barrels: barrel.removeNode() self.barrels = [] def __generateBarrels(self): self.__removeAllBarrels() for i in xrange(self.numBarrels): point = self.barrelpoints[i] barrel = loader.loadModel('phase_4/models/cogHQ/gagTank.bam') barrel.setScale(self.barrelscale) barrel.setPos(point) barrel.setH(180) barrel.reparentTo(self) self.barrels.append(barrel) def __handleTruckTrigger(self, entry): if not base.localAvatar.hasBarrel: self.sendUpdate('requestBarrel') def announceGenerate(self): DistributedNode.announceGenerate(self) self.kart = loader.loadModel('phase_6/models/karting/Kart3_Final.bam') self.kart.find('**/decals').removeNode() self.kart.reparentTo(self) self.pod = loader.loadModel('phase_4/models/minigames/pods_truck.egg') self.pod.reparentTo(self) self.pod.setScale(0.2) self.pod.setY(8.5) self.pod.setH(180) self.pod.find('**/metal_ramp').setBin('ground', 18) self.pod.find('**/metal_ramp_coll').setCollideMask( CIGlobals.FloorBitmask) self.rope = Rope() self.rope.ropeNode.setUseVertexColor(1) self.rope.setup(3, ({ 'node': self.kart, 'point': (0, 1.5, 0.7), 'color': (0, 0, 0, 1), 'thickness': 1000 }, { 'node': self.kart, 'point': (0, 1.5, 0.7), 'color': (0, 0, 0, 1), 'thickness': 1000 }, { 'node': self.pod, 'point': (0, 31, 5), 'color': (0, 0, 0, 1), 'thickness': 1000 }), []) self.rope.setH(180) self.rope.reparentTo(self) sphere = CollisionSphere(0, 0, 0, 2) sphere.setTangible(0) node = CollisionNode(self.uniqueName('truck_trigger')) node.addSolid(sphere) node.setCollideMask(CIGlobals.WallBitmask) self.triggerNP = self.attachNewNode(node) self.triggerNP.setPos(0, 8.0, 2.0) self.setScale(2.0) self.accept('enter' + self.triggerNP.node().getName(), self.__handleTruckTrigger) def disable(self): self.ignore('enter' + self.triggerNP.node().getName()) self.__removeAllBarrels() self.barrels = None self.numBarrels = None if self.rope: self.rope.removeNode() self.rope = None if self.pod: self.pod.removeNode() self.pod = None if self.kart: self.kart.removeNode() self.kart = None self.mg = None DistributedNode.disable(self) return
class DistributedDeliveryTruck(DistributedNode): notify = directNotify.newCategory('DistributedDeliveryTruck') barrelscale = 0.15 barrelpoints = [(1.05, 2.68, 0.84), (0, 2.68, 0.84), (-1.05, 2.68, 0.84), (1.05, 3.68, 0.84), (0, 3.68, 0.84), (-1.05, 3.68, 0.84), (1.05, 4.68, 0.84), (0, 4.68, 0.84), (-1.05, 4.68, 0.84), (1.05, 5.68, 0.84), (0, 5.68, 0.84), (-1.05, 5.68, 0.84), (1.05, 6.68, 0.84), (0, 6.68, 0.84), (-1.05, 6.68, 0.84), (1.05, 7.68, 0.84), (0, 7.68, 0.84), (-1.05, 7.68, 0.84)] def __init__(self, cr): DistributedNode.__init__(self, cr) self.kart = None self.rope = None self.pod = None self.barrels = [] self.numBarrels = 0 self.triggerNP = None self.mg = None return def setNumBarrels(self, num): self.numBarrels = num self.__generateBarrels() def getNumBarrels(self): return self.numBarrels def __removeAllBarrels(self): for barrel in self.barrels: barrel.removeNode() self.barrels = [] def __generateBarrels(self): self.__removeAllBarrels() for i in xrange(self.numBarrels): point = self.barrelpoints[i] barrel = loader.loadModel('phase_4/models/cogHQ/gagTank.bam') barrel.setScale(self.barrelscale) barrel.setPos(point) barrel.setH(180) barrel.reparentTo(self) self.barrels.append(barrel) def __handleTruckTrigger(self, entry): if not base.localAvatar.hasBarrel: self.sendUpdate('requestBarrel') def announceGenerate(self): DistributedNode.announceGenerate(self) self.kart = loader.loadModel('phase_6/models/karting/Kart3_Final.bam') self.kart.find('**/decals').removeNode() self.kart.reparentTo(self) self.pod = loader.loadModel('phase_4/models/minigames/pods_truck.egg') self.pod.reparentTo(self) self.pod.setScale(0.2) self.pod.setY(8.5) self.pod.setH(180) self.rope = Rope() self.rope.ropeNode.setUseVertexColor(1) self.rope.setup(3, ({'node': self.kart, 'point': (0, 1.5, 0.7), 'color': (0, 0, 0, 1), 'thickness': 1000}, {'node': self.kart, 'point': (0, 1.5, 0.7), 'color': (0, 0, 0, 1), 'thickness': 1000}, {'node': self.pod, 'point': (0, 31, 5), 'color': (0, 0, 0, 1), 'thickness': 1000}), []) self.rope.setH(180) self.rope.reparentTo(self) sphere = CollisionSphere(0, 0, 0, 2) sphere.setTangible(0) node = CollisionNode(self.uniqueName('truck_trigger')) node.addSolid(sphere) node.setCollideMask(CIGlobals.WallBitmask) self.triggerNP = self.attachNewNode(node) self.triggerNP.setPos(0, 8.0, 2.0) self.setScale(2.0) self.accept('enter' + self.triggerNP.node().getName(), self.__handleTruckTrigger) def disable(self): self.ignore('enter' + self.triggerNP.node().getName()) self.__removeAllBarrels() self.barrels = None self.numBarrels = None if self.rope: self.rope.removeNode() self.rope = None if self.pod: self.pod.removeNode() self.pod = None if self.kart: self.kart.removeNode() self.kart = None self.mg = None DistributedNode.disable(self) return