示例#1
0
 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
示例#2
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
示例#3
0
 def convert(self, data):
     if (data is None):
         return ''
     assert IdManager.is_valid_id(data), self.convert_error(data)
     return data
示例#4
0
	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
		)
示例#5
0
	def is_valid_spaceid(self, spaceid):
		return True if spaceid is None else IdManager.is_valid_id(spaceid)