def box_callback(playerdata: PlayerData, args): from bastd.actor.playerspaz import PlayerSpaz def do_box(player): if player.actor and isinstance(player.actor, PlayerSpaz) and player.actor.node: player.actor.node.torso_model = ba.getmodel('tnt') player.actor.node.color_mask_texture = ba.gettexture('tnt') player.actor.node.color_texture = ba.gettexture('tnt') player.actor.node.highlight = (1, 1, 1) player.actor.node.color = (1, 1, 1) player.actor.node.head_model = None player.actor.node.style = 'cyborg' activity = ba.getactivity() if len(args) < 2: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all' and playerdata.status == Status.ADMIN: for iplayer in activity.players: do_box(iplayer) else: try: iplayer = activity.players[int(args[1])] do_box(iplayer) except (IndexError, ValueError): chatmessage(get_locale('not_player_error'))
def commands(acc_id, msg): global whitelist global whitelist_on global spectators cmnd = msg.split(" ")[0] args = msg.split(" ")[1:] if cmnd == '/add' and args != []: gg = _ba.get_game_roster() for clt in gg: if clt['client_id'] == int(args[0]): addToWhitelist(clt['account_id'], clt['display_string']) f = open("loggs.txt", 'a+') f.write(acc_id + " added " + clt['account_id'] + "\n") f.close() _ba.chatmessage(clt['display_string'] + " whitelisted") if cmnd == '/whitelist': whitelist_on = whitelist_on == False if whitelist_on: _ba.chatmessage("WhiteList turned on") else: _ba.chatmessage("whitelist turned off") if cmnd == '/spectators': spectators = spectators == False if spectators: _ba.chatmessage("Spectators can watch now") else: _ba.chatmessage("Spectators will be kicked")
def reflections_callback(playerdata: PlayerData, args): activity = ba.getactivity() assert isinstance(activity, ba.GameActivity) try: rs = [int(args[2])] ref_type = 'soft' if int(args[1]) == 0 else 'powerup' except (ValueError, IndexError): chatmessage(get_locale('chat_command_not_args_error')) return activity.map.node.reflection = ref_type activity.map.node.reflection_scale = rs try: activity.map.bg.reflection = ref_type activity.map.bg.reflection_scale = rs except AttributeError: pass try: activity.map.floor.reflection = ref_type activity.map.floor.reflection_scale = rs except AttributeError: pass try: activity.map.center.reflection = ref_type activity.map.center.reflection_scale = rs except AttributeError: pass
def remove_callback(playerdata: PlayerData, args): activity = ba.getactivity() if len(args) < 2: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all' and playerdata.status == Status.ADMIN: for player in activity.players: player.sessionplayer.remove_from_game() else: activity.players[int(args[1])].sessionplayer.remove_from_game()
def change_lobby_check_time(arguments): try: argument = int(arguments[0]) except: _ba.chatmessage("must type numbe to change lobby check time") settings = setting.get_settings_data() settings["white_list"]["lobbychecktime"] = argument setting.commit(settings) _ba.chatmessage(f"lobby check time is {arg} now")
def changeplaylist(arguments): if len(arguments) == 0: _ba.chatmessage("enter list code or name") else: if arguments[0] == 'coop': serverdata.coopmode = True else: serverdata.coopmode = False playlist.setPlaylist(arguments[0]) return
def set_playlist(content): if content is None: return _playlists_var = "{} Playlists".format(content["playlistType"]) playlists = _ba.app.config[_playlists_var] playlist = playlists[content["playlistName"]] _ba.chatmessage("Fetched playlist:" + content["playlistName"]) typename = ('teams' if content['playlistType'] == 'Team Tournament' else 'ffa' if content['playlistType'] == 'Free-for-All' else '??') return set_playlist_inline(playlist, typename)
def spectators(arguments): if arguments[0] in ['on', 'off']: settings = setting.get_settings_data() if arguments[0] == 'on': settings["white_list"]["spectators"] = True setting.commit(settings) _ba.chatmessage("spectators on") elif arguments[0] == 'off': settings["white_list"]["spectators"] = False setting.commit(settings) _ba.chatmessage("spectators off")
def shatter_callback(playerdata: PlayerData, args): activity = ba.getactivity() if len(args) < 3 or not args[2].isdigit(): chatmessage(get_locale('chat_command_not_args_error')) else: level = int(args[2]) if args[1] == 'all' and playerdata.status == Status.ADMIN: for i in activity.players: i.actor.node.shattered = level else: try: activity.players[int(args[0])].actor.node.shattered = level except (ValueError, IndexError): chatmessage(get_locale('not_player_error'))
def setPlaylist(para): if para.isdigit(): playlist(para) elif para == "coop": _thread.start_new_thread(withDelay, ( CoopSession, None, )) elif para in settings["playlists"]: playlist(settings["playlists"][para]) else: _ba.chatmessage("Available Playlist") for play in settings["playlists"]: _ba.chatmessage(play)
def heal_callback(playerdata: PlayerData, args): activity = ba.getactivity() if len(args) < 2: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all': for i in activity.players: if i.actor and hasattr(i.actor, 'node'): assert isinstance(i.actor.node, ba.Node) i.actor.node.handlemessage( ba.PowerupMessage(poweruptype='health')) else: player = activity.players[int(args[0])] if player.actor and hasattr(player.actor, 'node'): assert isinstance(player.actor.node, ba.Node) player.actor.node.handlemessage( ba.PowerupMessage(poweruptype='health'))
def _cmd(command_data: bytes) -> None: """Handle commands coming in from our server manager parent process.""" import pickle command = pickle.loads(command_data) assert isinstance(command, ServerCommand) if isinstance(command, StartServerModeCommand): assert _ba.app.server is None _ba.app.server = ServerController(command.config) return if isinstance(command, ShutdownCommand): assert _ba.app.server is not None _ba.app.server.shutdown(reason=command.reason, immediate=command.immediate) return if isinstance(command, ChatMessageCommand): assert _ba.app.server is not None _ba.chatmessage(command.message, clients=command.clients) return if isinstance(command, ScreenMessageCommand): assert _ba.app.server is not None # Note: we have to do transient messages if # clients is specified, so they won't show up # in replays. _ba.screenmessage(command.message, color=command.color, clients=command.clients, transient=command.clients is not None) return if isinstance(command, ClientListCommand): assert _ba.app.server is not None _ba.app.server.print_client_list() return if isinstance(command, KickCommand): assert _ba.app.server is not None _ba.app.server.kick(client_id=command.client_id, ban_time=command.ban_time) return print(f'{Clr.SRED}ERROR: server process' f' got unknown command: {type(command)}{Clr.RST}')
def sleep_callback(playerdata: PlayerData, args): activity = ba.getactivity() if not args: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all' and playerdata.status == Status.ADMIN: for i in activity.players: try: i.actor.node.handlemessage('knockout', 5000) except AttributeError: pass else: try: activity.players[int(args[1])].actor.node.handlemessage( 'knockout', 5000) except (ValueError, IndexError): chatmessage(get_locale('not_player_error')) except AttributeError: pass
def _notify_handlers(cmd: str, playerdata: PlayerData): args = cmd.split() for handler in _handlers: if args[0] in handler.commands and playerdata.status in handler.statuses: if _lastrun.get(playerdata.id, {}).get( args[0], 0) + handler.statuses[playerdata.status] < int( datetime.now().timestamp()): try: with ba.Context(get_foreground_host_activity()): handler.callback(playerdata, args) except Exception: ba.print_exception( f'Error while processing command {cmd} from {playerdata.id}' ) chatmessage(get_locale('command_some_error')) lastrun = _lastrun.get(playerdata.id, {}) lastrun[args[0]] = int(datetime.now().timestamp()) _lastrun[playerdata.id] = lastrun else: chatmessage(get_locale('commands_too_many'))
def gp_callback(playerdata: PlayerData, args): activity = ba.getactivity() if len(args) < 2: chatmessage(get_locale('chat_command_not_args_error')) else: chatmessage(get_locale('player_profiles_text')) try: inputdevice = activity.players[int( args[1])].sessionplayer.inputdevice except (IndexError, ValueError): chatmessage(get_locale('not_player_error')) return profiles = inputdevice.get_player_profiles() for profile in profiles: if profile == '__account__': profile = inputdevice.get_account_name(False) chatmessage(profile) chatmessage(get_locale('dividing_strip_text'))
def fly_callback(playerdata: PlayerData, args): from bastd.actor.playerspaz import PlayerSpaz activity = ba.getactivity() if not args: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all' and playerdata.status == Status.ADMIN: for player in activity.players: if player.actor and isinstance(player.actor, PlayerSpaz): player.actor.node.fly = True else: try: player = activity.players[int(args[1])] except (IndexError, ValueError): chatmessage(get_locale('not_player_error')) return if player.actor and hasattr(player.actor, 'node'): if not player.actor.node.fly: player.actor.node.fly = True else: player.actor.node.fly = False
def kick_callback(playerdata: PlayerData, args): if len(args) < 2 or (not args[1].isdigit() and args[1] != '-1'): chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == '-1': chatmessage(get_locale('kick_host_error')) else: ban_time = 300 clients_ids = [player['client_id'] for player in _ba.get_game_roster()] if len(args) > 1 and playerdata.status == Status.ADMIN: ban_time = int(args[1]) elif len(args) > 1 and playerdata.status != Status.ADMIN: chatmessage(get_locale('time_arg_access_error')) if int(args[1]) in clients_ids: target = get_player_by('client_id', int(args[1])) if target.status == Status.ADMIN: chatmessage(get_locale('kick_admin_error')) else: _ba.disconnect_client(int(args[1]), ban_time=ban_time) else: chatmessage(get_locale('not_player_error'))
def tint_callback(playerdata: PlayerData, args): if len(args) < 2 or (len(args) < 4 and args[1] != 'r'): chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'r': m = 1.30 if len(args) < 3 else float(args[2]) s = 1000 if len(args) < 4 else float(args[3]) if m > 3 and playerdata.status != Status.ADMIN: chatmessage(get_locale('too_big_arg_error')) return tint = { s * 0: (m, 0, 0), s * 1: (0, m, 0), s * 2: (0, 0, m), s * 3: (m, 0, 0), } ba.animate_array(ba.getactivity().globalsnode, 'tint', 3, tint, True, suppress_format_warning=True, timeformat=ba.TimeFormat.MILLISECONDS) else: color = (float(args[1]), float(args[2]), float(args[3])) if max(map(abs, color)) > 3 and playerdata.status != Status.ADMIN: chatmessage(get_locale('too_big_arg_error')) return ba.getactivity().globalsnode.tint = color
def hug_callback(playerdata: PlayerData, args): def do_hug(p1: ba.Player, p2: ba.Player): from bastd.actor.playerspaz import PlayerSpaz if (p1.actor.is_alive() and isinstance(p1.actor, PlayerSpaz) and p2.actor.is_alive() and isinstance(p2.actor, PlayerSpaz)): p1.actor.node.hold_node = p2.actor.node p2.actor.node.hold_node = p1.actor.node activity = ba.getactivity() if len(args) == 1: alives = [] for i in range(len(activity.players)): if activity.players[i]: alives.append(i) count = len(alives) // 2 for i in range(count): do_hug(activity.players[alives[i]], activity.players[alives[count + i]]) elif len(args) == 3: try: do_hug(activity.players[int(args[1])], activity.players[int(args[2])]) except (IndexError, ValueError): chatmessage(get_locale('not_player_error'))
def ac_callback(playerdata: PlayerData, args): if not args: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'r': m = 1.30 if len(args) < 3 else float(args[2]) s = 1000 if len(args) < 4 else float(args[3]) ambient_color = { s * 0: (m, 0, 0), s * 1: (0, m, 0), s * 2: (0, 0, m), s * 3: (m, 0, 0) } ba.animate_array(ba.getactivity().globalsnode, 'ambient_color', 3, ambient_color, True, suppress_format_warning=True, timeformat=ba.TimeFormat.MILLISECONDS) else: ba.getactivity().globalsnode.ambientColor = (float(args[1]), float(args[2]), float(args[3]))
def rainbow_callback(playerdata: PlayerData, args): color = {0: (0, 0, 3), 0.5: (0, 3, 0), 1: (3, 0, 0), 1.5: (0, 0, 3)} highlight = {0: (3, 0, 0), 0.5: (0, 0, 0), 1: (0, 0, 3), 1.5: (3, 0, 0)} def do_rainbow(player): if player and player.actor and player.actor.node: ba.animate_array(player.actor.node, 'color', 3, color, True) ba.animate_array(player.actor.node, 'highlight', 3, highlight, True) player.actor.node.handlemessage('celebrate', 6000) activity = ba.getactivity() if len(args) < 1: chatmessage(get_locale('chat_command_not_args_error')) elif args[1] == 'all': for i in activity.players: do_rainbow(i) else: try: do_rainbow(activity.players[int(args[1])]) except (IndexError, ValueError): chatmessage(get_locale('not_player_error'))
def list_callback(playerdata: PlayerData, args): client_ids = [ (i['players'][0]['name_full'] if i['players'] else i['displayString'], str(i['client_id'])) for i in _ba.get_game_roster() ] chatmessage(get_locale('player_ids_text')) activity = _ba.get_foreground_host_activity() for i in range(len(activity.players)): p = activity.players[i] chatmessage('{} | {} | {}'.format( i, p.getname().ljust(15), p.sessionplayer.inputdevice.client_id)) chatmessage(get_locale('dividing_strip_text'))
def help_callback(playerdata: PlayerData, args): for handler in _handlers: chatmessage("{} - {}".format( handler.commands[0], get_locale('command_help').get( handler.commands[0], get_locale('command_help_not_found'))))
def play_sound_callback(playerdata: PlayerData, args): if len(args) < 2: chatmessage(get_locale('chat_command_not_args_error')) else: ba.playsound(ba.getsound(str(args[0])), volume=2)
def changepartysize(arguments): if len(arguments) == 0: _ba.chatmessage("enter number") else: _ba.set_public_party_max_size(int(arguments[0]))
def _send_chat_message(self) -> None: _ba.chatmessage(cast(str, ba.textwidget(query=self._text_field))) ba.textwidget(edit=self._text_field, text='')
def send(msg, clientid): """Shortcut To Send Private Msg To Client""" _ba.chatmessage(str(msg), clients=[clientid]) _ba.screenmessage(str(msg), transient=True, clients=[clientid])