Exemplo n.º 1
0
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
Exemplo n.º 2
0
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'))
Exemplo n.º 3
0
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'))
Exemplo n.º 4
0
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'))
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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()
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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'))
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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'))
Exemplo n.º 11
0
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'))
Exemplo n.º 12
0
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'))
Exemplo n.º 13
0
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'))
Exemplo n.º 14
0
    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)
Exemplo n.º 15
0
    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)
Exemplo n.º 16
0
 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)
Exemplo n.º 17
0
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'))
Exemplo n.º 18
0
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]))
Exemplo n.º 19
0
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'))))
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
    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