def __init__(self, game): self.game = game self.frame = Frame(self.game, True) self._back_button = Button( (self.game.width - 200) / 2, 100, 200, 40, resource_pack.get_translation('game.gui.pause_menu.back_to_game')) self._exit_button = Button( (self.game.width - 200) / 2, 150, 200, 40, resource_pack.get_translation('game.gui.pause_menu.exit')) def on_back_press(): schedule_once(lambda dt: self.game.toggle_gui(), 0.1) def on_exit_press(): self.game.save(0) self.game.on_close() exit(0) def on_resize(width, height): h = get_size()[1] self._back_button.x = (self.game.width - 200) / 2 self._back_button.y = 100 self._exit_button.x = (self.game.width - 200) / 2 self._exit_button.y = 150 self.frame.add_widget(self._back_button) self.frame.add_widget(self._exit_button) self.frame.register_event('resize', on_resize) self._back_button.register_event('press', on_back_press) self._exit_button.register_event('press', on_exit_press)
def valid(self, value): try: return int(value) - (1 if self.axis == 'y' else 0) except: if value.startswith('~'): if value == '~': return int( round(get_game().player['position'] [ord(self.axis) - 120])) - (1 if self.axis == 'y' else 0) try: delta = int(value[1:]) - (1 if self.axis == 'y' else 0) except: raise TypeError( resource_pack.get_translation( 'command.args.position.wrong') % value) else: return (int( round(get_game().player['position'][ord(self.axis) - 120] + delta)) - (1 if self.axis == 'y' else 0)) else: raise TypeError( resource_pack.get_translation( 'command.args.position.wrong') % value)
def add_block(self, position, block, immediate=True, record=True): """ 在 position 处添加一个方块 :param: pssition 长度为3的元组, 要添加方块的位置 :param: block 方块 :param: immediate 是否立即绘制方块 :param: record 是否记录方块更改(在生成地形时不记录) """ if position in self.world: self.remove_block(position, immediate, record=False) if -64 <= position[1] < 512: # 建筑限制为-64格以上, 512格以下 if record == True: self.change[pos2str(position)] = block if block in blocks: self.world[position] = blocks[block] self.world[position].on_build(position) self.world[position].position = position else: # 将不存在的方块替换为 missing self.world[position] = blocks['missing'] self.sectors.setdefault(sectorize(position), []).append(position) if self.exposed(position): self.show_block(position) if not self.world[position].transparent: self.check_neighbors(position) else: if position[1] >= 512: get_game().dialogue.add_dialogue(resource_pack.get_translation('game.text.build_out_of_world')[0] % 512) else: get_game().dialogue.add_dialogue(resource_pack.get_translation('game.text.build_out_of_world')[1])
def draw_label(self): if not self.is_init: if self.exclusive: self.dialogue.draw() if self.debug['debug'] and self.exclusive: x, y, z = self.player['position'] rx, ry = self.player['rotation'] mem = round( psutil.Process(os.getpid()).memory_full_info()[0] / 1048576, 2) fps = pyglet.clock.get_fps() text = '\n'.join( resource_pack.get_translation('game.text.debug')) text = text.replace('%(version)', VERSION['str']).replace( '%(info)', ', '.join(self._info_ext)) text = text.replace('%(xyz)', '%.1f, %.1f, %.1f' % (x, y, z)).replace( '%(rot)', '%.2f, %.2f' % (rx, ry)) text = text.replace('%(mem)', '%.2f' % mem).replace( '%(fps)', '%d' % fps) self.label['top'].text = text self.label['top'].draw() else: # 初始化屏幕 self.loading.draw()
class CommandWeather(CommandBase): formats = [ ArgumentCollection(type=StringArgument()), ArgumentCollection(type=StringArgument(), duration=NumberArgument(min_=0)) ] description = [ resource_pack.get_translation('command.name.weather.help'), '/weather <string:type> [int:duration]' ] def execute(self): self.weather = {'now': '', 'duration': 0} if self.args['type'] in weather: self.weather['now'] = self.args['type'] else: self.game.dialogue.add_dialogue( resource_pack.get_translation( 'command.name.weather.none_exist') % self.args['type']) return if 'duration' in self.args: duration = weather[self.args['type']].duration self.weather['duration'] = min( max(duration[0], self.args['duration']), duration[1]) else: self.weather['duration'] = random.randint( *weather[self.args['type']].duration) weather[self.game.weather['now']].leave() self.game.weather = self.weather weather[self.game.weather['now']].change()
def valid(self, value): if value in blocks: return value else: raise TypeError( resource_pack.get_translation('command.args.block.wrong') % value)
class CommandTime(CommandBase): formats = [ ArgumentCollection(), ArgumentCollection(op=StringArgument('^(add|set)$'), time=NumberArgument(min_=0)), ArgumentCollection(op=StringArgument('set'), time=StringArgument('^(day|noon|night)$')) ] description = [ resource_pack.get_translation('command.name.time.help'), '/time', '/time add <int:second>', '/time set <int:time>', '/time set <str:day|noon|night>' ] def execute(self): if 'op' not in self.args: self.game.dialogue.add_dialogue(str(int(self.game.time))) else: if self.args['op'] == 'add': self.game.time += self.args['time'] elif self.args['op'] == 'set': if isinstance(self.args['time'], int): self.game.time = self.args['time'] elif isinstance(self.args['time'], str): d = {'day': 300, 'noon': 600, 'night': 900} self.game.time = int( self.game.time) // 1200 * 1200 + d[self.args['time']] change_sky_color(0)
def die(self, reason): if not self._data['die']: self._data['die'] = True self._data['die_reason'] = resource_pack.get_translation( reason) % player['name'] get_game().dialogue.add_dialogue(self._data['die_reason']) get_game().toggle_gui() get_game().toggle_gui('die')
def valid(self, value): if value == 'true': return True elif value == 'false': return False else: raise TypeError( resource_pack.get_translation('command.args.boolean.wrong') % value)
def valid(self, value): if '=' in value: key, value = value.split('=', 1) if len(key) < 1: raise TypeError( resource_pack.get_translation('command.args.dict.wrong') % key) else: return {key: self.argument(value)}
def valid(self, value): if self.re_expr: if re.match(self.re_expr, value): return value else: raise TypeError( resource_pack.get_translation( 'command.args.string.not_available') % value) else: return value
def __init__(self, game): self.game = game self.frame = Frame(self.game, True) self.frame.set_background_color((220, 0, 0, 100)) self._text_die = ColorLabel( text=resource_pack.get_translation('game.text.die'), x=self.game.width / 2, y=0.8 * self.game.height, font_size=42, anchor_x='center', anchor_y='center') self._text_reason = ColorLabel(text=get_game().player['die_reason'], anchor_x='center', anchor_y='center', x=self.game.width / 2, y=0.7 * self.game.height, font_size=15) self._respawn = Button( ((self.game.width - 200) / 2), 0.7 * self.game.height, 200, 40, resource_pack.get_translation('game.text.respawn')) def on_press(): self.game.player['die'] = False self.game.player['position'] = self.game.player['respawn_position'] self.game.toggle_gui() def on_resize(width, height): self._text_die.x = width / 2 self._text_die.y = 0.8 * height self._text_reason.x = width / 2 self._text_reason.y = 0.7 * height self._respawn.x = (width - 200) / 2 self._respawn.y = 0.7 * height def on_die(): self._text_reason.text = get_game().player['die_reason'] self.frame.add_widget(self._text_die) self.frame.add_widget(self._text_reason) self.frame.add_widget(self._respawn) get_game().register_event('die', on_die) self.frame.register_event('resize', on_resize) self._respawn.register_event('press', on_press)
class CommandSay(CommandBase): formats = [ArgumentCollection(text=StringArgument())] description = [ resource_pack.get_translation('command.name.say.help'), '/say <string:str>' ] def execute(self): self.game.dialogue.add_dialogue(self.args['text'])
class CommandSeed(CommandBase): formats = [ArgumentCollection()] description = [ resource_pack.get_translation('command.name.seed.help'), '/seed' ] def execute(self): self.game.dialogue.add_dialogue( resource_pack.get_translation('general.seed') + ': ' + str(self.game.world.seed))
def run_command(self, s): # 运行命令 command = s.split(' ')[0] if command not in commands: match = get_close_matches(s, list(commands.keys()), n=1) if len(match) == 1: self.dialogue.add_dialogue( resource_pack.get_translation('command.not_found')[1] % (command, match[0])) else: self.dialogue.add_dialogue( resource_pack.get_translation('command.not_found')[0] % command) else: try: log_info('Run command: %s' % s) cmd = commands[command](self, s) except TypeError as error: self.dialogue.add_dialogue('Arguments error: %s' % error.args[0]) else: cmd.execute()
def valid(self, value): try: value = self.type(value) except: raise TypeError( resource_pack.get_translation( 'command.args.number.not_a_number') % value) else: if (self.range[0] is not None) and (self.range[1] is not None): if self.range[0] <= value <= self.range[1]: return value elif self.range[0] is not None: if self.range[0] <= value: return value elif self.range[1] is not None: if self.range[1] >= value: return value else: return value # 都没有匹配后运行到这里生成错误信息 if (self.range[0] is not None) and (self.range[1] is not None): raise TypeError( resource_pack.get_translation( 'command.args.number.not_between') % (self.range[0], self.range[1])) elif self.range[0] is not None: raise TypeError( resource_pack.get_translation( 'command.args.number.is_small') % (value, self.range[0])) elif self.range[1] is not None: raise TypeError( resource_pack.get_translation('command.args.number.is_big') % (value, self.range[1])) else: raise TypeError( resource_pack.get_translation('command.args.number.wrong') % value)
class CommandTeleport(CommandBase): formats = [ ArgumentCollection(x=PositionArgument('x'), y=PositionArgument('y'), z=PositionArgument('z')) ] description = [ resource_pack.get_translation('command.name.teleport.help'), '/tp <position>' ] def execute(self): self.game.player['position'] = tuple(self.args.values())
class CommandGameMode(CommandBase): formats = [ArgumentCollection(mode=NumberArgument())] description = [ resource_pack.get_translation('command.name.gamemode.help'), '/gamemode <number:mode>' ] def execute(self): if self.args['mode'] in [0, 1]: self.game.player['gamemode'] = self.args['mode'] if self.args[0] == 1: self.game.player['flying'] = True else: self.game.player['flying'] = False
class CommandSetBlock(CommandBase): formats = [ ArgumentCollection(x=PositionArgument('x'), y=PositionArgument('y'), z=PositionArgument('z'), block=BlockArgument()) ] description = [ resource_pack.get_translation('command.name.setblock.help'), '/setblock <position> <block>' ] def execute(self): self.game.world.add_block( tuple(self.args['x'], self.args['y'], self.args['z']), self.args['block'])
class CommandHelp(CommandBase): formats = [ArgumentCollection(), ArgumentCollection(cmd=StringArgument())] description = [ resource_pack.get_translation('command.name.help.help'), '/help', '/help <string:command>' ] def execute(self): global commands if len(self.args) == 0: cmds = '' for key, value in commands.items(): cmds += '/' + key + ' - ' + value.description[0] + '\n' self.game.dialogue.add_dialogue(cmds) elif 'cmd' in self.args: cmd = commands[self.args['cmd']] self.game.dialogue.add_dialogue('\n'.join(cmd.description[1:]))
def execute(self): self.weather = {'now': '', 'duration': 0} if self.args['type'] in weather: self.weather['now'] = self.args['type'] else: self.game.dialogue.add_dialogue( resource_pack.get_translation( 'command.name.weather.none_exist') % self.args['type']) return if 'duration' in self.args: duration = weather[self.args['type']].duration self.weather['duration'] = min( max(duration[0], self.args['duration']), duration[1]) else: self.weather['duration'] = random.randint( *weather[self.args['type']].duration) weather[self.game.weather['now']].leave() self.game.weather = self.weather weather[self.game.weather['now']].change()
def __init__(self, game): width, height = get_size() self.game = game self.frame = Frame(self.game, True) self._inventory = Image( (width - 352) / 2, (height - 332) / 2, resource_pack.get_resource( 'textures/gui/containers/inventory').get_region( 0, 90, 176, 166)) self._inventory.sprite.scale = 2 self._label = ColorLabel( text=resource_pack.get_translation('game.gui.craft.name'), color='black', anchor_x='left', font_size=12, x=(width - 352) / 2 + 194, y=height - (height - 332) / 2 - 28, shadow=False) self._slots = BagSlot((width - 352) / 2 + 16, (height - 332) / 2 + 164) self._table = CraftingTable((width - 352) / 2 + 196, height - (height - 332) / 2 - 36, 2) self._table.set_output(112, -20) def on_resize(width, height): self._inventory.sprite.position = (width - 352) / 2, (height - 332) / 2 self._label.x = (width - 352) / 2 + 194 self._label.y = height - (height - 332) / 2 + 284 self._slots.resize((width - 352) / 2 + 16, (height - 332) / 2 + 164) self._table.resize((width - 352) / 2 + 196, height - (height - 332) / 2 - 36) self.frame.register_event('resize', on_resize) self.frame.add_widget(self._inventory) self.frame.add_widget(self._label) for slot in self._slots.slots(): self.frame.add_widget(slot) for slot in self._table.slots(): self.frame.add_widget(slot)
def execute(self): self.game.dialogue.add_dialogue( resource_pack.get_translation('general.seed') + ': ' + str(self.game.world.seed))
def get_translation(name): return _resource_pack.get_translation(name)