def _EnterEditMode(self): if not self.colony: colony = self.GetColony(session.charid) if colony is None: self.LogInfo('No colony found, creating a blank one') colony = self.GetNewColony(session.charid) colony.SetColonyData(planet.ColonyData(session.charid, None)) self.colonies[session.charid] = colony self.colony = colony else: self.colony = colony if not self.isInEditMode: self.backupData = self.colony.colonyData.GetCopy() self.backupData.SetEventHandler(self) self.enteredEditModeTime = blue.os.GetWallclockTime() self.StopTicking() self.isInEditMode = True sm.GetService('planetUI').EnteredEditMode(self.planetID)
def GetCopy(self, eventHandler = None): newColonyData = planet.ColonyData(self.ownerID, eventHandler) newColonyData.SetLevel(self.level) for pin in self.pins.itervalues(): data = pin.Serialize(full=True) newPinID = newColonyData.RestorePinFromRow(data) for link in self.links.itervalues(): data = link.Serialize() if data.endpoint1 > data.endpoint2: data.endpoint1, data.endpoint2 = data.endpoint2, data.endpoint1 newColonyData.RestoreLinkFromRow(data) for route in self.routes.itervalues(): data = route.Serialize() newColonyData.RestoreRouteFromRow(data) return newColonyData
def CreateCommandPin(self, charID, typeID, latitude, longitude): if charID in self.colonies: colony = self.GetColony(charID) if colony is not None and colony.colonyData is not None and colony.colonyData.commandPin is not None: raise UserError('CannotBuildMultipleCommandPins') if session.shipid is None: raise UserError('CannotBuildCommandPinWithoutShip') shipInv = sm.GetService('invCache').GetInventoryFromId(session.shipid) commandCenterID = None invList = shipInv.List(const.flagSpecializedCommandCenterHold) invList.extend(shipInv.List(const.flagCargo)) for item in invList: if item.typeID == typeID: commandCenterID = item.itemID break if commandCenterID is None: raise UserError('CannotBuildCommandPin') colony = self.GetNewColony(charID) self.colonies[charID] = colony self.colony = colony colony.SetColonyData(planet.ColonyData(charID, None)) colony.ValidateCreatePin(charID, typeID, latitude, longitude) wasInEditMode = self.IsInEditMode() self._EnterEditMode() colony.colonyData.PrimePin(commandCenterID, typeID, charID, latitude, longitude) self.changes.AddCommand(planet.COMMAND_CREATEPIN, pinID=commandCenterID, typeID=typeID, latitude=latitude, longitude=longitude) self.commandPinChange = CP_COMMANDPINADDED sm.ScatterEvent('OnPlanetPinPlaced', commandCenterID) sm.ScatterEvent('OnEditModeBuiltOrDestroyed') pin = colony.GetPin(commandCenterID) pin.inEditMode = True level = sm.GetService('godma').GetTypeAttribute( typeID, const.attributeMetaLevel) colony.colonyData.SetLevel(level) return pin
def _PrimeColony(self, ownerID, serializedColony): if ownerID not in self.colonies: self.colonies[ownerID] = colony = self.GetNewColony(ownerID) else: colony = self.GetColony(ownerID) freshColonyData = planet.ColonyData(session.charid, None) colony.SetColonyData(freshColonyData) freshColonyData.SetLevel(serializedColony.level) for pin in serializedColony.pins: freshColonyData.RestorePinFromRow(pin) for linkData in serializedColony.links: freshColonyData.RestoreLinkFromRow(linkData) for route in serializedColony.routes: freshColonyData.RestoreRouteFromRow(route) colony.currentSimTime = serializedColony.currentSimTime colony.PrimeSimulation(serializedColony.currentSimTime) self.colonies[ownerID] = colony self.colony = colony return colony
def SubmitChanges(self): simulationEndTime = None if self.commandPinChange == CP_COMMANDPINREMOVED: self.remoteHandler.UserAbandonPlanet() newColonyData = planet.ColonyData(session.charid, None) self.colonies[session.charid].SetColonyData(newColonyData) else: serializedChanges = self.changes.Serialize() try: updatedColony = self.remoteHandler.UserUpdateNetwork( serializedChanges) except Exception: self.changes.LogCommandStream(self) raise self._PrimeColony(session.charid, updatedColony) if self.commandPinChange != CP_NOCHANGE: sm.GetService('neocom').Blink('factories') sm.GetService( 'planetSvc').ScatterOnPlanetCommandCenterDeployedOrRemoved( self.planetID) self._ExitEditMode() sm.ScatterEvent('OnPlanetChangesSubmitted', self.planetID)