def announceGenerate(self): # TODO - for some reason this is getting called hundreds of times when there are multiple districts DistributedObject.DistributedObject.announceGenerate(self) self.sendUpdate("enteredParty", []) globalClock.syncFrameTime() self.startPartyClock() base.localAvatar.chatMgr.chatInputSpeedChat.addInsidePartiesMenu() self.spawnTitleText() messenger.send(self.generatedEvent) if config.GetBool("show-debug-party-grid", 0): self.testGrid = NodePath("test_grid") self.testGrid.reparentTo(base.cr.playGame.hood.loader.geom) for i in xrange(len(self.grid)): for j in xrange(len(self.grid[i])): cm = CardMaker("gridsquare") np = NodePath(cm.generate()) np.setScale(12) np.setP(-90.0) np.setPos( PartyUtils.convertDistanceFromPartyGrid(j, 0) - 6.0, PartyUtils.convertDistanceFromPartyGrid(i, 1) - 6.0, 0.1, ) np.reparentTo(self.testGrid) if self.grid[i][j]: np.setColorScale(0.0, 1.0, 0.0, 1.0) else: np.setColorScale(1.0, 0.0, 0.0, 1.0)
def announceGenerate(self): #TODO - for some reason this is getting called hundreds of times when there are multiple districts DistributedObject.DistributedObject.announceGenerate(self) self.sendUpdate('enteredParty', []) globalClock.syncFrameTime() self.startPartyClock() base.localAvatar.chatMgr.chatInputSpeedChat.addInsidePartiesMenu() self.spawnTitleText() messenger.send(self.generatedEvent) if config.GetBool('show-debug-party-grid', 0): self.testGrid = NodePath('test_grid') self.testGrid.reparentTo(base.cr.playGame.hood.loader.geom) for i in range(len(self.grid)): for j in range(len(self.grid[i])): cm = CardMaker('gridsquare') np = NodePath(cm.generate()) np.setScale(12) np.setP(-90.0) np.setPos( PartyUtils.convertDistanceFromPartyGrid(j, 0) - 6.0, PartyUtils.convertDistanceFromPartyGrid(i, 1) - 6.0, 0.1) np.reparentTo(self.testGrid) if self.grid[i][j]: np.setColorScale(0.0, 1.0, 0.0, 1.0) else: np.setColorScale(1.0, 0.0, 0.0, 1.0)
def announceGenerate(self): assert(self.notify.debug("announceGenerate()")) DistributedObject.DistributedObject.announceGenerate(self) self.sendUpdate("avIdEnteredParty", [base.localAvatar.doId]) # we probably just spent a lot of time loading, so # tell globalClock to update the frame timestamp globalClock.syncFrameTime() self.startPartyClock() base.localAvatar.chatMgr.chatInputSpeedChat.addInsidePartiesMenu() self.spawnTitleText() if config.GetBool('show-debug-party-grid', 0): # Debug grid self.testGrid = NodePath("test_grid") self.testGrid.reparentTo(base.cr.playGame.hood.loader.geom) for i in range(len(self.grid)): for j in range(len(self.grid[i])): cm = CardMaker("gridsquare") np = NodePath(cm.generate()) np.setScale(12) np.setP(-90.0) np.setPos(PartyUtils.convertDistanceFromPartyGrid(j,0)-6.0, PartyUtils.convertDistanceFromPartyGrid(i,1)-6.0, 0.1) np.reparentTo(self.testGrid) if self.grid[i][j]: np.setColorScale(0.0, 1.0, 0.0, 1.0) else: np.setColorScale(1.0, 0.0, 0.0, 1.0)
def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) self.sendUpdate('enteredParty', []) globalClock.syncFrameTime() self.startPartyClock() base.localAvatar.chatMgr.chatInputSpeedChat.addInsidePartiesMenu() self.spawnTitleText() messenger.send(self.generatedEvent) if config.GetBool('show-debug-party-grid', 0): self.testGrid = NodePath('test_grid') self.testGrid.reparentTo(base.cr.playGame.hood.loader.geom) for i in range(len(self.grid)): for j in range(len(self.grid[i])): cm = CardMaker('gridsquare') np = NodePath(cm.generate()) np.setScale(12) np.setP(-90.0) np.setPos(PartyUtils.convertDistanceFromPartyGrid(j, 0) - 6.0, PartyUtils.convertDistanceFromPartyGrid(i, 1) - 6.0, 0.1) np.reparentTo(self.testGrid) if self.grid[i][j]: np.setColorScale(0.0, 1.0, 0.0, 1.0) else: np.setColorScale(1.0, 0.0, 0.0, 1.0)
class AreaMap(Map): def __init__(self, area): Map.__init__(self, "map-" + area.getName()) self.capturePoints = {} mapNode = area.getMapNode() if mapNode and not mapNode.isEmpty(): geom = mapNode.getChild(0) geom.setScale(mapNode.getScale()) geom.flattenStrong() mapNode.setScale(1) self.worldNode = mapNode self.map = self.worldNode.copyTo(NodePath()) (a, b) = self.map.getTightBounds() diff = b - a h = diff[1] w = diff[0] else: self.worldNode = area self.map = NodePath("no map found") (a, b) = self.worldNode.geom.getTightBounds() diff = b - a h = diff[1] w = diff[0] ratio = h / w if ratio < 0.98999999999999999: normalScale = 2 / w screenScale = 1 else: normalScale = 2 / h screenScale = 0.75 self.map.clearTransform() self.map.show() self.screenNode = NodePath("Minimap-screenNode") self.screenNode.setP(90) self.screenNode.setScale(screenScale * normalScale) self.screenNode.hide() self.map.reparentTo(self.screenNode) self.mapOverlay = self.map.attachNewNode("mapOverlay") self.mapOverlay.wrtReparentTo(self.screenNode) self.radarTransformNode = NodePath("radarTransform") self.radarTransformNode.setScale(self.worldNode.getScale()[0]) self.map.instanceTo(self.radarTransformNode) localAvatar.guiMgr.addMinimap(self) if self.allowOnScreen(): self.addObject(MinimapFootprint(area)) if self.allowOnScreen(): if area.getUniqueId() not in [LocationIds.RAVENS_COVE_ISLAND]: for shop in area.getShopNodes(): uid = shop.getTag("Uid") shopType = shop.getTag("ShopType") self.addObject(MinimapShop(uid, shop, shopType)) self.map.findAllMatches("**/=Holiday").stash() if base.cr.newsManager: for holiday in base.cr.newsManager.getHolidayList(): self.handleHolidayStarted(area, HolidayGlobals.getHolidayName(holiday)) self.zoomLevels = area.getZoomLevels() self.accept("landMapRadarAxisChanged", self.setRadarAxis) def destroy(self): self.ignore("landMapRadarAxisChanged") if hasattr(base, "localAvatar"): localAvatar.guiMgr.removeMinimap(self) for holiday in self.capturePoints.keys(): zones = self.capturePoints.pop(holiday, {}) for object in zones.itervalues(): self.removeObject(object) Map.destroy(self) def allowOnScreen(self): return self.map.find("minimap-card").isEmpty() def getZoomLevels(self): return self.zoomLevels def getWorldNode(self): return self.worldNode def getScreenNode(self): return self.screenNode def getOverlayNode(self): return self.mapOverlay def getCapturePoint(self, holidayId, zone): if self.capturePoints.has_key(holidayId): return self.capturePoints[holidayId][zone] def updateTask(self, task): self.update() return task.cont def update(self): for obj in self.objects: obj.updateOnMap(self) def addObject(self, object): Map.addObject(self, object) mapNode = object.getMapNode() mapNode.reparentTo(self.map, sort=object.SORT) object.getOverlayNode().reparentTo(self.mapOverlay, sort=object.SORT) object.addedToMap(self) def removeObject(self, object): Map.removeObject(self, object) object.getMapNode().detachNode() object.getOverlayNode().detachNode() object.removedFromMap(self) def updateRadarTransform(self, av): if self.radarAxis == Options.RadarAxisMap: self.radarTransformNode.setPosHprScale(-av.getPos(self.worldNode), VBase3(0), VBase3(1)) else: holdHpr = av.getHpr() av.setH(camera.getH(render) - self.worldNode.getH(render)) self.radarTransformNode.setTransform(self.worldNode.getTransform(av)) av.setHpr(holdHpr) localAvatar.guiMgr.radarGui.updateDial(self) def getRadarNode(self): return self.radarTransformNode def handleHolidayStarted(self, area, holiday): self.map.findAllMatches("**/=Holiday=%s;+s" % (holiday,)).unstash() for node in area.getCapturePointNodes(holiday): zones = self.capturePoints.setdefault(holiday, {}) zone = int(node.getTag("Zone")) if zone not in zones: object = MinimapCapturePoint(node, holiday, zone) zones[zone] = object self.addObject(object) continue handleHolidayStarted = report(types=["frameCount", "args"], dConfigParam="minimap")(handleHolidayStarted) def handleHolidayEnded(self, area, holiday, override=False): if holiday in InvasionGlobals.INVASION_IDS and not override: taskMgr.doMethodLater(10, self.handleInvasionEnded, "handleInvasionEnded", extraArgs=[area, holiday]) else: self.map.findAllMatches("**/=Holiday=%s;+s" % (holiday,)).stash() for object in self.capturePoints.pop(holiday, {}).itervalues(): self.removeObject(object) handleHolidayEnded = report(types=["frameCount", "args"], dConfigParam="minimap")(handleHolidayEnded) def handleInvasionEnded(self, area, holiday): if not localAvatar.guiMgr.invasionScoreboard: self.map.findAllMatches("**/=Holiday=%s;+s" % (holiday,)).stash() for object in self.capturePoints.pop(holiday, {}).itervalues(): self.removeObject(object)
class AreaMap(Map): def __init__(self, area): Map.__init__(self, 'map-' + area.getName()) self.capturePoints = { } mapNode = area.getMapNode() if mapNode and not mapNode.isEmpty(): geom = mapNode.getChild(0) geom.setScale(mapNode.getScale()) geom.flattenStrong() mapNode.setScale(1) self.worldNode = mapNode self.map = self.worldNode.copyTo(NodePath()) (a, b) = self.map.getTightBounds() diff = b - a h = diff[1] w = diff[0] else: self.worldNode = area self.map = NodePath('no map found') (a, b) = self.worldNode.geom.getTightBounds() diff = b - a h = diff[1] w = diff[0] ratio = h / w if ratio < 0.98999999999999999: normalScale = 2 / w screenScale = 1 else: normalScale = 2 / h screenScale = 0.75 self.map.clearTransform() self.map.show() self.screenNode = NodePath('Minimap-screenNode') self.screenNode.setP(90) self.screenNode.setScale(screenScale * normalScale) self.screenNode.hide() self.map.reparentTo(self.screenNode) self.mapOverlay = self.map.attachNewNode('mapOverlay') self.mapOverlay.wrtReparentTo(self.screenNode) self.radarTransformNode = NodePath('radarTransform') self.radarTransformNode.setScale(self.worldNode.getScale()[0]) self.map.instanceTo(self.radarTransformNode) localAvatar.guiMgr.addMinimap(self) if self.allowOnScreen(): self.addObject(MinimapFootprint(area)) self.shops = set() if self.allowOnScreen(): if area.getUniqueId() not in [ LocationIds.RAVENS_COVE_ISLAND]: for shop in area.getShopNodes(): uid = shop.getTag('Uid') shopType = shop.getTag('ShopType') self.addObject(MinimapShop(uid, shop, shopType)) self.map.findAllMatches('**/=Holiday').stash() if base.cr.newsManager: for holiday in base.cr.newsManager.getHolidayList(): self.handleHolidayStarted(area, HolidayGlobals.getHolidayName(holiday)) self.zoomLevels = area.getZoomLevels() self.accept('landMapRadarAxisChanged', self.setRadarAxis) def destroy(self): self.ignore('landMapRadarAxisChanged') if hasattr(base, 'localAvatar'): localAvatar.guiMgr.removeMinimap(self) for shop in self.shops: self.removeObject(shop) self.shops = set() for holiday in self.capturePoints.keys(): zones = self.capturePoints.pop(holiday, { }) for object in zones.itervalues(): self.removeObject(object) Map.destroy(self) def allowOnScreen(self): return self.map.find('minimap-card').isEmpty() def getZoomLevels(self): return self.zoomLevels def getWorldNode(self): return self.worldNode def getScreenNode(self): return self.screenNode def getOverlayNode(self): return self.mapOverlay def getCapturePoint(self, holidayId, zone): if self.capturePoints.has_key(holidayId): return self.capturePoints[holidayId][zone] def updateTask(self, task): self.update() return task.cont def update(self): for obj in self.objects: obj.updateOnMap(self) def addObject(self, object): Map.addObject(self, object) mapNode = object.getMapNode() mapNode.reparentTo(self.map, sort = object.SORT) object.getOverlayNode().reparentTo(self.mapOverlay, sort = object.SORT) object.addedToMap(self) def removeObject(self, object): Map.removeObject(self, object) object.getMapNode().detachNode() object.getOverlayNode().detachNode() object.removedFromMap(self) def updateRadarTransform(self, av): if self.radarAxis == Options.RadarAxisMap: self.radarTransformNode.setPosHprScale(-av.getPos(self.worldNode), VBase3(0), VBase3(1)) else: holdHpr = av.getHpr() av.setH(camera.getH(render) - self.worldNode.getH(render)) self.radarTransformNode.setTransform(self.worldNode.getTransform(av)) av.setHpr(holdHpr) localAvatar.guiMgr.radarGui.updateDial(self) def getRadarNode(self): return self.radarTransformNode def handleHolidayStarted(self, area, holiday): self.map.findAllMatches('**/=Holiday=%s;+s' % (holiday,)).unstash() for node in area.getCapturePointNodes(holiday): zones = self.capturePoints.setdefault(holiday, { }) zone = int(node.getTag('Zone')) if zone not in zones: object = MinimapCapturePoint(node, holiday, zone) zones[zone] = object self.addObject(object) continue handleHolidayStarted = report(types = [ 'frameCount', 'args'], dConfigParam = 'minimap')(handleHolidayStarted) def handleHolidayEnded(self, area, holiday, override = False): if holiday in InvasionGlobals.INVASION_IDS and not override: taskMgr.doMethodLater(10, self.handleInvasionEnded, 'handleInvasionEnded', extraArgs = [ area, holiday]) else: self.map.findAllMatches('**/=Holiday=%s;+s' % (holiday,)).stash() for object in self.capturePoints.pop(holiday, { }).itervalues(): self.removeObject(object) handleHolidayEnded = report(types = [ 'frameCount', 'args'], dConfigParam = 'minimap')(handleHolidayEnded) def handleInvasionEnded(self, area, holiday): if not localAvatar.guiMgr.invasionScoreboard: self.map.findAllMatches('**/=Holiday=%s;+s' % (holiday,)).stash() for object in self.capturePoints.pop(holiday, { }).itervalues(): self.removeObject(object)
class Entity(DirectObject, object): def __init__(self, model = None): self.prime = None if model != None: self.set_model(model) def get_model(self): return self.prime def set_model(self, model): if model != None: if isinstance(model, PandaNode): self.prime = NodePath(model) elif isinstance(model, NodePath): self.prime = model else: if Filename(model).exists(): self.model = Filename(model).getBasenameWoExtension() path = model else: if isinstance(model, Filename): self.model = model.getBasenameWoExtension() path = model.getFullpath() else: path = APP_PATH + model print "path: ", path if Filename(path).exists(): pass elif Filename(path + ".bam").exists(): path += ".bam" elif Filename(path + ".bam.pz").exists(): path += ".bam.pz" elif Filename(path + ".egg").exists(): path += ".egg" elif Filename(path + ".egg.pz").exists(): path += ".egg.pz" elif Filename(path + ".x").exists(): path += ".x" else: print ":object(error): can't find model", model, "!" # Probably shouldn't exit because of this sys.exit(1) self.model = model self.prime = base.loader.loadModel(path) if self.prime == None: print ":object(error): can't load model", model, "!" # Probably shouldn't exit because of this sys.exit(1) def getX(self): return self.prime.getX(base.render) def getY(self): return self.prime.getY(base.render) def getZ(self): return self.prime.getZ(base.render) def getH(self): return self.prime.getH(base.render) def getP(self): return self.prime.getP(base.render) def getR(self): return self.prime.getR(base.render) def getSx(self): return self.prime.getSx(base.render) def getSy(self): return self.prime.getSy(base.render) def getSz(self): return self.prime.getSz(base.render) def getPos(self): return self.prime.getPos(base.render) def getHpr(self): return self.prime.getHpr(base.render) def getScale(self): return self.prime.getScale(base.render) def getCollideMask(self): return self.prime.getCollideMask() def getTransparency(self): return self.prime.getTransparency() def getTwoSided(self): return self.prime.getTwoSided() def getParent(self): return self.prime.getParent() def setX(self, *v): self.prime.setX(*v) def setY(self, *v): self.prime.setY(*v) def setZ(self, *v): self.prime.setZ(*v) def setH(self, *v): self.prime.setH(*v) def setP(self, *v): self.prime.setP(*v) def setR(self, *v): self.prime.setR(*v) def setSx(self, *v): self.prime.setSx(*v) def setSy(self, *v): self.prime.setSy(*v) def setSz(self, *v): self.prime.setSz(*v) def setPos(self, *v): self.prime.setPos(*v) def setHpr(self, *v): self.prime.setHpr(*v) def setScale(self, *v): self.prime.setScale(*v) def setCollideMask(self, *v): self.prime.setCollideMask(*v) def setTransparency(self, *v): self.prime.setTransparency(*v) def setTwoSided(self, *v): self.prime.setTwoSided(*v) def removeNode(self): self.prime.removeNode() def reparentTo(self, parent): if isinstance(parent, Entity): parent = parent.prime if isinstance(parent, str): if parent.startswith("render/"): parent = parent[7:] tv = parent parent = base.render.find(tv) if parent == NodePath(): parent = base.render.find("**/" + tv) if parent != NodePath() and parent != None: self.prime.reparentTo(parent) def wrtReparentTo(self, parent): if isinstance(parent, Entity): parent = parent.prime if isinstance(parent, str): if parent.startswith("render/"): parent = parent[7:] tv = parent parent = base.render.find(tv) if parent == NodePath(): parent = base.render.find("**/" + tv) if parent != NodePath(): self.prime.reparentTo(parent) def attachTo(self, parent): """This attaches the object to another object/nodepath. The caller object stays at the same place, with the same scale and rotation, but they become relative to the other object/nodepath. This is useful with for example a character that steps onto a moving ship or so.""" if isinstance(parent, Entity): parent = parent.prime if isinstance(parent, str): if(parent.startswith("render/")): parent = parent[7:] tv = parent parent = base.render.find(tv) if(parent == NodePath()): parent = base.render.find("**/" + tv) if(parent != NodePath()): self.prime.setPos(self.prime.getPos(parent)) self.prime.setHpr(self.prime.getHpr(parent)) self.prime.setScale(self.prime.getScale(parent)) self.prime.reparentTo(parent) def hide(self): self.prime.hide() def show(self): self.prime.show() def __del__(self): try: if isinstance(self.prime, NodePath): self.prime.removeNode() except AttributeError: pass def __getstate__(self): return [self.model, self.getX(), self.getY(), self.getZ(), self.getH(), self.getP(), self.getR(), self.getSx(), self.getSy(), self.getSz(), self.getCollideMask().getWord(), self.getTransparency(), self.getTwoSided(), str(self.getParent())] def __setstate__(self, p): if len(p) < 14: print ":object(error): This state is not compatible with this version!" sys.exit(1) self.setModel(p[0]) self.setX(p[1]) self.setY(p[2]) self.setZ(p[3]) self.setH(p[4]) self.setP(p[5]) self.setR(p[6]) self.setSx(p[7]) self.setSy(p[8]) self.setSz(p[9]) self.setCollideMask(BitMask32(p[10])) self.setTransparency(p[11]) self.setTwoSided(p[12]) self.reparentTo(p[13])