mirror of
https://github.com/bombsquad-community/plugin-manager.git
synced 2025-10-08 14:54:36 +00:00
commit
e1a13a0935
5 changed files with 1602 additions and 0 deletions
|
|
@ -40,6 +40,44 @@
|
||||||
"md5sum": "a7ad7f1ac908fd871bcbcf665d49828c"
|
"md5sum": "a7ad7f1ac908fd871bcbcf665d49828c"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"memory_game": {
|
||||||
|
"description": "Memorise tiles to surive! Playable in teams/ffa/co-op",
|
||||||
|
"external_url": "",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Freaku",
|
||||||
|
"email": "",
|
||||||
|
"discord": "[Just] Freak#4999"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": {
|
||||||
|
"1.0.0": {
|
||||||
|
"api_version": 7,
|
||||||
|
"commit_sha": "858030b",
|
||||||
|
"released_on": "01-09-2022",
|
||||||
|
"md5sum": "27de4d6a66f41367977812c2df307c24"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"musical_flags": {
|
||||||
|
"description": "Musical chairs... but for bombsquad!?!! Playable in ffa/teams",
|
||||||
|
"external_url": "",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Freaku",
|
||||||
|
"email": "",
|
||||||
|
"discord": "[Just] Freak#4999"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": {
|
||||||
|
"1.0.0": {
|
||||||
|
"api_version": 7,
|
||||||
|
"commit_sha": "858030b",
|
||||||
|
"released_on": "01-09-2022",
|
||||||
|
"md5sum": "c84b7f415de5d3e9189ee73fc0e3ce93"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1017
plugins/minigames/memory_game.py
Normal file
1017
plugins/minigames/memory_game.py
Normal file
File diff suppressed because it is too large
Load diff
252
plugins/minigames/musical_flags.py
Normal file
252
plugins/minigames/musical_flags.py
Normal file
|
|
@ -0,0 +1,252 @@
|
||||||
|
# Made by MattZ45986 on GitHub
|
||||||
|
# Ported by: Freaku / @[Just] Freak#4999
|
||||||
|
|
||||||
|
|
||||||
|
# Bug Fixes & Improvements as well...
|
||||||
|
|
||||||
|
# Join BCS:
|
||||||
|
# https://discord.gg/ucyaesh
|
||||||
|
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
import _ba
|
||||||
|
import ba
|
||||||
|
import random
|
||||||
|
import math
|
||||||
|
from bastd.actor.flag import Flag, FlagPickedUpMessage
|
||||||
|
from bastd.actor.playerspaz import PlayerSpaz
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from typing import Any, Type, List, Dict, Tuple, Union, Sequence, Optional
|
||||||
|
|
||||||
|
|
||||||
|
class Player(ba.Player['Team']):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.done: bool = False
|
||||||
|
self.survived: bool = True
|
||||||
|
|
||||||
|
|
||||||
|
class Team(ba.Team[Player]):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.score = 0
|
||||||
|
|
||||||
|
|
||||||
|
# ba_meta require api 7
|
||||||
|
# ba_meta export game
|
||||||
|
class MFGame(ba.TeamGameActivity[Player, Team]):
|
||||||
|
name = 'Musical Flags'
|
||||||
|
description = "Don't be the one stuck without a flag!"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_available_settings(
|
||||||
|
cls, sessiontype: Type[ba.Session]) -> List[ba.Setting]:
|
||||||
|
settings = [
|
||||||
|
ba.IntChoiceSetting(
|
||||||
|
'Time Limit',
|
||||||
|
choices=[
|
||||||
|
('None', 0),
|
||||||
|
('1 Minute', 60),
|
||||||
|
('2 Minutes', 120),
|
||||||
|
('5 Minutes', 300),
|
||||||
|
('10 Minutes', 600),
|
||||||
|
('20 Minutes', 1200),
|
||||||
|
],
|
||||||
|
default=0,
|
||||||
|
),
|
||||||
|
ba.BoolSetting('Epic Mode', default=False),
|
||||||
|
ba.BoolSetting('Enable Running', default=True),
|
||||||
|
ba.BoolSetting('Enable Punching', default=False),
|
||||||
|
ba.BoolSetting('Enable Bottom Credit', True)
|
||||||
|
]
|
||||||
|
return settings
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def supports_session_type(cls, sessiontype: Type[ba.Session]) -> bool:
|
||||||
|
return (issubclass(sessiontype, ba.DualTeamSession)
|
||||||
|
or issubclass(sessiontype, ba.FreeForAllSession))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
|
||||||
|
return ['Doom Shroom']
|
||||||
|
|
||||||
|
def __init__(self, settings: dict):
|
||||||
|
super().__init__(settings)
|
||||||
|
self.nodes = []
|
||||||
|
self._dingsound = ba.getsound('dingSmall')
|
||||||
|
self._epic_mode = bool(settings['Epic Mode'])
|
||||||
|
self.credit_text = bool(settings['Enable Bottom Credit'])
|
||||||
|
self._time_limit = float(settings['Time Limit'])
|
||||||
|
self.is_punch = bool(settings['Enable Punching'])
|
||||||
|
self.is_run = bool(settings['Enable Running'])
|
||||||
|
|
||||||
|
self._textRound = ba.newnode('text',
|
||||||
|
attrs={'text': '',
|
||||||
|
'position': (0, -38),
|
||||||
|
'scale': 1,
|
||||||
|
'shadow': 1.0,
|
||||||
|
'flatness': 1.0,
|
||||||
|
'color': (1.0, 0.0, 1.0),
|
||||||
|
'opacity': 1,
|
||||||
|
'v_attach': 'top',
|
||||||
|
'h_attach': 'center',
|
||||||
|
'h_align': 'center',
|
||||||
|
'v_align': 'center'})
|
||||||
|
|
||||||
|
self.slow_motion = self._epic_mode
|
||||||
|
# A cool music, matching our gamemode theme
|
||||||
|
self.default_music = ba.MusicType.FLAG_CATCHER
|
||||||
|
|
||||||
|
def get_instance_description(self) -> Union[str, Sequence]:
|
||||||
|
return 'Catch Flag for yourself'
|
||||||
|
|
||||||
|
def get_instance_description_short(self) -> Union[str, Sequence]:
|
||||||
|
return 'Catch Flag for yourself'
|
||||||
|
|
||||||
|
def on_player_join(self, player: Player) -> None:
|
||||||
|
if self.has_begun():
|
||||||
|
ba.screenmessage(
|
||||||
|
ba.Lstr(resource='playerDelayedJoinText',
|
||||||
|
subs=[('${PLAYER}', player.getname(full=True))]),
|
||||||
|
color=(0, 1, 0), transient=True)
|
||||||
|
player.survived = False
|
||||||
|
return
|
||||||
|
self.spawn_player(player)
|
||||||
|
|
||||||
|
def on_player_leave(self, player: Player) -> None:
|
||||||
|
super().on_player_leave(player)
|
||||||
|
# A departing player may trigger game-over.
|
||||||
|
self.checkEnd()
|
||||||
|
|
||||||
|
def on_begin(self) -> None:
|
||||||
|
super().on_begin()
|
||||||
|
self.roundNum = 0
|
||||||
|
self.numPickedUp = 0
|
||||||
|
self.nodes = []
|
||||||
|
self.flags = []
|
||||||
|
self.spawned = []
|
||||||
|
self.setup_standard_time_limit(self._time_limit)
|
||||||
|
if self.credit_text:
|
||||||
|
t = ba.newnode('text',
|
||||||
|
attrs={'text': "Ported by Freaku\nMade by MattZ45986", # Disable 'Enable Bottom Credits' when making playlist, No need to edit this lovely...
|
||||||
|
'scale': 0.7,
|
||||||
|
'position': (0, 0),
|
||||||
|
'shadow': 0.5,
|
||||||
|
'flatness': 1.2,
|
||||||
|
'color': (1, 1, 1),
|
||||||
|
'h_align': 'center',
|
||||||
|
'v_attach': 'bottom'})
|
||||||
|
self.makeRound()
|
||||||
|
self._textRound.text = 'Round ' + str(self.roundNum)
|
||||||
|
ba.timer(5, self.checkEnd)
|
||||||
|
|
||||||
|
def makeRound(self):
|
||||||
|
for player in self.players:
|
||||||
|
if player.survived:
|
||||||
|
player.team.score += 1
|
||||||
|
self.roundNum += 1
|
||||||
|
self._textRound.text = 'Round ' + str(self.roundNum)
|
||||||
|
self.flags = []
|
||||||
|
self.spawned = []
|
||||||
|
angle = random.randint(0, 359)
|
||||||
|
c = 0
|
||||||
|
for player in self.players:
|
||||||
|
if player.survived:
|
||||||
|
c += 1
|
||||||
|
spacing = 10
|
||||||
|
for player in self.players:
|
||||||
|
player.done = False
|
||||||
|
if player.survived:
|
||||||
|
if not player.is_alive():
|
||||||
|
self.spawn_player(player, (.5, 5, -4))
|
||||||
|
self.spawned.append(player)
|
||||||
|
try:
|
||||||
|
spacing = 360 // (c)
|
||||||
|
except:
|
||||||
|
self.checkEnd()
|
||||||
|
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1), (0, 0, 0),
|
||||||
|
(0.5, 0.8, 0), (0, 0.8, 0.5), (0.8, 0.25, 0.7), (0, 0.27, 0.55), (2, 2, 0.6), (0.4, 3, 0.85)]
|
||||||
|
# Smart Mathematics:
|
||||||
|
# All Flags spawn same distance from the players
|
||||||
|
for i in range(c-1):
|
||||||
|
angle += spacing
|
||||||
|
angle %= 360
|
||||||
|
x = 6 * math.sin(math.degrees(angle))
|
||||||
|
z = 6 * math.cos(math.degrees(angle))
|
||||||
|
flag = Flag(position=(x+.5, 5, z-4), color=colors[i]).autoretain()
|
||||||
|
self.flags.append(flag)
|
||||||
|
|
||||||
|
def killRound(self):
|
||||||
|
self.numPickedUp = 0
|
||||||
|
for player in self.players:
|
||||||
|
if player.is_alive():
|
||||||
|
player.actor.handlemessage(ba.DieMessage())
|
||||||
|
for flag in self.flags:
|
||||||
|
flag.node.delete()
|
||||||
|
for light in self.nodes:
|
||||||
|
light.delete()
|
||||||
|
|
||||||
|
def spawn_player(self, player: Player, pos: tuple = (0, 0, 0)) -> ba.Actor:
|
||||||
|
spaz = self.spawn_player_spaz(player)
|
||||||
|
if pos == (0, 0, 0):
|
||||||
|
pos = (-.5+random.random()*2, 3+random.random()*2, -5+random.random()*2)
|
||||||
|
spaz.connect_controls_to_player(enable_punch=self.is_punch,
|
||||||
|
enable_bomb=False, enable_run=self.is_run)
|
||||||
|
spaz.handlemessage(ba.StandMessage(pos))
|
||||||
|
return spaz
|
||||||
|
|
||||||
|
def check_respawn(self, player):
|
||||||
|
if not player.done and player.survived:
|
||||||
|
self.respawn_player(player, 2.5)
|
||||||
|
|
||||||
|
def handlemessage(self, msg: Any) -> Any:
|
||||||
|
|
||||||
|
if isinstance(msg, ba.PlayerDiedMessage):
|
||||||
|
super().handlemessage(msg)
|
||||||
|
player = msg.getplayer(Player)
|
||||||
|
ba.timer(0.1, ba.Call(self.check_respawn, player))
|
||||||
|
ba.timer(0.5, self.checkEnd)
|
||||||
|
elif isinstance(msg, FlagPickedUpMessage):
|
||||||
|
self.numPickedUp += 1
|
||||||
|
msg.node.getdelegate(PlayerSpaz, True).getplayer(Player, True).done = True
|
||||||
|
l = ba.newnode('light',
|
||||||
|
owner=None,
|
||||||
|
attrs={'color': msg.node.color,
|
||||||
|
'position': (msg.node.position_center),
|
||||||
|
'intensity': 1})
|
||||||
|
self.nodes.append(l)
|
||||||
|
msg.flag.handlemessage(ba.DieMessage())
|
||||||
|
msg.node.handlemessage(ba.DieMessage())
|
||||||
|
msg.node.delete()
|
||||||
|
if self.numPickedUp == len(self.flags):
|
||||||
|
for player in self.spawned:
|
||||||
|
if not player.done:
|
||||||
|
try:
|
||||||
|
player.survived = False
|
||||||
|
ba.screenmessage("No Flag? "+player.getname())
|
||||||
|
player.actor.handlemessage(ba.StandMessage((0, 3, -2)))
|
||||||
|
ba.timer(0.5, ba.Call(player.actor.handlemessage, ba.FreezeMessage()))
|
||||||
|
ba.timer(3, ba.Call(player.actor.handlemessage, ba.ShouldShatterMessage()))
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
ba.timer(3.5, self.killRound)
|
||||||
|
ba.timer(3.55, self.makeRound)
|
||||||
|
else:
|
||||||
|
return super().handlemessage(msg)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def checkEnd(self):
|
||||||
|
i = 0
|
||||||
|
for player in self.players:
|
||||||
|
if player.survived:
|
||||||
|
i += 1
|
||||||
|
if i <= 1:
|
||||||
|
for player in self.players:
|
||||||
|
if player.survived:
|
||||||
|
player.team.score += 10
|
||||||
|
ba.timer(2.5, self.end_game)
|
||||||
|
|
||||||
|
def end_game(self) -> None:
|
||||||
|
results = ba.GameResults()
|
||||||
|
for team in self.teams:
|
||||||
|
results.set_team_score(team, team.score)
|
||||||
|
self.end(results=results)
|
||||||
|
|
@ -76,6 +76,25 @@
|
||||||
"md5sum": "aac4edfcaeca1dc2910f97e739d67482"
|
"md5sum": "aac4edfcaeca1dc2910f97e739d67482"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"floater": {
|
||||||
|
"description": "Calls a overpowered floater in any gamemode. Chat /floater to activate!",
|
||||||
|
"external_url": "",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Freaku",
|
||||||
|
"email": "",
|
||||||
|
"discord": "[Just] Freak#4999"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": {
|
||||||
|
"1.0.0": {
|
||||||
|
"api_version": 7,
|
||||||
|
"commit_sha": "858030b",
|
||||||
|
"released_on": "01-09-2022",
|
||||||
|
"md5sum": "c024a0774f2e960dad7f633efdc3feb5"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
276
plugins/utilities/floater.py
Normal file
276
plugins/utilities/floater.py
Normal file
|
|
@ -0,0 +1,276 @@
|
||||||
|
# Ported by: Freaku / @[Just] Freak#4999
|
||||||
|
|
||||||
|
# Join BCS:
|
||||||
|
# https://discord.gg/ucyaesh
|
||||||
|
|
||||||
|
|
||||||
|
# My GitHub:
|
||||||
|
# https://github.com/Freaku17/BombSquad-Mods-byFreaku
|
||||||
|
|
||||||
|
|
||||||
|
# ba_meta require api 7
|
||||||
|
from __future__ import annotations
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
import _ba
|
||||||
|
import ba
|
||||||
|
import random
|
||||||
|
import math
|
||||||
|
from bastd.gameutils import SharedObjects
|
||||||
|
from bastd.actor.bomb import Bomb
|
||||||
|
from bastd.actor.popuptext import PopupText
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
class Floater(ba.Actor):
|
||||||
|
def __init__(self, bounds):
|
||||||
|
super().__init__()
|
||||||
|
shared = SharedObjects.get()
|
||||||
|
self.controlled = False
|
||||||
|
self.source_player = None
|
||||||
|
self.floaterMaterial = ba.Material()
|
||||||
|
self.floaterMaterial.add_actions(
|
||||||
|
conditions=('they_have_material',
|
||||||
|
shared.player_material),
|
||||||
|
actions=(('modify_node_collision', 'collide', True),
|
||||||
|
('modify_part_collision', 'physical', True)))
|
||||||
|
self.floaterMaterial.add_actions(
|
||||||
|
conditions=(('they_have_material',
|
||||||
|
shared.object_material), 'or',
|
||||||
|
('they_have_material',
|
||||||
|
shared.footing_material), 'or',
|
||||||
|
('they_have_material',
|
||||||
|
self.floaterMaterial)),
|
||||||
|
actions=('modify_part_collision', 'physical', False))
|
||||||
|
|
||||||
|
self.pos = bounds
|
||||||
|
self.px = "random.uniform(self.pos[0],self.pos[3])"
|
||||||
|
self.py = "random.uniform(self.pos[1],self.pos[4])"
|
||||||
|
self.pz = "random.uniform(self.pos[2],self.pos[5])"
|
||||||
|
|
||||||
|
self.node = ba.newnode(
|
||||||
|
'prop',
|
||||||
|
delegate=self,
|
||||||
|
owner=None,
|
||||||
|
attrs={
|
||||||
|
'position': (eval(self.px), eval(self.py), eval(self.pz)),
|
||||||
|
'model':
|
||||||
|
ba.getmodel('landMine'),
|
||||||
|
'light_model':
|
||||||
|
ba.getmodel('landMine'),
|
||||||
|
'body':
|
||||||
|
'landMine',
|
||||||
|
'body_scale':
|
||||||
|
3,
|
||||||
|
'model_scale':
|
||||||
|
3.1,
|
||||||
|
'shadow_size':
|
||||||
|
0.25,
|
||||||
|
'density':
|
||||||
|
999999,
|
||||||
|
'gravity_scale':
|
||||||
|
0.0,
|
||||||
|
'color_texture':
|
||||||
|
ba.gettexture('achievementFlawlessVictory'),
|
||||||
|
'reflection':
|
||||||
|
'soft',
|
||||||
|
'reflection_scale': [0.25],
|
||||||
|
'materials':
|
||||||
|
[shared.footing_material, self.floaterMaterial]
|
||||||
|
})
|
||||||
|
self.node2 = ba.newnode(
|
||||||
|
'prop',
|
||||||
|
owner=self.node,
|
||||||
|
attrs={
|
||||||
|
'position': (0, 0, 0),
|
||||||
|
'body':
|
||||||
|
'sphere',
|
||||||
|
'model':
|
||||||
|
None,
|
||||||
|
'color_texture':
|
||||||
|
None,
|
||||||
|
'body_scale':
|
||||||
|
1.0,
|
||||||
|
'reflection':
|
||||||
|
'powerup',
|
||||||
|
'density':
|
||||||
|
999999,
|
||||||
|
'reflection_scale': [1.0],
|
||||||
|
'model_scale':
|
||||||
|
1.0,
|
||||||
|
'gravity_scale':
|
||||||
|
0,
|
||||||
|
'shadow_size':
|
||||||
|
0.1,
|
||||||
|
'is_area_of_interest':
|
||||||
|
True,
|
||||||
|
'materials':
|
||||||
|
[shared.object_material, self.floaterMaterial]
|
||||||
|
})
|
||||||
|
self.node.connectattr('position', self.node2, 'position')
|
||||||
|
|
||||||
|
def pop(self): PopupText(text="Ported by \ue048Freaku", scale=1.3, position=(
|
||||||
|
self.node.position[0], self.node.position[1]-1, self.node.position[2]), color=(0, 1, 1)).autoretain() # Edit = YouNoob...
|
||||||
|
|
||||||
|
def checkCanControl(self):
|
||||||
|
if not self.node.exists():
|
||||||
|
return False
|
||||||
|
if not self.source_player.is_alive():
|
||||||
|
self.dis()
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def con(self):
|
||||||
|
self.controlled = True
|
||||||
|
self.checkPlayerDie()
|
||||||
|
|
||||||
|
def up(self):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (v[0], 5, v[2])
|
||||||
|
|
||||||
|
def upR(self):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (v[0], 0, v[2])
|
||||||
|
|
||||||
|
def down(self):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (v[0], -5, v[2])
|
||||||
|
|
||||||
|
def downR(self):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (v[0], 0, v[2])
|
||||||
|
|
||||||
|
def leftright(self, value):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (5 * value, v[1], v[2])
|
||||||
|
|
||||||
|
def updown(self, value):
|
||||||
|
if not self.checkCanControl():
|
||||||
|
return
|
||||||
|
v = self.node.velocity
|
||||||
|
self.node.velocity = (v[0], v[1], -5 * value)
|
||||||
|
|
||||||
|
def dis(self):
|
||||||
|
if self.node.exists():
|
||||||
|
self.controlled = False
|
||||||
|
self.node.velocity = (0, 0, 0)
|
||||||
|
self.move()
|
||||||
|
|
||||||
|
def checkPlayerDie(self):
|
||||||
|
if not self.controlled:
|
||||||
|
return
|
||||||
|
if self.source_player is None:
|
||||||
|
return
|
||||||
|
if self.source_player.is_alive():
|
||||||
|
ba.timer(1, self.checkPlayerDie)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.dis()
|
||||||
|
|
||||||
|
def distance(self, x1, y1, z1, x2, y2, z2):
|
||||||
|
d = math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2))
|
||||||
|
return d
|
||||||
|
|
||||||
|
def drop(self):
|
||||||
|
try:
|
||||||
|
np = self.node.position
|
||||||
|
except:
|
||||||
|
np = (0, 0, 0)
|
||||||
|
self.b = Bomb(bomb_type=random.choice(['normal', 'ice', 'sticky', 'impact', 'land_mine', 'tnt']),
|
||||||
|
source_player=self.source_player, position=(np[0], np[1] - 1, np[2]), velocity=(0, -1, 0)).autoretain()
|
||||||
|
if self.b.bomb_type in ['impact', 'land_mine']:
|
||||||
|
self.b.arm()
|
||||||
|
|
||||||
|
def move(self):
|
||||||
|
px = eval(self.px)
|
||||||
|
py = eval(self.py)
|
||||||
|
pz = eval(self.pz)
|
||||||
|
if self.node.exists() and not self.controlled:
|
||||||
|
pn = self.node.position
|
||||||
|
dist = self.distance(pn[0], pn[1], pn[2], px, py, pz)
|
||||||
|
self.node.velocity = ((px - pn[0]) / dist, (py - pn[1]) / dist, (pz - pn[2]) / dist)
|
||||||
|
ba.timer(dist-1, ba.WeakCall(self.move), suppress_format_warning=True)
|
||||||
|
|
||||||
|
def handlemessage(self, msg):
|
||||||
|
if isinstance(msg, ba.DieMessage):
|
||||||
|
self.node.delete()
|
||||||
|
self.node2.delete()
|
||||||
|
self.controlled = False
|
||||||
|
elif isinstance(msg, ba.OutOfBoundsMessage):
|
||||||
|
self.handlemessage(ba.DieMessage())
|
||||||
|
else:
|
||||||
|
super().handlemessage(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def assignFloInputs(clientID: int):
|
||||||
|
with ba.Context(_ba.get_foreground_host_activity()):
|
||||||
|
activity = ba.getactivity()
|
||||||
|
if not hasattr(activity, 'flo') or not activity.flo.node.exists():
|
||||||
|
try:
|
||||||
|
activity.flo = Floater(activity.map.get_def_bound_box('map_bounds'))
|
||||||
|
except:
|
||||||
|
return # Perhaps using in main-menu/score-screen
|
||||||
|
floater = activity.flo
|
||||||
|
if floater.controlled:
|
||||||
|
ba.screenmessage('Floater is already being controlled',
|
||||||
|
color=(1, 0, 0), transient=True, clients=[clientID])
|
||||||
|
return
|
||||||
|
ba.screenmessage('You Gained Control Over The Floater!\n Press Bomb to Throw Bombs and Punch to leave!', clients=[
|
||||||
|
clientID], transient=True, color=(0, 1, 1))
|
||||||
|
|
||||||
|
for i in _ba.get_foreground_host_activity().players:
|
||||||
|
if i.sessionplayer.inputdevice.client_id == clientID:
|
||||||
|
def dis(i, floater):
|
||||||
|
i.actor.node.invincible = False
|
||||||
|
i.resetinput()
|
||||||
|
i.actor.connect_controls_to_player()
|
||||||
|
floater.dis()
|
||||||
|
ps = i.actor.node.position
|
||||||
|
i.actor.node.invincible = True
|
||||||
|
floater.node.position = (ps[0], ps[1] + 1.0, ps[2])
|
||||||
|
ba.timer(1, floater.pop)
|
||||||
|
i.actor.node.hold_node = ba.Node(None)
|
||||||
|
i.actor.node.hold_node = floater.node2
|
||||||
|
i.actor.connect_controls_to_player()
|
||||||
|
i.actor.disconnect_controls_from_player()
|
||||||
|
i.resetinput()
|
||||||
|
floater.source_player = i
|
||||||
|
floater.con()
|
||||||
|
i.assigninput(ba.InputType.PICK_UP_PRESS, floater.up)
|
||||||
|
i.assigninput(ba.InputType.PICK_UP_RELEASE, floater.upR)
|
||||||
|
i.assigninput(ba.InputType.JUMP_PRESS, floater.down)
|
||||||
|
i.assigninput(ba.InputType.BOMB_PRESS, floater.drop)
|
||||||
|
i.assigninput(ba.InputType.PUNCH_PRESS, ba.Call(dis, i, floater))
|
||||||
|
i.assigninput(ba.InputType.UP_DOWN, floater.updown)
|
||||||
|
i.assigninput(ba.InputType.LEFT_RIGHT, floater.leftright)
|
||||||
|
|
||||||
|
|
||||||
|
old_fcm = _ba.chatmessage
|
||||||
|
|
||||||
|
|
||||||
|
def new_chat_message(msg: Union[str, ba.Lstr], clients: Sequence[int] = None, sender_override: str = None):
|
||||||
|
old_fcm(msg, clients, sender_override)
|
||||||
|
if msg == '/floater':
|
||||||
|
try:
|
||||||
|
assignFloInputs(-1)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
_ba.chatmessage = new_chat_message
|
||||||
|
|
||||||
|
# ba_meta export plugin
|
||||||
|
|
||||||
|
|
||||||
|
class byFreaku(ba.Plugin):
|
||||||
|
def __init__(self): pass
|
||||||
Loading…
Add table
Add a link
Reference in a new issue