mirror of
https://github.com/bombsquad-community/plugin-manager.git
synced 2025-10-08 14:54:36 +00:00
Done with utilities. Need some testing on ultraparty and few fix on auto stunt and quick customgame
This commit is contained in:
parent
39845e7b61
commit
77d16e63c7
19 changed files with 1221 additions and 1093 deletions
|
|
@ -1,12 +1,15 @@
|
||||||
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 8
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
from ba import _map
|
import bauiv1 as bui
|
||||||
from bastd.gameutils import SharedObjects
|
import bascenev1 as bs
|
||||||
from bastd.maps import *
|
from bascenev1 import _map
|
||||||
|
from bascenev1lib.gameutils import SharedObjects
|
||||||
|
from bascenev1lib.maps import *
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -48,7 +51,7 @@ class ForestMapData():
|
||||||
points['spawn2'] = (5.0, -2.0, -2.0) + (0.5, 1.0, 3.2)
|
points['spawn2'] = (5.0, -2.0, -2.0) + (0.5, 1.0, 3.2)
|
||||||
|
|
||||||
|
|
||||||
class ForestMap(ba.Map):
|
class ForestMap(bs.Map):
|
||||||
|
|
||||||
defs = ForestMapData()
|
defs = ForestMapData()
|
||||||
name = 'Forest'
|
name = 'Forest'
|
||||||
|
|
@ -64,11 +67,11 @@ class ForestMap(ba.Map):
|
||||||
@classmethod
|
@classmethod
|
||||||
def on_preload(cls) -> any:
|
def on_preload(cls) -> any:
|
||||||
data: dict[str, any] = {
|
data: dict[str, any] = {
|
||||||
'model': ba.getmodel('natureBackground'),
|
'mesh': bs.getmesh('natureBackground'),
|
||||||
'tex': ba.gettexture('natureBackgroundColor'),
|
'tex': bui.gettexture('natureBackgroundColor'),
|
||||||
'collide_model': ba.getcollidemodel('natureBackgroundCollide'),
|
'collision_mesh': bs.getcollisionmesh('natureBackgroundCollide'),
|
||||||
'bgmodel': ba.getmodel('thePadBG'),
|
'bgmesh': bs.getmesh('thePadBG'),
|
||||||
'bgtex': ba.gettexture('menuBG')
|
'bgtex': bui.gettexture('menuBG')
|
||||||
}
|
}
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
@ -76,27 +79,27 @@ class ForestMap(ba.Map):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
shared = SharedObjects.get()
|
shared = SharedObjects.get()
|
||||||
|
|
||||||
self.node = ba.newnode(
|
self.node = bs.newnode(
|
||||||
'terrain',
|
'terrain',
|
||||||
delegate=self,
|
delegate=self,
|
||||||
attrs={
|
attrs={
|
||||||
'model': self.preloaddata['model'],
|
'mesh': self.preloaddata['mesh'],
|
||||||
'color_texture': self.preloaddata['tex'],
|
'color_texture': self.preloaddata['tex'],
|
||||||
'collide_model': self.preloaddata['collide_model'],
|
'collide_mesh': self.preloaddata['collide_mesh'],
|
||||||
'materials': [shared.footing_material]
|
'materials': [shared.footing_material]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.background = ba.newnode(
|
self.background = bs.newnode(
|
||||||
'terrain',
|
'terrain',
|
||||||
attrs={
|
attrs={
|
||||||
'model': self.preloaddata['bgmodel'],
|
'mesh': self.preloaddata['bgmesh'],
|
||||||
'lighting': False,
|
'lighting': False,
|
||||||
'shadow': True,
|
'shadow': True,
|
||||||
'color_texture': self.preloaddata['bgtex']
|
'color_texture': self.preloaddata['bgtex']
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
gnode = ba.getactivity().globalsnode
|
gnode = bs.getactivity().globalsnode
|
||||||
gnode.tint = (1.0, 1.10, 1.15)
|
gnode.tint = (1.0, 1.10, 1.15)
|
||||||
gnode.ambient_color = (0.9, 1.3, 1.1)
|
gnode.ambient_color = (0.9, 1.3, 1.1)
|
||||||
gnode.shadow_ortho = False
|
gnode.shadow_ortho = False
|
||||||
|
|
@ -104,7 +107,7 @@ class ForestMap(ba.Map):
|
||||||
gnode.vignette_inner = (0.95, 0.95, 0.99)
|
gnode.vignette_inner = (0.95, 0.95, 0.99)
|
||||||
|
|
||||||
def is_point_near_edge(self,
|
def is_point_near_edge(self,
|
||||||
point: ba.Vec3,
|
point: babase.Vec3,
|
||||||
running: bool = False) -> bool:
|
running: bool = False) -> bool:
|
||||||
xpos = point.x
|
xpos = point.x
|
||||||
zpos = point.z
|
zpos = point.z
|
||||||
|
|
@ -117,5 +120,5 @@ class ForestMap(ba.Map):
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class EnableMe(ba.Plugin):
|
class EnableMe(babase.Plugin):
|
||||||
_map.register_map(ForestMap)
|
_map.register_map(ForestMap)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "2454845",
|
"commit_sha": "2454845",
|
||||||
|
|
@ -106,6 +107,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "2fda676",
|
"commit_sha": "2fda676",
|
||||||
|
|
@ -125,6 +127,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "2fda676",
|
"commit_sha": "2fda676",
|
||||||
|
|
@ -163,6 +166,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "fed7c24",
|
"commit_sha": "fed7c24",
|
||||||
|
|
@ -187,6 +191,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "2fda676",
|
"commit_sha": "2fda676",
|
||||||
|
|
@ -206,6 +211,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.2.3": null,
|
||||||
"1.2.2": {
|
"1.2.2": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "7753b87",
|
"commit_sha": "7753b87",
|
||||||
|
|
@ -239,7 +245,7 @@
|
||||||
{
|
{
|
||||||
"name": "Rikko",
|
"name": "Rikko",
|
||||||
"email": "rikkolovescats@proton.me",
|
"email": "rikkolovescats@proton.me",
|
||||||
"discord": "Rikko#7383"
|
"discord": "rikkolovescats"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Vishal",
|
"name": "Vishal",
|
||||||
|
|
@ -299,7 +305,7 @@
|
||||||
{
|
{
|
||||||
"name": "Rikko",
|
"name": "Rikko",
|
||||||
"email": "rikkolovescats@proton.me",
|
"email": "rikkolovescats@proton.me",
|
||||||
"discord": "Rikko#7383"
|
"discord": "rikkolovescats"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
|
@ -470,6 +476,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "6acdea8",
|
"commit_sha": "6acdea8",
|
||||||
|
|
@ -669,6 +676,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"4.0.1": null,
|
||||||
"4.0.0": {
|
"4.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "a23e8cd",
|
"commit_sha": "a23e8cd",
|
||||||
|
|
@ -684,10 +692,11 @@
|
||||||
{
|
{
|
||||||
"name": "TheMikirog",
|
"name": "TheMikirog",
|
||||||
"email": "",
|
"email": "",
|
||||||
"discord": "TheMikirog#1984"
|
"discord": "themikirog"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"3.0.1": null,
|
||||||
"3.0.0": {
|
"3.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "0841b9e",
|
"commit_sha": "0841b9e",
|
||||||
|
|
@ -703,10 +712,11 @@
|
||||||
{
|
{
|
||||||
"name": "TheMikirog",
|
"name": "TheMikirog",
|
||||||
"email": "",
|
"email": "",
|
||||||
"discord": "TheMikirog#1984"
|
"discord": "themikirog"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "0841b9e",
|
"commit_sha": "0841b9e",
|
||||||
|
|
@ -722,10 +732,11 @@
|
||||||
{
|
{
|
||||||
"name": "TheMikirog",
|
"name": "TheMikirog",
|
||||||
"email": "",
|
"email": "",
|
||||||
"discord": "TheMikirog#1984"
|
"discord": "themikirog"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "0841b9e",
|
"commit_sha": "0841b9e",
|
||||||
|
|
@ -741,10 +752,11 @@
|
||||||
{
|
{
|
||||||
"name": "Cross Joy",
|
"name": "Cross Joy",
|
||||||
"email": "cross.joy.official@gmail.com",
|
"email": "cross.joy.official@gmail.com",
|
||||||
"discord": "Cross Joy#0721"
|
"discord": "crossjoy"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "800125c",
|
"commit_sha": "800125c",
|
||||||
|
|
@ -760,7 +772,7 @@
|
||||||
{
|
{
|
||||||
"name": "Cross Joy",
|
"name": "Cross Joy",
|
||||||
"email": "cross.joy.official@gmail.com",
|
"email": "cross.joy.official@gmail.com",
|
||||||
"discord": "Cross Joy#0721"
|
"discord": "crossjoy"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
|
@ -809,10 +821,11 @@
|
||||||
{
|
{
|
||||||
"name": "TheMikirog",
|
"name": "TheMikirog",
|
||||||
"email": "",
|
"email": "",
|
||||||
"discord": "TheMikirog#1984"
|
"discord": "themikirog"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "cb2d952",
|
"commit_sha": "cb2d952",
|
||||||
|
|
@ -828,10 +841,11 @@
|
||||||
{
|
{
|
||||||
"name": "TheMikirog",
|
"name": "TheMikirog",
|
||||||
"email": "",
|
"email": "",
|
||||||
"discord": "TheMikirog#1984"
|
"discord": "themikirog"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "05ffa9f",
|
"commit_sha": "05ffa9f",
|
||||||
|
|
@ -847,10 +861,11 @@
|
||||||
{
|
{
|
||||||
"name": "Rikko",
|
"name": "Rikko",
|
||||||
"email": "rikkolovescats@proton.me",
|
"email": "rikkolovescats@proton.me",
|
||||||
"discord": "Rikko#7383"
|
"discord": "rikkolovescats"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"1.0.1": null,
|
||||||
"1.0.0": {
|
"1.0.0": {
|
||||||
"api_version": 7,
|
"api_version": 7,
|
||||||
"commit_sha": "3221b3a",
|
"commit_sha": "3221b3a",
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,17 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
import ba
|
# ba_meta require api 8
|
||||||
|
import babase
|
||||||
|
import bascenev1 as bs
|
||||||
|
|
||||||
original_getmodel = ba.getmodel
|
original_getmesh = bs.getmesh
|
||||||
|
|
||||||
|
|
||||||
def get_model_gracefully(model):
|
def get_mesh_gracefully(mesh):
|
||||||
if model is not None:
|
if mesh is not None:
|
||||||
return original_getmodel(model)
|
return original_getmesh(mesh)
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class Main(ba.Plugin):
|
class Main(babase.Plugin):
|
||||||
def on_app_running(self):
|
def on_app_running(self):
|
||||||
ba.getmodel = get_model_gracefully
|
bs.getmesh = get_mesh_gracefully
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,25 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
# AutoStunt mod by - Mr.Smoothy x Rikko
|
# AutoStunt mod by - Mr.Smoothy x Rikko
|
||||||
# https://discord.gg/ucyaesh
|
# https://discord.gg/ucyaesh
|
||||||
# https://bombsquad.ga
|
# https://bombsquad-community.web.app/home
|
||||||
# Dont modify redistribute this plugin , if want to use features of this plugin in your mod write logic in seprate file
|
# Dont modify redistribute this plugin , if want to use features of this plugin in your mod write logic in seprate file
|
||||||
# and import this as module.
|
# and import this as module.
|
||||||
# If want to contribute in this original module, raise PR on github https://github.com/bombsquad-community/plugin-manager
|
# If want to contribute in this original module, raise PR on github https://github.com/bombsquad-community/plugin-manager
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
import _ba
|
import bauiv1 as bui
|
||||||
import bastd
|
import bascenev1 as bs
|
||||||
from bastd.actor.text import Text
|
import _babase
|
||||||
from bastd.actor.image import Image
|
import bascenev1lib
|
||||||
from bastd.actor import spaz
|
from bascenev1lib.actor.text import Text
|
||||||
from bastd.actor import playerspaz
|
from bascenev1lib.actor.image import Image
|
||||||
from bastd.gameutils import SharedObjects
|
from bascenev1lib.actor import spaz
|
||||||
from bastd.actor.powerupbox import PowerupBoxFactory
|
from bascenev1lib.actor import playerspaz
|
||||||
from bastd.actor.spazfactory import SpazFactory
|
from bascenev1lib.gameutils import SharedObjects
|
||||||
from bastd.game.elimination import EliminationGame
|
from bascenev1lib.actor.powerupbox import PowerupBoxFactory
|
||||||
|
from bascenev1lib.actor.spazfactory import SpazFactory
|
||||||
|
from bascenev1lib.game.elimination import EliminationGame
|
||||||
import math
|
import math
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
|
@ -26,12 +29,12 @@ from typing import Optional
|
||||||
CONTROLS_CENTER = (0, 0)
|
CONTROLS_CENTER = (0, 0)
|
||||||
CONTROLS_SCALE = 1
|
CONTROLS_SCALE = 1
|
||||||
|
|
||||||
BASE_STUNTS_DIRECTORY = os.path.join(_ba.env()["python_directory_user"], "CustomStunts")
|
BASE_STUNTS_DIRECTORY = os.path.join(_babase.env()["python_directory_user"], "CustomStunts")
|
||||||
PLAYERS_STUNT_INFO = {}
|
PLAYERS_STUNT_INFO = {}
|
||||||
|
|
||||||
STUNT_CACHE = {}
|
STUNT_CACHE = {}
|
||||||
original_on_begin = ba._activity.Activity.on_begin
|
original_on_begin = bs._activity.Activity.on_begin
|
||||||
original_chatmessage = _ba.chatmessage
|
original_chatmessage = bs.chatmessage
|
||||||
|
|
||||||
|
|
||||||
class ControlsUI:
|
class ControlsUI:
|
||||||
|
|
@ -105,7 +108,7 @@ CONTROLS_UI_MAP = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class NewSpaz(bastd.actor.spaz.Spaz):
|
class NewSpaz(bascenev1lib.actor.spaz.Spaz):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.move_map = {
|
self.move_map = {
|
||||||
|
|
@ -125,7 +128,7 @@ class NewSpaz(bastd.actor.spaz.Spaz):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class NewPlayerSpaz(bastd.actor.playerspaz.PlayerSpaz):
|
class NewPlayerSpaz(bascenev1lib.actor.playerspaz.PlayerSpaz):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.move_map = {
|
self.move_map = {
|
||||||
|
|
@ -150,7 +153,7 @@ class NewPlayerSpaz(bastd.actor.playerspaz.PlayerSpaz):
|
||||||
def _handle_action(self, action, value: Optional[float] = None) -> None:
|
def _handle_action(self, action, value: Optional[float] = None) -> None:
|
||||||
if self.source_player.sessionplayer in PLAYERS_STUNT_INFO:
|
if self.source_player.sessionplayer in PLAYERS_STUNT_INFO:
|
||||||
PLAYERS_STUNT_INFO[self.source_player.sessionplayer].append({
|
PLAYERS_STUNT_INFO[self.source_player.sessionplayer].append({
|
||||||
"time": ba.time() - self.source_player.recording_start_time,
|
"time": bs.time() - self.source_player.recording_start_time,
|
||||||
"move": {
|
"move": {
|
||||||
"action": action,
|
"action": action,
|
||||||
"value": value,
|
"value": value,
|
||||||
|
|
@ -230,11 +233,11 @@ def handle_player_replay_end(player):
|
||||||
|
|
||||||
|
|
||||||
def get_player_from_client_id(client_id, activity=None):
|
def get_player_from_client_id(client_id, activity=None):
|
||||||
activity = activity or _ba.get_foreground_host_activity()
|
activity = activity or bs.get_foreground_host_activity()
|
||||||
for player in activity.players:
|
for player in activity.players:
|
||||||
if player.sessionplayer.inputdevice.client_id == client_id:
|
if player.sessionplayer.inputdevice.client_id == client_id:
|
||||||
return player
|
return player
|
||||||
raise ba.SessionPlayerNotFound()
|
raise bs.SessionPlayerNotFound()
|
||||||
|
|
||||||
|
|
||||||
def mirror(clieid):
|
def mirror(clieid):
|
||||||
|
|
@ -243,8 +246,8 @@ def mirror(clieid):
|
||||||
|
|
||||||
|
|
||||||
def capture(player):
|
def capture(player):
|
||||||
with ba.Context(player.actor._activity()):
|
with babase.ContextRef(player.actor._activity()):
|
||||||
player.recording_start_time = ba.time()
|
player.recording_start_time = bs.time()
|
||||||
PLAYERS_STUNT_INFO[player.sessionplayer] = []
|
PLAYERS_STUNT_INFO[player.sessionplayer] = []
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -266,33 +269,33 @@ def replay(player, stunt_name):
|
||||||
stunt = json.load(fin)
|
stunt = json.load(fin)
|
||||||
STUNT_CACHE[stunt_name] = stunt
|
STUNT_CACHE[stunt_name] = stunt
|
||||||
except:
|
except:
|
||||||
ba.screenmessage(f"{stunt_name} doesn't exists")
|
bui.screenmessage(f"{stunt_name} doesn't exists")
|
||||||
return
|
return
|
||||||
player.in_replay = True
|
player.in_replay = True
|
||||||
with ba.Context(player.actor._activity()):
|
with babase.ContextRef(player.actor._activity()):
|
||||||
ControlsUI.display(player.actor._activity())
|
ControlsUI.display(player.actor._activity())
|
||||||
for move in stunt:
|
for move in stunt:
|
||||||
value = move["move"]["value"]
|
value = move["move"]["value"]
|
||||||
if value is None:
|
if value is None:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(player.actor.move_map[move["move"]["action"]])
|
babase.Call(player.actor.move_map[move["move"]["action"]])
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(player.actor.move_map[move["move"]["action"]], move["move"]["value"])
|
babase.Call(player.actor.move_map[move["move"]["action"]], move["move"]["value"])
|
||||||
)
|
)
|
||||||
last_move_time = move["time"]
|
last_move_time = move["time"]
|
||||||
time_to_hide_controls = last_move_time + 1
|
time_to_hide_controls = last_move_time + 1
|
||||||
ba.timer(time_to_hide_controls, ba.Call(handle_player_replay_end, player))
|
bs.timer(time_to_hide_controls, babase.Call(handle_player_replay_end, player))
|
||||||
|
|
||||||
|
|
||||||
def spawn_mirror_spaz(player):
|
def spawn_mirror_spaz(player):
|
||||||
player.mirror_mode = True
|
player.mirror_mode = True
|
||||||
with ba.Context(player.actor._activity()):
|
with babase.ContextRef(player.actor._activity()):
|
||||||
bot = spaz.Spaz(player.color, player.highlight, character=player.character).autoretain()
|
bot = spaz.Spaz(player.color, player.highlight, character=player.character).autoretain()
|
||||||
bot.handlemessage(ba.StandMessage(
|
bot.handlemessage(bs.StandMessage(
|
||||||
(player.actor.node.position[0], player.actor.node.position[1], player.actor.node.position[2]+1), 93))
|
(player.actor.node.position[0], player.actor.node.position[1], player.actor.node.position[2]+1), 93))
|
||||||
bot.node.name = player.actor.node.name
|
bot.node.name = player.actor.node.name
|
||||||
bot.node.name_color = player.actor.node.name_color
|
bot.node.name_color = player.actor.node.name_color
|
||||||
|
|
@ -309,51 +312,51 @@ def ghost(player, stunt_name):
|
||||||
stunt = json.load(fin)
|
stunt = json.load(fin)
|
||||||
STUNT_CACHE[stunt_name] = stunt
|
STUNT_CACHE[stunt_name] = stunt
|
||||||
except:
|
except:
|
||||||
ba.screenmessage(f"{stunt_name} doesn't exists")
|
bui.screenmessage(f"{stunt_name} doesn't exists")
|
||||||
return
|
return
|
||||||
player.in_replay = True
|
player.in_replay = True
|
||||||
|
|
||||||
with ba.Context(player.actor._activity()):
|
with babase.ContextRef(player.actor._activity()):
|
||||||
bot = spaz.Spaz((1, 0, 0), character="Spaz").autoretain()
|
bot = spaz.Spaz((1, 0, 0), character="Spaz").autoretain()
|
||||||
bot.handlemessage(ba.StandMessage(player.actor.node.position, 93))
|
bot.handlemessage(bs.StandMessage(player.actor.node.position, 93))
|
||||||
give_ghost_power(bot)
|
give_ghost_power(bot)
|
||||||
ControlsUI.display(player.actor._activity())
|
ControlsUI.display(player.actor._activity())
|
||||||
for move in stunt:
|
for move in stunt:
|
||||||
value = move["move"]["value"]
|
value = move["move"]["value"]
|
||||||
if value is None:
|
if value is None:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(bot.move_map[move["move"]["action"]])
|
babase.Call(bot.move_map[move["move"]["action"]])
|
||||||
)
|
)
|
||||||
ui_activation = CONTROLS_UI_MAP.get(move["move"]["action"])
|
ui_activation = CONTROLS_UI_MAP.get(move["move"]["action"])
|
||||||
if ui_activation:
|
if ui_activation:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(ui_activation, player.actor._activity())
|
babase.Call(ui_activation, player.actor._activity())
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(bot.move_map[move["move"]["action"]], move["move"]["value"])
|
babase.Call(bot.move_map[move["move"]["action"]], move["move"]["value"])
|
||||||
)
|
)
|
||||||
ui_activation = CONTROLS_UI_MAP.get(move["move"]["action"])
|
ui_activation = CONTROLS_UI_MAP.get(move["move"]["action"])
|
||||||
|
|
||||||
if ui_activation:
|
if ui_activation:
|
||||||
ba.timer(
|
bs.timer(
|
||||||
move["time"],
|
move["time"],
|
||||||
ba.Call(ui_activation, player.actor._activity(), move["move"]["value"])
|
babase.Call(ui_activation, player.actor._activity(), move["move"]["value"])
|
||||||
)
|
)
|
||||||
last_move_time = move["time"]
|
last_move_time = move["time"]
|
||||||
time_to_hide_controls = last_move_time + 1
|
time_to_hide_controls = last_move_time + 1
|
||||||
ba.timer(time_to_hide_controls, ba.Call(handle_player_replay_end, player))
|
bs.timer(time_to_hide_controls, babase.Call(handle_player_replay_end, player))
|
||||||
ba.timer(time_to_hide_controls, ba.Call(bot.node.delete))
|
bs.timer(time_to_hide_controls, babase.Call(bot.node.delete))
|
||||||
|
|
||||||
|
|
||||||
def give_ghost_power(spaz):
|
def give_ghost_power(spaz):
|
||||||
spaz.node.invincible = True
|
spaz.node.invincible = True
|
||||||
shared = SharedObjects.get()
|
shared = SharedObjects.get()
|
||||||
factory = SpazFactory.get()
|
factory = SpazFactory.get()
|
||||||
ghost = ba.Material()
|
ghost = bs.Material()
|
||||||
# smoothy hecks
|
# smoothy hecks
|
||||||
ghost.add_actions(
|
ghost.add_actions(
|
||||||
conditions=(('they_have_material', factory.spaz_material), 'or',
|
conditions=(('they_have_material', factory.spaz_material), 'or',
|
||||||
|
|
@ -397,7 +400,7 @@ def new_chatmessage(msg):
|
||||||
|
|
||||||
if command == "start":
|
if command == "start":
|
||||||
capture(player)
|
capture(player)
|
||||||
_ba.chatmessage("Recording started for {}.".format(
|
bs.chatmessage("Recording started for {}.".format(
|
||||||
player.getname(),
|
player.getname(),
|
||||||
))
|
))
|
||||||
return original_chatmessage(msg)
|
return original_chatmessage(msg)
|
||||||
|
|
@ -406,28 +409,28 @@ def new_chatmessage(msg):
|
||||||
|
|
||||||
if command == "save":
|
if command == "save":
|
||||||
if len(msg_splits) < 2:
|
if len(msg_splits) < 2:
|
||||||
ba.screenmessage("Enter name of stunt eg : *save bombjump")
|
bui.screenmessage("Enter name of stunt eg : *save bombjump")
|
||||||
return original_chatmessage(msg)
|
return original_chatmessage(msg)
|
||||||
save(player, stunt_name)
|
save(player, stunt_name)
|
||||||
_ba.chatmessage('Recording "{}" by {} saved.'.format(
|
bs.chatmessage('Recording "{}" by {} saved.'.format(
|
||||||
stunt_name,
|
stunt_name,
|
||||||
player.getname(),
|
player.getname(),
|
||||||
))
|
))
|
||||||
elif command == "stunt":
|
elif command == "stunt":
|
||||||
if len(msg_splits) < 2:
|
if len(msg_splits) < 2:
|
||||||
ba.screenmessage("Enter name of stunt eg : *stunt bombjump")
|
bui.screenmessage("Enter name of stunt eg : *stunt bombjump")
|
||||||
return original_chatmessage(msg)
|
return original_chatmessage(msg)
|
||||||
replay(player, stunt_name)
|
replay(player, stunt_name)
|
||||||
_ba.chatmessage('Replaying "{}" on {}.'.format(
|
bs.chatmessage('Replaying "{}" on {}.'.format(
|
||||||
stunt_name,
|
stunt_name,
|
||||||
player.getname(),
|
player.getname(),
|
||||||
))
|
))
|
||||||
elif command == "learn":
|
elif command == "learn":
|
||||||
if len(msg_splits) < 2:
|
if len(msg_splits) < 2:
|
||||||
ba.screenmessage("Enter name of stunt eg : *learn bombjump")
|
bui.screenmessage("Enter name of stunt eg : *learn bombjump")
|
||||||
return original_chatmessage(msg)
|
return original_chatmessage(msg)
|
||||||
ghost(player, stunt_name)
|
ghost(player, stunt_name)
|
||||||
_ba.chatmessage('Replaying "{}" on {}.'.format(
|
bs.chatmessage('Replaying "{}" on {}.'.format(
|
||||||
stunt_name,
|
stunt_name,
|
||||||
player.getname(),
|
player.getname(),
|
||||||
))
|
))
|
||||||
|
|
@ -473,25 +476,25 @@ def set_stick_image_position(self, x: float, y: float) -> None:
|
||||||
|
|
||||||
def on_begin(self, *args, **kwargs) -> None:
|
def on_begin(self, *args, **kwargs) -> None:
|
||||||
self._jump_image = Image(
|
self._jump_image = Image(
|
||||||
ba.gettexture('buttonJump'),
|
bui.gettexture('buttonJump'),
|
||||||
position=(385, 160),
|
position=(385, 160),
|
||||||
scale=(50, 50),
|
scale=(50, 50),
|
||||||
color=[0.1, 0.45, 0.1, 0]
|
color=[0.1, 0.45, 0.1, 0]
|
||||||
)
|
)
|
||||||
self._pickup_image = Image(
|
self._pickup_image = Image(
|
||||||
ba.gettexture('buttonPickUp'),
|
bui.gettexture('buttonPickUp'),
|
||||||
position=(385, 240),
|
position=(385, 240),
|
||||||
scale=(50, 50),
|
scale=(50, 50),
|
||||||
color=[0, 0.35, 0, 0]
|
color=[0, 0.35, 0, 0]
|
||||||
)
|
)
|
||||||
self._punch_image = Image(
|
self._punch_image = Image(
|
||||||
ba.gettexture('buttonPunch'),
|
bui.gettexture('buttonPunch'),
|
||||||
position=(345, 200),
|
position=(345, 200),
|
||||||
scale=(50, 50),
|
scale=(50, 50),
|
||||||
color=[0.45, 0.45, 0, 0]
|
color=[0.45, 0.45, 0, 0]
|
||||||
)
|
)
|
||||||
self._bomb_image = Image(
|
self._bomb_image = Image(
|
||||||
ba.gettexture('buttonBomb'),
|
bui.gettexture('buttonBomb'),
|
||||||
position=(425, 200),
|
position=(425, 200),
|
||||||
scale=(50, 50),
|
scale=(50, 50),
|
||||||
color=[0.45, 0.1, 0.1, 0]
|
color=[0.45, 0.1, 0.1, 0]
|
||||||
|
|
@ -499,10 +502,10 @@ def on_begin(self, *args, **kwargs) -> None:
|
||||||
self.stick_image_position_x = self.stick_image_position_y = 0.0
|
self.stick_image_position_x = self.stick_image_position_y = 0.0
|
||||||
self._stick_base_position = p = (-328, 200)
|
self._stick_base_position = p = (-328, 200)
|
||||||
self._stick_base_image_color = c2 = (0.25, 0.25, 0.25, 1.0)
|
self._stick_base_image_color = c2 = (0.25, 0.25, 0.25, 1.0)
|
||||||
self._stick_base_image = ba.newnode(
|
self._stick_base_image = bs.newnode(
|
||||||
'image',
|
'image',
|
||||||
attrs={
|
attrs={
|
||||||
'texture': ba.gettexture('nub'),
|
'texture': bui.gettexture('nub'),
|
||||||
'absolute_scale': True,
|
'absolute_scale': True,
|
||||||
'vr_depth': -40,
|
'vr_depth': -40,
|
||||||
'position': p,
|
'position': p,
|
||||||
|
|
@ -511,9 +514,9 @@ def on_begin(self, *args, **kwargs) -> None:
|
||||||
})
|
})
|
||||||
self._stick_nub_position = p = (-328, 200)
|
self._stick_nub_position = p = (-328, 200)
|
||||||
self._stick_nub_image_color = c3 = (0.4, 0.4, 0.4, 1.0)
|
self._stick_nub_image_color = c3 = (0.4, 0.4, 0.4, 1.0)
|
||||||
self._stick_nub_image = ba.newnode('image',
|
self._stick_nub_image = bs.newnode('image',
|
||||||
attrs={
|
attrs={
|
||||||
'texture': ba.gettexture('nub'),
|
'texture': bui.gettexture('nub'),
|
||||||
'absolute_scale': True,
|
'absolute_scale': True,
|
||||||
'position': p,
|
'position': p,
|
||||||
'scale': (110*0.6, 110*0.66),
|
'scale': (110*0.6, 110*0.66),
|
||||||
|
|
@ -526,22 +529,22 @@ def on_begin(self, *args, **kwargs) -> None:
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class byHeySmoothy(ba.Plugin):
|
class byHeySmoothy(babase.Plugin):
|
||||||
def on_app_running(self):
|
def on_app_running(self):
|
||||||
_ba.set_party_icon_always_visible(True)
|
bui.set_party_icon_always_visible(True)
|
||||||
ba._activity.Activity.on_begin = on_begin
|
bs._activity.Activity.on_begin = on_begin
|
||||||
_ba.chatmessage = new_chatmessage
|
bs.chatmessage = new_chatmessage
|
||||||
bastd.actor.playerspaz.PlayerSpaz = NewPlayerSpaz
|
bascenev1lib.actor.playerspaz.PlayerSpaz = NewPlayerSpaz
|
||||||
bastd.actor.spaz.Spaz = NewSpaz
|
bascenev1lib.actor.spaz.Spaz = NewSpaz
|
||||||
|
|
||||||
|
|
||||||
# lets define a sample elimination game that can use super power of this plugin
|
# lets define a sample elimination game that can use super power of this plugin
|
||||||
|
|
||||||
# ba_meta export game
|
# ba_meta export bascenev1.GameActivity
|
||||||
class BroEliminaition(EliminationGame):
|
class BroEliminaition(EliminationGame):
|
||||||
name = 'BroElimination'
|
name = 'BroElimination'
|
||||||
description = 'Elimination Game with dual character control'
|
description = 'Elimination Game with dual character control'
|
||||||
|
|
||||||
def spawn_player(self, player) -> ba.Actor:
|
def spawn_player(self, player) -> bs.Actor:
|
||||||
super().spawn_player(player)
|
super().spawn_player(player)
|
||||||
spawn_mirror_spaz(player)
|
spawn_mirror_spaz(player)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
|
|
||||||
"""
|
"""
|
||||||
AutoRun by TheMikirog
|
AutoRun by TheMikirog
|
||||||
|
|
@ -18,11 +19,13 @@ from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
# Let's import everything we need and nothing more.
|
# Let's import everything we need and nothing more.
|
||||||
import ba
|
import babase
|
||||||
import bastd
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
|
import bascenev1lib
|
||||||
import math
|
import math
|
||||||
from ba._generated.enums import TimeType
|
from babase._mgen.enums import TimeType
|
||||||
from bastd.actor.spaz import Spaz
|
from bascenev1lib.actor.spaz import Spaz
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -72,8 +75,7 @@ if TYPE_CHECKING:
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class AutoRun(ba.Plugin):
|
class AutoRun(babase.Plugin):
|
||||||
|
|
||||||
# During my research and prototyping I figured I'd have to do some linear algebgra.
|
# During my research and prototyping I figured I'd have to do some linear algebgra.
|
||||||
# I didn't want to use libraries, since this is supposed to be a standalone mod.
|
# I didn't want to use libraries, since this is supposed to be a standalone mod.
|
||||||
# Because of this I made certain functions from scratch that are easily accessible.
|
# Because of this I made certain functions from scratch that are easily accessible.
|
||||||
|
|
@ -109,14 +111,13 @@ class AutoRun(ba.Plugin):
|
||||||
# Here I'm defining a new spaz init function that'll be replaced.
|
# Here I'm defining a new spaz init function that'll be replaced.
|
||||||
def new_init(func):
|
def new_init(func):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
|
||||||
# Here's where we execute the original game's code, so it's not lost.
|
# Here's where we execute the original game's code, so it's not lost.
|
||||||
# We want to add our code at the end of the existing code, so our code goes under that.
|
# We want to add our code at the end of the existing code, so our code goes under that.
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
|
|
||||||
# We define some variables that we need to keep track of.
|
# We define some variables that we need to keep track of.
|
||||||
# For future reference, if you see args[0] anywhere, that is "self" in the original function.
|
# For future reference, if you see args[0] anywhere, that is "self" in the original function.
|
||||||
args[0].autorun_timer: ba.Timer | None = None
|
args[0].autorun_timer: bs.Timer | None = None
|
||||||
args[0].autorun_override = False
|
args[0].autorun_override = False
|
||||||
|
|
||||||
# We wanna do our auto run calculations when the player moves their analog stick to make it responsive.
|
# We wanna do our auto run calculations when the player moves their analog stick to make it responsive.
|
||||||
|
|
@ -140,12 +141,14 @@ class AutoRun(ba.Plugin):
|
||||||
# Notice how it's the capital T Timer instead of the small letter.
|
# Notice how it's the capital T Timer instead of the small letter.
|
||||||
# That's important, because big T returns a timer object we can manipulate.
|
# That's important, because big T returns a timer object we can manipulate.
|
||||||
# We need it assigned to a variable, because we have to delete it once it stops being relevant.
|
# We need it assigned to a variable, because we have to delete it once it stops being relevant.
|
||||||
args[0].autorun_timer = ba.Timer(
|
args[0].autorun_timer = bs.Timer(0.1, spaz_autorun_update, repeat=True)
|
||||||
0.1, spaz_autorun_update, timetype=TimeType.SIM, repeat=True)
|
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
# Let's replace the original function with our modified version.
|
# Let's replace the original function with our modified version.
|
||||||
bastd.actor.spaz.Spaz.__init__ = new_init(bastd.actor.spaz.Spaz.__init__)
|
bascenev1lib.actor.spaz.Spaz.__init__ = new_init(
|
||||||
|
bascenev1lib.actor.spaz.Spaz.__init__
|
||||||
|
)
|
||||||
|
|
||||||
# This is the bulk of our mod. Our run_update function.
|
# This is the bulk of our mod. Our run_update function.
|
||||||
# The goal here is to change the self.node.run attribute of our character.
|
# The goal here is to change the self.node.run attribute of our character.
|
||||||
|
|
@ -170,8 +173,10 @@ class AutoRun(ba.Plugin):
|
||||||
movement_vector = [horizontal, vertical]
|
movement_vector = [horizontal, vertical]
|
||||||
|
|
||||||
# Get our character's facing direction
|
# Get our character's facing direction
|
||||||
facing_direction = (self.node.position[0] - self.node.position_forward[0],
|
facing_direction = (
|
||||||
self.node.position[2] - self.node.position_forward[2])
|
self.node.position[0] - self.node.position_forward[0],
|
||||||
|
self.node.position[2] - self.node.position_forward[2],
|
||||||
|
)
|
||||||
# We want our character's facing direction to be a normalized vector (magnitude of 1).
|
# We want our character's facing direction to be a normalized vector (magnitude of 1).
|
||||||
facing_direction = AutoRun.normalize(facing_direction)
|
facing_direction = AutoRun.normalize(facing_direction)
|
||||||
|
|
||||||
|
|
@ -216,9 +221,11 @@ class AutoRun(ba.Plugin):
|
||||||
args[0].autorun_override = args[1]
|
args[0].autorun_override = args[1]
|
||||||
# Here's our original unchanged function
|
# Here's our original unchanged function
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
# We replace the character running function with our modified version.
|
# We replace the character running function with our modified version.
|
||||||
bastd.actor.spaz.Spaz.on_run = new_onrun(bastd.actor.spaz.Spaz.on_run)
|
bascenev1lib.actor.spaz.Spaz.on_run = new_onrun(bascenev1lib.actor.spaz.Spaz.on_run)
|
||||||
|
|
||||||
# There's two function that are called when our player pushes the analog stick - two for each axis.
|
# There's two function that are called when our player pushes the analog stick - two for each axis.
|
||||||
# Here's for the vertical axis.
|
# Here's for the vertical axis.
|
||||||
|
|
@ -229,9 +236,13 @@ class AutoRun(ba.Plugin):
|
||||||
# If we're not holding the run button and we're a player, run our auto run behavior.
|
# If we're not holding the run button and we're a player, run our auto run behavior.
|
||||||
if not args[0].autorun_override and args[0].source_player:
|
if not args[0].autorun_override and args[0].source_player:
|
||||||
AutoRun.run_update(args[0])
|
AutoRun.run_update(args[0])
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
# You get the idea.
|
# You get the idea.
|
||||||
bastd.actor.spaz.Spaz.on_move_up_down = new_updown(bastd.actor.spaz.Spaz.on_move_up_down)
|
bascenev1lib.actor.spaz.Spaz.on_move_up_down = new_updown(
|
||||||
|
bascenev1lib.actor.spaz.Spaz.on_move_up_down
|
||||||
|
)
|
||||||
|
|
||||||
# Let's do the same for our horizontal axis.
|
# Let's do the same for our horizontal axis.
|
||||||
# Second verse same as the first.
|
# Second verse same as the first.
|
||||||
|
|
@ -240,9 +251,12 @@ class AutoRun(ba.Plugin):
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
if not args[0].autorun_override and args[0].source_player:
|
if not args[0].autorun_override and args[0].source_player:
|
||||||
AutoRun.run_update(args[0])
|
AutoRun.run_update(args[0])
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spaz.Spaz.on_move_left_right = new_leftright(
|
|
||||||
bastd.actor.spaz.Spaz.on_move_left_right)
|
bascenev1lib.actor.spaz.Spaz.on_move_left_right = new_leftright(
|
||||||
|
bascenev1lib.actor.spaz.Spaz.on_move_left_right
|
||||||
|
)
|
||||||
|
|
||||||
# There's one downside to the looping timer - it runs constantly even if the player is dead.
|
# There's one downside to the looping timer - it runs constantly even if the player is dead.
|
||||||
# We don't want to waste computational power on something like that.
|
# We don't want to waste computational power on something like that.
|
||||||
|
|
@ -250,10 +264,14 @@ class AutoRun(ba.Plugin):
|
||||||
def new_handlemessage(func):
|
def new_handlemessage(func):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
# Only react to the death message.
|
# Only react to the death message.
|
||||||
if isinstance(args[1], ba.DieMessage):
|
if isinstance(args[1], bs.DieMessage):
|
||||||
# Kill the timer.
|
# Kill the timer.
|
||||||
args[0].autorun_timer = None
|
args[0].autorun_timer = None
|
||||||
# Original function.
|
# Original function.
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spaz.Spaz.handlemessage = new_handlemessage(bastd.actor.spaz.Spaz.handlemessage)
|
|
||||||
|
bascenev1lib.actor.spaz.Spaz.handlemessage = new_handlemessage(
|
||||||
|
bascenev1lib.actor.spaz.Spaz.handlemessage
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Bomb Radius Visualizer by TheMikirog
|
Bomb Radius Visualizer by TheMikirog
|
||||||
|
|
@ -16,9 +17,11 @@ from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
# Let's import everything we need and nothing more.
|
# Let's import everything we need and nothing more.
|
||||||
import ba
|
import babase
|
||||||
import bastd
|
import bauiv1 as bui
|
||||||
from bastd.actor.bomb import Bomb
|
import bascenev1 as bs
|
||||||
|
import bascenev1lib
|
||||||
|
from bascenev1lib.actor.bomb import Bomb
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -26,7 +29,7 @@ if TYPE_CHECKING:
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class BombRadiusVisualizer(ba.Plugin):
|
class BombRadiusVisualizer(babase.Plugin):
|
||||||
|
|
||||||
# We use a decorator to add extra code to existing code, increasing mod compatibility.
|
# We use a decorator to add extra code to existing code, increasing mod compatibility.
|
||||||
# Here I'm defining a new bomb init function that'll be replaced.
|
# Here I'm defining a new bomb init function that'll be replaced.
|
||||||
|
|
@ -44,7 +47,7 @@ class BombRadiusVisualizer(ba.Plugin):
|
||||||
# Let's make a new node that's just a circle. It's the some one used in the Target Practice minigame.
|
# Let's make a new node that's just a circle. It's the some one used in the Target Practice minigame.
|
||||||
# This is going to make a slightly opaque red circle, signifying damaging area.
|
# This is going to make a slightly opaque red circle, signifying damaging area.
|
||||||
# We aren't defining the size, because we're gonna animate it shortly after.
|
# We aren't defining the size, because we're gonna animate it shortly after.
|
||||||
args[0].radius_visualizer = ba.newnode('locator',
|
args[0].radius_visualizer = bs.newnode('locator',
|
||||||
# Remove itself when the bomb node dies.
|
# Remove itself when the bomb node dies.
|
||||||
owner=args[0].node,
|
owner=args[0].node,
|
||||||
attrs={
|
attrs={
|
||||||
|
|
@ -59,14 +62,14 @@ class BombRadiusVisualizer(ba.Plugin):
|
||||||
|
|
||||||
# Let's do a fancy animation of that red circle growing into shape like a cartoon.
|
# Let's do a fancy animation of that red circle growing into shape like a cartoon.
|
||||||
# We're gonna read our bomb's blast radius and use it to decide the size of our circle.
|
# We're gonna read our bomb's blast radius and use it to decide the size of our circle.
|
||||||
ba.animate_array(args[0].radius_visualizer, 'size', 1, {
|
bs.animate_array(args[0].radius_visualizer, 'size', 1, {
|
||||||
0.0: [0.0],
|
0.0: [0.0],
|
||||||
0.2: [args[0].blast_radius * 2.2],
|
0.2: [args[0].blast_radius * 2.2],
|
||||||
0.25: [args[0].blast_radius * 2.0]
|
0.25: [args[0].blast_radius * 2.0]
|
||||||
})
|
})
|
||||||
|
|
||||||
# Let's do a second circle, this time just the outline to where the damaging area ends.
|
# Let's do a second circle, this time just the outline to where the damaging area ends.
|
||||||
args[0].radius_visualizer_circle = ba.newnode('locator',
|
args[0].radius_visualizer_circle = bs.newnode('locator',
|
||||||
# Remove itself when the bomb node dies.
|
# Remove itself when the bomb node dies.
|
||||||
owner=args[0].node,
|
owner=args[0].node,
|
||||||
attrs={
|
attrs={
|
||||||
|
|
@ -81,7 +84,7 @@ class BombRadiusVisualizer(ba.Plugin):
|
||||||
args[0].node.connectattr('position', args[0].radius_visualizer_circle, 'position')
|
args[0].node.connectattr('position', args[0].radius_visualizer_circle, 'position')
|
||||||
|
|
||||||
# Let's animate that circle too, but this time let's do the opacity.
|
# Let's animate that circle too, but this time let's do the opacity.
|
||||||
ba.animate(
|
bs.animate(
|
||||||
args[0].radius_visualizer_circle, 'opacity', {
|
args[0].radius_visualizer_circle, 'opacity', {
|
||||||
0: 0.0,
|
0: 0.0,
|
||||||
0.4: 0.1
|
0.4: 0.1
|
||||||
|
|
@ -90,4 +93,4 @@ class BombRadiusVisualizer(ba.Plugin):
|
||||||
|
|
||||||
# Finally we """travel through the game files""" to replace the function we want with our own version.
|
# Finally we """travel through the game files""" to replace the function we want with our own version.
|
||||||
# We transplant the old function's arguments into our version.
|
# We transplant the old function's arguments into our version.
|
||||||
bastd.actor.bomb.Bomb.__init__ = new_bomb_init(bastd.actor.bomb.Bomb.__init__)
|
bascenev1lib.actor.bomb.Bomb.__init__ = new_bomb_init(bascenev1lib.actor.bomb.Bomb.__init__)
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,22 @@
|
||||||
|
# Ported by brostos to api 8
|
||||||
|
# Tool used to make porting easier.(https://github.com/bombsquad-community/baport)
|
||||||
"""python 3.9 | chatcmd for a beutiful game - BombSquad OwO"""
|
"""python 3.9 | chatcmd for a beutiful game - BombSquad OwO"""
|
||||||
# modded by IM_NOT_PRANAV#7874
|
# modded by IM_NOT_PRANAV#7874
|
||||||
|
|
||||||
# biggggggg thankssssssssssssss to FireFighter1037 for helping everything
|
# biggggggg thankssssssssssssss to FireFighter1037 for helping everything
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# ba_meta require api 7
|
# Ported by brostos to api 8
|
||||||
from _ba import env, get_foreground_host_activity, get_foreground_host_session, get_game_roster, get_chat_messages, set_party_icon_always_visible, chatmessage as cmsg, screenmessage as smsg
|
# ba_meta require api 8
|
||||||
import ba
|
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
from bascenev1 import get_foreground_host_activity, get_foreground_host_session, get_game_roster, get_chat_messages, chatmessage as cmsg
|
||||||
|
from bauiv1 import set_party_icon_always_visible, screenmessage as smsg
|
||||||
|
import babase
|
||||||
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
|
from bauiv1lib import mainmenu
|
||||||
|
|
||||||
# our prefix that what we starts cmds with
|
# our prefix that what we starts cmds with
|
||||||
px = '/'
|
px = '/'
|
||||||
|
|
@ -17,17 +27,20 @@ px = '/'
|
||||||
class _cmds:
|
class _cmds:
|
||||||
|
|
||||||
def _process_cmd():
|
def _process_cmd():
|
||||||
set_party_icon_always_visible(True)
|
try:
|
||||||
messages = get_chat_messages()
|
messages = get_chat_messages()
|
||||||
if len(messages) > 1:
|
if len(messages) > 1:
|
||||||
lastmsg = messages[len(messages)-1]
|
lastmsg = messages[len(messages)-1]
|
||||||
|
|
||||||
m = lastmsg.split(' ')[1]
|
m = lastmsg.split(' ')[1]
|
||||||
if m.startswith(px):
|
if m.startswith(px):
|
||||||
return _cmds._handle()
|
return _cmds._handle()
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _handle():
|
def _handle():
|
||||||
messages = get_chat_messages()
|
messages = get_chat_messages()
|
||||||
if len(messages) > 1:
|
if len(messages) > 1:
|
||||||
|
|
@ -137,17 +150,17 @@ class _cmds:
|
||||||
cmsg('could not found player')
|
cmsg('could not found player')
|
||||||
|
|
||||||
elif m in [px+'quit', px+'restart']:
|
elif m in [px+'quit', px+'restart']:
|
||||||
ba.quit()
|
babase.quit()
|
||||||
|
|
||||||
elif m in [px+'mute', px+'mutechat']:
|
elif m in [px+'mute', px+'mutechat']:
|
||||||
cfg = ba.app.config
|
cfg = babase.app.config
|
||||||
cfg['Chat Muted'] = True
|
cfg['Chat Muted'] = True
|
||||||
cfg.apply_and_commit()
|
cfg.apply_and_commit()
|
||||||
cmsg('muted')
|
cmsg('muted')
|
||||||
smsg(f'chat muted use {px}unmute and click on send to unmute')
|
smsg(f'chat muted use {px}unmute and click on send to unmute')
|
||||||
|
|
||||||
elif m in [px+'unmute', px+'unmutechat']:
|
elif m in [px+'unmute', px+'unmutechat']:
|
||||||
cfg = ba.app.config
|
cfg = babase.app.config
|
||||||
cfg['Chat Muted'] = False
|
cfg['Chat Muted'] = False
|
||||||
cfg.apply_and_commit()
|
cfg.apply_and_commit()
|
||||||
cmsg('un_muted')
|
cmsg('un_muted')
|
||||||
|
|
@ -222,16 +235,16 @@ class _cmds:
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
body = i.actor.node
|
body = i.actor.node
|
||||||
if not body.torso_model == None:
|
if not body.torso_mesh == None:
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.torso_model = None
|
body.torso_mesh = None
|
||||||
body.upper_arm_model = None
|
body.upper_arm_mesh = None
|
||||||
body.forearm_model = None
|
body.forearm_mesh = None
|
||||||
body.pelvis_model = None
|
body.pelvis_mesh = None
|
||||||
body.hand_model = None
|
body.hand_mesh = None
|
||||||
body.toes_model = None
|
body.toes_mesh = None
|
||||||
body.upper_leg_model = None
|
body.upper_leg_mesh = None
|
||||||
body.lower_leg_model = None
|
body.lower_leg_mesh = None
|
||||||
body.style = 'cyborg'
|
body.style = 'cyborg'
|
||||||
cmsg('All invisible now Dont get cought')
|
cmsg('All invisible now Dont get cought')
|
||||||
else:
|
else:
|
||||||
|
|
@ -239,16 +252,16 @@ class _cmds:
|
||||||
else:
|
else:
|
||||||
body = activity_players[int(n[0])].actor.node
|
body = activity_players[int(n[0])].actor.node
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
if not body.torso_model == None:
|
if not body.torso_mesh == None:
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.torso_model = None
|
body.torso_mesh = None
|
||||||
body.upper_arm_model = None
|
body.upper_arm_mesh = None
|
||||||
body.forearm_model = None
|
body.forearm_mesh = None
|
||||||
body.pelvis_model = None
|
body.pelvis_mesh = None
|
||||||
body.hand_model = None
|
body.hand_mesh = None
|
||||||
body.toes_model = None
|
body.toes_mesh = None
|
||||||
body.upper_leg_model = None
|
body.upper_leg_mesh = None
|
||||||
body.lower_leg_model = None
|
body.lower_leg_mesh = None
|
||||||
body.style = 'cyborg'
|
body.style = 'cyborg'
|
||||||
cmsg(is_name+' using invisiblelity ')
|
cmsg(is_name+' using invisiblelity ')
|
||||||
else:
|
else:
|
||||||
|
|
@ -260,8 +273,8 @@ class _cmds:
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
body = i.actor.node
|
body = i.actor.node
|
||||||
if not body.head_model == None:
|
if not body.head_mesh == None:
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.style = 'cyborg'
|
body.style = 'cyborg'
|
||||||
cmsg('headless ? xD')
|
cmsg('headless ? xD')
|
||||||
else:
|
else:
|
||||||
|
|
@ -269,8 +282,8 @@ class _cmds:
|
||||||
else:
|
else:
|
||||||
body = activity_players[int(n[0])].actor.node
|
body = activity_players[int(n[0])].actor.node
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
if not body.head_model == None:
|
if not body.head_mesh == None:
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.style = 'cyborg'
|
body.style = 'cyborg'
|
||||||
cmsg(is_name+'is headless now xD')
|
cmsg(is_name+'is headless now xD')
|
||||||
else:
|
else:
|
||||||
|
|
@ -282,16 +295,16 @@ class _cmds:
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
body = i.actor.node
|
body = i.actor.node
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.handlemessage(ba.PowerupMessage(poweruptype='punch'))
|
body.handlemessage(bs.PowerupMessage(poweruptype='punch'))
|
||||||
body.handlemessage(ba.PowerupMessage(poweruptype='shield'))
|
body.handlemessage(bs.PowerupMessage(poweruptype='shield'))
|
||||||
cmsg('dont creep out childs all will be scared')
|
cmsg('dont creep out childs all will be scared')
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
body = activity_players[int(n[0])].actor.node
|
body = activity_players[int(n[0])].actor.node
|
||||||
body.head_model = None
|
body.head_mesh = None
|
||||||
body.handlemessage(ba.PowerupMessage(poweruptype='punch'))
|
body.handlemessage(bs.PowerupMessage(poweruptype='punch'))
|
||||||
body.handlemessage(ba.PowerupMessage(poweruptype='shield'))
|
body.handlemessage(bs.PowerupMessage(poweruptype='shield'))
|
||||||
cmsg('dont creep out childs all will be scared')
|
cmsg('dont creep out childs all will be scared')
|
||||||
except:
|
except:
|
||||||
cmsg('could not found player to make')
|
cmsg('could not found player to make')
|
||||||
|
|
@ -301,11 +314,11 @@ class _cmds:
|
||||||
cmsg(f'Use : {px}kill all or {px}kill number of list')
|
cmsg(f'Use : {px}kill all or {px}kill number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.DieMessage())
|
i.actor.node.handlemessage(bs.DieMessage())
|
||||||
cmsg('Killed all')
|
cmsg('Killed all')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(ba.DieMessage())
|
activity_players[int(n[0])].actor.node.handlemessage(bs.DieMessage())
|
||||||
cmsg('Killed '+is_name)
|
cmsg('Killed '+is_name)
|
||||||
|
|
||||||
elif m in [px+'heal', px+'heath']:
|
elif m in [px+'heal', px+'heath']:
|
||||||
|
|
@ -313,12 +326,12 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}heal all or {px}heal number of list')
|
cmsg(f'Use: {px}heal all or {px}heal number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.PowerupMessage(poweruptype='health'))
|
i.actor.node.handlemessage(bs.PowerupMessage(poweruptype='health'))
|
||||||
cmsg('Heald all')
|
cmsg('Heald all')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(
|
activity_players[int(n[0])].actor.node.handlemessage(
|
||||||
ba.PowerupMessage(poweruptype='health'))
|
bs.PowerupMessage(poweruptype='health'))
|
||||||
cmsg('Heald '+is_name)
|
cmsg('Heald '+is_name)
|
||||||
|
|
||||||
elif m in [px+'curse', px+'cur']:
|
elif m in [px+'curse', px+'cur']:
|
||||||
|
|
@ -326,12 +339,12 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}curse all or {px}curse number of list')
|
cmsg(f'Use: {px}curse all or {px}curse number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.PowerupMessage(poweruptype='curse'))
|
i.actor.node.handlemessage(bs.PowerupMessage(poweruptype='curse'))
|
||||||
cmsg('Cursed all')
|
cmsg('Cursed all')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(
|
activity_players[int(n[0])].actor.node.handlemessage(
|
||||||
ba.PowerupMessage(poweruptype='curse'))
|
bs.PowerupMessage(poweruptype='curse'))
|
||||||
cmsg('Cursed '+is_name)
|
cmsg('Cursed '+is_name)
|
||||||
|
|
||||||
elif m in [px+'sleep']:
|
elif m in [px+'sleep']:
|
||||||
|
|
@ -378,12 +391,12 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}gloves all or {px}gloves number of list')
|
cmsg(f'Use: {px}gloves all or {px}gloves number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.PowerupMessage(poweruptype='punch'))
|
i.actor.node.handlemessage(bs.PowerupMessage(poweruptype='punch'))
|
||||||
cmsg('Free Gloves enjoy all')
|
cmsg('Free Gloves enjoy all')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(
|
activity_players[int(n[0])].actor.node.handlemessage(
|
||||||
ba.PowerupMessage(poweruptype='punch'))
|
bs.PowerupMessage(poweruptype='punch'))
|
||||||
cmsg(is_name+' using gloves')
|
cmsg(is_name+' using gloves')
|
||||||
|
|
||||||
elif m in [px+'shield', px+'protect']:
|
elif m in [px+'shield', px+'protect']:
|
||||||
|
|
@ -391,12 +404,12 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}shield all or {px}shield number of list')
|
cmsg(f'Use: {px}shield all or {px}shield number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.PowerupMessage(poweruptype='shield'))
|
i.actor.node.handlemessage(bs.PowerupMessage(poweruptype='shield'))
|
||||||
cmsg('Everyone enjoy free shield :)')
|
cmsg('Everyone enjoy free shield :)')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(
|
activity_players[int(n[0])].actor.node.handlemessage(
|
||||||
ba.PowerupMessage(poweruptype='shield'))
|
bs.PowerupMessage(poweruptype='shield'))
|
||||||
cmsg(is_name+' using shield')
|
cmsg(is_name+' using shield')
|
||||||
|
|
||||||
elif m in [px+'freeze', px+'ice']:
|
elif m in [px+'freeze', px+'ice']:
|
||||||
|
|
@ -404,11 +417,11 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}freeze all or {px}freeze number of list')
|
cmsg(f'Use: {px}freeze all or {px}freeze number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.FreezeMessage())
|
i.actor.node.handlemessage(bs.FreezeMessage())
|
||||||
cmsg('Freezed all')
|
cmsg('Freezed all')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(ba.FreezeMessage())
|
activity_players[int(n[0])].actor.node.handlemessage(bs.FreezeMessage())
|
||||||
cmsg('Un freezed '+is_name)
|
cmsg('Un freezed '+is_name)
|
||||||
|
|
||||||
elif m in [px+'unfreeze', px+'thaw']:
|
elif m in [px+'unfreeze', px+'thaw']:
|
||||||
|
|
@ -416,11 +429,11 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}unfreeze/thaw all or {px}unfreeze/thaw number of list')
|
cmsg(f'Use: {px}unfreeze/thaw all or {px}unfreeze/thaw number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.ThawMessage())
|
i.actor.node.handlemessage(bs.ThawMessage())
|
||||||
cmsg('Un freezed all ')
|
cmsg('Un freezed all ')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(ba.ThawMessage())
|
activity_players[int(n[0])].actor.node.handlemessage(bs.ThawMessage())
|
||||||
cmsg('Un freezed '+is_name)
|
cmsg('Un freezed '+is_name)
|
||||||
|
|
||||||
elif m in [px+'fall']:
|
elif m in [px+'fall']:
|
||||||
|
|
@ -428,11 +441,11 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}fall all or {px}fall number of list')
|
cmsg(f'Use: {px}fall all or {px}fall number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.StandMessage())
|
i.actor.node.handlemessage(bs.StandMessage())
|
||||||
cmsg('Felt everyone')
|
cmsg('Felt everyone')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(ba.StandMessage())
|
activity_players[int(n[0])].actor.node.handlemessage(bs.StandMessage())
|
||||||
cmsg(is_name+' got felt')
|
cmsg(is_name+' got felt')
|
||||||
|
|
||||||
elif m in [px+'celebrate', px+'celeb']:
|
elif m in [px+'celebrate', px+'celeb']:
|
||||||
|
|
@ -440,11 +453,11 @@ class _cmds:
|
||||||
cmsg(f'Use: {px}celebrate all or {px}celebrate number of list')
|
cmsg(f'Use: {px}celebrate all or {px}celebrate number of list')
|
||||||
elif n[0] == 'all':
|
elif n[0] == 'all':
|
||||||
for i in activity_players:
|
for i in activity_players:
|
||||||
i.actor.node.handlemessage(ba.CelebrateMessage())
|
i.actor.node.handlemessage(bs.CelebrateMessage())
|
||||||
cmsg('Celebrate all :)')
|
cmsg('Celebrate all :)')
|
||||||
else:
|
else:
|
||||||
is_name = session_players[int(n[0])].getname()
|
is_name = session_players[int(n[0])].getname()
|
||||||
activity_players[int(n[0])].actor.node.handlemessage(ba.CelebrateMessage())
|
activity_players[int(n[0])].actor.node.handlemessage(bs.CelebrateMessage())
|
||||||
cmsg(is_name+' is celebrating bt why?')
|
cmsg(is_name+' is celebrating bt why?')
|
||||||
|
|
||||||
elif m in [px+'fly']:
|
elif m in [px+'fly']:
|
||||||
|
|
@ -531,13 +544,24 @@ class _cmds:
|
||||||
cmsg(u'\U0001F95A Nazz are past/present/future \U0001F95A')
|
cmsg(u'\U0001F95A Nazz are past/present/future \U0001F95A')
|
||||||
cmsg(u'\U0001F95A everything is Nazz \U0001F95A')
|
cmsg(u'\U0001F95A everything is Nazz \U0001F95A')
|
||||||
|
|
||||||
|
class NewMainMenuWindow(mainmenu.MainMenuWindow):
|
||||||
# ba.timer(0.05, _update, repeat=True)
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
# Display chat icon, but if user open/close gather it may disappear
|
||||||
|
bui.set_party_icon_always_visible(True)
|
||||||
|
|
||||||
|
# bs.timer(0.05, _update, repeat=True)
|
||||||
def same():
|
def same():
|
||||||
ba.timer(0.5, _cmds._process_cmd, True)
|
# bs.timer(0.5, _cmds._process_cmd, True)
|
||||||
|
_cmds._process_cmd()
|
||||||
# ba_meta export plugin
|
# ba_meta export babase.Plugin
|
||||||
|
|
||||||
|
|
||||||
class _enableee(ba.Plugin):
|
class _enableee(babase.Plugin):
|
||||||
same()
|
timer = bs.AppTimer(0.5, same,repeat=True)
|
||||||
|
|
||||||
|
def on_app_running(self):
|
||||||
|
mainmenu.MainMenuWindow = NewMainMenuWindow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +1,16 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
# (see https://ballistica.net/wiki/meta-tag-system)
|
# (see https://ballistica.net/wiki/meta-tag-system)
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
import random
|
import random
|
||||||
from bastd.actor import bomb
|
from bascenev1lib.actor import bomb
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Sequence
|
from typing import Sequence
|
||||||
|
|
@ -20,7 +23,7 @@ class NewBlast(bomb.Blast):
|
||||||
velocity: Sequence[float] = (0.0, 0.0, 0.0),
|
velocity: Sequence[float] = (0.0, 0.0, 0.0),
|
||||||
blast_radius: float = 2.0,
|
blast_radius: float = 2.0,
|
||||||
blast_type: str = 'normal',
|
blast_type: str = 'normal',
|
||||||
source_player: ba.Player | None = None,
|
source_player: bs.Player | None = None,
|
||||||
hit_type: str = 'explosion',
|
hit_type: str = 'explosion',
|
||||||
hit_subtype: str = 'normal',
|
hit_subtype: str = 'normal',
|
||||||
):
|
):
|
||||||
|
|
@ -29,7 +32,7 @@ class NewBlast(bomb.Blast):
|
||||||
scorch_radius = light_radius = self.radius
|
scorch_radius = light_radius = self.radius
|
||||||
if self.blast_type == 'tnt':
|
if self.blast_type == 'tnt':
|
||||||
scorch_radius *= 1.15
|
scorch_radius *= 1.15
|
||||||
scorch = ba.newnode(
|
scorch = bs.newnode(
|
||||||
'scorch',
|
'scorch',
|
||||||
attrs={
|
attrs={
|
||||||
'position': position,
|
'position': position,
|
||||||
|
|
@ -38,11 +41,11 @@ class NewBlast(bomb.Blast):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
random_color = (random.random(), random.random(), random.random())
|
random_color = (random.random(), random.random(), random.random())
|
||||||
scorch.color = ba.safecolor(random_color)
|
scorch.color = babase.safecolor(random_color)
|
||||||
ba.animate(scorch, 'presence', {3.000: 1, 13.000: 0})
|
bs.animate(scorch, 'presence', {3.000: 1, 13.000: 0})
|
||||||
ba.timer(13.0, scorch.delete)
|
bs.timer(13.0, scorch.delete)
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class RandomColorsPlugin(ba.Plugin):
|
class RandomColorsPlugin(babase.Plugin):
|
||||||
bomb.Blast = NewBlast
|
bomb.Blast = NewBlast
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
# (see https://ballistica.net/wiki/meta-tag-system)
|
# (see https://ballistica.net/wiki/meta-tag-system)
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
from bastd.actor.spaz import Spaz
|
import bascenev1 as bs
|
||||||
|
from bascenev1lib.actor.spaz import Spaz
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
@ -16,19 +18,19 @@ Spaz.oldhandlemessage = Spaz.handlemessage
|
||||||
|
|
||||||
|
|
||||||
def handlemessage(self, msg: Any) -> Any:
|
def handlemessage(self, msg: Any) -> Any:
|
||||||
if isinstance(msg, ba.DieMessage):
|
if isinstance(msg, bs.DieMessage):
|
||||||
if self.node:
|
if self.node:
|
||||||
self.node.color_texture = ba.gettexture('bonesColor')
|
self.node.color_texture = bs.gettexture('bonesColor')
|
||||||
self.node.color_mask_texture = ba.gettexture('bonesColorMask')
|
self.node.color_mask_texture = bs.gettexture('bonesColorMask')
|
||||||
self.node.head_model = ba.getmodel('bonesHead')
|
self.node.head_mesh = bs.getmesh('bonesHead')
|
||||||
self.node.torso_model = ba.getmodel('bonesTorso')
|
self.node.torso_mesh = bs.getmesh('bonesTorso')
|
||||||
self.node.pelvis_model = ba.getmodel('bonesPelvis')
|
self.node.pelvis_mesh = bs.getmesh('bonesPelvis')
|
||||||
self.node.upper_arm_model = ba.getmodel('bonesUpperArm')
|
self.node.upper_arm_mesh = bs.getmesh('bonesUpperArm')
|
||||||
self.node.forearm_model = ba.getmodel('bonesForeArm')
|
self.node.forearm_mesh = bs.getmesh('bonesForeArm')
|
||||||
self.node.hand_model = ba.getmodel('bonesHand')
|
self.node.hand_mesh = bs.getmesh('bonesHand')
|
||||||
self.node.upper_leg_model = ba.getmodel('bonesUpperLeg')
|
self.node.upper_leg_mesh = bs.getmesh('bonesUpperLeg')
|
||||||
self.node.lower_leg_model = ba.getmodel('bonesLowerLeg')
|
self.node.lower_leg_mesh = bs.getmesh('bonesLowerLeg')
|
||||||
self.node.toes_model = ba.getmodel('bonesToes')
|
self.node.toes_mesh = bs.getmesh('bonesToes')
|
||||||
self.node.style = 'bones'
|
self.node.style = 'bones'
|
||||||
self.oldhandlemessage(msg)
|
self.oldhandlemessage(msg)
|
||||||
else:
|
else:
|
||||||
|
|
@ -36,5 +38,5 @@ def handlemessage(self, msg: Any) -> Any:
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class CustomDeath(ba.Plugin):
|
class CustomDeath(babase.Plugin):
|
||||||
Spaz.handlemessage = handlemessage
|
Spaz.handlemessage = handlemessage
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
"""Disco Light Mod: V1.0
|
"""Disco Light Mod: V1.0
|
||||||
Made by Cross Joy"""
|
Made by Cross Joy"""
|
||||||
|
|
||||||
|
|
@ -5,7 +6,7 @@ Made by Cross Joy"""
|
||||||
# Can visit my github https://github.com/CrossJoy/Bombsquad-Modding
|
# Can visit my github https://github.com/CrossJoy/Bombsquad-Modding
|
||||||
|
|
||||||
# You can contact me through discord:
|
# You can contact me through discord:
|
||||||
# My Discord Id: Cross Joy#0721
|
# My Discord Id: crossjoy
|
||||||
# My BS Discord Server: https://discord.gg/JyBY6haARJ
|
# My BS Discord Server: https://discord.gg/JyBY6haARJ
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -25,19 +26,22 @@ Made by Cross Joy"""
|
||||||
# Other clients/players can't use the commands.
|
# Other clients/players can't use the commands.
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 8
|
||||||
|
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
from baenv import TARGET_BALLISTICA_BUILD as build_number
|
||||||
import _ba
|
from bauiv1lib import mainmenu
|
||||||
from ba import _gameutils
|
import babase
|
||||||
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
|
import _babase
|
||||||
|
from bascenev1 import _gameutils, animate
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from ba import animate
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Sequence, Union
|
from typing import Sequence, Union
|
||||||
|
|
@ -51,38 +55,38 @@ def is_game_version_lower_than(version):
|
||||||
version is lower than the passed version. Useful for addressing
|
version is lower than the passed version. Useful for addressing
|
||||||
any breaking changes within game versions.
|
any breaking changes within game versions.
|
||||||
"""
|
"""
|
||||||
game_version = tuple(map(int, ba.app.version.split(".")))
|
game_version = tuple(map(int, babase.app.version if build_number < 21282 else babase.app.env.split(".")))
|
||||||
version = tuple(map(int, version.split(".")))
|
version = tuple(map(int, version.split(".")))
|
||||||
return game_version < version
|
return game_version < version
|
||||||
|
|
||||||
|
|
||||||
if is_game_version_lower_than("1.7.7"):
|
# if is_game_version_lower_than("1.7.7"):
|
||||||
ba_internal = _ba
|
# ba_internal = _ba
|
||||||
else:
|
# else:
|
||||||
ba_internal = ba.internal
|
# ba_internal = babase.internal
|
||||||
|
|
||||||
|
|
||||||
# Activate disco light.
|
# Activate disco light.
|
||||||
def start():
|
def start():
|
||||||
activity = _ba.get_foreground_host_activity()
|
activity = bs.get_foreground_host_activity()
|
||||||
|
|
||||||
with ba.Context(activity):
|
with activity.context:
|
||||||
partyLight(True)
|
partyLight(True)
|
||||||
rainbow(activity)
|
rainbow(activity)
|
||||||
|
|
||||||
|
|
||||||
# Deactivate disco light.
|
# Deactivate disco light.
|
||||||
def stop():
|
def stop():
|
||||||
activity = _ba.get_foreground_host_activity()
|
activity = bs.get_foreground_host_activity()
|
||||||
|
|
||||||
with ba.Context(activity):
|
with activity.context:
|
||||||
partyLight(False)
|
partyLight(False)
|
||||||
stop_rainbow(activity)
|
stop_rainbow(activity)
|
||||||
|
|
||||||
|
|
||||||
# Create and animate colorful spotlight.
|
# Create and animate colorful spotlight.
|
||||||
def partyLight(switch=True):
|
def partyLight(switch=True):
|
||||||
from ba._nodeactor import NodeActor
|
from bascenev1._nodeactor import NodeActor
|
||||||
x_spread = 10
|
x_spread = 10
|
||||||
y_spread = 5
|
y_spread = 5
|
||||||
positions = [[-x_spread, -y_spread], [0, -y_spread], [0, y_spread],
|
positions = [[-x_spread, -y_spread], [0, -y_spread], [0, y_spread],
|
||||||
|
|
@ -91,14 +95,14 @@ def partyLight(switch=True):
|
||||||
times = [0, 2700, 1000, 1800, 500, 1400]
|
times = [0, 2700, 1000, 1800, 500, 1400]
|
||||||
|
|
||||||
# Store this on the current activity, so we only have one at a time.
|
# Store this on the current activity, so we only have one at a time.
|
||||||
activity = _ba.getactivity()
|
activity = bs.getactivity()
|
||||||
activity.camera_flash_data = [] # type: ignore
|
activity.camera_flash_data = [] # type: ignore
|
||||||
for i in range(6):
|
for i in range(6):
|
||||||
r = random.choice([0.5, 1])
|
r = random.choice([0.5, 1])
|
||||||
g = random.choice([0.5, 1])
|
g = random.choice([0.5, 1])
|
||||||
b = random.choice([0.5, 1])
|
b = random.choice([0.5, 1])
|
||||||
light = NodeActor(
|
light = NodeActor(
|
||||||
_ba.newnode('light',
|
bs.newnode('light',
|
||||||
attrs={
|
attrs={
|
||||||
'position': (positions[i][0], 0, positions[i][1]),
|
'position': (positions[i][0], 0, positions[i][1]),
|
||||||
'radius': 1.0,
|
'radius': 1.0,
|
||||||
|
|
@ -108,7 +112,7 @@ def partyLight(switch=True):
|
||||||
}))
|
}))
|
||||||
sval = 1.87
|
sval = 1.87
|
||||||
iscale = 1.3
|
iscale = 1.3
|
||||||
tcombine = _ba.newnode('combine',
|
tcombine = bs.newnode('combine',
|
||||||
owner=light.node,
|
owner=light.node,
|
||||||
attrs={
|
attrs={
|
||||||
'size': 3,
|
'size': 3,
|
||||||
|
|
@ -149,7 +153,7 @@ def partyLight(switch=True):
|
||||||
loop=True,
|
loop=True,
|
||||||
offset=times[i])
|
offset=times[i])
|
||||||
if not switch:
|
if not switch:
|
||||||
_ba.timer(0.1,
|
bs.timer(0.1,
|
||||||
light.node.delete)
|
light.node.delete)
|
||||||
activity.camera_flash_data.append(light) # type: ignore
|
activity.camera_flash_data.append(light) # type: ignore
|
||||||
|
|
||||||
|
|
@ -158,7 +162,7 @@ def partyLight(switch=True):
|
||||||
def rainbow(self) -> None:
|
def rainbow(self) -> None:
|
||||||
"""Create RGB tint."""
|
"""Create RGB tint."""
|
||||||
c_existing = self.globalsnode.tint
|
c_existing = self.globalsnode.tint
|
||||||
cnode = _ba.newnode('combine',
|
cnode = bs.newnode('combine',
|
||||||
attrs={
|
attrs={
|
||||||
'input0': c_existing[0],
|
'input0': c_existing[0],
|
||||||
'input1': c_existing[1],
|
'input1': c_existing[1],
|
||||||
|
|
@ -187,11 +191,14 @@ def rainbow(self) -> None:
|
||||||
# Revert to the original map tint.
|
# Revert to the original map tint.
|
||||||
def stop_rainbow(self):
|
def stop_rainbow(self):
|
||||||
"""Revert to the original map tint."""
|
"""Revert to the original map tint."""
|
||||||
c_existing = self.globalsnode.tint
|
try:
|
||||||
map_name = self.map.getname()
|
c_existing = self.globalsnode.tint
|
||||||
tint = check_map_tint(map_name)
|
map_name = self.map.getname()
|
||||||
|
tint = check_map_tint(map_name)
|
||||||
|
except:
|
||||||
|
tint = (1, 1, 1)
|
||||||
|
|
||||||
cnode = _ba.newnode('combine',
|
cnode = bs.newnode('combine',
|
||||||
attrs={
|
attrs={
|
||||||
'input0': c_existing[0],
|
'input0': c_existing[0],
|
||||||
'input1': c_existing[1],
|
'input1': c_existing[1],
|
||||||
|
|
@ -249,11 +256,11 @@ def check_map_tint(map_name):
|
||||||
|
|
||||||
|
|
||||||
# Get the original game codes.
|
# Get the original game codes.
|
||||||
old_fcm = ba_internal.chatmessage
|
old_fcm = bs.chatmessage
|
||||||
|
|
||||||
|
|
||||||
# New chat func to add some commands to activate/deactivate the disco light.
|
# New chat func to add some commands to activate/deactivate the disco light.
|
||||||
def new_chat_message(msg: Union[str, ba.Lstr], clients: Sequence[int] = None,
|
def new_chat_message(msg: Union[str, babase.Lstr], clients: Sequence[int] = None,
|
||||||
sender_override: str = None):
|
sender_override: str = None):
|
||||||
old_fcm(msg, clients, sender_override)
|
old_fcm(msg, clients, sender_override)
|
||||||
if msg == '/disco':
|
if msg == '/disco':
|
||||||
|
|
@ -261,13 +268,18 @@ def new_chat_message(msg: Union[str, ba.Lstr], clients: Sequence[int] = None,
|
||||||
if msg == '/disco off':
|
if msg == '/disco off':
|
||||||
stop()
|
stop()
|
||||||
|
|
||||||
|
class NewMainMenuWindow(mainmenu.MainMenuWindow):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
# Display chat icon, but if user open/close gather it may disappear
|
||||||
|
bui.set_party_icon_always_visible(True)
|
||||||
|
|
||||||
# Replace new chat func to the original game codes.
|
# Replace new chat func to the original game codes.
|
||||||
ba_internal.chatmessage = new_chat_message
|
bs.chatmessage = new_chat_message
|
||||||
if not ba_internal.is_party_icon_visible():
|
|
||||||
ba_internal.set_party_icon_always_visible(True)
|
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class ByCrossJoy(ba.Plugin):
|
class ByCrossJoy(babase.Plugin):
|
||||||
def __init__(self): pass
|
def on_app_running(self):
|
||||||
|
mainmenu.MainMenuWindow = NewMainMenuWindow
|
||||||
|
|
||||||
|
|
@ -370,7 +370,7 @@ def get_event_loop(force_fresh=False):
|
||||||
|
|
||||||
def _generate_join_secret(self):
|
def _generate_join_secret(self):
|
||||||
# resp = requests.get('https://legacy.ballistica.net/bsAccessCheck').text
|
# resp = requests.get('https://legacy.ballistica.net/bsAccessCheck').text
|
||||||
connection_info = bs.get_connection_to_host_info_2()
|
connection_info = bs.get_connection_to_host_info() if build_number < 21697 else bs.get_connection_to_host_info_2()
|
||||||
if connection_info:
|
if connection_info:
|
||||||
addr = _last_server_addr
|
addr = _last_server_addr
|
||||||
port = _last_server_port
|
port = _last_server_port
|
||||||
|
|
@ -870,7 +870,7 @@ class DiscordRP(babase.Plugin):
|
||||||
|
|
||||||
def update_status(self) -> None:
|
def update_status(self) -> None:
|
||||||
roster = bs.get_game_roster()
|
roster = bs.get_game_roster()
|
||||||
connection_info = bs.get_connection_to_host_info_2()
|
connection_info = bs.get_connection_to_host_info() if build_number < 21697 else bs.get_connection_to_host_info_2()
|
||||||
|
|
||||||
self.rpc_thread.large_image_key = "bombsquadicon"
|
self.rpc_thread.large_image_key = "bombsquadicon"
|
||||||
self.rpc_thread.large_image_text = "BombSquad"
|
self.rpc_thread.large_image_text = "BombSquad"
|
||||||
|
|
@ -963,7 +963,7 @@ class DiscordRP(babase.Plugin):
|
||||||
points = act._score
|
points = act._score
|
||||||
self.rpc_thread.details += f" ({points} points)"
|
self.rpc_thread.details += f" ({points} points)"
|
||||||
elif isinstance(act, MeteorShowerGame):
|
elif isinstance(act, MeteorShowerGame):
|
||||||
with bs.ContextRef(act):
|
with act.context:
|
||||||
sec = bs.time() - act._timer.getstarttime()
|
sec = bs.time() - act._timer.getstarttime()
|
||||||
secfmt = ""
|
secfmt = ""
|
||||||
if sec < 60:
|
if sec < 60:
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,32 @@
|
||||||
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
"""===========MAX_PLAYERS==========="""
|
"""===========MAX_PLAYERS==========="""
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 8
|
||||||
# (see https://ballistica.net/wiki/meta-tag-system)
|
# (see https://ballistica.net/wiki/meta-tag-system)
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
import _ba
|
import bauiv1 as bui
|
||||||
from ba._session import Session
|
import bascenev1 as bs
|
||||||
from ba._coopsession import CoopSession, TEAM_COLORS, TEAM_NAMES
|
import _babase
|
||||||
from ba._multiteamsession import MultiTeamSession
|
from bascenev1._session import Session
|
||||||
from bastd.ui.gather import GatherWindow
|
from bascenev1._coopsession import CoopSession, TEAM_COLORS, TEAM_NAMES
|
||||||
from bastd.ui.popup import PopupWindow
|
from bascenev1._multiteamsession import MultiTeamSession
|
||||||
|
from bauiv1lib.gather import GatherWindow
|
||||||
|
from bauiv1lib.popup import PopupWindow
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import List, Any, Optional, Sequence
|
from typing import List, Any, Optional, Sequence
|
||||||
|
|
||||||
|
|
||||||
cfg = ba.app.config
|
cfg = babase.app.config
|
||||||
cmp = {'coop_max_players': 4,
|
cmp = {'coop_max_players': 4,
|
||||||
'teams_max_players': 8,
|
'teams_max_players': 8,
|
||||||
'ffa_max_players': 8}
|
'ffa_max_players': 8}
|
||||||
|
|
||||||
lang = ba.app.lang.language
|
lang = bs.app.lang.language
|
||||||
if lang == 'Spanish':
|
if lang == 'Spanish':
|
||||||
title_text = 'Máximo de Jugadores'
|
title_text = 'Máximo de Jugadores'
|
||||||
title_short_text = 'Jugadores'
|
title_short_text = 'Jugadores'
|
||||||
|
|
@ -41,7 +44,7 @@ else:
|
||||||
class ConfigNumberEdit:
|
class ConfigNumberEdit:
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
parent: ba.Widget,
|
parent: bui.Widget,
|
||||||
position: Tuple[float, float],
|
position: Tuple[float, float],
|
||||||
value: int,
|
value: int,
|
||||||
config: str,
|
config: str,
|
||||||
|
|
@ -53,7 +56,7 @@ class ConfigNumberEdit:
|
||||||
self._config = config
|
self._config = config
|
||||||
|
|
||||||
textscale = 1.0
|
textscale = 1.0
|
||||||
self.nametext = ba.textwidget(
|
self.nametext = bui.textwidget(
|
||||||
parent=parent,
|
parent=parent,
|
||||||
position=(position[0], position[1]),
|
position=(position[0], position[1]),
|
||||||
size=(100, 30),
|
size=(100, 30),
|
||||||
|
|
@ -63,7 +66,7 @@ class ConfigNumberEdit:
|
||||||
h_align='left',
|
h_align='left',
|
||||||
v_align='center',
|
v_align='center',
|
||||||
scale=textscale)
|
scale=textscale)
|
||||||
self.valuetext = ba.textwidget(
|
self.valuetext = bui.textwidget(
|
||||||
parent=parent,
|
parent=parent,
|
||||||
position=(position[0]+150, position[1]),
|
position=(position[0]+150, position[1]),
|
||||||
size=(60, 28),
|
size=(60, 28),
|
||||||
|
|
@ -73,21 +76,21 @@ class ConfigNumberEdit:
|
||||||
v_align='center',
|
v_align='center',
|
||||||
text=str(value),
|
text=str(value),
|
||||||
padding=2)
|
padding=2)
|
||||||
self.minusbutton = ba.buttonwidget(
|
self.minusbutton = bui.buttonwidget(
|
||||||
parent=parent,
|
parent=parent,
|
||||||
position=(position[0]+240, position[1]),
|
position=(position[0]+240, position[1]),
|
||||||
size=(28, 28),
|
size=(28, 28),
|
||||||
label='-',
|
label='-',
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
on_activate_call=ba.Call(self._down),
|
on_activate_call=babase.Call(self._down),
|
||||||
repeat=True)
|
repeat=True)
|
||||||
self.plusbutton = ba.buttonwidget(
|
self.plusbutton = bui.buttonwidget(
|
||||||
parent=parent,
|
parent=parent,
|
||||||
position=(position[0]+290, position[1]),
|
position=(position[0]+290, position[1]),
|
||||||
size=(28, 28),
|
size=(28, 28),
|
||||||
label='+',
|
label='+',
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
on_activate_call=ba.Call(self._up),
|
on_activate_call=babase.Call(self._up),
|
||||||
repeat=True)
|
repeat=True)
|
||||||
|
|
||||||
def _up(self) -> None:
|
def _up(self) -> None:
|
||||||
|
|
@ -99,7 +102,7 @@ class ConfigNumberEdit:
|
||||||
self._update_display()
|
self._update_display()
|
||||||
|
|
||||||
def _update_display(self) -> None:
|
def _update_display(self) -> None:
|
||||||
ba.textwidget(edit=self.valuetext, text=str(self._value))
|
bui.textwidget(edit=self.valuetext, text=str(self._value))
|
||||||
cfg['Config Max Players'][self._config] = self._value
|
cfg['Config Max Players'][self._config] = self._value
|
||||||
cfg.apply_and_commit()
|
cfg.apply_and_commit()
|
||||||
|
|
||||||
|
|
@ -108,7 +111,7 @@ class SettingsMaxPlayers(PopupWindow):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# pylint: disable=too-many-locals
|
# pylint: disable=too-many-locals
|
||||||
uiscale = ba.app.ui.uiscale
|
uiscale = bui.app.ui_v1.uiscale
|
||||||
self._transitioning_out = False
|
self._transitioning_out = False
|
||||||
self._width = 400
|
self._width = 400
|
||||||
self._height = 220
|
self._height = 220
|
||||||
|
|
@ -121,7 +124,7 @@ class SettingsMaxPlayers(PopupWindow):
|
||||||
scale=1.2,
|
scale=1.2,
|
||||||
bg_color=bg_color)
|
bg_color=bg_color)
|
||||||
|
|
||||||
self._cancel_button = ba.buttonwidget(
|
self._cancel_button = bui.buttonwidget(
|
||||||
parent=self.root_widget,
|
parent=self.root_widget,
|
||||||
position=(25, self._height - 40),
|
position=(25, self._height - 40),
|
||||||
size=(50, 50),
|
size=(50, 50),
|
||||||
|
|
@ -130,12 +133,12 @@ class SettingsMaxPlayers(PopupWindow):
|
||||||
color=bg_color,
|
color=bg_color,
|
||||||
on_activate_call=self._on_cancel_press,
|
on_activate_call=self._on_cancel_press,
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
icon=ba.gettexture('crossOut'),
|
icon=bui.gettexture('crossOut'),
|
||||||
iconscale=1.2)
|
iconscale=1.2)
|
||||||
ba.containerwidget(edit=self.root_widget,
|
bui.containerwidget(edit=self.root_widget,
|
||||||
cancel_button=self._cancel_button)
|
cancel_button=self._cancel_button)
|
||||||
|
|
||||||
ba.textwidget(
|
bui.textwidget(
|
||||||
parent=self.root_widget,
|
parent=self.root_widget,
|
||||||
position=(self._width * 0.5, self._height - 30),
|
position=(self._width * 0.5, self._height - 30),
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
|
|
@ -144,7 +147,7 @@ class SettingsMaxPlayers(PopupWindow):
|
||||||
scale=0.8,
|
scale=0.8,
|
||||||
text=title_text,
|
text=title_text,
|
||||||
maxwidth=200,
|
maxwidth=200,
|
||||||
color=ba.app.ui.title_color)
|
color=bui.app.ui_v1.title_color)
|
||||||
|
|
||||||
posx = 33
|
posx = 33
|
||||||
posy = self._height
|
posy = self._height
|
||||||
|
|
@ -176,37 +179,38 @@ class SettingsMaxPlayers(PopupWindow):
|
||||||
def _transition_out(self) -> None:
|
def _transition_out(self) -> None:
|
||||||
if not self._transitioning_out:
|
if not self._transitioning_out:
|
||||||
self._transitioning_out = True
|
self._transitioning_out = True
|
||||||
ba.containerwidget(edit=self.root_widget, transition='out_scale')
|
bui.containerwidget(edit=self.root_widget, transition='out_scale')
|
||||||
|
|
||||||
def on_popup_cancel(self) -> None:
|
def on_popup_cancel(self) -> None:
|
||||||
ba.playsound(ba.getsound('swish'))
|
bui.getsound('swish').play()
|
||||||
self._transition_out()
|
self._transition_out()
|
||||||
|
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
"""Instantiate a co-op mode session."""
|
"""Instantiate a co-op mode session."""
|
||||||
# pylint: disable=cyclic-import
|
# pylint: disable=cyclic-import
|
||||||
from ba._campaign import getcampaign
|
getcampaign = bui.app.classic.getcampaign
|
||||||
from bastd.activity.coopjoin import CoopJoinActivity
|
from bascenev1lib.activity.coopjoin import CoopJoinActivity
|
||||||
|
|
||||||
_ba.increment_analytics_count('Co-op session start')
|
_babase.increment_analytics_count('Co-op session start')
|
||||||
app = _ba.app
|
app = babase.app
|
||||||
|
classic = app.classic
|
||||||
|
|
||||||
# If they passed in explicit min/max, honor that.
|
# If they passed in explicit min/max, honor that.
|
||||||
# Otherwise defer to user overrides or defaults.
|
# Otherwise defer to user overrides or defaults.
|
||||||
if 'min_players' in app.coop_session_args:
|
if 'min_players' in classic.coop_session_args:
|
||||||
min_players = app.coop_session_args['min_players']
|
min_players = classic.coop_session_args['min_players']
|
||||||
else:
|
else:
|
||||||
min_players = 1
|
min_players = 1
|
||||||
if 'max_players' in app.coop_session_args:
|
if 'max_players' in classic.coop_session_args:
|
||||||
max_players = app.coop_session_args['max_players']
|
max_players = classic.coop_session_args['max_players']
|
||||||
else:
|
else:
|
||||||
max_players = app.config.get(
|
max_players = app.config.get(
|
||||||
'Coop Game Max Players',
|
'Coop Game Max Players',
|
||||||
cfg['Config Max Players']['coop_max_players'])
|
cfg['Config Max Players']['coop_max_players'])
|
||||||
|
|
||||||
# print('FIXME: COOP SESSION WOULD CALC DEPS.')
|
# print('FIXME: COOP SESSION WOULD CALC DEPS.')
|
||||||
depsets: Sequence[ba.DependencySet] = []
|
depsets: Sequence[babase.DependencySet] = []
|
||||||
|
|
||||||
Session.__init__(self,
|
Session.__init__(self,
|
||||||
depsets,
|
depsets,
|
||||||
|
|
@ -217,30 +221,30 @@ def __init__(self) -> None:
|
||||||
|
|
||||||
# Tournament-ID if we correspond to a co-op tournament (otherwise None)
|
# Tournament-ID if we correspond to a co-op tournament (otherwise None)
|
||||||
self.tournament_id: Optional[str] = (
|
self.tournament_id: Optional[str] = (
|
||||||
app.coop_session_args.get('tournament_id'))
|
classic.coop_session_args.get('tournament_id'))
|
||||||
|
|
||||||
self.campaign = getcampaign(app.coop_session_args['campaign'])
|
self.campaign = getcampaign(classic.coop_session_args['campaign'])
|
||||||
self.campaign_level_name: str = app.coop_session_args['level']
|
self.campaign_level_name: str = classic.coop_session_args['level']
|
||||||
|
|
||||||
self._ran_tutorial_activity = False
|
self._ran_tutorial_activity = False
|
||||||
self._tutorial_activity: Optional[ba.Activity] = None
|
self._tutorial_activity: Optional[babase.Activity] = None
|
||||||
self._custom_menu_ui: List[Dict[str, Any]] = []
|
self._custom_menu_ui: List[Dict[str, Any]] = []
|
||||||
|
|
||||||
# Start our joining screen.
|
# Start our joining screen.
|
||||||
self.setactivity(_ba.newactivity(CoopJoinActivity))
|
self.setactivity(bs.newactivity(CoopJoinActivity))
|
||||||
|
|
||||||
self._next_game_instance: Optional[ba.GameActivity] = None
|
self._next_game_instance: Optional[bs.GameActivity] = None
|
||||||
self._next_game_level_name: Optional[str] = None
|
self._next_game_level_name: Optional[str] = None
|
||||||
self._update_on_deck_game_instances()
|
self._update_on_deck_game_instances()
|
||||||
|
|
||||||
|
|
||||||
def get_max_players(self) -> int:
|
def get_max_players(self) -> int:
|
||||||
"""Return max number of ba.Players allowed to join the game at once."""
|
"""Return max number of bs.Players allowed to join the game at once."""
|
||||||
if self.use_teams:
|
if self.use_teams:
|
||||||
return _ba.app.config.get(
|
return _babase.app.config.get(
|
||||||
'Team Game Max Players',
|
'Team Game Max Players',
|
||||||
cfg['Config Max Players']['teams_max_players'])
|
cfg['Config Max Players']['teams_max_players'])
|
||||||
return _ba.app.config.get(
|
return _babase.app.config.get(
|
||||||
'Free-for-All Max Players',
|
'Free-for-All Max Players',
|
||||||
cfg['Config Max Players']['ffa_max_players'])
|
cfg['Config Max Players']['ffa_max_players'])
|
||||||
|
|
||||||
|
|
@ -250,18 +254,18 @@ GatherWindow.__old_init__ = GatherWindow.__init__
|
||||||
|
|
||||||
def __gather_init__(self,
|
def __gather_init__(self,
|
||||||
transition: Optional[str] = 'in_right',
|
transition: Optional[str] = 'in_right',
|
||||||
origin_widget: ba.Widget = None):
|
origin_widget: bui.Widget = None):
|
||||||
self.__old_init__(transition, origin_widget)
|
self.__old_init__(transition, origin_widget)
|
||||||
|
|
||||||
def _do_max_players():
|
def _do_max_players():
|
||||||
SettingsMaxPlayers()
|
SettingsMaxPlayers()
|
||||||
self._max_players_button = ba.buttonwidget(
|
self._max_players_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(self._width*0.72, self._height*0.91),
|
position=(self._width*0.72, self._height*0.91),
|
||||||
size=(220, 60),
|
size=(220, 60),
|
||||||
scale=1.0,
|
scale=1.0,
|
||||||
color=(0.6, 0.0, 0.9),
|
color=(0.6, 0.0, 0.9),
|
||||||
icon=ba.gettexture('usersButton'),
|
icon=bui.gettexture('usersButton'),
|
||||||
iconscale=1.5,
|
iconscale=1.5,
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
label=title_short_text,
|
label=title_short_text,
|
||||||
|
|
@ -290,11 +294,11 @@ def _save_state(self) -> None:
|
||||||
sel_name = 'TabContainer'
|
sel_name = 'TabContainer'
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'unrecognized selection: \'{sel}\'')
|
raise ValueError(f'unrecognized selection: \'{sel}\'')
|
||||||
ba.app.ui.window_states[type(self)] = {
|
bui.app.ui_v1.window_states[type(self)] = {
|
||||||
'sel_name': sel_name,
|
'sel_name': sel_name,
|
||||||
}
|
}
|
||||||
except Exception:
|
except Exception:
|
||||||
ba.print_exception(f'Error saving state for {self}.')
|
babase.print_exception(f'Error saving state for {self}.')
|
||||||
|
|
||||||
|
|
||||||
def _restore_state(self) -> None:
|
def _restore_state(self) -> None:
|
||||||
|
|
@ -303,12 +307,12 @@ def _restore_state(self) -> None:
|
||||||
for tab in self._tabs.values():
|
for tab in self._tabs.values():
|
||||||
tab.restore_state()
|
tab.restore_state()
|
||||||
|
|
||||||
sel: Optional[ba.Widget]
|
sel: Optional[bui.Widget]
|
||||||
winstate = ba.app.ui.window_states.get(type(self), {})
|
winstate = bui.app.ui_v1.window_states.get(type(self), {})
|
||||||
sel_name = winstate.get('sel_name', None)
|
sel_name = winstate.get('sel_name', None)
|
||||||
assert isinstance(sel_name, (str, type(None)))
|
assert isinstance(sel_name, (str, type(None)))
|
||||||
current_tab = self.TabID.ABOUT
|
current_tab = self.TabID.ABOUT
|
||||||
gather_tab_val = ba.app.config.get('Gather Tab')
|
gather_tab_val = babase.app.config.get('Gather Tab')
|
||||||
try:
|
try:
|
||||||
stored_tab = enum_by_value(self.TabID, gather_tab_val)
|
stored_tab = enum_by_value(self.TabID, gather_tab_val)
|
||||||
if stored_tab in self._tab_row.tabs:
|
if stored_tab in self._tab_row.tabs:
|
||||||
|
|
@ -331,35 +335,35 @@ def _restore_state(self) -> None:
|
||||||
sel = self._tab_row.tabs[sel_tab_id].button
|
sel = self._tab_row.tabs[sel_tab_id].button
|
||||||
else:
|
else:
|
||||||
sel = self._tab_row.tabs[current_tab].button
|
sel = self._tab_row.tabs[current_tab].button
|
||||||
ba.containerwidget(edit=self._root_widget, selected_child=sel)
|
bui.containerwidget(edit=self._root_widget, selected_child=sel)
|
||||||
except Exception:
|
except Exception:
|
||||||
ba.print_exception('Error restoring gather-win state.')
|
babase.print_exception('Error restoring gather-win state.')
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class MaxPlayersPlugin(ba.Plugin):
|
class MaxPlayersPlugin(babase.Plugin):
|
||||||
|
|
||||||
def has_settings_ui(self) -> bool:
|
def has_settings_ui(self) -> bool:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def show_settings_ui(self, source_widget: ba.Widget | None) -> None:
|
def show_settings_ui(self, source_widget: bui.Widget | None) -> None:
|
||||||
SettingsMaxPlayers()
|
SettingsMaxPlayers()
|
||||||
|
|
||||||
if 'Config Max Players' in ba.app.config:
|
if 'Config Max Players' in babase.app.config:
|
||||||
old_config = ba.app.config['Config Max Players']
|
old_config = babase.app.config['Config Max Players']
|
||||||
for setting in cmp:
|
for setting in cmp:
|
||||||
if setting not in old_config:
|
if setting not in old_config:
|
||||||
ba.app.config['Config Max Players'].update({setting: cmp[setting]})
|
babase.app.config['Config Max Players'].update({setting: cmp[setting]})
|
||||||
remove_list = []
|
remove_list = []
|
||||||
for setting in old_config:
|
for setting in old_config:
|
||||||
if setting not in cmp:
|
if setting not in cmp:
|
||||||
remove_list.append(setting)
|
remove_list.append(setting)
|
||||||
for element in remove_list:
|
for element in remove_list:
|
||||||
ba.app.config['Config Max Players'].pop(element)
|
babase.app.config['Config Max Players'].pop(element)
|
||||||
else:
|
else:
|
||||||
ba.app.config['Config Max Players'] = cmp
|
babase.app.config['Config Max Players'] = cmp
|
||||||
ba.app.config.apply_and_commit()
|
babase.app.config.apply_and_commit()
|
||||||
|
|
||||||
CoopSession.__init__ = __init__
|
CoopSession.__init__ = __init__
|
||||||
MultiTeamSession.get_max_players = get_max_players
|
MultiTeamSession.get_max_players = get_max_players
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,20 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING, cast
|
from typing import TYPE_CHECKING, cast
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Sequence, Callable, List, Dict, Tuple, Optional, Union
|
from typing import Any, Sequence, Callable, List, Dict, Tuple, Optional, Union
|
||||||
|
|
||||||
import random
|
import random
|
||||||
import ba
|
import babase
|
||||||
import _ba
|
import bauiv1 as bui
|
||||||
from ba._map import Map
|
import bascenev1 as bs
|
||||||
from bastd import mainmenu
|
import _babase
|
||||||
from bastd.ui.party import PartyWindow
|
from bascenev1._map import Map
|
||||||
from bastd.gameutils import SharedObjects
|
from bascenev1lib import mainmenu
|
||||||
|
from bauiv1lib.mainmenu import MainMenuWindow
|
||||||
|
from bauiv1lib.party import PartyWindow
|
||||||
|
from bascenev1lib.gameutils import SharedObjects
|
||||||
|
|
||||||
"""mood light plugin by ʟօʊքɢǟʀօʊ
|
"""mood light plugin by ʟօʊքɢǟʀօʊ
|
||||||
type ml in chat or use plugin manager to open settings"""
|
type ml in chat or use plugin manager to open settings"""
|
||||||
|
|
@ -21,7 +25,7 @@ def Print(*args):
|
||||||
for arg in args:
|
for arg in args:
|
||||||
a = str(arg)
|
a = str(arg)
|
||||||
out += a
|
out += a
|
||||||
ba.screenmessage(out)
|
bui.screenmessage(out)
|
||||||
|
|
||||||
|
|
||||||
def cprint(*args):
|
def cprint(*args):
|
||||||
|
|
@ -29,26 +33,26 @@ def cprint(*args):
|
||||||
for arg in args:
|
for arg in args:
|
||||||
a = str(arg)
|
a = str(arg)
|
||||||
out += a
|
out += a
|
||||||
_ba.chatmessage(out)
|
bs.chatmessage(out)
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Ldefault, Udefault = ba.app.config.get("moodlightingSettings")
|
Ldefault, Udefault = babase.app.config.get("moodlightingSettings")
|
||||||
except:
|
except:
|
||||||
ba.app.config["moodlightingSettings"] = (15, 20)
|
babase.app.config["moodlightingSettings"] = (15, 20)
|
||||||
Ldefault, Udefault = ba.app.config.get("moodlightingSettings")
|
Ldefault, Udefault = babase.app.config.get("moodlightingSettings")
|
||||||
Print("settings up moodlight")
|
Print("settings up moodlight")
|
||||||
Print("Type ml in chat or use plugin manager to access settings")
|
Print("Type ml in chat or use plugin manager to access settings")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
loop = ba.app.config.get("moodlightEnabled")
|
loop = babase.app.config.get("moodlightEnabled")
|
||||||
except:
|
except:
|
||||||
ba.app.config["moodlightEnabled"] = True
|
babase.app.config["moodlightEnabled"] = True
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
loop = True
|
loop = True
|
||||||
|
|
||||||
|
|
||||||
class SettingWindow(ba.Window):
|
class SettingWindow(bui.Window):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.draw_ui()
|
self.draw_ui()
|
||||||
|
|
||||||
|
|
@ -56,57 +60,57 @@ class SettingWindow(ba.Window):
|
||||||
global Ldefault, Udefault
|
global Ldefault, Udefault
|
||||||
try:
|
try:
|
||||||
if Udefault >= 29 and self.selected == "upper":
|
if Udefault >= 29 and self.selected == "upper":
|
||||||
ba.textwidget(edit=self.warn_text,
|
bui.textwidget(edit=self.warn_text,
|
||||||
text="Careful!You risk get blind beyond this point")
|
text="Careful!You risk get blind beyond this point")
|
||||||
elif self.selected == "lower" and Ldefault >= -20 or self.selected == "upper" and Udefault <= 30:
|
elif self.selected == "lower" and Ldefault >= -20 or self.selected == "upper" and Udefault <= 30:
|
||||||
ba.textwidget(edit=self.warn_text, text="")
|
bui.textwidget(edit=self.warn_text, text="")
|
||||||
if self.selected == "lower":
|
if self.selected == "lower":
|
||||||
Ldefault += 1
|
Ldefault += 1
|
||||||
ba.textwidget(edit=self.lower_text, text=str(Ldefault))
|
bui.textwidget(edit=self.lower_text, text=str(Ldefault))
|
||||||
elif self.selected == "upper":
|
elif self.selected == "upper":
|
||||||
Udefault += 1
|
Udefault += 1
|
||||||
ba.textwidget(edit=self.upper_text, text=str(Udefault))
|
bui.textwidget(edit=self.upper_text, text=str(Udefault))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
ba.textwidget(edit=self.warn_text, text="Click on number to select it")
|
bui.textwidget(edit=self.warn_text, text="Click on number to select it")
|
||||||
|
|
||||||
def decrease_limit(self):
|
def decrease_limit(self):
|
||||||
global Ldefault, Udefault
|
global Ldefault, Udefault
|
||||||
try:
|
try:
|
||||||
if Ldefault <= -19 and self.selected == "lower":
|
if Ldefault <= -19 and self.selected == "lower":
|
||||||
ba.textwidget(edit=self.warn_text,
|
bui.textwidget(edit=self.warn_text,
|
||||||
text="DON'T BE AFRAID OF DARK,IT'S A PLACE WHERE YOU CAN HIDE")
|
text="DON'T BE AFRAID OF DARK,IT'S A PLACE WHERE YOU CAN HIDE")
|
||||||
elif (self.selected == "upper" and Udefault <= 30) or (self.selected == "lower" and Ldefault >= -20):
|
elif (self.selected == "upper" and Udefault <= 30) or (self.selected == "lower" and Ldefault >= -20):
|
||||||
ba.textwidget(edit=self.warn_text, text="")
|
bui.textwidget(edit=self.warn_text, text="")
|
||||||
if self.selected == "lower":
|
if self.selected == "lower":
|
||||||
Ldefault -= 1
|
Ldefault -= 1
|
||||||
ba.textwidget(edit=self.lower_text, text=str(Ldefault))
|
bui.textwidget(edit=self.lower_text, text=str(Ldefault))
|
||||||
elif self.selected == "upper":
|
elif self.selected == "upper":
|
||||||
Udefault -= 1
|
Udefault -= 1
|
||||||
ba.textwidget(edit=self.upper_text, text=str(Udefault))
|
bui.textwidget(edit=self.upper_text, text=str(Udefault))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
ba.textwidget(edit=self.warn_text, text="Click on number to select it")
|
bui.textwidget(edit=self.warn_text, text="Click on number to select it")
|
||||||
|
|
||||||
def on_text_click(self, selected):
|
def on_text_click(self, selected):
|
||||||
self.selected = selected
|
self.selected = selected
|
||||||
if selected == "upper":
|
if selected == "upper":
|
||||||
ba.textwidget(edit=self.upper_text, color=(0, 0, 1))
|
bui.textwidget(edit=self.upper_text, color=(0, 0, 1))
|
||||||
ba.textwidget(edit=self.lower_text, color=(1, 1, 1))
|
bui.textwidget(edit=self.lower_text, color=(1, 1, 1))
|
||||||
elif selected == "lower":
|
elif selected == "lower":
|
||||||
ba.textwidget(edit=self.lower_text, color=(0, 0, 1))
|
bui.textwidget(edit=self.lower_text, color=(0, 0, 1))
|
||||||
ba.textwidget(edit=self.upper_text, color=(1, 1, 1))
|
bui.textwidget(edit=self.upper_text, color=(1, 1, 1))
|
||||||
else:
|
else:
|
||||||
Print("this should't happen from on_text_click")
|
Print("this should't happen from on_text_click")
|
||||||
|
|
||||||
def draw_ui(self):
|
def draw_ui(self):
|
||||||
self.uiscale = ba.app.ui.uiscale
|
self.uiscale = bui.app.ui_v1.uiscale
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
root_widget=ba.containerwidget(
|
root_widget=bui.containerwidget(
|
||||||
size=(670, 670),
|
size=(670, 670),
|
||||||
on_outside_click_call=self.close,
|
on_outside_click_call=self.close,
|
||||||
transition="in_right",))
|
transition="in_right",))
|
||||||
|
|
||||||
moodlight_label = ba.textwidget(
|
moodlight_label = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(200, 100),
|
size=(200, 100),
|
||||||
position=(150, 550),
|
position=(150, 550),
|
||||||
|
|
@ -117,7 +121,7 @@ class SettingWindow(ba.Window):
|
||||||
text="Mood light settings",
|
text="Mood light settings",
|
||||||
color=(0, 1, 0))
|
color=(0, 1, 0))
|
||||||
|
|
||||||
self.enable_button = ba.buttonwidget(
|
self.enable_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(100, 470),
|
position=(100, 470),
|
||||||
size=(90, 70),
|
size=(90, 70),
|
||||||
|
|
@ -126,7 +130,7 @@ class SettingWindow(ba.Window):
|
||||||
label="DISABLE" if loop else "ENABLE",
|
label="DISABLE" if loop else "ENABLE",
|
||||||
on_activate_call=self.on_enableButton_press)
|
on_activate_call=self.on_enableButton_press)
|
||||||
|
|
||||||
save_button = ba.buttonwidget(
|
save_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(520, 470),
|
position=(520, 470),
|
||||||
size=(90, 70),
|
size=(90, 70),
|
||||||
|
|
@ -134,18 +138,18 @@ class SettingWindow(ba.Window):
|
||||||
label="SAVE",
|
label="SAVE",
|
||||||
on_activate_call=self.save_settings)
|
on_activate_call=self.save_settings)
|
||||||
|
|
||||||
self.close_button = ba.buttonwidget(
|
self.close_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(550, 590),
|
position=(550, 590),
|
||||||
size=(35, 35),
|
size=(35, 35),
|
||||||
icon=ba.gettexture("crossOut"),
|
icon=bui.gettexture("crossOut"),
|
||||||
icon_color=(1, 0.2, 0.2),
|
icon_color=(1, 0.2, 0.2),
|
||||||
scale=2,
|
scale=2,
|
||||||
color=(1, 0.2, 0.2),
|
color=(1, 0.2, 0.2),
|
||||||
extra_touch_border_scale=5,
|
extra_touch_border_scale=5,
|
||||||
on_activate_call=self.close)
|
on_activate_call=self.close)
|
||||||
|
|
||||||
self.lower_text = ba.textwidget(
|
self.lower_text = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(200, 100),
|
size=(200, 100),
|
||||||
scale=2,
|
scale=2,
|
||||||
|
|
@ -157,7 +161,7 @@ class SettingWindow(ba.Window):
|
||||||
click_activate=True,
|
click_activate=True,
|
||||||
selectable=True)
|
selectable=True)
|
||||||
|
|
||||||
lower_text_label = ba.textwidget(
|
lower_text_label = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(200, 100),
|
size=(200, 100),
|
||||||
position=(100, 150),
|
position=(100, 150),
|
||||||
|
|
@ -165,7 +169,7 @@ class SettingWindow(ba.Window):
|
||||||
v_align="center",
|
v_align="center",
|
||||||
text="Limit darkness")
|
text="Limit darkness")
|
||||||
|
|
||||||
self.upper_text = ba.textwidget(
|
self.upper_text = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(200, 100),
|
size=(200, 100),
|
||||||
scale=2,
|
scale=2,
|
||||||
|
|
@ -177,7 +181,7 @@ class SettingWindow(ba.Window):
|
||||||
click_activate=True,
|
click_activate=True,
|
||||||
selectable=True)
|
selectable=True)
|
||||||
|
|
||||||
upper_text_label = ba.textwidget(
|
upper_text_label = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(200, 100),
|
size=(200, 100),
|
||||||
position=(400, 150),
|
position=(400, 150),
|
||||||
|
|
@ -185,25 +189,25 @@ class SettingWindow(ba.Window):
|
||||||
v_align="center",
|
v_align="center",
|
||||||
text="Limit brightness")
|
text="Limit brightness")
|
||||||
|
|
||||||
decrease_button = ba.buttonwidget(
|
decrease_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(100, 100),
|
position=(100, 100),
|
||||||
size=(5, 1),
|
size=(5, 1),
|
||||||
scale=3.5,
|
scale=3.5,
|
||||||
extra_touch_border_scale=2.5,
|
extra_touch_border_scale=2.5,
|
||||||
icon=ba.gettexture("downButton"),
|
icon=bui.gettexture("downButton"),
|
||||||
on_activate_call=self.decrease_limit)
|
on_activate_call=self.decrease_limit)
|
||||||
|
|
||||||
increase_button = ba.buttonwidget(
|
increase_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(600, 100),
|
position=(600, 100),
|
||||||
size=(5, 1),
|
size=(5, 1),
|
||||||
scale=3.5,
|
scale=3.5,
|
||||||
extra_touch_border_scale=2.5,
|
extra_touch_border_scale=2.5,
|
||||||
icon=ba.gettexture("upButton"),
|
icon=bui.gettexture("upButton"),
|
||||||
on_activate_call=self.increase_limit)
|
on_activate_call=self.increase_limit)
|
||||||
|
|
||||||
self.warn_text = ba.textwidget(
|
self.warn_text = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
text="",
|
text="",
|
||||||
size=(400, 200),
|
size=(400, 200),
|
||||||
|
|
@ -213,28 +217,28 @@ class SettingWindow(ba.Window):
|
||||||
maxwidth=600)
|
maxwidth=600)
|
||||||
|
|
||||||
# ++++++++++++++++for keyboard navigation++++++++++++++++
|
# ++++++++++++++++for keyboard navigation++++++++++++++++
|
||||||
ba.widget(edit=self.enable_button, up_widget=decrease_button,
|
bui.widget(edit=self.enable_button, up_widget=decrease_button,
|
||||||
down_widget=self.lower_text, left_widget=save_button, right_widget=save_button)
|
down_widget=self.lower_text, left_widget=save_button, right_widget=save_button)
|
||||||
ba.widget(edit=save_button, up_widget=self.close_button, down_widget=self.upper_text,
|
bui.widget(edit=save_button, up_widget=self.close_button, down_widget=self.upper_text,
|
||||||
left_widget=self.enable_button, right_widget=self.enable_button)
|
left_widget=self.enable_button, right_widget=self.enable_button)
|
||||||
ba.widget(edit=self.close_button, up_widget=increase_button, down_widget=save_button,
|
bui.widget(edit=self.close_button, up_widget=increase_button, down_widget=save_button,
|
||||||
left_widget=self.enable_button, right_widget=save_button)
|
left_widget=self.enable_button, right_widget=save_button)
|
||||||
ba.widget(edit=self.lower_text, up_widget=self.enable_button, down_widget=decrease_button,
|
bui.widget(edit=self.lower_text, up_widget=self.enable_button, down_widget=decrease_button,
|
||||||
left_widget=self.upper_text, right_widget=self.upper_text)
|
left_widget=self.upper_text, right_widget=self.upper_text)
|
||||||
ba.widget(edit=self.upper_text, up_widget=save_button, down_widget=increase_button,
|
bui.widget(edit=self.upper_text, up_widget=save_button, down_widget=increase_button,
|
||||||
left_widget=self.lower_text, right_widget=self.lower_text)
|
left_widget=self.lower_text, right_widget=self.lower_text)
|
||||||
ba.widget(edit=decrease_button, up_widget=self.lower_text, down_widget=self.enable_button,
|
bui.widget(edit=decrease_button, up_widget=self.lower_text, down_widget=self.enable_button,
|
||||||
left_widget=increase_button, right_widget=increase_button)
|
left_widget=increase_button, right_widget=increase_button)
|
||||||
ba.widget(edit=increase_button, up_widget=self.upper_text, down_widget=self.close_button,
|
bui.widget(edit=increase_button, up_widget=self.upper_text, down_widget=self.close_button,
|
||||||
left_widget=decrease_button, right_widget=decrease_button)
|
left_widget=decrease_button, right_widget=decrease_button)
|
||||||
# --------------------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
ba.textwidget(edit=self.upper_text, on_activate_call=ba.Call(self.on_text_click, "upper"))
|
bui.textwidget(edit=self.upper_text, on_activate_call=babase.Call(self.on_text_click, "upper"))
|
||||||
ba.textwidget(edit=self.lower_text, on_activate_call=ba.Call(self.on_text_click, "lower"))
|
bui.textwidget(edit=self.lower_text, on_activate_call=babase.Call(self.on_text_click, "lower"))
|
||||||
|
|
||||||
def on_enableButton_press(self):
|
def on_enableButton_press(self):
|
||||||
global loop
|
global loop
|
||||||
loop = ba.app.config.get("moodlightEnabled")
|
loop = babase.app.config.get("moodlightEnabled")
|
||||||
if loop:
|
if loop:
|
||||||
loop = False
|
loop = False
|
||||||
label = "ENABLE"
|
label = "ENABLE"
|
||||||
|
|
@ -243,49 +247,54 @@ class SettingWindow(ba.Window):
|
||||||
loop = True
|
loop = True
|
||||||
label = "DISABLE"
|
label = "DISABLE"
|
||||||
color = (1, 0, 0)
|
color = (1, 0, 0)
|
||||||
in_game = not isinstance(_ba.get_foreground_host_session(), mainmenu.MainMenuSession)
|
in_game = not isinstance(bs.get_foreground_host_session(), mainmenu.MainMenuSession)
|
||||||
if in_game:
|
if in_game:
|
||||||
Print("Restart level to apply")
|
Print("Restart level to apply")
|
||||||
ba.app.config["moodlightEnabled"] = loop
|
babase.app.config["moodlightEnabled"] = loop
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
ba.buttonwidget(edit=self.enable_button, label=label, color=color)
|
bui.buttonwidget(edit=self.enable_button, label=label, color=color)
|
||||||
|
|
||||||
def save_settings(self):
|
def save_settings(self):
|
||||||
ba.app.config["moodlightingSettings"] = (Ldefault, Udefault)
|
babase.app.config["moodlightingSettings"] = (Ldefault, Udefault)
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
Print("settings saved")
|
Print("settings saved")
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
ba.containerwidget(edit=self._root_widget, transition="out_right",)
|
bui.containerwidget(edit=self._root_widget, transition="out_right",)
|
||||||
|
|
||||||
|
|
||||||
def new_chat_message(msg: Union[str, ba.Lstr], clients: Sequence[int] = None, sender_override: str = None):
|
def new_chat_message(msg: Union[str, babase.Lstr], clients: Sequence[int] = None, sender_override: str = None):
|
||||||
old_fcm(msg, clients, sender_override)
|
old_fcm(msg, clients, sender_override)
|
||||||
if msg == 'ml':
|
if msg == 'ml':
|
||||||
try:
|
try:
|
||||||
global Ldefault, Udefault
|
global Ldefault, Udefault
|
||||||
Ldefault, Udefault = ba.app.config.get("moodlightingSettings")
|
Ldefault, Udefault = babase.app.config.get("moodlightingSettings")
|
||||||
SettingWindow()
|
SettingWindow()
|
||||||
cprint("Mood light settings opened")
|
cprint("Mood light settings opened")
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
Print(err, "-from new_chat_message")
|
Print(err, "-from new_chat_message")
|
||||||
|
|
||||||
|
class NewMainMenuWindow(MainMenuWindow):
|
||||||
old_fcm = _ba.chatmessage
|
def __init__(self, *args, **kwargs):
|
||||||
_ba.chatmessage = new_chat_message
|
super().__init__(*args, **kwargs)
|
||||||
_ba.set_party_icon_always_visible(True)
|
# Display chat icon, but if user open/close gather it may disappear
|
||||||
|
bui.set_party_icon_always_visible(True)
|
||||||
|
|
||||||
|
old_fcm = bs.chatmessage
|
||||||
|
bs.chatmessage = new_chat_message
|
||||||
Map._old_init = Map.__init__
|
Map._old_init = Map.__init__
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class moodlight(ba.Plugin):
|
class moodlight(babase.Plugin):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def on_app_running(self):
|
def on_app_running(self):
|
||||||
_ba.show_progress_bar()
|
_babase.show_progress_bar()
|
||||||
|
MainMenuWindow = NewMainMenuWindow
|
||||||
|
|
||||||
def show_settings_ui(self, source_widget):
|
def show_settings_ui(self, source_widget):
|
||||||
SettingWindow()
|
SettingWindow()
|
||||||
|
|
@ -298,11 +307,11 @@ class moodlight(ba.Plugin):
|
||||||
|
|
||||||
def _new_init(self, vr_overlay_offset: Optional[Sequence[float]] = None) -> None:
|
def _new_init(self, vr_overlay_offset: Optional[Sequence[float]] = None) -> None:
|
||||||
self._old_init(vr_overlay_offset)
|
self._old_init(vr_overlay_offset)
|
||||||
in_game = not isinstance(_ba.get_foreground_host_session(), mainmenu.MainMenuSession)
|
in_game = not isinstance(bs.get_foreground_host_session(), mainmenu.MainMenuSession)
|
||||||
if not in_game:
|
if not in_game:
|
||||||
return
|
return
|
||||||
|
|
||||||
gnode = _ba.getactivity().globalsnode
|
gnode = bs.getactivity().globalsnode
|
||||||
default_tint = (1.100000023841858, 1.0, 0.8999999761581421)
|
default_tint = (1.100000023841858, 1.0, 0.8999999761581421)
|
||||||
transition_duration = 1.0 # for future improvements
|
transition_duration = 1.0 # for future improvements
|
||||||
|
|
||||||
|
|
@ -310,16 +319,16 @@ class moodlight(ba.Plugin):
|
||||||
if loop:
|
if loop:
|
||||||
Range = (random.randrange(Ldefault, Udefault)/10, random.randrange(Ldefault,
|
Range = (random.randrange(Ldefault, Udefault)/10, random.randrange(Ldefault,
|
||||||
Udefault)/10, random.randrange(Ldefault, Udefault)/10)
|
Udefault)/10, random.randrange(Ldefault, Udefault)/10)
|
||||||
ba.animate_array(gnode, 'tint', 3, {
|
bs.animate_array(gnode, 'tint', 3, {
|
||||||
0.0: gnode.tint,
|
0.0: gnode.tint,
|
||||||
transition_duration: Range
|
transition_duration: Range
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
global timer
|
global timer
|
||||||
timer = None
|
timer = None
|
||||||
ba.animate_array(gnode, "tint", 3, {0.0: gnode.tint, 0.4: default_tint})
|
bs.animate_array(gnode, "tint", 3, {0.0: gnode.tint, 0.4: default_tint})
|
||||||
|
|
||||||
global timer
|
global timer
|
||||||
timer = ba.Timer(0.3, changetint, repeat=True)
|
timer = bs.Timer(0.3, changetint, repeat=True)
|
||||||
|
|
||||||
Map.__init__ = _new_init
|
Map.__init__ = _new_init
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,25 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
# (see https://ballistica.net/wiki/meta-tag-system)
|
# (see https://ballistica.net/wiki/meta-tag-system)
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
import _ba
|
import bauiv1 as bui
|
||||||
from bastd.ui.play import PlayWindow
|
import bascenev1 as bs
|
||||||
from bastd.ui.playlist.addgame import PlaylistAddGameWindow
|
import _babase
|
||||||
from ba._freeforallsession import FreeForAllSession
|
from bauiv1lib.play import PlayWindow
|
||||||
from bastd.activity.multiteamjoin import MultiTeamJoinActivity
|
from bauiv1lib.playlist.addgame import PlaylistAddGameWindow
|
||||||
|
from bascenev1._freeforallsession import FreeForAllSession
|
||||||
|
from bascenev1lib.activity.multiteamjoin import MultiTeamJoinActivity
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
lang = ba.app.lang.language
|
lang = bs.app.lang.language
|
||||||
|
|
||||||
if lang == 'Spanish':
|
if lang == 'Spanish':
|
||||||
custom_txt = 'personalizar...'
|
custom_txt = 'personalizar...'
|
||||||
|
|
@ -24,30 +27,30 @@ else:
|
||||||
custom_txt = 'custom...'
|
custom_txt = 'custom...'
|
||||||
|
|
||||||
|
|
||||||
if 'quick_game_button' in ba.app.config:
|
if 'quick_game_button' in babase.app.config:
|
||||||
config = ba.app.config['quick_game_button']
|
config = babase.app.config['quick_game_button']
|
||||||
else:
|
else:
|
||||||
config = {'selected': None, 'config': None}
|
config = {'selected': None, 'config': None}
|
||||||
ba.app.config['quick_game_button'] = config
|
babase.app.config['quick_game_button'] = config
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
|
|
||||||
|
|
||||||
def start_game(session: ba.Session, fadeout: bool = True):
|
def start_game(session: bs.Session, fadeout: bool = True):
|
||||||
def callback():
|
def callback():
|
||||||
if fadeout:
|
if fadeout:
|
||||||
_ba.unlock_all_input()
|
_babase.unlock_all_input()
|
||||||
try:
|
try:
|
||||||
_ba.new_host_session(session)
|
bs.new_host_session(session)
|
||||||
except Exception:
|
except Exception:
|
||||||
from bastd import mainmenu
|
from bascenev1lib import mainmenu
|
||||||
ba.print_exception('exception running session', session)
|
babase.print_exception('exception running session', session)
|
||||||
|
|
||||||
# Drop back into a main menu session.
|
# Drop back into a main menu session.
|
||||||
_ba.new_host_session(mainmenu.MainMenuSession)
|
bs.new_host_session(mainmenu.MainMenuSession)
|
||||||
|
|
||||||
if fadeout:
|
if fadeout:
|
||||||
_ba.fade_screen(False, time=0.25, endcall=callback)
|
_babase.fade_screen(False, time=0.25, endcall=callback)
|
||||||
_ba.lock_all_input()
|
_babase.lock_all_input()
|
||||||
else:
|
else:
|
||||||
callback()
|
callback()
|
||||||
|
|
||||||
|
|
@ -56,7 +59,7 @@ class SimplePlaylist:
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
settings: dict,
|
settings: dict,
|
||||||
gametype: type[ba.GameActivity]):
|
gametype: type[bs.GameActivity]):
|
||||||
self.settings = settings
|
self.settings = settings
|
||||||
self.gametype = gametype
|
self.gametype = gametype
|
||||||
|
|
||||||
|
|
@ -75,7 +78,7 @@ class CustomSession(FreeForAllSession):
|
||||||
# pylint: disable=cyclic-import
|
# pylint: disable=cyclic-import
|
||||||
self.use_teams = False
|
self.use_teams = False
|
||||||
self._tutorial_activity_instance = None
|
self._tutorial_activity_instance = None
|
||||||
ba.Session.__init__(self, depsets=[],
|
bs.Session.__init__(self, depsets=[],
|
||||||
team_names=None,
|
team_names=None,
|
||||||
team_colors=None,
|
team_colors=None,
|
||||||
min_players=1,
|
min_players=1,
|
||||||
|
|
@ -89,12 +92,12 @@ class CustomSession(FreeForAllSession):
|
||||||
self._playlist = SimplePlaylist(self._config, self._gametype)
|
self._playlist = SimplePlaylist(self._config, self._gametype)
|
||||||
config['selected'] = self._gametype.__name__
|
config['selected'] = self._gametype.__name__
|
||||||
config['config'] = self._config
|
config['config'] = self._config
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
|
|
||||||
# Get a game on deck ready to go.
|
# Get a game on deck ready to go.
|
||||||
self._current_game_spec: Optional[Dict[str, Any]] = None
|
self._current_game_spec: Optional[Dict[str, Any]] = None
|
||||||
self._next_game_spec: Dict[str, Any] = self._playlist.pull_next()
|
self._next_game_spec: Dict[str, Any] = self._playlist.pull_next()
|
||||||
self._next_game: Type[ba.GameActivity] = (
|
self._next_game: Type[bs.GameActivity] = (
|
||||||
self._next_game_spec['resolved_type'])
|
self._next_game_spec['resolved_type'])
|
||||||
|
|
||||||
# Go ahead and instantiate the next game we'll
|
# Go ahead and instantiate the next game we'll
|
||||||
|
|
@ -102,71 +105,71 @@ class CustomSession(FreeForAllSession):
|
||||||
self._instantiate_next_game()
|
self._instantiate_next_game()
|
||||||
|
|
||||||
# Start in our custom join screen.
|
# Start in our custom join screen.
|
||||||
self.setactivity(_ba.newactivity(MultiTeamJoinActivity))
|
self.setactivity(bs.newactivity(MultiTeamJoinActivity))
|
||||||
|
|
||||||
|
|
||||||
class SelectGameWindow(PlaylistAddGameWindow):
|
class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
|
|
||||||
def __init__(self, transition: str = 'in_right'):
|
def __init__(self, transition: str = 'in_right'):
|
||||||
class EditController:
|
class EditController:
|
||||||
_sessiontype = ba.FreeForAllSession
|
_sessiontype = bs.FreeForAllSession
|
||||||
|
|
||||||
def get_session_type(self) -> Type[ba.Session]:
|
def get_session_type(self) -> Type[bs.Session]:
|
||||||
return self._sessiontype
|
return self._sessiontype
|
||||||
|
|
||||||
self._editcontroller = EditController()
|
self._editcontroller = EditController()
|
||||||
self._r = 'addGameWindow'
|
self._r = 'addGameWindow'
|
||||||
uiscale = ba.app.ui.uiscale
|
uiscale = bui.app.ui_v1.uiscale
|
||||||
self._width = 750 if uiscale is ba.UIScale.SMALL else 650
|
self._width = 750 if uiscale is babase.UIScale.SMALL else 650
|
||||||
x_inset = 50 if uiscale is ba.UIScale.SMALL else 0
|
x_inset = 50 if uiscale is babase.UIScale.SMALL else 0
|
||||||
self._height = (346 if uiscale is ba.UIScale.SMALL else
|
self._height = (346 if uiscale is babase.UIScale.SMALL else
|
||||||
380 if uiscale is ba.UIScale.MEDIUM else 440)
|
380 if uiscale is babase.UIScale.MEDIUM else 440)
|
||||||
top_extra = 30 if uiscale is ba.UIScale.SMALL else 20
|
top_extra = 30 if uiscale is babase.UIScale.SMALL else 20
|
||||||
self._scroll_width = 210
|
self._scroll_width = 210
|
||||||
|
|
||||||
self._root_widget = ba.containerwidget(
|
self._root_widget = bui.containerwidget(
|
||||||
size=(self._width, self._height + top_extra),
|
size=(self._width, self._height + top_extra),
|
||||||
transition=transition,
|
transition=transition,
|
||||||
scale=(2.17 if uiscale is ba.UIScale.SMALL else
|
scale=(2.17 if uiscale is babase.UIScale.SMALL else
|
||||||
1.5 if uiscale is ba.UIScale.MEDIUM else 1.0),
|
1.5 if uiscale is babase.UIScale.MEDIUM else 1.0),
|
||||||
stack_offset=(0, 1) if uiscale is ba.UIScale.SMALL else (0, 0))
|
stack_offset=(0, 1) if uiscale is babase.UIScale.SMALL else (0, 0))
|
||||||
|
|
||||||
self._back_button = ba.buttonwidget(parent=self._root_widget,
|
self._back_button = bui.buttonwidget(parent=self._root_widget,
|
||||||
position=(58 + x_inset,
|
position=(58 + x_inset,
|
||||||
self._height - 53),
|
self._height - 53),
|
||||||
size=(165, 70),
|
size=(165, 70),
|
||||||
scale=0.75,
|
scale=0.75,
|
||||||
text_scale=1.2,
|
text_scale=1.2,
|
||||||
label=ba.Lstr(resource='backText'),
|
label=babase.Lstr(resource='backText'),
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
button_type='back',
|
button_type='back',
|
||||||
on_activate_call=self._back)
|
on_activate_call=self._back)
|
||||||
self._select_button = select_button = ba.buttonwidget(
|
self._select_button = select_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(self._width - (172 + x_inset), self._height - 50),
|
position=(self._width - (172 + x_inset), self._height - 50),
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
size=(160, 60),
|
size=(160, 60),
|
||||||
scale=0.75,
|
scale=0.75,
|
||||||
text_scale=1.2,
|
text_scale=1.2,
|
||||||
label=ba.Lstr(resource='selectText'),
|
label=babase.Lstr(resource='selectText'),
|
||||||
on_activate_call=self._add)
|
on_activate_call=self._add)
|
||||||
|
|
||||||
if ba.app.ui.use_toolbars:
|
if bui.app.ui_v1.use_toolbars:
|
||||||
ba.widget(edit=select_button,
|
bui.widget(edit=select_button,
|
||||||
right_widget=_ba.get_special_widget('party_button'))
|
right_widget=bui.get_special_widget('party_button'))
|
||||||
|
|
||||||
ba.textwidget(parent=self._root_widget,
|
bui.textwidget(parent=self._root_widget,
|
||||||
position=(self._width * 0.5, self._height - 28),
|
position=(self._width * 0.5, self._height - 28),
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
scale=1.0,
|
scale=1.0,
|
||||||
text=ba.Lstr(resource=self._r + '.titleText'),
|
text=babase.Lstr(resource=self._r + '.titleText'),
|
||||||
h_align='center',
|
h_align='center',
|
||||||
color=ba.app.ui.title_color,
|
color=bui.app.ui_v1.title_color,
|
||||||
maxwidth=250,
|
maxwidth=250,
|
||||||
v_align='center')
|
v_align='center')
|
||||||
v = self._height - 64
|
v = self._height - 64
|
||||||
|
|
||||||
self._selected_title_text = ba.textwidget(
|
self._selected_title_text = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(x_inset + self._scroll_width + 50 + 30, v - 15),
|
position=(x_inset + self._scroll_width + 50 + 30, v - 15),
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
|
|
@ -177,7 +180,7 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
v_align='center')
|
v_align='center')
|
||||||
v -= 30
|
v -= 30
|
||||||
|
|
||||||
self._selected_description_text = ba.textwidget(
|
self._selected_description_text = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(x_inset + self._scroll_width + 50 + 30, v),
|
position=(x_inset + self._scroll_width + 50 + 30, v),
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
|
|
@ -190,31 +193,31 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
|
|
||||||
v = self._height - 60
|
v = self._height - 60
|
||||||
|
|
||||||
self._scrollwidget = ba.scrollwidget(parent=self._root_widget,
|
self._scrollwidget = bui.scrollwidget(parent=self._root_widget,
|
||||||
position=(x_inset + 61,
|
position=(x_inset + 61,
|
||||||
v - scroll_height),
|
v - scroll_height),
|
||||||
size=(self._scroll_width,
|
size=(self._scroll_width,
|
||||||
scroll_height),
|
scroll_height),
|
||||||
highlight=False)
|
highlight=False)
|
||||||
ba.widget(edit=self._scrollwidget,
|
bui.widget(edit=self._scrollwidget,
|
||||||
up_widget=self._back_button,
|
up_widget=self._back_button,
|
||||||
left_widget=self._back_button,
|
left_widget=self._back_button,
|
||||||
right_widget=select_button)
|
right_widget=select_button)
|
||||||
self._column: Optional[ba.Widget] = None
|
self._column: Optional[bui.Widget] = None
|
||||||
|
|
||||||
v -= 35
|
v -= 35
|
||||||
ba.containerwidget(edit=self._root_widget,
|
bui.containerwidget(edit=self._root_widget,
|
||||||
cancel_button=self._back_button,
|
cancel_button=self._back_button,
|
||||||
start_button=select_button)
|
start_button=select_button)
|
||||||
self._selected_game_type: Optional[Type[ba.GameActivity]] = None
|
self._selected_game_type: Optional[Type[bs.GameActivity]] = None
|
||||||
|
|
||||||
ba.containerwidget(edit=self._root_widget,
|
bui.containerwidget(edit=self._root_widget,
|
||||||
selected_child=self._scrollwidget)
|
selected_child=self._scrollwidget)
|
||||||
|
|
||||||
self._game_types: list[type[ba.GameActivity]] = []
|
self._game_types: list[type[bs.GameActivity]] = []
|
||||||
|
|
||||||
# Get actual games loading in the bg.
|
# Get actual games loading in the bg.
|
||||||
ba.app.meta.load_exported_classes(ba.GameActivity,
|
babase.app.meta.load_exported_classes(bs.GameActivity,
|
||||||
self._on_game_types_loaded,
|
self._on_game_types_loaded,
|
||||||
completion_cb_in_bg_thread=True)
|
completion_cb_in_bg_thread=True)
|
||||||
|
|
||||||
|
|
@ -231,12 +234,12 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
def _refresh(self,
|
def _refresh(self,
|
||||||
select_get_more_games_button: bool = False,
|
select_get_more_games_button: bool = False,
|
||||||
selected: bool = None) -> None:
|
selected: bool = None) -> None:
|
||||||
# from ba.internal import get_game_types
|
# from babase.internal import get_game_types
|
||||||
|
|
||||||
if self._column is not None:
|
if self._column is not None:
|
||||||
self._column.delete()
|
self._column.delete()
|
||||||
|
|
||||||
self._column = ba.columnwidget(parent=self._scrollwidget,
|
self._column = bui.columnwidget(parent=self._scrollwidget,
|
||||||
border=2,
|
border=2,
|
||||||
margin=0)
|
margin=0)
|
||||||
|
|
||||||
|
|
@ -244,11 +247,10 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
|
|
||||||
def _doit() -> None:
|
def _doit() -> None:
|
||||||
if self._select_button:
|
if self._select_button:
|
||||||
ba.timer(0.1,
|
bs.apptimer(0.1,
|
||||||
self._select_button.activate,
|
self._select_button.activate)
|
||||||
timetype=ba.TimeType.REAL)
|
|
||||||
|
|
||||||
txt = ba.textwidget(parent=self._column,
|
txt = bui.textwidget(parent=self._column,
|
||||||
position=(0, 0),
|
position=(0, 0),
|
||||||
size=(self._width - 88, 24),
|
size=(self._width - 88, 24),
|
||||||
text=gametype.get_display_string(),
|
text=gametype.get_display_string(),
|
||||||
|
|
@ -256,30 +258,30 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
v_align='center',
|
v_align='center',
|
||||||
color=(0.8, 0.8, 0.8, 1.0),
|
color=(0.8, 0.8, 0.8, 1.0),
|
||||||
maxwidth=self._scroll_width * 0.8,
|
maxwidth=self._scroll_width * 0.8,
|
||||||
on_select_call=ba.Call(
|
on_select_call=babase.Call(
|
||||||
self._set_selected_game_type, gametype),
|
self._set_selected_game_type, gametype),
|
||||||
always_highlight=True,
|
always_highlight=True,
|
||||||
selectable=True,
|
selectable=True,
|
||||||
on_activate_call=_doit)
|
on_activate_call=_doit)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
ba.widget(edit=txt, up_widget=self._back_button)
|
bui.widget(edit=txt, up_widget=self._back_button)
|
||||||
|
|
||||||
self._get_more_games_button = ba.buttonwidget(
|
self._get_more_games_button = bui.buttonwidget(
|
||||||
parent=self._column,
|
parent=self._column,
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
label=ba.Lstr(resource=self._r + '.getMoreGamesText'),
|
label=babase.Lstr(resource=self._r + '.getMoreGamesText'),
|
||||||
color=(0.54, 0.52, 0.67),
|
color=(0.54, 0.52, 0.67),
|
||||||
textcolor=(0.7, 0.65, 0.7),
|
textcolor=(0.7, 0.65, 0.7),
|
||||||
on_activate_call=self._on_get_more_games_press,
|
on_activate_call=self._on_get_more_games_press,
|
||||||
size=(178, 50))
|
size=(178, 50))
|
||||||
if select_get_more_games_button:
|
if select_get_more_games_button:
|
||||||
ba.containerwidget(edit=self._column,
|
bui.containerwidget(edit=self._column,
|
||||||
selected_child=self._get_more_games_button,
|
selected_child=self._get_more_games_button,
|
||||||
visible_child=self._get_more_games_button)
|
visible_child=self._get_more_games_button)
|
||||||
|
|
||||||
def _add(self) -> None:
|
def _add(self) -> None:
|
||||||
_ba.lock_all_input() # Make sure no more commands happen.
|
_babase.lock_all_input() # Make sure no more commands happen.
|
||||||
ba.timer(0.1, _ba.unlock_all_input, timetype=ba.TimeType.REAL)
|
bs.apptimer(0.1, _babase.unlock_all_input)
|
||||||
gameconfig = {}
|
gameconfig = {}
|
||||||
if config['selected'] == self._selected_game_type.__name__:
|
if config['selected'] == self._selected_game_type.__name__:
|
||||||
if config['config']:
|
if config['config']:
|
||||||
|
|
@ -297,13 +299,13 @@ class SelectGameWindow(PlaylistAddGameWindow):
|
||||||
CustomSession._gametype = self._selected_game_type
|
CustomSession._gametype = self._selected_game_type
|
||||||
start_game(CustomSession)
|
start_game(CustomSession)
|
||||||
else:
|
else:
|
||||||
ba.app.ui.clear_main_menu_window(transition='out_right')
|
bui.app.ui_v1.clear_main_menu_window(transition='out_right')
|
||||||
ba.app.ui.set_main_menu_window(
|
bui.app.ui_v1.set_main_menu_window(
|
||||||
SelectGameWindow(transition='in_left').get_root_widget())
|
SelectGameWindow(transition='in_left').get_root_widget())
|
||||||
|
|
||||||
def _back(self) -> None:
|
def _back(self) -> None:
|
||||||
ba.containerwidget(edit=self._root_widget, transition='out_right')
|
bui.containerwidget(edit=self._root_widget, transition='out_right')
|
||||||
ba.app.ui.set_main_menu_window(
|
bui.app.ui_v1.set_main_menu_window(
|
||||||
PlayWindow(transition='in_left').get_root_widget())
|
PlayWindow(transition='in_left').get_root_widget())
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -318,11 +320,11 @@ def __init__(self, *args, **kwargs):
|
||||||
|
|
||||||
def do_quick_game() -> None:
|
def do_quick_game() -> None:
|
||||||
self._save_state()
|
self._save_state()
|
||||||
ba.containerwidget(edit=self._root_widget, transition='out_left')
|
bui.containerwidget(edit=self._root_widget, transition='out_left')
|
||||||
ba.app.ui.set_main_menu_window(
|
bui.app.ui_v1.set_main_menu_window(
|
||||||
SelectGameWindow().get_root_widget())
|
SelectGameWindow().get_root_widget())
|
||||||
|
|
||||||
self._quick_game_button = ba.buttonwidget(
|
self._quick_game_button = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
position=(width - 55 - 120, height - 132),
|
position=(width - 55 - 120, height - 132),
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
|
|
@ -350,32 +352,32 @@ def states(self) -> None:
|
||||||
def _save_state(self) -> None:
|
def _save_state(self) -> None:
|
||||||
swapped = {v: k for k, v in states(self).items()}
|
swapped = {v: k for k, v in states(self).items()}
|
||||||
if self._root_widget.get_selected_child() in swapped:
|
if self._root_widget.get_selected_child() in swapped:
|
||||||
ba.app.ui.window_states[
|
bui.app.ui_v1.window_states[
|
||||||
self.__class__.__name__] = swapped[
|
self.__class__.__name__] = swapped[
|
||||||
self._root_widget.get_selected_child()]
|
self._root_widget.get_selected_child()]
|
||||||
else:
|
else:
|
||||||
ba.print_exception(f'Error saving state for {self}.')
|
babase.print_exception(f'Error saving state for {self}.')
|
||||||
|
|
||||||
|
|
||||||
def _restore_state(self) -> None:
|
def _restore_state(self) -> None:
|
||||||
if not hasattr(self, '_quick_game_button'):
|
if not hasattr(self, '_quick_game_button'):
|
||||||
return # ensure that our monkey patched init ran
|
return # ensure that our monkey patched init ran
|
||||||
if self.__class__.__name__ not in ba.app.ui.window_states:
|
if self.__class__.__name__ not in bui.app.ui_v1.window_states:
|
||||||
ba.containerwidget(edit=self._root_widget,
|
bui.containerwidget(edit=self._root_widget,
|
||||||
selected_child=self._coop_button)
|
selected_child=self._coop_button)
|
||||||
return
|
return
|
||||||
sel = states(self).get(
|
sel = states(self).get(
|
||||||
ba.app.ui.window_states[self.__class__.__name__], None)
|
bui.app.ui_v1.window_states[self.__class__.__name__], None)
|
||||||
if sel:
|
if sel:
|
||||||
ba.containerwidget(edit=self._root_widget, selected_child=sel)
|
bui.containerwidget(edit=self._root_widget, selected_child=sel)
|
||||||
else:
|
else:
|
||||||
ba.containerwidget(edit=self._root_widget,
|
bui.containerwidget(edit=self._root_widget,
|
||||||
selected_child=self._coop_button)
|
selected_child=self._coop_button)
|
||||||
ba.print_exception(f'Error restoring state for {self}.')
|
babase.print_exception(f'Error restoring state for {self}.')
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class QuickGamePlugin(ba.Plugin):
|
class QuickGamePlugin(babase.Plugin):
|
||||||
PlayWindow.__init__ = __init__
|
PlayWindow.__init__ = __init__
|
||||||
PlayWindow._save_state = _save_state
|
PlayWindow._save_state = _save_state
|
||||||
PlayWindow._restore_state = _restore_state
|
PlayWindow._restore_state = _restore_state
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
"""
|
"""
|
||||||
Quickturn by TheMikirog
|
Quickturn by TheMikirog
|
||||||
|
|
||||||
|
|
@ -9,16 +10,18 @@
|
||||||
No Rights Reserved
|
No Rights Reserved
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 8
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import ba
|
import babase
|
||||||
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
import math
|
import math
|
||||||
import bastd
|
import bascenev1lib
|
||||||
from bastd.actor.spaz import Spaz
|
from bascenev1lib.actor.spaz import Spaz
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -26,7 +29,7 @@ if TYPE_CHECKING:
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class Quickturn(ba.Plugin):
|
class Quickturn(babase.Plugin):
|
||||||
|
|
||||||
class FootConnectMessage:
|
class FootConnectMessage:
|
||||||
"""Spaz started touching the ground"""
|
"""Spaz started touching the ground"""
|
||||||
|
|
@ -46,7 +49,7 @@ class Quickturn(ba.Plugin):
|
||||||
if self.node.knockout > 0.0 or self.frozen or self.node.hold_node:
|
if self.node.knockout > 0.0 or self.frozen or self.node.hold_node:
|
||||||
return
|
return
|
||||||
|
|
||||||
t_ms = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
t_ms = bs.time() * 1000
|
||||||
assert isinstance(t_ms, int)
|
assert isinstance(t_ms, int)
|
||||||
|
|
||||||
if t_ms - self.last_wavedash_time_ms >= self._wavedash_cooldown:
|
if t_ms - self.last_wavedash_time_ms >= self._wavedash_cooldown:
|
||||||
|
|
@ -77,7 +80,7 @@ class Quickturn(ba.Plugin):
|
||||||
self.last_wavedash_time_ms = t_ms
|
self.last_wavedash_time_ms = t_ms
|
||||||
|
|
||||||
# FX
|
# FX
|
||||||
ba.emitfx(position=self.node.position,
|
bs.emitfx(position=self.node.position,
|
||||||
velocity=(vel[0]*0.5, -1, vel[1]*0.5),
|
velocity=(vel[0]*0.5, -1, vel[1]*0.5),
|
||||||
chunk_type='spark',
|
chunk_type='spark',
|
||||||
count=5,
|
count=5,
|
||||||
|
|
@ -104,7 +107,7 @@ class Quickturn(ba.Plugin):
|
||||||
args[0].grounded = 0
|
args[0].grounded = 0
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spaz.Spaz.__init__ = new_spaz_init(bastd.actor.spaz.Spaz.__init__)
|
bascenev1lib.actor.spaz.Spaz.__init__ = new_spaz_init(bascenev1lib.actor.spaz.Spaz.__init__)
|
||||||
|
|
||||||
def new_factory(func):
|
def new_factory(func):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
|
@ -112,12 +115,12 @@ class Quickturn(ba.Plugin):
|
||||||
|
|
||||||
args[0].roller_material.add_actions(
|
args[0].roller_material.add_actions(
|
||||||
conditions=('they_have_material',
|
conditions=('they_have_material',
|
||||||
bastd.gameutils.SharedObjects.get().footing_material),
|
bascenev1lib.gameutils.SharedObjects.get().footing_material),
|
||||||
actions=(('message', 'our_node', 'at_connect', Quickturn.FootConnectMessage),
|
actions=(('message', 'our_node', 'at_connect', Quickturn.FootConnectMessage),
|
||||||
('message', 'our_node', 'at_disconnect', Quickturn.FootDisconnectMessage)))
|
('message', 'our_node', 'at_disconnect', Quickturn.FootDisconnectMessage)))
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spazfactory.SpazFactory.__init__ = new_factory(
|
bascenev1lib.actor.spazfactory.SpazFactory.__init__ = new_factory(
|
||||||
bastd.actor.spazfactory.SpazFactory.__init__)
|
bascenev1lib.actor.spazfactory.SpazFactory.__init__)
|
||||||
|
|
||||||
def new_handlemessage(func):
|
def new_handlemessage(func):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
|
@ -129,7 +132,7 @@ class Quickturn(ba.Plugin):
|
||||||
|
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spaz.Spaz.handlemessage = new_handlemessage(bastd.actor.spaz.Spaz.handlemessage)
|
bascenev1lib.actor.spaz.Spaz.handlemessage = new_handlemessage(bascenev1lib.actor.spaz.Spaz.handlemessage)
|
||||||
|
|
||||||
def new_on_run(func):
|
def new_on_run(func):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
|
@ -137,4 +140,4 @@ class Quickturn(ba.Plugin):
|
||||||
Quickturn.wavedash(args[0])
|
Quickturn.wavedash(args[0])
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
return wrapper
|
return wrapper
|
||||||
bastd.actor.spaz.Spaz.on_run = new_on_run(bastd.actor.spaz.Spaz.on_run)
|
bascenev1lib.actor.spaz.Spaz.on_run = new_on_run(bascenev1lib.actor.spaz.Spaz.on_run)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Ragdoll-B-Gone by TheMikirog
|
Ragdoll-B-Gone by TheMikirog
|
||||||
|
|
@ -18,11 +19,13 @@ from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
# Let's import everything we need and nothing more.
|
# Let's import everything we need and nothing more.
|
||||||
import ba
|
import babase
|
||||||
import bastd
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
|
import bascenev1lib
|
||||||
import random
|
import random
|
||||||
from bastd.actor.spaz import Spaz
|
from bascenev1lib.actor.spaz import Spaz
|
||||||
from bastd.actor.spazfactory import SpazFactory
|
from bascenev1lib.actor.spazfactory import SpazFactory
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -30,7 +33,7 @@ if TYPE_CHECKING:
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
class RagdollBGone(ba.Plugin):
|
class RagdollBGone(babase.Plugin):
|
||||||
|
|
||||||
# We use a decorator to add extra code to existing code, increasing mod compatibility.
|
# We use a decorator to add extra code to existing code, increasing mod compatibility.
|
||||||
# Any gameplay altering mod should master the decorator!
|
# Any gameplay altering mod should master the decorator!
|
||||||
|
|
@ -42,16 +45,16 @@ class RagdollBGone(ba.Plugin):
|
||||||
# We're working kind of blindly here, so it's good to have the original function
|
# We're working kind of blindly here, so it's good to have the original function
|
||||||
# open in a second window for argument reference.
|
# open in a second window for argument reference.
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
if isinstance(args[1], ba.DieMessage): # Replace Spaz death behavior
|
if isinstance(args[1], bs.DieMessage): # Replace Spaz death behavior
|
||||||
|
|
||||||
# Here we play the gamey death noise in Co-op.
|
# Here we play the gamey death noise in Co-op.
|
||||||
if not args[1].immediate:
|
if not args[1].immediate:
|
||||||
if args[0].play_big_death_sound and not args[0]._dead:
|
if args[0].play_big_death_sound and not args[0]._dead:
|
||||||
ba.playsound(SpazFactory.get().single_player_death_sound)
|
SpazFactory.get().single_player_death_sound.play()
|
||||||
|
|
||||||
# If our Spaz dies by falling out of the map, we want to keep the ragdoll.
|
# If our Spaz dies by falling out of the map, we want to keep the ragdoll.
|
||||||
# Ragdolls don't impact gameplay if Spaz dies this way, so it's fine if we leave the behavior as is.
|
# Ragdolls don't impact gameplay if Spaz dies this way, so it's fine if we leave the behavior as is.
|
||||||
if args[1].how == ba.DeathType.FALL:
|
if args[1].how == bs.DeathType.FALL:
|
||||||
# The next two properties are all built-in, so their behavior can't be edited directly without touching the C++ layer.
|
# The next two properties are all built-in, so their behavior can't be edited directly without touching the C++ layer.
|
||||||
# We can change their values though!
|
# We can change their values though!
|
||||||
# "hurt" property is basically the health bar above the player and the blinking when low on health.
|
# "hurt" property is basically the health bar above the player and the blinking when low on health.
|
||||||
|
|
@ -61,7 +64,7 @@ class RagdollBGone(ba.Plugin):
|
||||||
# Again, this behavior is built in. We can only trigger it by setting "dead" to True.
|
# Again, this behavior is built in. We can only trigger it by setting "dead" to True.
|
||||||
args[0].node.dead = True
|
args[0].node.dead = True
|
||||||
# After the death animation ends (which is around 2 seconds) let's remove the Spaz our of existence.
|
# After the death animation ends (which is around 2 seconds) let's remove the Spaz our of existence.
|
||||||
ba.timer(2.0, args[0].node.delete)
|
bs.timer(2.0, args[0].node.delete)
|
||||||
else:
|
else:
|
||||||
# Here's our new behavior!
|
# Here's our new behavior!
|
||||||
# The idea is to remove the Spaz node and make some sparks for extra flair.
|
# The idea is to remove the Spaz node and make some sparks for extra flair.
|
||||||
|
|
@ -80,7 +83,7 @@ class RagdollBGone(ba.Plugin):
|
||||||
args[0].node.position[2])
|
args[0].node.position[2])
|
||||||
# This function allows us to spawn particles like sparks and bomb shrapnel.
|
# This function allows us to spawn particles like sparks and bomb shrapnel.
|
||||||
# We're gonna use sparks here.
|
# We're gonna use sparks here.
|
||||||
ba.emitfx(position=pos, # Here we place our edited position.
|
bs.emitfx(position=pos, # Here we place our edited position.
|
||||||
velocity=args[0].node.velocity,
|
velocity=args[0].node.velocity,
|
||||||
# Random amount of sparks between 2 and 5
|
# Random amount of sparks between 2 and 5
|
||||||
count=random.randrange(2, 5),
|
count=random.randrange(2, 5),
|
||||||
|
|
@ -95,10 +98,10 @@ class RagdollBGone(ba.Plugin):
|
||||||
# Pick a random death noise
|
# Pick a random death noise
|
||||||
sound = death_sounds[random.randrange(len(death_sounds))]
|
sound = death_sounds[random.randrange(len(death_sounds))]
|
||||||
# Play the sound where our Spaz is
|
# Play the sound where our Spaz is
|
||||||
ba.playsound(sound, position=args[0].node.position)
|
sound.play(position=args[0].node.position)
|
||||||
# Delete our Spaz node immediately.
|
# Delete our Spaz node immediately.
|
||||||
# Removing stuff is weird and prone to errors, so we're gonna delay it.
|
# Removing stuff is weird and prone to errors, so we're gonna delay it.
|
||||||
ba.timer(0.001, args[0].node.delete)
|
bs.timer(0.001, args[0].node.delete)
|
||||||
|
|
||||||
# Let's mark our Spaz as dead, so he can't die again.
|
# Let's mark our Spaz as dead, so he can't die again.
|
||||||
# Notice how we're targeting the Spaz and not it's node.
|
# Notice how we're targeting the Spaz and not it's node.
|
||||||
|
|
@ -116,4 +119,4 @@ class RagdollBGone(ba.Plugin):
|
||||||
|
|
||||||
# Finally we """travel through the game files""" to replace the function we want with our own version.
|
# Finally we """travel through the game files""" to replace the function we want with our own version.
|
||||||
# We transplant the old function's arguments into our version.
|
# We transplant the old function's arguments into our version.
|
||||||
bastd.actor.spaz.Spaz.handlemessage = new_handlemessage(bastd.actor.spaz.Spaz.handlemessage)
|
bascenev1lib.actor.spaz.Spaz.handlemessage = new_handlemessage(bascenev1lib.actor.spaz.Spaz.handlemessage)
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,19 @@
|
||||||
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, TypeVar
|
from typing import TYPE_CHECKING, TypeVar
|
||||||
|
|
||||||
import _ba
|
import _babase
|
||||||
import ba
|
import babase
|
||||||
import ba.internal
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
import random
|
import random
|
||||||
from bastd.ui.gather.publictab import PublicGatherTab, PartyEntry, PingThread
|
from bauiv1lib.gather.publictab import PublicGatherTab, PartyEntry, PingThread
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
ClassType = TypeVar('ClassType')
|
ClassType = TypeVar('ClassType')
|
||||||
MethodType = TypeVar('Methodtype')
|
MethodType = TypeVar('MethodType')
|
||||||
|
|
||||||
|
|
||||||
def override(cls: ClassType) -> Callable[[MethodType], MethodType]:
|
def override(cls: ClassType) -> Callable[[MethodType], MethodType]:
|
||||||
|
|
@ -50,26 +52,26 @@ class NewPublicGatherTab(PublicGatherTab, PingThread):
|
||||||
v = c_height - 35
|
v = c_height - 35
|
||||||
v -= 60
|
v -= 60
|
||||||
|
|
||||||
self._random_join_button = ba.buttonwidget(
|
self._random_join_button = bui.buttonwidget(
|
||||||
parent=self._container,
|
parent=self._container,
|
||||||
label='random',
|
label='random',
|
||||||
size=(90, 45),
|
size=(90, 45),
|
||||||
position=(710, v + 10),
|
position=(710, v + 10),
|
||||||
on_activate_call=ba.WeakCall(self._join_random_server),
|
on_activate_call=bs.WeakCall(self._join_random_server),
|
||||||
)
|
)
|
||||||
ba.widget(edit=self._random_join_button, up_widget=self._host_text,
|
bui.widget(edit=self._random_join_button, up_widget=self._host_text,
|
||||||
left_widget=self._filter_text)
|
left_widget=self._filter_text)
|
||||||
|
|
||||||
# We could place it somewhere under plugin settings which is kind of
|
# We could place it somewhere under plugin settings which is kind of
|
||||||
# official way to customise plugins. Although it's too deep:
|
# official way to customise plugins. Although it's too deep:
|
||||||
# Gather Window -> Main Menu -> Settings -> Advanced -(scroll)->
|
# Gather Window -> Main Menu -> Settings -> Advanced -(scroll)->
|
||||||
# Plugins -(scroll probably)-> RandomJoin Settings.
|
# Plugins -(scroll probably)-> RandomJoin Settings.
|
||||||
self._random_join_settings_button = ba.buttonwidget(
|
self._random_join_settings_button = bui.buttonwidget(
|
||||||
parent=self._container,
|
parent=self._container,
|
||||||
icon=ba.gettexture('settingsIcon'),
|
icon=bui.gettexture('settingsIcon'),
|
||||||
size=(40, 40),
|
size=(40, 40),
|
||||||
position=(820, v + 13),
|
position=(820, v + 13),
|
||||||
on_activate_call=ba.WeakCall(self._show_random_join_settings),
|
on_activate_call=bs.WeakCall(self._show_random_join_settings),
|
||||||
)
|
)
|
||||||
|
|
||||||
@override(PublicGatherTab)
|
@override(PublicGatherTab)
|
||||||
|
|
@ -97,9 +99,9 @@ class NewPublicGatherTab(PublicGatherTab, PingThread):
|
||||||
and p.ping <= randomjoin.maximum_ping)))]
|
and p.ping <= randomjoin.maximum_ping)))]
|
||||||
|
|
||||||
if not parties:
|
if not parties:
|
||||||
ba.screenmessage('No suitable servers found; wait',
|
bui.screenmessage('No suitable servers found; wait',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
return
|
return
|
||||||
|
|
||||||
for party in parties:
|
for party in parties:
|
||||||
|
|
@ -110,33 +112,33 @@ class NewPublicGatherTab(PublicGatherTab, PingThread):
|
||||||
party = random.choice(
|
party = random.choice(
|
||||||
[p for p in parties if p.name[:6] in name_prefixes])
|
[p for p in parties if p.name[:6] in name_prefixes])
|
||||||
|
|
||||||
ba.internal.connect_to_party(party.address, party.port)
|
bs.connect_to_party(party.address, party.port)
|
||||||
|
|
||||||
|
|
||||||
class RandomJoinSettingsPopup(ba.Window):
|
class RandomJoinSettingsPopup(bui.Window):
|
||||||
def __init__(self, origin_widget: ba.Widget) -> None:
|
def __init__(self, origin_widget: bui.Widget) -> None:
|
||||||
c_width = 600
|
c_width = 600
|
||||||
c_height = 400
|
c_height = 400
|
||||||
uiscale = ba.app.ui.uiscale
|
uiscale = bui.app.ui_v1.uiscale
|
||||||
super().__init__(root_widget=ba.containerwidget(
|
super().__init__(root_widget=bui.containerwidget(
|
||||||
scale=(
|
scale=(
|
||||||
1.8
|
1.8
|
||||||
if uiscale is ba.UIScale.SMALL
|
if uiscale is babase.UIScale.SMALL
|
||||||
else 1.55
|
else 1.55
|
||||||
if uiscale is ba.UIScale.MEDIUM
|
if uiscale is babase.UIScale.MEDIUM
|
||||||
else 1.0
|
else 1.0
|
||||||
),
|
),
|
||||||
scale_origin_stack_offset=origin_widget.get_screen_space_center(),
|
scale_origin_stack_offset=origin_widget.get_screen_space_center(),
|
||||||
stack_offset=(0, -10)
|
stack_offset=(0, -10)
|
||||||
if uiscale is ba.UIScale.SMALL
|
if uiscale is babase.UIScale.SMALL
|
||||||
else (0, 15)
|
else (0, 15)
|
||||||
if uiscale is ba.UIScale.MEDIUM
|
if uiscale is babase.UIScale.MEDIUM
|
||||||
else (0, 0),
|
else (0, 0),
|
||||||
size=(c_width, c_height),
|
size=(c_width, c_height),
|
||||||
transition='in_scale',
|
transition='in_scale',
|
||||||
))
|
))
|
||||||
|
|
||||||
ba.textwidget(
|
bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
h_align='center',
|
h_align='center',
|
||||||
|
|
@ -149,7 +151,7 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
)
|
)
|
||||||
|
|
||||||
v = c_height - 120
|
v = c_height - 120
|
||||||
ba.textwidget(
|
bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
h_align='right',
|
h_align='right',
|
||||||
|
|
@ -158,7 +160,7 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
maxwidth=c_width * 0.3,
|
maxwidth=c_width * 0.3,
|
||||||
position=(c_width * 0.4, v),
|
position=(c_width * 0.4, v),
|
||||||
)
|
)
|
||||||
self._maximum_ping_edit = ba.textwidget(
|
self._maximum_ping_edit = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(c_width * 0.3, 40),
|
size=(c_width * 0.3, 40),
|
||||||
h_align='left',
|
h_align='left',
|
||||||
|
|
@ -171,7 +173,7 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
max_chars=4,
|
max_chars=4,
|
||||||
)
|
)
|
||||||
v -= 60
|
v -= 60
|
||||||
ba.textwidget(
|
bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(0, 0),
|
size=(0, 0),
|
||||||
h_align='right',
|
h_align='right',
|
||||||
|
|
@ -180,7 +182,7 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
maxwidth=c_width * 0.3,
|
maxwidth=c_width * 0.3,
|
||||||
position=(c_width * 0.4, v),
|
position=(c_width * 0.4, v),
|
||||||
)
|
)
|
||||||
self._minimum_players_edit = ba.textwidget(
|
self._minimum_players_edit = bui.textwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
size=(c_width * 0.3, 40),
|
size=(c_width * 0.3, 40),
|
||||||
h_align='left',
|
h_align='left',
|
||||||
|
|
@ -195,27 +197,27 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
v -= 60
|
v -= 60
|
||||||
|
|
||||||
# Cancel button.
|
# Cancel button.
|
||||||
self.cancel_button = btn = ba.buttonwidget(
|
self.cancel_button = btn = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
label=ba.Lstr(resource='cancelText'),
|
label=babase.Lstr(resource='cancelText'),
|
||||||
size=(180, 60),
|
size=(180, 60),
|
||||||
color=(1.0, 0.2, 0.2),
|
color=(1.0, 0.2, 0.2),
|
||||||
position=(40, 30),
|
position=(40, 30),
|
||||||
on_activate_call=self._cancel,
|
on_activate_call=self._cancel,
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
)
|
)
|
||||||
ba.containerwidget(edit=self._root_widget, cancel_button=btn)
|
bui.containerwidget(edit=self._root_widget, cancel_button=btn)
|
||||||
|
|
||||||
# Save button.
|
# Save button.
|
||||||
self.savebtn = btn = ba.buttonwidget(
|
self.savebtn = btn = bui.buttonwidget(
|
||||||
parent=self._root_widget,
|
parent=self._root_widget,
|
||||||
label=ba.Lstr(resource='saveText'),
|
label=babase.Lstr(resource='saveText'),
|
||||||
size=(180, 60),
|
size=(180, 60),
|
||||||
position=(c_width - 200, 30),
|
position=(c_width - 200, 30),
|
||||||
on_activate_call=self._save,
|
on_activate_call=self._save,
|
||||||
autoselect=True,
|
autoselect=True,
|
||||||
)
|
)
|
||||||
ba.containerwidget(edit=self._root_widget, start_button=btn)
|
bui.containerwidget(edit=self._root_widget, start_button=btn)
|
||||||
|
|
||||||
def _save(self) -> None:
|
def _save(self) -> None:
|
||||||
errored = False
|
errored = False
|
||||||
|
|
@ -223,19 +225,19 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
maximum_ping: int | None = None
|
maximum_ping: int | None = None
|
||||||
try:
|
try:
|
||||||
minimum_players = int(
|
minimum_players = int(
|
||||||
ba.textwidget(query=self._minimum_players_edit))
|
bui.textwidget(query=self._minimum_players_edit))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
ba.screenmessage('"Minimum players" should be integer',
|
bui.screenmessage('"Minimum players" should be integer',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
errored = True
|
errored = True
|
||||||
try:
|
try:
|
||||||
maximum_ping = int(
|
maximum_ping = int(
|
||||||
ba.textwidget(query=self._maximum_ping_edit))
|
bui.textwidget(query=self._maximum_ping_edit))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
ba.screenmessage('"Maximum ping" should be integer',
|
bui.screenmessage('"Maximum ping" should be integer',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
errored = True
|
errored = True
|
||||||
if errored:
|
if errored:
|
||||||
return
|
return
|
||||||
|
|
@ -244,16 +246,16 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
assert maximum_ping is not None
|
assert maximum_ping is not None
|
||||||
|
|
||||||
if minimum_players < 0:
|
if minimum_players < 0:
|
||||||
ba.screenmessage('"Minimum players" should be at least 0',
|
bui.screenmessage('"Minimum players" should be at least 0',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
errored = True
|
errored = True
|
||||||
|
|
||||||
if maximum_ping <= 0:
|
if maximum_ping <= 0:
|
||||||
ba.screenmessage('"Maximum ping" should be greater than 0',
|
bui.screenmessage('"Maximum ping" should be greater than 0',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
ba.screenmessage('(use 9999 as dont-care value)',
|
bui.screenmessage('(use 9999 as dont-care value)',
|
||||||
color=(1, 0, 0))
|
color=(1, 0, 0))
|
||||||
errored = True
|
errored = True
|
||||||
|
|
||||||
|
|
@ -264,15 +266,15 @@ class RandomJoinSettingsPopup(ba.Window):
|
||||||
randomjoin.minimum_players = minimum_players
|
randomjoin.minimum_players = minimum_players
|
||||||
|
|
||||||
randomjoin.commit_config()
|
randomjoin.commit_config()
|
||||||
ba.playsound(ba.getsound('shieldUp'))
|
bui.getsound('shieldUp').play()
|
||||||
self._transition_out()
|
self._transition_out()
|
||||||
|
|
||||||
def _cancel(self) -> None:
|
def _cancel(self) -> None:
|
||||||
ba.playsound(ba.getsound('shieldDown'))
|
bui.getsound('shieldDown').play()
|
||||||
self._transition_out()
|
self._transition_out()
|
||||||
|
|
||||||
def _transition_out(self) -> None:
|
def _transition_out(self) -> None:
|
||||||
ba.containerwidget(edit=self._root_widget, transition='out_scale')
|
bui.containerwidget(edit=self._root_widget, transition='out_scale')
|
||||||
|
|
||||||
|
|
||||||
class RandomJoin:
|
class RandomJoin:
|
||||||
|
|
@ -283,7 +285,7 @@ class RandomJoin:
|
||||||
self.load_config()
|
self.load_config()
|
||||||
|
|
||||||
def load_config(self) -> None:
|
def load_config(self) -> None:
|
||||||
cfg = ba.app.config.get('Random Join', {
|
cfg = babase.app.config.get('Random Join', {
|
||||||
'maximum_ping': self.maximum_ping,
|
'maximum_ping': self.maximum_ping,
|
||||||
'minimum_players': self.minimum_players,
|
'minimum_players': self.minimum_players,
|
||||||
})
|
})
|
||||||
|
|
@ -291,25 +293,25 @@ class RandomJoin:
|
||||||
self.maximum_ping = cfg['maximum_ping']
|
self.maximum_ping = cfg['maximum_ping']
|
||||||
self.minimum_players = cfg['minimum_players']
|
self.minimum_players = cfg['minimum_players']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
ba.screenmessage('Error: RandomJoin config is broken, resetting..',
|
bui.screenmessage('Error: RandomJoin config is broken, resetting..',
|
||||||
color=(1, 0, 0), log=True)
|
color=(1, 0, 0), log=True)
|
||||||
ba.playsound(ba.getsound('error'))
|
bui.getsound('error').play()
|
||||||
self.commit_config()
|
self.commit_config()
|
||||||
|
|
||||||
def commit_config(self) -> None:
|
def commit_config(self) -> None:
|
||||||
ba.app.config['Random Join'] = {
|
babase.app.config['Random Join'] = {
|
||||||
'maximum_ping': self.maximum_ping,
|
'maximum_ping': self.maximum_ping,
|
||||||
'minimum_players': self.minimum_players,
|
'minimum_players': self.minimum_players,
|
||||||
}
|
}
|
||||||
ba.app.config.commit()
|
babase.app.config.commit()
|
||||||
|
|
||||||
|
|
||||||
randomjoin = RandomJoin()
|
randomjoin = RandomJoin()
|
||||||
|
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 8
|
||||||
# ba_meta export ba.Plugin
|
# ba_meta export babase.Plugin
|
||||||
class RandomJoinPlugin(ba.Plugin):
|
class RandomJoinPlugin(babase.Plugin):
|
||||||
def on_app_running(self) -> None:
|
def on_app_running(self) -> None:
|
||||||
# I feel bad that all patching logic happens not here.
|
# I feel bad that all patching logic happens not here.
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
# ba_meta require api 7
|
# Porting to api 8 made easier by baport.(https://github.com/bombsquad-community/baport)
|
||||||
|
# ba_meta require api 8
|
||||||
|
|
||||||
"""
|
"""
|
||||||
TNT Respawn Text by TheMikirog
|
TNT Respawn Text by TheMikirog
|
||||||
|
|
@ -16,11 +17,13 @@ from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
# Let's import everything we need and nothing more.
|
# Let's import everything we need and nothing more.
|
||||||
import ba
|
import babase
|
||||||
import bastd
|
import bauiv1 as bui
|
||||||
|
import bascenev1 as bs
|
||||||
|
import bascenev1lib
|
||||||
import math
|
import math
|
||||||
import random
|
import random
|
||||||
from bastd.actor.bomb import Bomb
|
from bascenev1lib.actor.bomb import Bomb
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
pass
|
pass
|
||||||
|
|
@ -40,7 +43,7 @@ if TYPE_CHECKING:
|
||||||
|
|
||||||
|
|
||||||
# ba_meta export plugin
|
# ba_meta export plugin
|
||||||
class TNTRespawnText(ba.Plugin):
|
class TNTRespawnText(babase.Plugin):
|
||||||
|
|
||||||
# This clamping function will make sure a certain value can't go above or below a certain threshold.
|
# This clamping function will make sure a certain value can't go above or below a certain threshold.
|
||||||
# We're gonna need this functionality in just a bit.
|
# We're gonna need this functionality in just a bit.
|
||||||
|
|
@ -54,7 +57,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
def on_tnt_exploded(self):
|
def on_tnt_exploded(self):
|
||||||
self.tnt_has_callback = False
|
self.tnt_has_callback = False
|
||||||
self._respawn_text.color = (1.0, 1.0, 1.0)
|
self._respawn_text.color = (1.0, 1.0, 1.0)
|
||||||
ba.animate(
|
bs.animate(
|
||||||
self._respawn_text,
|
self._respawn_text,
|
||||||
'opacity',
|
'opacity',
|
||||||
{
|
{
|
||||||
|
|
@ -92,7 +95,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
respawn_text_position = (args[0]._position[0],
|
respawn_text_position = (args[0]._position[0],
|
||||||
args[0]._position[1] - 0.4,
|
args[0]._position[1] - 0.4,
|
||||||
args[0]._position[2])
|
args[0]._position[2])
|
||||||
args[0]._respawn_text = ba.newnode(
|
args[0]._respawn_text = bs.newnode(
|
||||||
'text',
|
'text',
|
||||||
attrs={
|
attrs={
|
||||||
'text': "", # we'll set the text later
|
'text': "", # we'll set the text later
|
||||||
|
|
@ -126,7 +129,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
args[0]._tnt.node.add_death_action(tnt_callback)
|
args[0]._tnt.node.add_death_action(tnt_callback)
|
||||||
return wrapper
|
return wrapper
|
||||||
# Let's replace the original init function with our modified version.
|
# Let's replace the original init function with our modified version.
|
||||||
bastd.actor.bomb.TNTSpawner.__init__ = new_init(bastd.actor.bomb.TNTSpawner.__init__)
|
bascenev1lib.actor.bomb.TNTSpawner.__init__ = new_init(bascenev1lib.actor.bomb.TNTSpawner.__init__)
|
||||||
|
|
||||||
# Our modified update function.
|
# Our modified update function.
|
||||||
# This gets called every 1.1s. Check the TNTSpawner class in the game's code for details.
|
# This gets called every 1.1s. Check the TNTSpawner class in the game's code for details.
|
||||||
|
|
@ -165,7 +168,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
# Code goes here if we don't have a TNT box and we reached 100%.
|
# Code goes here if we don't have a TNT box and we reached 100%.
|
||||||
if args[0]._tnt is None or args[0]._wait_time >= args[0]._respawn_time and args[0]._respawn_text:
|
if args[0]._tnt is None or args[0]._wait_time >= args[0]._respawn_time and args[0]._respawn_text:
|
||||||
# Animate the text "bounce" to draw attention
|
# Animate the text "bounce" to draw attention
|
||||||
ba.animate(
|
bs.animate(
|
||||||
args[0]._respawn_text,
|
args[0]._respawn_text,
|
||||||
'scale',
|
'scale',
|
||||||
{
|
{
|
||||||
|
|
@ -176,7 +179,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
# Fade the text away
|
# Fade the text away
|
||||||
ba.animate(
|
bs.animate(
|
||||||
args[0]._respawn_text,
|
args[0]._respawn_text,
|
||||||
'opacity',
|
'opacity',
|
||||||
{
|
{
|
||||||
|
|
@ -191,7 +194,7 @@ class TNTRespawnText(ba.Plugin):
|
||||||
args[0]._respawn_text.color = (1.0, 0.75, 0.5)
|
args[0]._respawn_text.color = (1.0, 0.75, 0.5)
|
||||||
|
|
||||||
# Make some sparks to draw the eye.
|
# Make some sparks to draw the eye.
|
||||||
ba.emitfx(
|
bs.emitfx(
|
||||||
position=args[0]._position,
|
position=args[0]._position,
|
||||||
count=int(5.0 + random.random() * 10),
|
count=int(5.0 + random.random() * 10),
|
||||||
scale=0.8,
|
scale=0.8,
|
||||||
|
|
@ -212,4 +215,4 @@ class TNTRespawnText(ba.Plugin):
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
# Let's replace the original update function with our modified version.
|
# Let's replace the original update function with our modified version.
|
||||||
bastd.actor.bomb.TNTSpawner._update = new_update(bastd.actor.bomb.TNTSpawner._update)
|
bascenev1lib.actor.bomb.TNTSpawner._update = new_update(bascenev1lib.actor.bomb.TNTSpawner._update)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue