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 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 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 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 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 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 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 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 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 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 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 handlemessage(self, msg: Any, returned: Any = None) -> Any: super(stdspaz.Spaz, self).handlemessage(msg) if isinstance(msg, ba.PowerupMessage): if not self.is_alive(): return for poweruptype, texture, callback in _callbacks: if msg.poweruptype == poweruptype: if ba.app.config.get('Powerup Popups', True): powerup_text = get_locale( 'powerup_names')[poweruptype] PopupText( ba.Lstr(translate=('gameDescriptions', powerup_text)), color=(1, 1, 1), scale=1, position=self.node.position).autoretain() callback(self, msg)
def __init__(self, position: Sequence[float] = (0, 1, 0), velocity: Sequence[float] = (0, 0, 0)): super().__init__() self.light: ba.Node self.picked: bool self.regen_timer = None self.phrase_text_node = None self.phrases: Sequence[Any] = get_locale('cube_companion_phrases') self.phrases_times: Sequence[float] = (10.0, 12.5, 15.0, 17.5, 20.0, 22.5, 25.0, 27.5, 30.0) self.phrases_time: float = random.choice(self.phrases_times) shared = SharedObjects.get() self.node: ba.Node = ba.newnode('prop', delegate=self, attrs={ 'body': 'crate', 'model': ba.getmodel('tnt'), 'light_model': ba.getmodel('tnt'), 'color_texture': ba.gettexture('landMineLit'), 'position': position, 'velocity': velocity, 'reflection': 'soft', 'reflection_scale': [0.25], 'materials': (shared.object_material, shared.footing_material) }) ba.animate(self.node, 'model_scale', {0: 0, 0.2: 1.3, 0.26: 1}) self.spawn_random_phrase_timer: ba.Timer = ba.Timer( self.phrases_time, self._spawn_random_phrase, repeat=True)
def _get_glowing_colors(self): """Search glowing code among profiles.""" try: should_del = [] for i in self._profilenames: for m in self._markers: if i.startswith(m + ','): code = i.split(',') self.glow_dict[code[0]] = (float(code[1]), float(code[2]), int(code[3]), int(code[4])) # should_del.append(i) for i in should_del: self._profilenames.remove(i) except Exception as err: print(err) ba.screenmessage( get_locale('init_glowing_code_error'), color=(1, 0, 0), clients=[self._player.get_input_device().client_id], transient=True)
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 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 handlemessage(self, msg, returned): from bastd.actor.popuptext import PopupText if isinstance(msg, ba.HitMessage): if msg.hit_type == 'punch': if not self.node: return None if self.node.invincible: return True mag = msg.magnitude * self.impact_scale velocity_mag = msg.velocity_magnitude * self.impact_scale damage_scale = 0.22 # If they've got a shield, deliver it to that instead. if self.shield: if msg.flat_damage: damage = msg.flat_damage * self.impact_scale else: damage = damage_scale * self.node.damage # Its a cleaner event if a hit just kills the shield # without damaging the player. # However, massive damage events should still be able to # damage the player. This hopefully gives us a happy medium. max_spillover = stdspaz.get_factory( ).max_shield_spillover_damage # If they passed our spillover threshold, # pass damage along to spaz. if self.shield_hitpoints <= -max_spillover: leftover_damage = -max_spillover - self.shield_hitpoints shield_leftover_ratio = leftover_damage / damage # Scale down the magnitudes applied to spaz accordingly. mag *= shield_leftover_ratio velocity_mag *= shield_leftover_ratio else: return True # Good job shield! else: shield_leftover_ratio = 1.0 if msg.flat_damage: damage = int(msg.flat_damage * self.impact_scale * shield_leftover_ratio) else: damage = int(damage_scale * self.node.damage) if damage > 999: PopupText(get_locale('fatality_text'), color=(0.905, 0.298, 0.235), scale=2.0, position=self.node.position).autoretain() ba.emitfx(position=msg.pos, chunk_type='spark', velocity=(msg.force_direction[0] * 1.3, msg.force_direction[1] * 1.3 + 5.0, msg.force_direction[2] * 1.3), count=45, scale=1.0, spread=1.0) self.lightning_bolt(position=self.node.position, radius=3) gnode = self.activity.globalsnode if not gnode.slow_motion: gnode.slow_motion = True def off_sm(): if gnode: gnode.slow_motion = False ba.timer(0.5, off_sm) elif 800 < damage < 999: PopupText(get_locale('crazy_text'), color=(0.180, 0.800, 0.443), scale=1.5, position=self.node.position).autoretain() ba.emitfx(position=msg.pos, chunk_type='spark', velocity=(msg.force_direction[0] * 1.3, msg.force_direction[1] * 1.3 + 5.0, msg.force_direction[2] * 1.3), count=45, scale=1.0, spread=1.0) elif 750 < damage < 800: PopupText(get_locale('aggressive_text'), color=(0.231, 0.596, 0.858), scale=1.5, position=self.node.position).autoretain() return returned