bombsquad-plugin-manager/plugins/utilities/sleep_on_afk.py

130 lines
4.4 KiB
Python
Raw Normal View History

2026-02-23 05:16:06 -03:00
# ba_meta require api 9
from __future__ import annotations
import babase
import bascenev1 as bs
from bascenev1lib.actor.spaz import Spaz
plugman = dict(
plugin_name="sleep_on_afk",
description="Staying idle for 40 seconds will make your character fall asleep, they need rest too..",
external_url="",
authors=[
{"name": "DinoWattz", "email": "", "discord": ""}
],
version="1.0.0",
)
INGAME_TIME = 40 # (in seconds)
2026-02-23 05:16:06 -03:00
# Spaz Changes
2026-02-23 05:16:06 -03:00
def _afk_sleep_knockout(self, value: float) -> None:
if not self.node:
return
if not self.is_alive() and hasattr(self.getplayer(self), 'sessionplayer'):
current_activity = self.getactivity()
player = self.getplayer(self).sessionplayer
# Pop timer data if the player is dead
if current_activity.customdata.get(str(player.id) + '_knockoutTimer') is not None:
current_activity.customdata.pop(str(player.id) + '_knockoutTimer')
return
self.node.handlemessage('knockout', value)
2026-02-23 05:16:06 -03:00
Spaz._afk_sleep_knockout = _afk_sleep_knockout # type: ignore
2026-02-23 05:16:06 -03:00
# Idle Checker
2026-02-23 05:16:06 -03:00
def idle_start(activity: bs.Activity):
activity.customdata['afk_timer'] = bs.Timer(
0.5, bs.CallStrict(idle_check, activity), repeat=True)
2026-02-23 05:16:06 -03:00
def idle_check(current_activity: bs.Activity):
current_session = current_activity.session
wait_time = INGAME_TIME if not current_activity.slow_motion else round(INGAME_TIME / 3)
current = bs.time() * 1000
if not current_session:
return
for player in current_session.sessionplayers:
if (
not player.exists()
or not player.in_game
or not getattr(player, 'activityplayer', None)
or not getattr(player.activityplayer, 'actor', None)
or not getattr(player.activityplayer.actor, 'node', None)
or not player.activityplayer.is_alive()
or not player.activityplayer.actor.node
or not player.activityplayer.actor.node.exists()
and not getattr(player.activityplayer.actor.node, 'invincible', False)
):
continue
2026-02-23 05:16:06 -03:00
player_actor = player.activityplayer.actor
player_node = player_actor.node
player_data = player.activityplayer.customdata
player_turbo_times = player_actor._turbo_filter_times
if player_node.move_up_down != 0.0 or player_node.move_left_right != 0.0:
player_data['last_input'] = current
elif player_turbo_times:
highest_turbo_time = player_turbo_times.get(
max(player_turbo_times, key=player_turbo_times.get))
2026-02-23 05:16:06 -03:00
if highest_turbo_time > player_data.get('last_input', current):
player_data.update({'last_input': highest_turbo_time})
2026-02-23 05:16:06 -03:00
player_data['last_input'] = player_data.get('last_input', current)
2026-02-23 05:16:06 -03:00
last_input = max(0, player_data['last_input'])
afk_time = int((current - last_input) / 1000)
# print(player_data)
# print(last_input)
# print(current)
# print(player.getname() + ": " + str(afk_time))
# print(wait_time)
2026-02-23 05:16:06 -03:00
if afk_time >= wait_time:
current_activity.customdata[str(player.id) + '_knockoutTimer'] = bs.Timer(
0.1, bs.WeakCallStrict(player_actor._afk_sleep_knockout, 100.0), repeat=True)
2026-02-23 05:16:06 -03:00
# Make the player's node not an area of interest if it was one
if not getattr(player_actor, '_previous_is_area_of_interest', False):
player_actor._previous_is_area_of_interest = player_node.is_area_of_interest
if player_actor._previous_is_area_of_interest:
player_node.is_area_of_interest = False
elif current_activity.customdata.get(str(player.id) + '_knockoutTimer') is not None:
current_activity.customdata.pop(str(player.id) + '_knockoutTimer')
2026-02-23 05:16:06 -03:00
# Restore the player's node area of interest if necessary
if getattr(player_actor, '_previous_is_area_of_interest', False):
player_node.is_area_of_interest = True
if hasattr(player_actor, "_previous_is_area_of_interest"):
delattr(player_actor, "_previous_is_area_of_interest")
2026-02-23 05:16:06 -03:00
# Setup new activity
org_on_begin = bs.Activity.on_begin
2026-02-23 05:16:06 -03:00
def patched_on_begin(self, *args, **kwargs):
idle_start(self)
return org_on_begin(self, *args, **kwargs)
2026-02-23 05:16:06 -03:00
bs.Activity.on_begin = patched_on_begin
# ba_meta export babase.Plugin
2026-02-23 05:16:06 -03:00
class Plugin(babase.Plugin):
pass