def __init__(self, entityid=''): '\n\t\t\xe8\xaf\xa5\xe5\x87\xbd\xe6\x95\xb0\xe5\xb0\x86\xe5\x88\x9d\xe5\xa7\x8b\xe5\x8c\x96\xe8\xaf\xa5\xe5\xae\x9e\xe4\xbe\x8b\xef\xbc\x8c\xe5\xb0\x86\xe5\xae\x9e\xe4\xbe\x8b\xe6\xb3\xa8\xe5\x86\x8c\xe8\x87\xb3 :class:`EntityManager`\n\n\t\t:param entityid: \xe6\xaf\x8f\xe4\xb8\xaaEntity\xe5\x94\xaf\xe4\xb8\x80\xe7\x8b\xac\xe6\x9c\x89\xe7\x9a\x84\xe6\xa0\x87\xe8\xaf\x86\xe7\xac\xa6\xe3\x80\x82\xe8\xaf\xa5\xe5\x8f\x82\xe6\x95\xb0\xe4\xb8\xbaNone\xe6\x88\x96\xe7\xbc\xba\xe7\x9c\x81\xe6\x97\xb6\xef\xbc\x8c\xe5\xb0\x86\xe7\x94\xb1 :func:`IdManager.genid` \xe7\x94\x9f\xe6\x88\x90\xe6\x96\xb0ID\xe3\x80\x82\n\t\t:type entityid: entityid/None\n\t\t' super(Entity, self).__init__() self._is_deactive = False self._is_destroyed = False self.id = (entityid or IdManager.genid()) EntityManager.addentity(self.id, self, False) self._timers = {} self._tick_timer = 0
def create_space(self, spaceid, teamid=None, controller=None): map_no = G.datam.get("scene_info").get(self.spaceno, {}).get("map_no", None) resource_name = G.datam.get("map").get(map_no, {}).get("resources", None) if not resource_name: self.logger.critical('[MEET_INVALID_MAPFILE_CONFIG] spaceno %s' % self.spaceno) return False if not self.is_valid_spaceid(spaceid): self.logger.error('[CRATE_SPACE_FAIL_MEET_INVALID_SPACEID] invalid spaceid %s' % spaceid) return False # 正在创建就继续等等, 也是成功 if self.creating.get(spaceid, False): return True # 表示创建中, 否则重复创建 self.creating[spaceid] = True # @note 这里指定一个特定的spaceid, 便于log中统计创建space的信息. # 但是self.creating中却需要使用None的spaceid, 因为这个None表示当前玩家不知道进入哪一个分线, 然后 # 也没有合适的分线进入情况下的创建, 使用None统一标记创建状态, 这样子当同时多个None实例创建的时候, # 就可以让其等待, 而不是创建多个不同的id的space if spaceid is None: spaceid = IdManager.genid() if teamid: self.team_space_mapping[teamid] = spaceid self.space_team_mapping[spaceid] = teamid if controller is None: controller = {} ServerSpace.create_space( mapfile = misc.get_mapfile(resource_name), controller = controller, spaceno = self.spaceno, spaceid = spaceid, anywhere = True ) self.logger.info('[CREATE_SPACE] space no %s - space id %s' % (self.spaceno, spaceid)) return True
def convert(self, data): if (data is None): return '' assert IdManager.is_valid_id(data), self.convert_error(data) return data
def init_from_dict(self, bdict): super(SpaceStub, self).init_from_dict(bdict) from hexm.server.utils.entity_timer_manager_wrapper import EntityTickerKeyTimerManager self._ticker_mgr = EntityTickerKeyTimerManager(self) self._ticker_mgr.run_ticker() # @TEMP 预先生成默认数量的space # @note 如果创建太快, 引擎那边会导致on_load失败, 不知道为啥, 先简单, 每隔一段时间创建一个分线 from hexm import debug_profile scene_no, count = debug_profile.get_server_default_scene_config() self._ticker_mgr.add_ticker_key_repeat_timer('create_space', 0.5, lambda : self.apply_create_space(scene_no, IdManager.genid()), run_num=count) # 自动每隔一段时间推送当前所有的分线列表信息到game进程 self._ticker_mgr.add_ticker_key_repeat_timer( space_consts.STUB_TICKER_TIMER_KEY_PUSH_SEP_LINE, space_consts.STUB_TIME_INTERVAL_PUSH_SEP_LINE, self._on_tick_send_sep_line ) # 更新世界BOSS玩法状态和同步数据 self._ticker_mgr.add_ticker_key_repeat_timer( space_consts.STUB_TICKER_TIMER_KEY_WORLD_BOSS, space_consts.STUB_TIME_INTERVAL_WORLD_BOSS, self._on_tick_world_boss )
def is_valid_spaceid(self, spaceid): return True if spaceid is None else IdManager.is_valid_id(spaceid)